📄 sl811.c
字号:
asm{stb i,usb_address_reg;}
asm{ldb i,#0x40;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_address;}
asm{stb i,usb_address_reg;}
asm{ldb i,#usb_internal_buffer_1;}
asm{stb i,usb_data_reg;}
do
{
FreshExternalWatchdog();
usb_address_reg=usb_a_control;
usb_data_reg=UsbCmd^DATA0_RD;
do
{
if(++cout1==0)return FALSE; //timerout
usb_address_reg=usb_interrupt_status;
}while(!(usb_data_reg&0x01));
ClearUsbInterruptStatus();
usb_address_reg=usb_a_status;
i=usb_data_reg;
if(i&0x02)return FALSE; //error detection in transmisson
if(i&0x04)return FALSE; //time out occurred
if(i&0x20)return FALSE; //overflow
if(i&0x01)
{
UsbCmd^=0x40;
usb_address_reg=usb_a_counter;
i=usb_data_reg;
i=0x40-i;
UsbBufferRead(i,usb_internal_buffer_1,usbdatabufferpointer);
usbdatabufferpointer+=i;
if((usbtransleft-=(WORD)i)<=0)
{
if(!(UsbCmd&0x40))return TRUE;
asm{ldb i,#usb_a_pid;}
asm{stb i,usb_address_reg;}
asm{ldb i,#PID_OUT;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_device_address;}
asm{stb i,usb_address_reg;}
asm{ldb i,usbdev;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_xferlen;}
asm{stb i,usb_address_reg;}
asm{stb 0,usb_data_reg;}
usb_address_reg=usb_a_control;
usb_data_reg=UsbCmd^DATA0_WR;
UsbCmd^=0x40;
return TRUE;
}
}
}while(++cout0<3000);
return FALSE;
}
//return: FALSE- 失败
// TRUE- 成功
BYTE UsbSendoutData(register BYTE usbendpoint,
BYTE usbdev,
BYTE *usbdatabufferpointer,
WORD usbtransleft)
{
register BYTE i,j;
WORD cout0=0,cout1=0;
asm{ldb i,#usb_a_pid;}
asm{stb i,usb_address_reg;}
asm{addb i,usbendpoint,#PID_OUT;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_device_address;}
asm{stb i,usb_address_reg;}
asm{ldb i,usbdev;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_xferlen;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0x40;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_address;}
asm{stb i,usb_address_reg;}
asm{ldb i,#usb_internal_buffer_1;}
asm{stb i,usb_data_reg;}
do
{
FreshExternalWatchdog();
UsbBufferWrite(0x40,usb_internal_buffer_1,usbdatabufferpointer);
usb_address_reg=usb_a_control;
usb_data_reg=UsbCmd^DATA0_WR;
do
{
if(++cout1==0)return FALSE; //timerout
usb_address_reg=usb_interrupt_status;
}while(!(usb_data_reg&0x01));
ClearUsbInterruptStatus();
usb_address_reg=usb_a_status;
i=usb_data_reg;
if(i&0x02)return FALSE; //error detection in transmisson
if(i&0x04)return FALSE; //time out occurred
if(i&0x20)return FALSE; //overflow
if(i&0x01)
{
UsbCmd^=0x40;
usbdatabufferpointer+=0x40;
if((usbtransleft-=0x40)<=0)
{
if(!(UsbCmd&0x40))return TRUE;
asm{ldb i,#usb_a_pid;}
asm{stb i,usb_address_reg;}
asm{ldb i,#PID_OUT;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_device_address;}
asm{stb i,usb_address_reg;}
asm{ldb i,usbdev;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_xferlen;}
asm{stb i,usb_address_reg;}
asm{stb 0,usb_data_reg;}
usb_address_reg=usb_a_control;
usb_data_reg=UsbCmd^DATA0_WR;
UsbCmd^=0x40;
return TRUE;
}
}
}while(++cout0<3000);
return FALSE;
}
//用SETUP包发送一个请求,并输入请求的结果
//return: FALSE- 失败
// TRUE- 成功
BYTE UsbSetupIn(BYTE usbdev,BYTE *usbdatabufferpointer,WORD usbtransleft)
{
if(UsbSendCmd(PID_SETUP,0x00,usbdev))
{
ClearUsbInterruptStatus();
UsbCmd^=0x40;
return UsbGetinData(0x00,usbdev,usbdatabufferpointer,usbtransleft);
}
return FALSE;
}
//对输入的USB设备进行描述符读取工作
//return: FALSE- 失败
// TRUE- 成功
BYTE UsbGetDescriptor(void)
{
SetupPacket.usb_setup_bmRequest=0x80;
SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
SetupPacket.usb_setup_wValue=DEVICE;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x40;
return UsbSetupIn(0x00,(BYTE*)&UsbDataBuffer,0x10);
}
//对插入的USB设备进行设置地址工作
//return: FALSE- 失败
// TRUE- 成功
BYTE UsbSetAddress(void)
{
SetupPacket.usb_setup_bmRequest=0x00;
SetupPacket.usb_setup_bRequest=SET_ADDRESS;
SetupPacket.usb_setup_wValue=NEW_DEVICE_ADDRESS;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x00;
if(!UsbSetupIn(0x00,(BYTE*)&UsbDataBuffer,0x00))return FALSE;
SetupPacket.usb_setup_bmRequest=0x80;
SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
SetupPacket.usb_setup_wValue=DEVICE;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x12;
if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x12))return FALSE;
SetupPacket.usb_setup_bmRequest=0x80;
SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
SetupPacket.usb_setup_wValue=CONFIGURATION;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x09;
if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x09))return FALSE;
SetupPacket.usb_setup_bmRequest=0x80;
SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
SetupPacket.usb_setup_wValue=CONFIGURATION;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0xff;
if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x20))return FALSE;
SetupPacket.usb_setup_bmRequest=0x80;
SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
SetupPacket.usb_setup_wValue=DEVICE;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x12;
if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x12))return FALSE;
SetupPacket.usb_setup_bmRequest=0x80;
SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
SetupPacket.usb_setup_wValue=CONFIGURATION;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x89;
return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x20);
}
//对插入的USB设备进行接口读取工作
//return: FALSE- 失败
// TRUE- 成功
BYTE UsbGetInterface(void)
{
SetupPacket.usb_setup_bmRequest=0xc2;
SetupPacket.usb_setup_bRequest=0x10;
SetupPacket.usb_setup_wValue=0x00;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x1f;
return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x1f);
}
//对插入的USB设备进行接口配置工作
//return: FALSE- 失败
// TRUE- 成功
BYTE UsbSetConfig(void)
{
SetupPacket.usb_setup_bmRequest=0x00;
SetupPacket.usb_setup_bRequest=0x09;
SetupPacket.usb_setup_wValue=0x01;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x00;
return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x00);
}
//读出优盘的状态
//return: FALSE 失败
// TRUE 成功
//优盘状态UsbDataBuff[0]=0 故障
// UsbDataBuff[0]=1 正常
BYTE UsbGetDiskStatus(void)
{
SetupPacket.usb_setup_bmRequest=0xc2;
SetupPacket.usb_setup_bRequest=0x14;
SetupPacket.usb_setup_wValue=0x00;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x01;
return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x01);
}
//读出优盘的写保护状态
//return: FALSE 失败
// TRUE 成功
//优盘状态UsbDataBuff[0]=0 无写保护
// UsbDataBuff[0]=1 有写保护
BYTE UsbGetDiskProtect(void)
{
SetupPacket.usb_setup_bmRequest=0xc2;
SetupPacket.usb_setup_bRequest=0x15;
SetupPacket.usb_setup_wValue=0x00;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x01;
return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x01);
}
//读出优盘数据
//return: FALSE 失败
// TRUE 成功
BYTE UsbGetDiskData(WORD usbdisksectorbegin,WORD usbdisksectorcount)
{
SetupPacket.usb_setup_bmRequest=0x42;
SetupPacket.usb_setup_bRequest=0x11;
SetupPacket.usb_setup_wValue=0x00;
SetupPacket.usb_setup_wIndex=0x00;
SetupPacket.usb_setup_wLength=0x08;
if(!UsbSendCmd(PID_SETUP,0x00,NEW_DEVICE_ADDRESS))return FALSE;
ClearUsbInterruptStatus();
UsbCmd^=0x40;
SetupPacket.usb_setup_bmRequest=usbdisksectorbegin;
SetupPacket.usb_setup_bRequest=usbdisksectorbegin>>8;
SetupPacket.usb_setup_wValue=0x00;
SetupPacket.usb_setup_wIndex=usbdisksectorcount;
SetupPacket.usb_setup_wLength=0x00;
if(!UsbSendCmd(PID_OUT,0x00,NEW_DEVICE_ADDRESS))return FALSE;
ClearUsbInterruptStatus();
UsbGetinData(0x00,NEW_DEVICE_ADDRESS,(BYTE*)UsbDataBuffer,0);
ClearUsbInterruptStatus();
return UsbGetinData(0x02,NEW_DEVICE_ADDRESS,(BYTE*)UsbReceiveBuffer,usbdisksectorcount<<0x09);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -