?? sl811.c
字號:
///////////////////////////////////////////////////////////
//初始化USB
void InitializeUsb(void)
{
register BYTE i;
asm{ldb i,#usb_csof_high;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0xae;}
asm{stb i,usb_data_reg;}
UsbReset();
asm{ldb i,#usb_csof_high;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0xae;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_csof_low;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0xe0;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_control_reg;}
asm{stb i,usb_address_reg;}
asm{stb 0,usb_data_reg;}
asm{ldb i,#usb_interrupt_enable;}
asm{stb i,usb_address_reg;}
asm{stb 0,usb_data_reg;}
ClearUsbInterruptStatus();
}
//復位USB
void UsbReset(void)
{
usb_address_reg=usb_control_reg;
usb_data_reg=0x08; //usb engine reset
DelayMs(50); //delay 50ms
usb_address_reg=usb_control_reg;
usb_data_reg=0x08; //usb engine reset
DelayMs(50); //delay 50ms
UsbCmd=0;
}
//判別USB是否需要處理,對插入的USB設備進行初始化工作
//return: FALSE- 優盤未插入
// TRUE- 優盤已插入
void UsbInsert(void)
{
BYTE i;
WORD data;
usb_address_reg=usb_interrupt_status;
i=usb_data_reg;
if(i&0x20)
{
usb_address_reg=usb_interrupt_status;
usb_data_reg=i;
UsbReset();
if(UsbDetectSpeed()==0xff){FlagUsbDisk=FALSE;return;}
if(!UsbGetDescriptor()){FlagUsbDisk=FALSE;return;}
if(!UsbSetAddress()){FlagUsbDisk=FALSE;return;}
if(!UsbSetConfig()){FlagUsbDisk=FALSE;return;}
if(!UsbGetInterface()){FlagUsbDisk=FALSE;return;}
if((UsbDataBuffer[1]!=0x16)||
(UsbDataBuffer[2]!=0x0a)||
(UsbDataBuffer[3]!=0x11)||
(UsbDataBuffer[4]!=0x11)){FlagUsbDisk=FALSE;return;}
//讀出容量,由于變量為BYTE,因此只能處理128M以下的優盤
DiskParameter.DiskSpace=UsbDataBuffer[9];
//讀出每一塊扇區數,得到進行寫入比較時的模
DiskParameter.DiskBlockSize=(WORD)UsbDataBuffer[15]+(((WORD)UsbDataBuffer[16])<<8)-1;
//讀BOOT區(0扇區)
if(!UsbGetDiskData(0,1)){FlagUsbDisk=FALSE;return;}
//ROOT區起始扇區
DiskParameter.DiskRootBegin=(((WORD)UsbReceiveBuffer[0x16])<<1)+1;
//控制塊起始扇區
DiskParameter.DiskDataBegin=(((WORD)UsbReceiveBuffer[0x11]+(((WORD)UsbReceiveBuffer[0x12])<<8))>>4)+
DiskParameter.DiskRootBegin+0x06;
//讀ROOT區
if(!UsbGetDiskData(DiskParameter.DiskRootBegin,1)){FlagUsbDisk=FALSE;return;}
//比較文件名ETFY.dat
if((UsbReceiveBuffer[0x20]!='E')||
(UsbReceiveBuffer[0x21]!='T')||
(UsbReceiveBuffer[0x22]!='F')||
(UsbReceiveBuffer[0x23]!='Y')){FlagUsbDisk=FALSE;return;}
//讀入控制快
if(!UsbGetDiskData(DiskParameter.DiskDataBegin,1)){FlagUsbDisk=FALSE;return;}
//測試校驗和
data=0;
for(i=0;i!=255;i++)data+=(WORD)UsbReceiveBuffer[2*i]+(((WORD)UsbReceiveBuffer[2*i+1])<<8);
if(data!=(WORD)UsbReceiveBuffer[510]+(((WORD)UsbReceiveBuffer[511])<<8)){FlagUsbDisk=FALSE;return;}
//讀授權
DiskParameter.ReadDiskAuthorize=UsbReceiveBuffer[0x49];
DiskParameter.ChangeSystemParamAuthorize=UsbReceiveBuffer[0x8a];
DiskParameter.ChangeAlarmParamAuthorize=UsbReceiveBuffer[0xae];
DiskParameter.ChangeClearAuthorize=UsbReceiveBuffer[0x150];
DiskParameter.ChangeChannelParamAuthorize=UsbReceiveBuffer[0x151];
DiskParameter.ChangeReactiveParamAuthorize=UsbReceiveBuffer[0x152];
DiskParameter.DiskFirstRecord=(WORD)UsbReceiveBuffer[0x20]+(((WORD)UsbReceiveBuffer[0x21])<<8);
DiskParameter.DiskRecordSize=((WORD)UsbReceiveBuffer[0x22]+(((WORD)UsbReceiveBuffer[0x23])<<8))<<1;
FlagUsbDisk=TRUE;
}
}
//檢測插入的USB設備工作速度
//return: 0xff-無設備
// 0x00-low
// 0x01-high
BYTE UsbDetectSpeed(void)
{
register BYTE i,j;
usb_address_reg=usb_csof_high;
usb_data_reg=0xae;
asm{ldb i,#usb_control_reg;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0x48;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_control_reg;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0x00;}
asm{stb i,usb_data_reg;}
DelayMs(20);
i=ClearUsbInterruptStatus();
if(!(i&0x20))
{
usb_address_reg=usb_control_reg;
usb_data_reg=0x00;
return 0xff; //null
}
else if(!(i&0x80))
{
asm{ldb i,#usb_csof_high;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0xee;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_csof_low;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0xe0;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_control_reg;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0x21;}
asm{stb i,usb_data_reg;}
j==0x00; //low speed
}
else
{
asm{ldb i,#usb_csof_high;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0xae;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_csof_low;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0xe0;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_control_reg;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0x05;}
asm{stb i,usb_data_reg;}
j=0x01; //high speed
}
asm{ldb i,#usb_a_pid;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0x50;}
asm{stb i,usb_data_reg;}
asm{ldb i,#usb_a_device_address;}
asm{stb i,usb_address_reg;}
asm{stb 0,usb_data_reg;}
asm{ldb i,#usb_a_control;}
asm{stb i,usb_address_reg;}
asm{ldb i,#0x01;}
asm{stb i,usb_data_reg;}
DelayMs(50);
return j;
}
//清除USB中斷狀態寄存器
//return:中斷狀態寄存器的內容
BYTE ClearUsbInterruptStatus(void)
{
register BYTE i;
asm{ldb i,#usb_interrupt_status;}
asm{stb i,usb_address_reg;}
i=usb_data_reg;
usb_address_reg=usb_interrupt_status;
usb_data_reg=i;
return i;
}
//批量寫入USB緩沖區
//input: xbyte- 寫入的字節數
// usbaddress- 寫入的usb緩沖區起始地址
// address- 數據指針
void UsbBufferWrite(BYTE xbyte,BYTE usbaddress,BYTE *address)
{
usb_address_reg=usbaddress;
while(xbyte--)
{
usb_data_reg=*address++;
DelayUs(2);
}
}
//批量讀出USB緩沖區
//input: xbyte- 讀出的字節數
// usbaddress- 讀出的usb緩沖區起始地址
// address- 數據指針
void UsbBufferRead(BYTE xbyte,BYTE usbaddress,BYTE *address)
{
usb_address_reg=usbaddress;
while(xbyte--)
{
*address++=usb_data_reg;
DelayUs(2);
}
}
//return: FALSE- 發送失敗
// TRUE- 發送成功
//when UsbSendSetupCmd,pid=PID_SETUP
//when UsbSendOUTCmd,pid=PID_OUT
BYTE UsbSendCmd(BYTE pid,register BYTE usbendpoint,BYTE usbdev)
{
register BYTE i;
WORD cout0=0,cout1=0;
asm{ldb i,#usb_a_pid;}
asm{stb i,usb_address_reg;}
asm{addb i,usbendpoint,pid;}
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,#0x08;}
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;}
UsbBufferWrite(0x08,usb_internal_buffer_1,(BYTE*)&SetupPacket);
do
{
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&0x40)&&(pid==PID_OUT))return FALSE; //NAK
if(i&0x01)return TRUE; //success
}while(++cout0<3000);
return FALSE;
}
//return: FALSE- 失敗
// TRUE- 成功
BYTE UsbGetinData(register BYTE usbendpoint,
BYTE usbdev,
BYTE *usbdatabufferpointer,
WORD usbtransleft)
{
register BYTE i;
WORD cout0=0,cout1=0;
asm{ldb i,#usb_a_pid;}
asm{stb i,usb_address_reg;}
asm{addb i,usbendpoint,#PID_IN;}
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;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -