usbdisk.lst
来自「基于D12」· LST 代码 · 共 2,018 行 · 第 1/5 页
LST
2,018 行
0535 2711 CLR R17
0536 940E0C61 CALL _single_transmit
(0177) }
0538 C02A RJMP 0x0563
(0178) else if(bRecipient==USB_RECIPIENT_ENDPOINT
0539 3042 CPI R20,2
053A F531 BNE 0x0561
053B 9020035F LDS R2,ControlData+2
053D 90300360 LDS R3,ControlData+3
053F 2022 TST R2
0540 F501 BNE 0x0561
0541 2033 TST R3
0542 F4F1 BNE 0x0561
(0179) &&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
(0180) {
(0181) endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
0543 91400361 LDS R20,0x361
0545 7043 ANDI R20,3
0546 7050 ANDI R21,0
(0182) if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
0547 90200361 LDS R2,0x361
0549 90300362 LDS R3,0x362
054B FE27 SBRS R2,7
054C C008 RJMP 0x0555
(0183) D12_SetEndpointStatus(endp*2+1,1);
054D E021 LDI R18,1
054E E082 LDI R24,2
054F 9F84 MUL R24,R20
0550 2D00 MOV R16,R0
0551 5F0F SUBI R16,0xFF
0552 940E0648 CALL _D12_SetEndpointStatus
0554 C006 RJMP 0x055B
(0184) else
(0185) D12_SetEndpointStatus(endp*2,1);
0555 E021 LDI R18,1
0556 E082 LDI R24,2
0557 9F84 MUL R24,R20
0558 2D00 MOV R16,R0
0559 940E0648 CALL _D12_SetEndpointStatus
(0186) single_transmit(0,0);
055B 2722 CLR R18
055C 2700 CLR R16
055D 2711 CLR R17
055E 940E0C61 CALL _single_transmit
(0187) }
0560 C002 RJMP 0x0563
(0188) else stall_ep0();
0561 940E0C50 CALL _stall_ep0
0563 940E0EF1 CALL pop_gset1
0565 9508 RET
(0189) }
(0190) void set_address(void)
(0191) {
(0192) D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue&DEVICE_ADDRESS_MASK),1);
_set_address:
0566 E021 LDI R18,1
0567 9100035F LDS R16,ControlData+2
0569 770F ANDI R16,0x7F
056A 7010 ANDI R17,0
056B 940E0607 CALL _D12_SetAddressEnable
(0193) single_transmit(0,0);
056D 2722 CLR R18
056E 2700 CLR R16
056F 2711 CLR R17
0570 940E0C61 CALL _single_transmit
0572 9508 RET
_get_descriptor:
bDescriptor --> R20
0573 940E0EEE CALL push_gset1
(0194) }
(0195) void get_descriptor(void)
(0196) {
(0197) unsigned char bDescriptor=MSB(ControlData.DeviceRequest.wValue);
0575 9140035F LDS R20,ControlData+2
0577 91500360 LDS R21,ControlData+3
0579 2F45 MOV R20,R21
057A 2755 CLR R21
057B 7050 ANDI R21,0
(0198) if(bDescriptor==USB_DEVICE_DESCRIPTOR_TYPE)
057C 3041 CPI R20,1
057D F439 BNE 0x0585
(0199) {
(0200) code_transmit((unsigned char*)&DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
057E E122 LDI R18,0x12
057F E030 LDI R19,0
0580 EC00 LDI R16,0xC0
0581 E010 LDI R17,0
0582 940E0C73 CALL _code_transmit
(0201) }
0584 C00B RJMP 0x0590
(0202) else if(bDescriptor==USB_CONFIGURATION_DESCRIPTOR_TYPE)
0585 3042 CPI R20,2
0586 F439 BNE 0x058E
(0203) {
(0204) code_transmit((unsigned char *)&ConfigDescr,CONFIG_DESCRIPTOR_LENGTH);
0587 E22E LDI R18,0x2E
0588 E030 LDI R19,0
0589 ED02 LDI R16,0xD2
058A E010 LDI R17,0
058B 940E0C73 CALL _code_transmit
(0205) }
058D C002 RJMP 0x0590
(0206) else stall_ep0();
058E 940E0C50 CALL _stall_ep0
0590 940E0EF1 CALL pop_gset1
0592 9508 RET
_get_configuration:
c --> Y+0
0593 9721 SBIW R28,1
(0207) }
(0208) void get_configuration(void)
(0209) {
(0210) unsigned char c=bEPPflags.bits.configuration;
0594 9180035A LDS R24,bEPPflags
0596 9586 LSR R24
0597 9586 LSR R24
0598 9586 LSR R24
0599 9586 LSR R24
059A 9586 LSR R24
059B 9586 LSR R24
059C 9586 LSR R24
059D 7081 ANDI R24,1
059E 8388 STD Y+0,R24
(0211) single_transmit(&c,1);
059F E021 LDI R18,1
05A0 018E MOVW R16,R28
05A1 940E0C61 CALL _single_transmit
05A3 9621 ADIW R28,1
05A4 9508 RET
(0212) }
(0213) void set_configuration(void)
(0214) {
(0215) if(ControlData.DeviceRequest.wValue==0)
_set_configuration:
05A5 9020035F LDS R2,ControlData+2
05A7 90300360 LDS R3,ControlData+3
05A9 2022 TST R2
05AA F489 BNE 0x05BC
05AB 2033 TST R3
05AC F479 BNE 0x05BC
(0216) {
(0217) single_transmit(0,0);
05AD 2722 CLR R18
05AE 2700 CLR R16
05AF 2711 CLR R17
05B0 940E0C61 CALL _single_transmit
(0218) DISABLE;
05B2 94F8 BCLR 7
(0219) bEPPflags.bits.configuration=0;
05B3 9180035A LDS R24,bEPPflags
05B5 778F ANDI R24,0x7F
05B6 9380035A STS bEPPflags,R24
(0220) ENABLE;
05B8 9478 BSET 7
(0221) init_unconfig();
05B9 940E0C59 CALL _init_unconfig
(0222) }
05BB C01B RJMP 0x05D7
(0223) else if(ControlData.DeviceRequest.wValue==1)
05BC 9180035F LDS R24,ControlData+2
05BE 91900360 LDS R25,ControlData+3
05C0 3081 CPI R24,1
05C1 E0E0 LDI R30,0
05C2 079E CPC R25,R30
05C3 F489 BNE 0x05D5
(0224) {
(0225) single_transmit(0,0);
05C4 2722 CLR R18
05C5 2700 CLR R16
05C6 2711 CLR R17
05C7 940E0C61 CALL _single_transmit
(0226) init_unconfig();
05C9 940E0C59 CALL _init_unconfig
(0227) init_config();
05CB 940E0C5D CALL _init_config
(0228) DISABLE;
05CD 94F8 BCLR 7
(0229) bEPPflags.bits.configuration=1;
05CE 9180035A LDS R24,bEPPflags
05D0 6880 ORI R24,0x80
05D1 9380035A STS bEPPflags,R24
(0230) ENABLE;
05D3 9478 BSET 7
(0231) }
05D4 C002 RJMP 0x05D7
(0232) else stall_ep0();
05D5 940E0C50 CALL _stall_ep0
05D7 9508 RET
_get_interface:
txdat --> Y+0
05D8 9721 SBIW R28,1
(0233) }
(0234) void get_interface(void)
(0235) {
(0236) unsigned char txdat=0;
05D9 2422 CLR R2
05DA 8228 STD Y+0,R2
(0237) single_transmit(&txdat,1);
05DB E021 LDI R18,1
05DC 018E MOVW R16,R28
05DD 940E0C61 CALL _single_transmit
05DF 9621 ADIW R28,1
05E0 9508 RET
(0238) }
(0239) void set_interface(void)
(0240) {
(0241) if(ControlData.DeviceRequest.wValue==0&&ControlData.DeviceRequest.wIndex==0)
_set_interface:
05E1 9020035F LDS R2,ControlData+2
05E3 90300360 LDS R3,ControlData+3
05E5 2022 TST R2
05E6 F481 BNE 0x05F7
05E7 2033 TST R3
05E8 F471 BNE 0x05F7
05E9 90200361 LDS R2,0x361
05EB 90300362 LDS R3,0x362
05ED 2022 TST R2
05EE F441 BNE 0x05F7
05EF 2033 TST R3
05F0 F431 BNE 0x05F7
(0242) single_transmit(0,0);
05F1 2722 CLR R18
05F2 2700 CLR R16
05F3 2711 CLR R17
05F4 940E0C61 CALL _single_transmit
05F6 C002 RJMP 0x05F9
(0243) else stall_ep0();
05F7 940E0C50 CALL _stall_ep0
05F9 9508 RET
FILE: J:\PDIUSBD12-Materials\富昌\优盘5.0\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
05FA ED88 LDI R24,0xD8
05FB 93807C01 STS 0x7C01,R24
(0013) if(bEnable)
05FD 2300 TST R16
05FE F021 BEQ 0x0603
(0014) D12_DATA=1;
05FF E081 LDI R24,1
0600 93807C00 STS 0x7C00,R24
0602 C003 RJMP 0x0606
(0015) else
(0016) D12_DATA=0;
0603 2422 CLR R2
0604 92207C00 STS 0x7C00,R2
0606 9508 RET
(0017) }
(0018) void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
(0019) {
(0020) D12_COMMAND=0xD0;
_D12_SetAddressEnable:
bEnable --> R18
bAddress --> R16
0607 ED80 LDI R24,0xD0
0608 93807C01 STS 0x7C01,R24
(0021) if(bEnable)
060A 2322 TST R18
060B F009 BEQ 0x060D
(0022) bAddress|=0x80;
060C 6800 ORI R16,0x80
(0023) D12_DATA=bAddress;
060D 93007C00 STS 0x7C00,R16
060F 9508 RET
(0024) }
(0025) void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
(0026) {
(0027) D12_COMMAND=0xF3;
_D12_SetMode:
bClkDiv --> R18
bConfig --> R16
0610 EF83 LDI R24,0xF3
0611 93807C01 STS 0x7C01,R24
(0028) D12_DATA=bConfig;
0613 93007C00 STS 0x7C00,R16
(0029) cwait1;
0615 0000 NOP
0616 0000 NOP
(0030) D12_DATA=bClkDiv;
0617 93207C00 STS 0x7C00,R18
0619 9508 RET
(0031) }
(0032) void D12_SetDMA(unsigned char bMode)
(0033) {
(0034) D12_COMMAND=0xFB;
_D12_SetDMA:
bMode --> R16
061A EF8B LDI R24,0xFB
061B 93807C01 STS 0x7C01,R24
(0035) cwait;
061D 0000 NOP
(0036) D12_DATA=bMode;
061E 93007C00 STS 0x7C00,R16
0620 9508 RET
(0037) }
(0038) unsigned char D12_ReadInterruptRegister(void)
(0039) {
(0040) unsigned char bl;
(0041) unsigned char j;
(0042) j=0;
_D12_ReadInterruptRegister:
j --> R18
bl --> R16
0621 2722 CLR R18
(0043) D12_COMMAND=0xF4;
0622 EF84 LDI R24,0xF4
0623 93807C01 STS 0x7C01,R24
(0044) cwait;
0625 0000 NOP
(0045) bl=D12_DATA;
0626 91007C00 LDS R16,0x7C00
(0046) cwait1;
0628 0000 NOP
0629 0000 NOP
(0047) j=D12_DATA;
062A 91207C00 LDS R18,0x7C00
(0048) return bl;
062C 9508 RET
_D12_SelectEndpoint:
c --> R20
bEndp --> R16
062D 940E0EEE CALL push_gset1
(0049) }
(0050) unsigned char D12_SelectEndpoint(unsigned char bEndp)
(0051) {
(0052) unsigned char c;
(0053) D12_COMMAND=bEndp;
062F 93007C01 STS 0x7C01,R16
(0054) cwait;
0631 0000 NOP
(0055) c=D12_DATA;
0632 91407C00 LDS R20,0x7C00
(0056) return c;
0634 2F04 MOV R16,R20
0635 940E0EF1 CALL pop_gset1
0637 9508 RET
(0057) }
(0058) unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
(0059) {
(0060) D12_COMMAND=0x40+bEndp;
_D12_ReadLastTransactionStatus:
bEndp --> R16
0638 2F80 MOV R24,R16
0639 5C80 SUBI R24,0xC0
063A 93807C01 STS 0x7C01,R24
(0061) cwait;
063C 0000 NOP
(0062) return D12_DATA;
063D 91007C00 LDS R16,0x7C00
063F 9508 RET
(0063) }
(0064) unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
(0065) {
(0066) D12_COMMAND=0x80+bEndp;
_D12_ReadEndpointStatus:
bEndp --> R16
0640 2F80 MOV R24,R16
0641 5880 SUBI R24,0x80
0642 93807C01 STS 0x7C01,R24
(0067) cwait;
0644 0000 NOP
(0068) return D12_DATA;
0645 91007C00 LDS R16,0x7C00
0647 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
0648 2F80 MOV R24,R16
0649 5C80 SUBI R24,0xC0
064A 93807C01 STS 0x7C01,R24
(0074) cwait;
064C 0000 NOP
(0075) D12_DATA=bStalled;
064D 93207C00 STS 0x7C00,R18
064F 9508 RET
_D12_ReadEndpoint:
j --> R20
i --> R22
buf --> R10
len --> R18
endp --> R16
0650 940E0EEA CALL push_gset3
0652 80AE LDD R10,Y+6
0653 80BF LDD R11,Y+7
(0076) }
(0077) unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len,
(0078) unsigned char * buf)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?