📄 03.htm
字号:
status) //返回CSW数据包<BR>{
<BR>csw.dCSWTag=cbw.dCBWTag;<BR>csw.dCSWDataResidue=DataResidue;<BR>csw.bCSWStatus=status;<BR>write_endpoint_buff(1,sizeof(CSW),(unsigned
char
*)(&csw));<BR>USB_usb_endp1_in=0;<BR>USB_usb_endp2_out=0;<BR>SCSI_Command=1;<BR>SCSI_Data=0;<BR>}<BR><BR><BR>void
write_10(void) //SCSI写操作<BR>{<BR>unsigned
long int LBA,Byte_Count;<BR>unsigned char
i;<BR>if(SCSI_Data)<BR> {<BR> ((unsigned
char*)&LBA)[0]=cbw.CBWCB[2];<BR> ((unsigned
char*)&LBA)[1]=cbw.CBWCB[3];<BR> ((unsigned
char*)&LBA)[2]=cbw.CBWCB[4];<BR> ((unsigned
char*)&LBA)[3]=cbw.CBWCB[5];<BR> ((unsigned
char*)&Byte_Count)[0]=0;<BR> ((unsigned
char*)&Byte_Count)[1]=cbw.CBWCB[7];<BR> ((unsigned
char*)&Byte_Count)[2]=cbw.CBWCB[8];<BR> ((unsigned
char*)&Byte_Count)[3]=0;<BR> Byte_Count<<=1;<BR> pData=buffer;<BR> while(USB_usb_endp2_out)<BR> {<BR> if((((unsigned
char *)&Byte_Count)[3]==0)&&((((unsigned char
*)&Byte_Count)[2]&0x01)==0))<BR> {<BR> wait_IDE_busy();<BR> write_IDE_LBA(LBA);<BR> write_IDE_sector_count(1);<BR> write_IDE_command(IDE_Write_Sectors);<BR> IDE_Address=IDE_Data;<BR> set_IDE_address();<BR> LBA++;<BR> }<BR> while(!(RXOUTB0||RXOUTB1));<BR> if(Byte_Count>MAX_BULK_DATA_SIZE)<BR> {<BR> UEPNUM=2; //选择端点<BR> for(i=0;i<MAX_BULK_DATA_SIZE;i++)<BR> {<BR> while(!IDE_IORDY);<BR> IDE_DIOW=0;<BR> IDE_DATA_L=UEPDATX;<BR> i++;<BR> IDE_DATA_H=UEPDATX;<BR> IDE_DIOW=1;<BR> }<BR> UEPSTAX=UEPSTAX
& (~0x42);//清除RXOUTB
位<BR> Byte_Count-=MAX_BULK_DATA_SIZE;<BR> }<BR> else
<BR> {<BR> UEPNUM=2; //选择端点<BR> for(i=0;i<Byte_Count;i++)<BR> {<BR> while(!IDE_IORDY);<BR> IDE_DIOW=0;<BR> IDE_DATA_L=UEPDATX;<BR> i++;<BR> IDE_DATA_H=UEPDATX;<BR> IDE_DIOW=1;<BR> }<BR> UEPSTAX=UEPSTAX
& (~0x42);//清除RXOUTB
位 <BR> Return_CSW(0x00,SUCCESS);<BR> wait_IDE_busy();<BR> IDE_Address=IDE_Bus_Not_Use;<BR> set_IDE_address();<BR> }<BR> }<BR> }<BR>else<BR> {<BR> error(3);<BR> }<BR>}<BR><BR>void
endp2_out(void) //主端点输出处理<BR>{<BR>if(SCSI_Command)<BR> {<BR> if(read_endpoint_buff(2,sizeof(CBW),(unsigned
char
*)(&cbw))!=sizeof(CBW)){error(2);return;}<BR> if(cbw.dCBWSignature!=0x55534243){error(3);return;}<BR> SCSI_Command=0;<BR> SCSI_Data=1;<BR> if(cbw.bmCBWFlags&0x80)<BR> {<BR> USB_usb_endp1_in=1;<BR> USB_usb_endp2_out=0;<BR> }<BR> else<BR> {<BR> USB_usb_endp1_in=0;<BR> USB_usb_endp2_out=1;<BR> switch(cbw.CBWCB[0])<BR> {<BR> case Write_10:
USB_LED=!USB_LED;write_10();break;<BR> case
Test_Unit_Ready: Return_CSW(0x00,SUCCESS);break;
<BR> case Verify:
Return_CSW(0x00,SUCCESS);break;<BR> default :
Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;<BR> }<BR> }<BR> }<BR>else<BR> {<BR> read_endpoint_buff(2,0,0);<BR> }<BR>}<BR><BR><BR>void
read_10(void) //SCSI读处理<BR>{<BR>unsigned
long int LBA=0,Byte_Count;<BR>unsigned char
i;<BR>if(SCSI_Data)<BR> {<BR> ((unsigned
char*)&LBA)[0]=cbw.CBWCB[2];<BR> ((unsigned
char*)&LBA)[1]=cbw.CBWCB[3];<BR> ((unsigned
char*)&LBA)[2]=cbw.CBWCB[4];<BR> ((unsigned
char*)&LBA)[3]=cbw.CBWCB[5];<BR> ((unsigned
char*)&Byte_Count)[0]=0;<BR> ((unsigned
char*)&Byte_Count)[1]=cbw.CBWCB[7];<BR> ((unsigned
char*)&Byte_Count)[2]=cbw.CBWCB[8];<BR> ((unsigned
char*)&Byte_Count)[3]=0;<BR> Byte_Count<<=1;<BR> pData=buffer;<BR> while(USB_usb_endp1_in)<BR> {<BR> if((((unsigned
char *)&Byte_Count)[3]==0)&&((((unsigned char
*)&Byte_Count)[2]&0x01)==0))<BR> {<BR> write_IDE_LBA(LBA);<BR> write_IDE_sector_count(1);<BR> write_IDE_command(IDE_Read_Sectors);<BR> IDE_Address=IDE_Data;<BR> set_IDE_address();<BR> IDE_DATA_H=0xFF;<BR> IDE_DATA_L=0xFF;<BR> LBA++;<BR> }<BR> if(Byte_Count>MAX_BULK_DATA_SIZE)<BR> {<BR> UEPNUM=1; //选择端点<BR> for(i=0;i<MAX_BULK_DATA_SIZE;i++) //填数据寄存器<BR> {<BR> while(!IDE_IORDY); //等待IDE
IO口忙<BR> IDE_DIOR=0; //发读信号<BR> UEPDATX=IDE_DATA_L; //读低字节<BR> i++;<BR> UEPDATX=IDE_DATA_H; //读高字节<BR> IDE_DIOR=1; //<BR> }<BR> UEPSTAX=UEPSTAX |
0x10; //设置TXRDY位<BR> while(!(
UEPSTAX & 0x01
)); //等待TXCMP<BR> UEPSTAX=UEPSTAX
&
(~0x01); //清除TXCMP<BR> Byte_Count-=MAX_BULK_DATA_SIZE;<BR> }<BR> else<BR> {<BR> UEPNUM=1; //选择端点<BR> for(i=0;i<Byte_Count;i++) //填数据寄存器<BR> {<BR> while(!IDE_IORDY);<BR> IDE_DIOR=0;<BR> UEPDATX=IDE_DATA_L;<BR> i++;<BR> UEPDATX=IDE_DATA_H;<BR> IDE_DIOR=1;<BR> }<BR> UEPSTAX=UEPSTAX
|
0x10; //设置TXRDY位<BR> while(!(
UEPSTAX & 0x01
)); //等待TXCMP<BR> UEPSTAX=UEPSTAX
&
(~0x01); //清除TXCMP<BR> Return_CSW(0x00,SUCCESS);<BR> <BR> IDE_Address=IDE_Bus_Not_Use;<BR> set_IDE_address();<BR> IDE_DATA_L=0xFF;<BR> }<BR> }<BR>}<BR>else
error(2);return;<BR>}<BR><BR>void
endp1_in(void) //主端点输入处理<BR>{<BR> switch(cbw.CBWCB[0])<BR> {<BR> case Read_10:
USB_LED=!USB_LED;read_10();break;<BR> case Inquiry:
write_endpoint_buff(1,0x24,DISK_INF);Return_CSW(0x00,SUCCESS);
break;<BR> case Read_Capacity:
write_endpoint_buff(1,0x08,DISK_CAPACITY);Return_CSW(0x00,SUCCESS);break;<BR> case
Read_Format_capacity:
write_endpoint_buff(1,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;<BR> case Request_Sense:
write_endpoint_buff(1,0x12,SENSE);Return_CSW(0x00,SUCCESS);break;<BR> case Medium_Removal:
Return_CSW(0x00,SUCCESS);break;<BR> case 0x1a:
write_endpoint_buff(1,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;<BR> default :
write_endpoint_buff(1,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;<BR> }<BR>}<BR><BR>void
usb(void)<BR>{<BR>LCD_go_home();<BR>prints("移动硬盘模式
");<BR>LCD_line_feed();<BR>prints(" ");<BR>disconnect_usb();<BR>init_usb();<BR>connect_usb();<BR>while(1)<BR> {
<BR> read_usb_status();<BR> if(status_bus_reset){usb_bus_reset();continue;}<BR> if(status_suspend_change){usb_bus_suspend();continue;}<BR> if(status_control_out_port){endp0_out();continue;}<BR> if(status_control_in_port&&USB_usb_endp0_in){endp0_in();continue;}<BR> if(status_main_out_port){endp2_out();continue;}<BR> if(status_main_in_port&&USB_usb_endp1_in){endp1_in();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -