?? 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 + -