usbdisk.lst
来自「基于D12」· LST 代码 · 共 2,018 行 · 第 1/5 页
LST
2,018 行
0449 142C CP R2,R12
044A 043D CPC R3,R13
044B F4E8 BCC 0x0469
(0207) {
(0208) Erase_Cluster(CANCEL_BLOCK);
044C EF0F LDI R16,0xFF
044D E017 LDI R17,7
044E 940E072C CALL _Erase_Cluster
(0209) for(i=pageNum;i<32;i++)
0450 80AE LDD R10,Y+6
0451 C014 RJMP 0x0466
(0210) {
(0211) ReadPage(blockNum,i,PageBuf);
0452 E480 LDI R24,0x40
0453 E091 LDI R25,1
0454 8399 STD Y+1,R25
0455 8388 STD Y+0,R24
0456 2D2A MOV R18,R10
0457 2733 CLR R19
0458 0186 MOVW R16,R12
0459 940E0759 CALL _ReadPage
(0212) WritePage(CANCEL_BLOCK,i,PageBuf);
045B E480 LDI R24,0x40
045C E091 LDI R25,1
045D 8399 STD Y+1,R25
045E 8388 STD Y+0,R24
045F 2D2A MOV R18,R10
0460 2733 CLR R19
0461 EF0F LDI R16,0xFF
0462 E017 LDI R17,7
0463 940E0792 CALL _WritePage
0465 94A3 INC R10
0466 2D8A MOV R24,R10
0467 3280 CPI R24,0x20
0468 F348 BCS 0x0452
(0213) }
(0214) }
(0215) return TRUE;
0469 E001 LDI R16,1
046A 9627 ADIW R28,7
046B 940E0EE3 CALL pop_gset5
046D 9508 RET
(0216) #undef cdbWrite10
(0217) }
(0218) BOOLEAN SPC_LockMedia(void)
(0219) {
(0220) Bulk_ErrorHandler(CSW_GOOD,0);
_SPC_LockMedia:
046E 2722 CLR R18
046F 2733 CLR R19
0470 2700 CLR R16
0471 940E0E0A CALL _Bulk_ErrorHandler
(0221) Bulk_CSWHandler();
0473 940E0D63 CALL _Bulk_CSWHandler
(0222) return TRUE;
0475 E001 LDI R16,1
0476 9508 RET
(0223) }
(0224) BOOLEAN SPC_Reserve6(void)
(0225) {
(0226) Bulk_ErrorHandler(CSW_FAIL,0);
_SPC_Reserve6:
0477 2722 CLR R18
0478 2733 CLR R19
0479 E001 LDI R16,1
047A 940E0E0A CALL _Bulk_ErrorHandler
(0227) Bulk_CSWHandler();
047C 940E0D63 CALL _Bulk_CSWHandler
(0228) return TRUE;
047E E001 LDI R16,1
047F 9508 RET
FILE: J:\PDIUSBD12-Materials\富昌\优盘5.0\CHAP9.C
(0001) #include <macros.h>
(0002) #include <stdio.h>
(0003) #include <string.h>
(0004)
(0005) #include "D12CI.H"
(0006) #include "MAIN.H"
(0007) #include "USB100.H"
(0008) #include "CHAP9.H"
(0009)
(0010) extern void single_transmit(unsigned char *buf,unsigned char len);
(0011) extern void code_transmit(const unsigned char * pRomData,unsigned short len);
(0012) extern void stall_ep0(void);
(0013) extern void init_unconfig(void);
(0014) extern void init_config(void);
(0015)
(0016) #define NUM_ENDPOINTS 4
(0017) #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR)\
(0018) +sizeof(USB_INTERFACE_DESCRIPTOR)\
(0019) +(NUM_ENDPOINTS*sizeof(USB_ENDPOINT_DESCRIPTOR))
(0020) extern CONTROL_XFER ControlData;
(0021) extern IO_REQUEST ioRequest;
(0022) extern EPPFLAGS bEPPflags;
(0023)
(0024) const USB_DEVICE_DESCRIPTOR DeviceDescr=
(0025) {
(0026) sizeof(USB_DEVICE_DESCRIPTOR),
(0027) USB_DEVICE_DESCRIPTOR_TYPE,
(0028) 0x0001,//SWAP(0x0100),
(0029) 0,//USB_CLASS_CODE_TEST_CLASS_DEVICE,
(0030) 0,
(0031) 0,
(0032) EP0_PACKET_SIZE,
(0033) 0x8405,//SWAP(0x0471),
(0034) 0x0100,//SWAP(0x0666),
(0035) 0x0001,//SWAP(0x0100),
(0036) 0,
(0037) 0,
(0038) 0,
(0039) 0x01
(0040) };
(0041) const USB_CONFIGURATION_DESCRIPTOR ConfigDescr=
(0042) {
(0043) sizeof(USB_CONFIGURATION_DESCRIPTOR),
(0044) USB_CONFIGURATION_DESCRIPTOR_TYPE,
(0045) CONFIG_DESCRIPTOR_LENGTH,//SWAP(CONFIG_DESCRIPTOR_LENGTH),
(0046) 1,
(0047) 1,
(0048) 0,
(0049) 0x80,
(0050) 0xfa
(0051) };
(0052) const USB_INTERFACE_DESCRIPTOR InterfaceDescr=
(0053) {
(0054) sizeof(USB_INTERFACE_DESCRIPTOR),
(0055) USB_INTERFACE_DESCRIPTOR_TYPE,
(0056) 0,
(0057) 0,
(0058) NUM_ENDPOINTS,
(0059) USB_DEVICE_CLASS_STORAGE,
(0060) 0x06,//SCSI
(0061) 0x50,//bulk only Transport
(0062) 0
(0063) };
(0064) const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr=
(0065) {
(0066) sizeof(USB_ENDPOINT_DESCRIPTOR),
(0067) USB_ENDPOINT_DESCRIPTOR_TYPE,
(0068) 0x81,
(0069) USB_ENDPOINT_TYPE_INTERRUPT,
(0070) EP1_PACKET_SIZE,//SWAP(EP1_PACKET_SIZE),
(0071) 10
(0072) };
(0073) const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr=
(0074) {
(0075) sizeof(USB_ENDPOINT_DESCRIPTOR),
(0076) USB_ENDPOINT_DESCRIPTOR_TYPE,
(0077) 0x1,
(0078) USB_ENDPOINT_TYPE_INTERRUPT,
(0079) EP1_PACKET_SIZE,//SWAP(EP1_PACKET_SIZE),
(0080) 10
(0081) };
(0082) const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr=
(0083) {
(0084) sizeof(USB_ENDPOINT_DESCRIPTOR),
(0085) USB_ENDPOINT_DESCRIPTOR_TYPE,
(0086) 0x82,
(0087) USB_ENDPOINT_TYPE_BULK,
(0088) EP2_PACKET_SIZE,//SWAP(EP2_PACKET_SIZE),
(0089) 10
(0090) };
(0091) const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr=
(0092) {
(0093) sizeof(USB_ENDPOINT_DESCRIPTOR),
(0094) USB_ENDPOINT_DESCRIPTOR_TYPE,
(0095) 0x2,
(0096) USB_ENDPOINT_TYPE_BULK,
(0097) EP2_PACKET_SIZE,//SWAP(EP2_PACKET_SIZE),
(0098) 10
(0099) };
(0100) //USB Protocol layer
(0101) void reserved(void)
(0102) {
(0103) stall_ep0();
_reserved:
0480 940E0C50 CALL _stall_ep0
0482 9508 RET
_get_status:
c --> R20
endp --> R22
txdat --> Y+0
bRecipient --> R20
0483 940E0EEC CALL push_gset2
0485 9722 SBIW R28,2
(0104) }
(0105) //USB standard device requests
(0106) void get_status(void)
(0107) {
(0108) unsigned char endp,txdat[2];
(0109) unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
0486 9140035D LDS R20,ControlData
0488 714F ANDI R20,0x1F
(0110) unsigned char c;
(0111) if(bRecipient==USB_RECIPIENT_DEVICE)
0489 F4A1 BNE 0x049E
(0112) {
(0113) if(bEPPflags.bits.remote_wakeup==1)
048A 9180035A LDS R24,bEPPflags
048C 9586 LSR R24
048D 9586 LSR R24
048E 9586 LSR R24
048F 7081 ANDI R24,1
0490 3081 CPI R24,1
0491 F419 BNE 0x0495
(0114) txdat[0]=3;
0492 E083 LDI R24,3
0493 8388 STD Y+0,R24
0494 C002 RJMP 0x0497
(0115) else
(0116) txdat[0]=1;
0495 E081 LDI R24,1
0496 8388 STD Y+0,R24
(0117) txdat[1]=0;
0497 2422 CLR R2
0498 8229 STD Y+1,R2
(0118) single_transmit(txdat,2);
0499 E022 LDI R18,2
049A 018E MOVW R16,R28
049B 940E0C61 CALL _single_transmit
(0119) }
049D C034 RJMP 0x04D2
(0120) else if(bRecipient==USB_RECIPIENT_INTERFACE)
049E 3041 CPI R20,1
049F F441 BNE 0x04A8
(0121) {
(0122) txdat[0]=0;
04A0 2422 CLR R2
04A1 8228 STD Y+0,R2
(0123) txdat[1]=0;
04A2 8229 STD Y+1,R2
(0124) single_transmit(txdat,2);
04A3 E022 LDI R18,2
04A4 018E MOVW R16,R28
04A5 940E0C61 CALL _single_transmit
(0125) }
04A7 C02A RJMP 0x04D2
(0126) else if(bRecipient==USB_RECIPIENT_ENDPOINT)
04A8 3042 CPI R20,2
04A9 F531 BNE 0x04D0
(0127) {
(0128) endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
04AA 91600361 LDS R22,0x361
04AC 7063 ANDI R22,3
04AD 7070 ANDI R23,0
(0129) if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
04AE 90200361 LDS R2,0x361
04B0 90300362 LDS R3,0x362
04B2 FE27 SBRS R2,7
04B3 C008 RJMP 0x04BC
(0130) c=D12_SelectEndpoint(endp*2+1);
04B4 E082 LDI R24,2
04B5 9F86 MUL R24,R22
04B6 2D00 MOV R16,R0
04B7 5F0F SUBI R16,0xFF
04B8 940E062D CALL _D12_SelectEndpoint
04BA 2F40 MOV R20,R16
04BB C006 RJMP 0x04C2
(0131) else
(0132) c=D12_SelectEndpoint(endp*2);
04BC E082 LDI R24,2
04BD 9F86 MUL R24,R22
04BE 2D00 MOV R16,R0
04BF 940E062D CALL _D12_SelectEndpoint
04C1 2F40 MOV R20,R16
(0133) if(c&D12_STALL)
04C2 FF41 SBRS R20,1
04C3 C003 RJMP 0x04C7
(0134) txdat[0]=1;
04C4 E081 LDI R24,1
04C5 8388 STD Y+0,R24
04C6 C002 RJMP 0x04C9
(0135) else
(0136) txdat[0]=0;
04C7 2422 CLR R2
04C8 8228 STD Y+0,R2
(0137) txdat[1]=0;
04C9 2422 CLR R2
04CA 8229 STD Y+1,R2
(0138) single_transmit(txdat,2);
04CB E022 LDI R18,2
04CC 018E MOVW R16,R28
04CD 940E0C61 CALL _single_transmit
(0139) }
04CF C002 RJMP 0x04D2
(0140) else stall_ep0();
04D0 940E0C50 CALL _stall_ep0
04D2 9622 ADIW R28,2
04D3 940E0EDA CALL pop_gset2
04D5 9508 RET
_clear_feature:
endp --> R20
bRecipient --> R20
04D6 940E0EEE CALL push_gset1
(0141) }
(0142) void clear_feature(void)
(0143) {
(0144) unsigned char endp;
(0145) unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
04D8 9140035D LDS R20,ControlData
04DA 714F ANDI R20,0x1F
(0146) if(bRecipient==USB_RECIPIENT_DEVICE
04DB F4A9 BNE 0x04F1
04DC 9180035F LDS R24,ControlData+2
04DE 91900360 LDS R25,ControlData+3
04E0 3081 CPI R24,1
04E1 E0E0 LDI R30,0
04E2 079E CPC R25,R30
04E3 F469 BNE 0x04F1
(0147) &&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
(0148) {
(0149) DISABLE;
04E4 94F8 BCLR 7
(0150) bEPPflags.bits.remote_wakeup=0;
04E5 9180035A LDS R24,bEPPflags
04E7 7F87 ANDI R24,0xF7
04E8 9380035A STS bEPPflags,R24
(0151) ENABLE;
04EA 9478 BSET 7
(0152) single_transmit(0,0);
04EB 2722 CLR R18
04EC 2700 CLR R16
04ED 2711 CLR R17
04EE 940E0C61 CALL _single_transmit
(0153) }
04F0 C02A RJMP 0x051B
(0154) else if(bRecipient==USB_RECIPIENT_ENDPOINT
04F1 3042 CPI R20,2
04F2 F531 BNE 0x0519
04F3 9020035F LDS R2,ControlData+2
04F5 90300360 LDS R3,ControlData+3
04F7 2022 TST R2
04F8 F501 BNE 0x0519
04F9 2033 TST R3
04FA F4F1 BNE 0x0519
(0155) &&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
(0156) {
(0157) endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
04FB 91400361 LDS R20,0x361
04FD 7043 ANDI R20,3
04FE 7050 ANDI R21,0
(0158) if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
04FF 90200361 LDS R2,0x361
0501 90300362 LDS R3,0x362
0503 FE27 SBRS R2,7
0504 C008 RJMP 0x050D
(0159) D12_SetEndpointStatus(endp*2+1,0);
0505 2722 CLR R18
0506 E082 LDI R24,2
0507 9F84 MUL R24,R20
0508 2D00 MOV R16,R0
0509 5F0F SUBI R16,0xFF
050A 940E0648 CALL _D12_SetEndpointStatus
050C C006 RJMP 0x0513
(0160) else
(0161) D12_SetEndpointStatus(endp*2,0);
050D 2722 CLR R18
050E E082 LDI R24,2
050F 9F84 MUL R24,R20
0510 2D00 MOV R16,R0
0511 940E0648 CALL _D12_SetEndpointStatus
(0162) single_transmit(0,0);
0513 2722 CLR R18
0514 2700 CLR R16
0515 2711 CLR R17
0516 940E0C61 CALL _single_transmit
(0163) }
0518 C002 RJMP 0x051B
(0164) else stall_ep0();
0519 940E0C50 CALL _stall_ep0
051B 940E0EF1 CALL pop_gset1
051D 9508 RET
_set_feature:
endp --> R20
bRecipient --> R20
051E 940E0EEE CALL push_gset1
(0165) }
(0166) void set_feature(void)
(0167) {
(0168) unsigned char endp;
(0169) unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
0520 9140035D LDS R20,ControlData
0522 714F ANDI R20,0x1F
(0170) if(bRecipient==USB_RECIPIENT_DEVICE
0523 F4A9 BNE 0x0539
0524 9180035F LDS R24,ControlData+2
0526 91900360 LDS R25,ControlData+3
0528 3081 CPI R24,1
0529 E0E0 LDI R30,0
052A 079E CPC R25,R30
052B F469 BNE 0x0539
(0171) &&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
(0172) {
(0173) DISABLE;
052C 94F8 BCLR 7
(0174) bEPPflags.bits.remote_wakeup=1;
052D 9180035A LDS R24,bEPPflags
052F 6088 ORI R24,0x8
0530 9380035A STS bEPPflags,R24
(0175) ENABLE;
0532 9478 BSET 7
(0176) single_transmit(0,0);
0533 2722 CLR R18
0534 2700 CLR R16
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?