📄 usbdisk.lst
字号:
044B F4E8 BCC 0x0469
(0207) {
(0208) Erase_Cluster(CANCEL_BLOCK);
044C EF0F LDI R16,0xFF
044D E017 LDI R17,7
044E 940E072A 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 940E0757 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 940E0790 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 940E0EDA 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 940E0E01 CALL _Bulk_ErrorHandler
(0221) Bulk_CSWHandler();
0473 940E0D5A 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 940E0E01 CALL _Bulk_ErrorHandler
(0227) Bulk_CSWHandler();
047C 940E0D5A CALL _Bulk_CSWHandler
(0228) return TRUE;
047E E001 LDI R16,1
047F 9508 RET
FILE: D:\AvrUSB\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();
(0104) }
_reserved:
0480 940C0C4A JMP _stall_ep0
_get_status:
c --> R20
endp --> R22
txdat --> Y+0
bRecipient --> R20
0482 940E0EF4 CALL push_gset2
0484 9722 SBIW R28,2
(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;
0485 9140035D LDS R20,_ControlData
0487 714F ANDI R20,0x1F
(0110) unsigned char c;
(0111) if(bRecipient==USB_RECIPIENT_DEVICE)
0488 F4A1 BNE 0x049D
(0112) {
(0113) if(bEPPflags.bits.remote_wakeup==1)
0489 9180035A LDS R24,_bEPPflags
048B 9586 LSR R24
048C 9586 LSR R24
048D 9586 LSR R24
048E 7081 ANDI R24,1
048F 3081 CPI R24,1
0490 F419 BNE 0x0494
(0114) txdat[0]=3;
0491 E083 LDI R24,3
0492 8388 STD Y+0,R24
0493 C002 RJMP 0x0496
(0115) else
(0116) txdat[0]=1;
0494 E081 LDI R24,1
0495 8388 STD Y+0,R24
(0117) txdat[1]=0;
0496 2422 CLR R2
0497 8229 STD Y+1,R2
(0118) single_transmit(txdat,2);
0498 E022 LDI R18,2
0499 018E MOVW R16,R28
049A 940E0C58 CALL _single_transmit
(0119) }
049C C034 RJMP 0x04D1
(0120) else if(bRecipient==USB_RECIPIENT_INTERFACE)
049D 3041 CPI R20,1
049E F441 BNE 0x04A7
(0121) {
(0122) txdat[0]=0;
049F 2422 CLR R2
04A0 8228 STD Y+0,R2
(0123) txdat[1]=0;
04A1 8229 STD Y+1,R2
(0124) single_transmit(txdat,2);
04A2 E022 LDI R18,2
04A3 018E MOVW R16,R28
04A4 940E0C58 CALL _single_transmit
(0125) }
04A6 C02A RJMP 0x04D1
(0126) else if(bRecipient==USB_RECIPIENT_ENDPOINT)
04A7 3042 CPI R20,2
04A8 F531 BNE 0x04CF
(0127) {
(0128) endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
04A9 91600361 LDS R22,0x361
04AB 7063 ANDI R22,3
04AC 7070 ANDI R23,0
(0129) if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
04AD 90200361 LDS R2,0x361
04AF 90300362 LDS R3,0x362
04B1 FE27 SBRS R2,7
04B2 C008 RJMP 0x04BB
(0130) c=D12_SelectEndpoint(endp*2+1);
04B3 E082 LDI R24,2
04B4 9F86 MUL R24,R22
04B5 2D00 MOV R16,R0
04B6 5F0F SUBI R16,0xFF
04B7 940E062B CALL _D12_SelectEndpoint
04B9 2F40 MOV R20,R16
04BA C006 RJMP 0x04C1
(0131) else
(0132) c=D12_SelectEndpoint(endp*2);
04BB E082 LDI R24,2
04BC 9F86 MUL R24,R22
04BD 2D00 MOV R16,R0
04BE 940E062B CALL _D12_SelectEndpoint
04C0 2F40 MOV R20,R16
(0133) if(c&D12_STALL)
04C1 FF41 SBRS R20,1
04C2 C003 RJMP 0x04C6
(0134) txdat[0]=1;
04C3 E081 LDI R24,1
04C4 8388 STD Y+0,R24
04C5 C002 RJMP 0x04C8
(0135) else
(0136) txdat[0]=0;
04C6 2422 CLR R2
04C7 8228 STD Y+0,R2
(0137) txdat[1]=0;
04C8 2422 CLR R2
04C9 8229 STD Y+1,R2
(0138) single_transmit(txdat,2);
04CA E022 LDI R18,2
04CB 018E MOVW R16,R28
04CC 940E0C58 CALL _single_transmit
(0139) }
04CE C002 RJMP 0x04D1
(0140) else stall_ep0();
04CF 940E0C4A CALL _stall_ep0
(0141) }
04D1 9622 ADIW R28,2
04D2 940E0ED1 CALL pop_gset2
04D4 9508 RET
_clear_feature:
endp --> R20
bRecipient --> R20
04D5 940E0EDD CALL push_gset1
(0142) void clear_feature(void)
(0143) {
(0144) unsigned char endp;
(0145) unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
04D7 9140035D LDS R20,_ControlData
04D9 714F ANDI R20,0x1F
(0146) if(bRecipient==USB_RECIPIENT_DEVICE
04DA F4A9 BNE 0x04F0
04DB 9180035F LDS R24,_ControlData+2
04DD 91900360 LDS R25,_ControlData+3
04DF 3081 CPI R24,1
04E0 E0E0 LDI R30,0
04E1 079E CPC R25,R30
04E2 F469 BNE 0x04F0
(0147) &&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
(0148) {
(0149) DISABLE;
04E3 94F8 BCLR 7
(0150) bEPPflags.bits.remote_wakeup=0;
04E4 9180035A LDS R24,_bEPPflags
04E6 7F87 ANDI R24,0xF7
04E7 9380035A STS _bEPPflags,R24
(0151) ENABLE;
04E9 9478 BSET 7
(0152) single_transmit(0,0);
04EA 2722 CLR R18
04EB 2700 CLR R16
04EC 2711 CLR R17
04ED 940E0C58 CALL _single_transmit
(0153) }
04EF C02A RJMP 0x051A
(0154) else if(bRecipient==USB_RECIPIENT_ENDPOINT
04F0 3042 CPI R20,2
04F1 F531 BNE 0x0518
04F2 9020035F LDS R2,_ControlData+2
04F4 90300360 LDS R3,_ControlData+3
04F6 2022 TST R2
04F7 F501 BNE 0x0518
04F8 2033 TST R3
04F9 F4F1 BNE 0x0518
(0155) &&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
(0156) {
(0157) endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
04FA 91400361 LDS R20,0x361
04FC 7043 ANDI R20,3
04FD 7050 ANDI R21,0
(0158) if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
04FE 90200361 LDS R2,0x361
0500 90300362 LDS R3,0x362
0502 FE27 SBRS R2,7
0503 C008 RJMP 0x050C
(0159) D12_SetEndpointStatus(endp*2+1,0);
0504 2722 CLR R18
0505 E082 LDI R24,2
0506 9F84 MUL R24,R20
0507 2D00 MOV R16,R0
0508 5F0F SUBI R16,0xFF
0509 940E0646 CALL _D12_SetEndpointStatus
050B C006 RJMP 0x0512
(0160) else
(0161) D12_SetEndpointStatus(endp*2,0);
050C 2722 CLR R18
050D E082 LDI R24,2
050E 9F84 MUL R24,R20
050F 2D00 MOV R16,R0
0510 940E0646 CALL _D12_SetEndpointStatus
(0162) single_transmit(0,0);
0512 2722 CLR R18
0513 2700 CLR R16
0514 2711 CLR R17
0515 940E0C58 CALL _single_transmit
(0163) }
0517 C002 RJMP 0x051A
(0164) else stall_ep0();
0518 940E0C4A CALL _stall_ep0
(0165) }
051A 940E0EE0 CALL pop_gset1
051C 9508 RET
_set_feature:
endp --> R20
bRecipient --> R20
051D 940E0EDD CALL push_gset1
(0166) void set_feature(void)
(0167) {
(0168) unsigned char endp;
(0169) unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
051F 9140035D LDS R20,_ControlData
0521 714F ANDI R20,0x1F
(0170) if(bRecipient==USB_RECIPIENT_DEVICE
0522 F4A9 BNE 0x0538
0523 9180035F LDS R24,_ControlData+2
0525 91900360 LDS R25,_ControlData+3
0527 3081 CPI R24,1
0528 E0E0 LDI R30,0
0529 079E CPC R25,R30
052A F469 BNE 0x0538
(0171) &&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
(0172) {
(0173) DISABLE;
052B 94F8 BCLR 7
(0174) bEPPflags.bits.remote_wakeup=1;
052C 9180035A LDS R24,_bEPPflags
052E 6088 ORI R24,0x8
052F 9380035A STS _bEPPflags,R24
(0175) ENABLE;
0531 9478 BSET 7
(0176) single_transmit(0,0);
0532 2722 CLR R18
0533 2700 CLR R16
0534 2711 CLR R17
0535 940E0C58 CALL _single_transmit
(0177) }
0537 C02A RJMP 0x0562
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -