📄 usb_disk.c
字号:
void SCSI_Read10()
{
unsigned char data i;
union
{
unsigned long Block;
unsigned char Addr[4];
}data BLK;
unsigned char length;
BLK.Addr[2] = bulk_CBW.CBWCB[4];
BLK.Addr[3] = bulk_CBW.CBWCB[5];
length = bulk_CBW.CBWCB[8];
while(length>0)
{
K9F_FUN = COMMAND;
K9F5608 = 0x00;
K9F_FUN = ADDRESS;
K9F5608 = 0;
K9F5608 = BLK.Addr[3];
K9F5608 = BLK.Addr[2];
K9F_FUN = D_DATA;
UEPNUM=0x01;
UEPSTAX|=DIR;
while(!(K9F_FUN & RB));
for(i=0;i<8;i++)
{
ReadFlash();
UEPSTAX|=TXRDY;
while(!(UEPSTAX&TXCMP));
UEPSTAX&=(~(TXCMP));
}
K9F5608 = INACTIVE;
length--;
BLK.Block ++;
}
TransmitCSW();
}
void delay()
{
unsigned char data i=20;
while(i-->0);
}
void SCSI_Write10()
{
union
{
unsigned long page;
unsigned char addr[4];
}data PG;
unsigned char data i=0,length=0,nBeginPage=0;
K9F_FUN = COMMAND;
K9F5608 = 0x60;
K9F_FUN = ADDRESS;
K9F5608 = BuffBlock;
K9F5608 = 0xff;
K9F_FUN = COMMAND;
K9F5608 = 0xd0;
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
K9F_FUN = COMMAND;
K9F5608 = 0x60;
K9F_FUN = ADDRESS;
K9F5608 = BuffBlock|0x20;
K9F5608 = 0xff;
K9F_FUN = COMMAND;
K9F5608 = 0xd0;
K9F_FUN = D_DATA;
PG.addr[2] = bulk_CBW.CBWCB[4];
PG.addr[3] = bulk_CBW.CBWCB[5];
length = bulk_CBW.CBWCB[8];
nBeginPage = PG.addr[3]&0x1f;
UEPNUM = 0x02;
delay();
while(!(K9F_FUN & RB));
if(nBeginPage>0)
{
for(i=0;i<nBeginPage;i++)
{
K9F_FUN = COMMAND;
K9F5608 = 0x00;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = (PG.addr[3]&0xe0)|i; //A9-A16
K9F5608 = PG.addr[2]; //A17-A24
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
K9F_FUN = COMMAND;
K9F5608 = 0x8a;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = BuffBlock|(PG.addr[3]&0x20)|i; //A9-A16
K9F5608 = 0xff; //A17-A24
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
}
nBeginPage=0;
}
while(length>0)
{
K9F_FUN = COMMAND;
K9F5608 = 0x80;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = (PG.addr[3]&0x3f)|BuffBlock; //A9-A16
K9F5608 = 0xff; //A17-A24
K9F_FUN = D_DATA;
for(i=0;i<8;i++)
{
while (!(UEPINT & EP2));
WriteFlash();
UEPSTAX &= 0xB9;
}
K9F_FUN = COMMAND;
K9F5608 = 0x10;
K9F_FUN = D_DATA;
length--;
delay();
while(!(K9F_FUN & RB));
if(((PG.addr[3]&0x1f)==0x1f)||(length==0))
{
for(i=((PG.addr[3]&0x1f)+1);i<32;i++)
{
K9F_FUN = COMMAND;
K9F5608 = 0x00;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = (PG.addr[3]&0xe0)|i; //A9-A16
K9F5608 = PG.addr[2]; //A17-A24
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
K9F_FUN = COMMAND;
K9F5608 = 0x8a;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
K9F5608 = 0xff; //A17-A24
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
}
K9F_FUN = COMMAND;
K9F5608 = 0x60; //擦除当前block
K9F_FUN = ADDRESS;
K9F5608 = PG.addr[3]; //A9-A16
K9F5608 = PG.addr[2]; //A17-A24
K9F_FUN = COMMAND;
K9F5608 = 0xd0;
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB)); //等待操作完成
for(i=0;i<32;i++)
{
K9F_FUN = COMMAND;
K9F5608 = 0x00;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
K9F5608 = 0xff; //A17-A24
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
K9F_FUN = COMMAND;
K9F5608 = 0x8a;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = (PG.addr[3]&0xe0)|i; //A9-A16
K9F5608 = PG.addr[2]; //A17-A24
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
}
if(length>0)
{
K9F_FUN = COMMAND;
K9F5608 = 0x60;
K9F_FUN = ADDRESS;
K9F5608 = (PG.addr[3]&0x20)|BuffBlock; //A9-A16
K9F5608 = 0xff; //A17-A24
K9F_FUN = COMMAND;
K9F5608 = 0xD0;
K9F_FUN = D_DATA;
delay();
while(!(K9F_FUN & RB));
}
}
PG.page++;
}
TransmitCSW();
}
void main_rxdone()
{
unsigned char data i;
unsigned char data Buf[64];
i = ReadEp(2,Buf);
P3_5 =0;
bulk_CSW[4] = Buf[4]; bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
switch(bulk_CBW.CBWCB[0])
{
case Inquiry :WriteEpBulk(1,36,B_InquiryData);break;
case Mode_Sense :SCSI_Mode_Sense(); break;
case Read10 :SCSI_Read10(); break;
case Read_Capacity :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
case Read_Format_Capacities :SCSI_Read_Format_Capacities(); break;
case Test_Unit_Ready :TransmitCSW(); break;
case Verify :TransmitCSW(); break;
case Write10 :SCSI_Write10(); break;
case Medium_Removal :TransmitCSW(); break;
}
P3_5 =1;
}
void Flash_Reset(void) //flash reset
{
unsigned int data i;
K9F_FUN = COMMAND;
K9F5608 = 0xff; //reset command
for (i=0; i<3000; i++) ; //delay
}
void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
{
int i;
unsigned int blockPage = (block << 5) | page;
K9F_FUN = COMMAND;
K9F5608 = 0x00;
K9F_FUN = ADDRESS;
K9F5608 = 0; //A0-A7
K9F5608 = blockPage & 0xff; //A9-A16
K9F5608 = (blockPage >> 8) & 0xff; //A17-A24
K9F_FUN = D_DATA;
i = 512;
while(!(K9F_FUN & RB));
while((i--)>0)
{
*pPage++ = K9F5608;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -