📄 ide_drv.c
字号:
#include "config.h" /* system configuration */
#include "ide_drv.h"
#include "..\usb\usb_drv.h" /* usb driver definition */
#include "lib_mcu\lcd\lcd_drv.h" /* c51 driver definition */
#include "lib_mcu\clock\clock.h"
//#include "lib_mcu\serial\serial.h"
#define Usb_clear_RXOUTB0() {if(UEPSTAX & 0x42) UEPSTAX &= 0xbd;}
extern xdata Byte gl_media_buffer[512];
extern bit bMediaReadOpenFlag;
extern INT16U u16MediaBytePointer;
extern INT32U u32MediaSector;
extern data Uint32 dCBWDataTransferLength;
extern data Uint16 hdd_data_length;
/////////////////////////////////////////////////////////////////////
bit WriteCommand(INT8U u8Command)
{
INT8U u8Try = 0;
do
{
ACC = FILE7;
u8Try ++;
if(u8Try > 250)
{
return FALSE;
}
}
while(BSY);
FILE7 = u8Command;
return TRUE;
}
/////////////////////////////////////////////////////////////////////
bit hdd_install(void)
{
AUXR = 0x5c; //设置EXT16=1,使能16-BIT传送模式
INTQ = 1;
ARST = 0;
clock_vDelay(0xff);
ARST = 1;
do
{
FILE6 = 0xa0;
ACC = FILE7;
}
while(!DRDY | BSY);
FILE6 = 0x20;
FILE2 = 64;
FILE7 = 0x91;
do{ACC = FILE7;} while(BSY);
FILE7 = 0x10;
do{ACC = FILE7;} while(BSY);
return OK;
}
/////////////////////////////////////////////////////////////////////
void HardDiskSleep(void)
{
do{ACC = FILE7;} while(BSY); //wait for NO busy
WriteCommand(0xe0); //write command code
// do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request
}
/////////////////////////////////////////////////////////////////////
bit hdd_read_open(Uint32 hdd_sector)
{
INT16U i = 0;
INT8U head, cylinderh, cylinderl, sector;
u32MediaSector = hdd_sector;
head = ((Byte*)&u32MediaSector)[0];
cylinderh = ((Byte*)&u32MediaSector)[1];
cylinderl = ((Byte*)&u32MediaSector)[2];
sector = ((Byte*)&u32MediaSector)[3];
do{ACC = FILE7;} while(BSY); //wait for NO busy
FILE6 = (0xe0 | (head & 0x0f));
FILE5 = cylinderh; //high 2-bit cylinder
FILE4 = cylinderl; //low 8-bit cylinder
FILE3 = sector; //start sector
FILE2 = 0x01; //sector counter
WriteCommand(0x20); //write command code
do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request
ACC = FILE7;
if (ERR)
return KO;
for (i=0; i<512; )
{
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
gl_media_buffer[i++] = FILE0;
gl_media_buffer[i++] = DAT16H;
}
u16MediaBytePointer = 0;
bMediaReadOpenFlag = 1;
return OK;
}
/////////////////////////////////////////////////////////////////////
Byte hdd_read_byte(void)
{
INT8U u8Data;
if(u16MediaBytePointer >= 512) //a new sector
{
u32MediaSector += 1;
hdd_read_open(u32MediaSector);
}
u8Data = gl_media_buffer[u16MediaBytePointer ++];
return(u8Data);
}
/////////////////////////////////////////////////////////////////////
bit hdd_read_close(void)
{
u16MediaBytePointer = 0;
bMediaReadOpenFlag = 0;
return OK;
}
/////////////////////////////////////////////////////////////////////
bit hdd_read_one_sector(Uint32 hdd_sector)
{
Byte i;
if(hdd_read_open(hdd_sector) == OK)
{
for (i = 0; i < 8; i++)
{
Usb_select_ep(EP_IN);
/* read 64 bytes from card */
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_write_byte(hdd_read_byte());
Usb_set_TXRDY();
Usb_select_ep(EP_IN);
while (!Usb_tx_complete());
Usb_clear_TXCMPL();
}
hdd_read_close();
return OK;
}
return KO;
}
/////////////////////////////////////////////////////////////////////
bit hdd_write_open(Uint32 hdd_sector)
{
INT8U head,cylinderh,cylinderl,sector;
u32MediaSector = hdd_sector;
head = ((Byte*)&u32MediaSector)[0];
cylinderh = ((Byte*)&u32MediaSector)[1];
cylinderl = ((Byte*)&u32MediaSector)[2];
sector = ((Byte*)&u32MediaSector)[3];
do{ACC = FILE7;} while(BSY);
FILE6 = (0xe0 | (head & 0x0f));
FILE5 = cylinderh; //high 2-bit cylinder
FILE4 = cylinderl; //low 8-bit cylinder
FILE3 = sector; //start sector
FILE2 = 1; //sector counter
WriteCommand(0x30);
do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request
ACC = FILE7;
if (ERR)
return KO;
u16MediaBytePointer = 0;
return OK;
}
/////////////////////////////////////////////////////////////////////
bit hdd_write_byte(Byte hdd_data)
{
gl_media_buffer[u16MediaBytePointer ++] = hdd_data;
return OK;
}
/////////////////////////////////////////////////////////////////////
bit hdd_write_close(void)
{
INT16U i;
for(i=0; i<512;)
{
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
DAT16H = gl_media_buffer[i + 1];
FILE0 = gl_media_buffer[i];
i += 2;
}
do{ACC = FILE7;} while(BSY);
return OK;
}
/////////////////////////////////////////////////////////////////////
bit hdd_write_one_sector(Uint32 hdd_sector)
{
INT8U j;
Usb_select_ep(EP_OUT);
for (j=0; j<8; j++)
{
while(!Usb_rx_complete()); /* wait end of reception */
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
hdd_write_byte(Usb_read_byte());
Usb_clear_RXOUT_PP();
}
hdd_write_open(hdd_sector);
hdd_write_close();
return OK;
}
/////////////////////////////////////////////////////////////////////////////////
Uint32 hdd_read_long_big_endian()
{
Uint32 cluster;
((Byte*)&cluster)[3] = hdd_read_byte();
((Byte*)&cluster)[2] = hdd_read_byte();
((Byte*)&cluster)[1] = hdd_read_byte();
((Byte*)&cluster)[0] = hdd_read_byte();
return cluster;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -