📄 sl811.c
字号:
sl811_read_buf(0x10, buf + 8, 0x08);
tmp = 0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x08);
sl811_write(0x03, 0x90); //PID IN
sl811_write(0x04, adr);
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x03); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x40) == 0)tmp =2;
}
sl811_read_buf(0x10, buf + 16, 0x08);
//8 last bytes
tmp = 0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x08);
sl811_write(0x03, 0x90); //PID IN
sl811_write(0x04, adr);
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x03); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x40) == 0)tmp =2;
}
sl811_read_buf(0x10, buf + 24, 0x08);
}
pause_ms(2);
// send a PID OUT to finish request
sl811_write(0x01, 0x00);
sl811_write(0x02, 0x00); //size
sl811_write(0x03, 0x10); //PID OUT
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x47); //PID DATA1
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
}
/****************************************************************************************/
// SET_CONFIGURATION function
/****************************************************************************************/
unsigned char sl811_set_conf(void)
{
unsigned char tmp;
sl811_write(0x10, 0x00);
sl811_write_next(0x09);
sl811_write_next(0x01);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x08); //size
sl811_write(0x03, 0xD0); //PID SETUP
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x07);
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
pause_ms(1);
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x08); //size
sl811_write(0x03, 0x90); //PID IN
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x03); //send commande
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 0)return ERROR;
return COMPLETED;
}
/****************************************************************************************/
// GET_CAPACITY function
/****************************************************************************************/
unsigned char sl811_get_capacity(unsigned char * buf)
{
unsigned char tmp;
//Send CBW "USBC"
sl811_write(0x10, 'U');
sl811_write_next('S');
sl811_write_next('B');
sl811_write_next('C');
sl811_write_next('P');
sl811_write_next('I');
sl811_write_next('K');
sl811_write_next('A');
sl811_write_next(0x08);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x80);
sl811_write_next(0x00);
sl811_write_next(0x0C);
sl811_write_next(0x25);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
tmp = 0;
while(tmp ==0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x1F); //size
sl811_write(0x03, 0x10 + endp_out); //PID OUT ENDP1 /*OUT 0001 (1 Hex) *///USB-A/USB-B Host PID, Device Endpoint (Write)/USB Status (Read) [03H, 0BH]
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27);
else sl811_write(0x00, 0x67);
data_toggle = data_toggle ^ 0x01;
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
}
pause_ms(1);
tmp = 0;
while(tmp ==0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x08); //size
sl811_write(0x03, 0x90 + endp_in); //PID IN ENDP2 /*IN 1001 (9 Hex) */USB-A/USB-B Host PID, Device Endpoint (Write)/USB Status (Read) [03H, 0BH]
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
if((sl811_read(0x03)&0x80) != 0)return STALL;
}
sl811_read_buf(0x10, buf, 0x08);
pause_ms(1);
//Get CSW "USBS"
tmp =0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x0D); //size
sl811_write(0x03, 0x90 + endp_in); //PID IN
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
}
if(sl811_read(0x10+ 0x0C) != 0)return ERROR;
return COMPLETED;
}
/****************************************************************************************/
// CLEAR_FEATURE Function
/****************************************************************************************/
void sl811_clear_feature(void)
{
unsigned char tmp;
sl811_write(0x10, 0x02);
sl811_write_next(0x01);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x80 + endp_in);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x08); //size
sl811_write(0x03, 0xD0); //PID SETUP
sl811_write(0x04, adr); //adevice address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x27); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
tmp = 0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x08); //size
sl811_write(0x03, 0x90); //PID IN
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)& 0x01) == 1)tmp = 2;
}
//get error frame
tmp = 0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x0D); //size
sl811_write(0x03, 0x90 + endp_in); //PID IN
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)& 0x01) == 1)tmp = 2;
}
}
/****************************************************************************************/
// READ_SECTOR Function
/****************************************************************************************/
unsigned char sl811_read_sector(unsigned long sector, void * buf0)
{
unsigned char tmp,i;
unsigned char *buf=buf0;
sl811_usb_ready();
sl811_usb_ready();
sl811_usb_ready();
while(sl811_usb_ready() !=0)pause_ms(20);
sl811_write(0x10, 'U');
sl811_write_next('S');
sl811_write_next('B');
sl811_write_next('C');
sl811_write_next('P');
sl811_write_next('I');
sl811_write_next('K');
sl811_write_next('A');
sl811_write_next(0x00);
sl811_write_next(0x02); //512 bytes
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x80);
sl811_write_next(0x00);
sl811_write_next(0x0C);
sl811_write_next(0x28); //UFI READ(10)
sl811_write_next(0x00);
sl811_write_next((char)(sector>>24));
sl811_write_next((char)(sector>>16));
sl811_write_next((char)(sector>>8));
sl811_write_next((char)(sector));
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x01); //sector number
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
sl811_write_next(0x00);
tmp = 0;
while(tmp ==0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x1F); //size
sl811_write(0x03, 0x10 + endp_out); //PID OUT ENDP1
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27); //Bit6 :Data Toggle Bit ,“0” if DATA0, “1” if DATA1.
else sl811_write(0x00, 0x67);
data_toggle = data_toggle ^ 0x01;
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
}
for(i=0; i!= 8; i++)
{
pause_ms(1);
tmp = 0;
while(tmp ==0)
{ ClearLcd();
GotoXY(1,0);
Print("IN tmp");
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x40); //size
sl811_write(0x03, 0x90 + endp_in); //PID IN ENDP2
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd Bit2: Direction When set = “1” transmit to Host. When “0” receive from Host.
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)
{
tmp =2;
}
}
sl811_read_buf(0x10, buf + (i*0x40), 0x40);
}
pause_ms(1);
//get CSW "USBS" frame to verify errors
tmp =0;
while(tmp == 0)
{
sl811_write(0x01, 0x10);
sl811_write(0x02, 0x0D); //size
sl811_write(0x03, 0x90 + endp_in); //PID IN
sl811_write(0x04, adr); //device address
sl811_write(0x0D, 0x01);
sl811_write(0x00, 0x23); //send cmd
for(tmp=255; tmp!= 0; tmp--)
{
asm("nop");
}
while((sl811_read(0x0D)&0x01) == 0);
if((sl811_read(0x03)&0x01) == 1)tmp =2;
}
ClearLcd();
GotoXY(1,0);
Print("RDCSW OK");
pause_ms(80);
if(sl811_read(0x10+ 0x0C) != 0)return ERROR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -