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 + -
显示快捷键?