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