📄 usbdisk.lst
字号:
(0178) else if(bRecipient==USB_RECIPIENT_ENDPOINT
0538 3042 CPI R20,2
0539 F531 BNE 0x0560
053A 9020035F LDS R2,_ControlData+2
053C 90300360 LDS R3,_ControlData+3
053E 2022 TST R2
053F F501 BNE 0x0560
0540 2033 TST R3
0541 F4F1 BNE 0x0560
(0179) &&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
(0180) {
(0181) endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
0542 91400361 LDS R20,0x361
0544 7043 ANDI R20,3
0545 7050 ANDI R21,0
(0182) if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
0546 90200361 LDS R2,0x361
0548 90300362 LDS R3,0x362
054A FE27 SBRS R2,7
054B C008 RJMP 0x0554
(0183) D12_SetEndpointStatus(endp*2+1,1);
054C E021 LDI R18,1
054D E082 LDI R24,2
054E 9F84 MUL R24,R20
054F 2D00 MOV R16,R0
0550 5F0F SUBI R16,0xFF
0551 940E0646 CALL _D12_SetEndpointStatus
0553 C006 RJMP 0x055A
(0184) else
(0185) D12_SetEndpointStatus(endp*2,1);
0554 E021 LDI R18,1
0555 E082 LDI R24,2
0556 9F84 MUL R24,R20
0557 2D00 MOV R16,R0
0558 940E0646 CALL _D12_SetEndpointStatus
(0186) single_transmit(0,0);
055A 2722 CLR R18
055B 2700 CLR R16
055C 2711 CLR R17
055D 940E0C58 CALL _single_transmit
(0187) }
055F C002 RJMP 0x0562
(0188) else stall_ep0();
0560 940E0C4A CALL _stall_ep0
(0189) }
0562 940E0EE0 CALL pop_gset1
0564 9508 RET
(0190) void set_address(void)
(0191) {
(0192) D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue&DEVICE_ADDRESS_MASK),1);
_set_address:
0565 E021 LDI R18,1
0566 9100035F LDS R16,_ControlData+2
0568 770F ANDI R16,0x7F
0569 7010 ANDI R17,0
056A 940E0605 CALL _D12_SetAddressEnable
(0193) single_transmit(0,0);
056C 2722 CLR R18
056D 2700 CLR R16
056E 2711 CLR R17
(0194) }
056F 940C0C58 JMP _single_transmit
_get_descriptor:
bDescriptor --> R20
0571 940E0EDD CALL push_gset1
(0195) void get_descriptor(void)
(0196) {
(0197) unsigned char bDescriptor=MSB(ControlData.DeviceRequest.wValue);
0573 9140035F LDS R20,_ControlData+2
0575 91500360 LDS R21,_ControlData+3
0577 2F45 MOV R20,R21
0578 2755 CLR R21
0579 7050 ANDI R21,0
(0198) if(bDescriptor==USB_DEVICE_DESCRIPTOR_TYPE)
057A 3041 CPI R20,1
057B F439 BNE 0x0583
(0199) {
(0200) code_transmit((unsigned char*)&DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
057C E122 LDI R18,0x12
057D E030 LDI R19,0
057E EC00 LDI R16,0xC0
057F E010 LDI R17,0
0580 940E0C6A CALL _code_transmit
(0201) }
0582 C00B RJMP 0x058E
(0202) else if(bDescriptor==USB_CONFIGURATION_DESCRIPTOR_TYPE)
0583 3042 CPI R20,2
0584 F439 BNE 0x058C
(0203) {
(0204) code_transmit((unsigned char *)&ConfigDescr,CONFIG_DESCRIPTOR_LENGTH);
0585 E22E LDI R18,0x2E
0586 E030 LDI R19,0
0587 ED02 LDI R16,0xD2
0588 E010 LDI R17,0
0589 940E0C6A CALL _code_transmit
(0205) }
058B C002 RJMP 0x058E
(0206) else stall_ep0();
058C 940E0C4A CALL _stall_ep0
(0207) }
058E 940E0EE0 CALL pop_gset1
0590 9508 RET
_get_configuration:
c --> Y+0
0591 9721 SBIW R28,1
(0208) void get_configuration(void)
(0209) {
(0210) unsigned char c=bEPPflags.bits.configuration;
0592 9180035A LDS R24,_bEPPflags
0594 9586 LSR R24
0595 9586 LSR R24
0596 9586 LSR R24
0597 9586 LSR R24
0598 9586 LSR R24
0599 9586 LSR R24
059A 9586 LSR R24
059B 7081 ANDI R24,1
059C 8388 STD Y+0,R24
(0211) single_transmit(&c,1);
059D E021 LDI R18,1
059E 018E MOVW R16,R28
059F 940E0C58 CALL _single_transmit
(0212) }
05A1 9621 ADIW R28,1
05A2 9508 RET
(0213) void set_configuration(void)
(0214) {
(0215) if(ControlData.DeviceRequest.wValue==0)
_set_configuration:
05A3 9020035F LDS R2,_ControlData+2
05A5 90300360 LDS R3,_ControlData+3
05A7 2022 TST R2
05A8 F489 BNE 0x05BA
05A9 2033 TST R3
05AA F479 BNE 0x05BA
(0216) {
(0217) single_transmit(0,0);
05AB 2722 CLR R18
05AC 2700 CLR R16
05AD 2711 CLR R17
05AE 940E0C58 CALL _single_transmit
(0218) DISABLE;
05B0 94F8 BCLR 7
(0219) bEPPflags.bits.configuration=0;
05B1 9180035A LDS R24,_bEPPflags
05B3 778F ANDI R24,0x7F
05B4 9380035A STS _bEPPflags,R24
(0220) ENABLE;
05B6 9478 BSET 7
(0221) init_unconfig();
05B7 940E0C52 CALL _init_unconfig
(0222) }
05B9 C01B RJMP 0x05D5
(0223) else if(ControlData.DeviceRequest.wValue==1)
05BA 9180035F LDS R24,_ControlData+2
05BC 91900360 LDS R25,_ControlData+3
05BE 3081 CPI R24,1
05BF E0E0 LDI R30,0
05C0 079E CPC R25,R30
05C1 F489 BNE 0x05D3
(0224) {
(0225) single_transmit(0,0);
05C2 2722 CLR R18
05C3 2700 CLR R16
05C4 2711 CLR R17
05C5 940E0C58 CALL _single_transmit
(0226) init_unconfig();
05C7 940E0C52 CALL _init_unconfig
(0227) init_config();
05C9 940E0C55 CALL _init_config
(0228) DISABLE;
05CB 94F8 BCLR 7
(0229) bEPPflags.bits.configuration=1;
05CC 9180035A LDS R24,_bEPPflags
05CE 6880 ORI R24,0x80
05CF 9380035A STS _bEPPflags,R24
(0230) ENABLE;
05D1 9478 BSET 7
(0231) }
05D2 C002 RJMP 0x05D5
(0232) else stall_ep0();
05D3 940E0C4A CALL _stall_ep0
(0233) }
05D5 9508 RET
_get_interface:
txdat --> Y+0
05D6 9721 SBIW R28,1
(0234) void get_interface(void)
(0235) {
(0236) unsigned char txdat=0;
05D7 2422 CLR R2
05D8 8228 STD Y+0,R2
(0237) single_transmit(&txdat,1);
05D9 E021 LDI R18,1
05DA 018E MOVW R16,R28
05DB 940E0C58 CALL _single_transmit
(0238) }
05DD 9621 ADIW R28,1
05DE 9508 RET
(0239) void set_interface(void)
(0240) {
(0241) if(ControlData.DeviceRequest.wValue==0&&ControlData.DeviceRequest.wIndex==0)
_set_interface:
05DF 9020035F LDS R2,_ControlData+2
05E1 90300360 LDS R3,_ControlData+3
05E3 2022 TST R2
05E4 F481 BNE 0x05F5
05E5 2033 TST R3
05E6 F471 BNE 0x05F5
05E7 90200361 LDS R2,0x361
05E9 90300362 LDS R3,0x362
05EB 2022 TST R2
05EC F441 BNE 0x05F5
05ED 2033 TST R3
05EE F431 BNE 0x05F5
(0242) single_transmit(0,0);
05EF 2722 CLR R18
05F0 2700 CLR R16
05F1 2711 CLR R17
05F2 940E0C58 CALL _single_transmit
05F4 C002 RJMP 0x05F7
(0243) else stall_ep0();
05F5 940E0C4A CALL _stall_ep0
(0244) }
05F7 9508 RET
FILE: D:\AvrUSB\D12CI.C
(0001) #include <macros.h>
(0002) #include "D12CI.h"
(0003) #include "MAIN.h"
(0004)
(0005) #define cwait asm("nop")
(0006) #define cwait1 asm("nop");asm("nop")
(0007)
(0008) extern EPPFLAGS bEPPflags;
(0009)
(0010) void D12_SetEndpointEnable(unsigned char bEnable)
(0011) {
(0012) D12_COMMAND=0xD8;
_D12_SetEndpointEnable:
bEnable --> R16
05F8 ED88 LDI R24,0xD8
05F9 93807C01 STS 0x7C01,R24
(0013) if(bEnable)
05FB 2300 TST R16
05FC F021 BEQ 0x0601
(0014) D12_DATA=1;
05FD E081 LDI R24,1
05FE 93807C00 STS 0x7C00,R24
0600 C003 RJMP 0x0604
(0015) else
(0016) D12_DATA=0;
0601 2422 CLR R2
0602 92207C00 STS 0x7C00,R2
(0017) }
0604 9508 RET
(0018) void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
(0019) {
(0020) D12_COMMAND=0xD0;
_D12_SetAddressEnable:
bEnable --> R18
bAddress --> R16
0605 ED80 LDI R24,0xD0
0606 93807C01 STS 0x7C01,R24
(0021) if(bEnable)
0608 2322 TST R18
0609 F009 BEQ 0x060B
(0022) bAddress|=0x80;
060A 6800 ORI R16,0x80
(0023) D12_DATA=bAddress;
060B 93007C00 STS 0x7C00,R16
(0024) }
060D 9508 RET
(0025) void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
(0026) {
(0027) D12_COMMAND=0xF3;
_D12_SetMode:
bClkDiv --> R18
bConfig --> R16
060E EF83 LDI R24,0xF3
060F 93807C01 STS 0x7C01,R24
(0028) D12_DATA=bConfig;
0611 93007C00 STS 0x7C00,R16
(0029) cwait1;
0613 0000 NOP
0614 0000 NOP
(0030) D12_DATA=bClkDiv;
0615 93207C00 STS 0x7C00,R18
(0031) }
0617 9508 RET
(0032) void D12_SetDMA(unsigned char bMode)
(0033) {
(0034) D12_COMMAND=0xFB;
_D12_SetDMA:
bMode --> R16
0618 EF8B LDI R24,0xFB
0619 93807C01 STS 0x7C01,R24
(0035) cwait;
061B 0000 NOP
(0036) D12_DATA=bMode;
061C 93007C00 STS 0x7C00,R16
(0037) }
061E 9508 RET
(0038) unsigned char D12_ReadInterruptRegister(void)
(0039) {
(0040) unsigned char bl;
(0041) unsigned char j;
(0042) j=0;
_D12_ReadInterruptRegister:
j --> R18
bl --> R16
061F 2722 CLR R18
(0043) D12_COMMAND=0xF4;
0620 EF84 LDI R24,0xF4
0621 93807C01 STS 0x7C01,R24
(0044) cwait;
0623 0000 NOP
(0045) bl=D12_DATA;
0624 91007C00 LDS R16,0x7C00
(0046) cwait1;
0626 0000 NOP
0627 0000 NOP
(0047) j=D12_DATA;
0628 91207C00 LDS R18,0x7C00
(0048) return bl;
062A 9508 RET
_D12_SelectEndpoint:
c --> R20
bEndp --> R16
062B 940E0EDD CALL push_gset1
(0049) }
(0050) unsigned char D12_SelectEndpoint(unsigned char bEndp)
(0051) {
(0052) unsigned char c;
(0053) D12_COMMAND=bEndp;
062D 93007C01 STS 0x7C01,R16
(0054) cwait;
062F 0000 NOP
(0055) c=D12_DATA;
0630 91407C00 LDS R20,0x7C00
(0056) return c;
0632 2F04 MOV R16,R20
0633 940E0EE0 CALL pop_gset1
0635 9508 RET
(0057) }
(0058) unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
(0059) {
(0060) D12_COMMAND=0x40+bEndp;
_D12_ReadLastTransactionStatus:
bEndp --> R16
0636 2F80 MOV R24,R16
0637 5C80 SUBI R24,0xC0
0638 93807C01 STS 0x7C01,R24
(0061) cwait;
063A 0000 NOP
(0062) return D12_DATA;
063B 91007C00 LDS R16,0x7C00
063D 9508 RET
(0063) }
(0064) unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
(0065) {
(0066) D12_COMMAND=0x80+bEndp;
_D12_ReadEndpointStatus:
bEndp --> R16
063E 2F80 MOV R24,R16
063F 5880 SUBI R24,0x80
0640 93807C01 STS 0x7C01,R24
(0067) cwait;
0642 0000 NOP
(0068) return D12_DATA;
0643 91007C00 LDS R16,0x7C00
0645 9508 RET
(0069) }
(0070) void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
(0071) {
(0072) unsigned char c;
(0073) D12_COMMAND=0x40+bEndp;
_D12_SetEndpointStatus:
c --> Y+1
bStalled --> R18
bEndp --> R16
0646 2F80 MOV R24,R16
0647 5C80 SUBI R24,0xC0
0648 93807C01 STS 0x7C01,R24
(0074) cwait;
064A 0000 NOP
(0075) D12_DATA=bStalled;
064B 93207C00 STS 0x7C00,R18
(0076) }
064D 9508 RET
_D12_ReadEndpoint:
j --> R20
i --> R22
buf --> R10
len --> R18
endp --> R16
064E 940E0EF8 CALL push_gset3
0650 80AE LDD R10,Y+6
0651 80BF LDD R11,Y+7
(0077) unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len,
(0078) unsigned char * buf)
(0079) {
(0080) unsigned char i,j;
(0081) D12_COMMAND=endp;
0652 93007C01 STS 0x7C01,R16
(0082) cwait;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -