📄 main.c
字号:
/*
*********************************************************************************************************
* File: Main.C
* Contents:
*
* $Date: 04/06/06 Kimi v0.1
* 01/05/07 kevin v0.2
* 01/08/07 kevin v0.3
* 01/29/07 kevin v0.4
* Copyright (c) 2007 Fameg, Inc. All rights reserved
*********************************************************************************************************
*/
#define ALLOCATE_EXTERN
#include "fs7805.h" // Declare GLOBAL variables and functions
#include "fs7805regs.h"
#include "Include.h"
#include "aplif.h"
#include "string.h"
xdata INT8U OutBuffer[512];
union FIFODataLen
{
INT16U Val;
INT8U Byte[2];
};
static union FIFODataLen Length;
void main(void)
{
TdInit();
WriteOutFIFO(); //move data to OutFIFO
WriteOneSector(0x07); //write data to IDE device
ReadOneSector(0x07); //read the 7th sector data from IDE device
while(1);
}
/*
*********************************************************************************************************
* WriteOneSector
*
* Description: Write one sector data(512 BYTE) to IDE device
*
* Arguments : sector: sector address need to be write
*
* Returns : none
*********************************************************************************************************
*/
void WriteOneSector (INT8U sector)
{
WritePIO8(ATA_DRIVESEL_REG, 0xE0);
WritePIO8(ATA_SECTOR_COUNT_REG,1); //write sector counter value to IDE register
WritePIO8(ATA_LBA_LSB_REG, sector); //write address to IDE register
WritePIO8(ATA_LBA_2SB_REG, 0);
WritePIO8(ATA_LBA_MSB_REG, 0);
init_udma_write(); //initialize UDMA relegated register
while ((ReadATAPI_STATUS_REG() != 0x50)); //wait for IDE device ready
WritePIO8 (ATA_COMMAND_REG, 0xCA); //write WRITE command to IDE register
while ((ReadATAPI_STATUS_REG() & 0x88) != 0x08); //wait for IDE device ready
WriteUDMA(0x200); //FS7805 start write data with APLIF
while ((ReadATAPI_STATUS_REG() != 0x50));
}
/*
*********************************************************************************************************
* ReadOneSector
*
* Description: Read one sector data(512 BYTE) from IDE device
*
* Arguments : sector: sector address need to be read
*
* Returns : none
*********************************************************************************************************
*/
void ReadOneSector (INT8U sector)
{
WritePIO8(ATA_DRIVESEL_REG, 0xE0);
WritePIO8(ATA_SECTOR_COUNT_REG,1); //write sector counter value to IDE register
WritePIO8(ATA_LBA_LSB_REG, sector); //write address to IDE register
WritePIO8(ATA_LBA_2SB_REG, 0);
WritePIO8(ATA_LBA_MSB_REG, 0);
init_udma_read(); //initialize UDMA relegated register
WritePIO8(ATA_COMMAND_REG, 0xC8); //write READ command to IDE register
while ((ReadATAPI_STATUS_REG() & 0x88) != 0x08); //wait for IDE device ready
ReadUDMA(0x200); //FS7805 start read data with APLIF
while ((ReadATAPI_STATUS_REG() != 0x50));
}
/*
*********************************************************************************************************
* WriteOutFIFO
*
* Description: Load data in FIFO and pass data to SFI
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void WriteOutFIFO ()
{
union
{
INT8U Val;
struct
{
INT8U Count0 : 3;
INT8U : 1;
INT8U Count1 : 3;
INT8U : 1;
} Bit;
} HighReg;
INT16U i;
for (i = 0; i < BYTES_PER_SECTOR; i++)
OutBuffer[i] = i ;
Length.Val = BYTES_PER_SECTOR;
HighReg.Val = EP1CNTH;
ParseOut();
EP1CNT0L = Length.Byte[1]; // Write count low byte
if (UsbDmaBuffer==DMA_FIFOA0)
{
HighReg.Bit.Count0 = Length.Byte[0] & 0x07;
HighReg.Val = HighReg.Val | bmCNT0HWEN;
}
else
{
HighReg.Bit.Count1 = Length.Byte[0] & 0x07;
HighReg.Val = HighReg.Val | bmCNT1HWEN;
}
EP1CNTH = HighReg.Val; // Write count high byte
memcpy((INT8U xdata *)UsbDmaBuffer, OutBuffer, BYTES_PER_SECTOR);// Copy data
if (UsbDmaBuffer==DMA_FIFOA0)
{
EPAFIFOCS = 0x44; // Set FULL bit
SFI_SKIP = 0x01;
}
else
{
EPAFIFOCS = 0x88; // Set FULL bit
SFI_SKIP = 0x41;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -