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