📄 cdc_enumerate.lst
字号:
\ AT91F_CDC_Enumerate:
\ 00000000 F3B5 PUSH {R0,R1,R4-R7,LR}
\ 00000002 011C MOV R1,R0
551 AT91PS_UDP pUDP = pCdc->pUdp;
\ 00000004 0468 LDR R4,[R0, #+0]
552 uchar bmRequestType, bRequest;
553 ushort wValue, wIndex, wLength, wStatus;
554
555
556 if ( !(pUDP->UDP_CSR[0] & AT91C_UDP_RXSETUP) )
\ 00000006 206B LDR R0,[R4, #+48]
\ 00000008 4007 LSL R0,R0,#+29
\ 0000000A 67D5 BPL ??AT91F_CDC_Enumerate_0
557 return;
558
559 bmRequestType = pUDP->UDP_FDR[0];
\ 0000000C 206D LDR R0,[R4, #+80]
\ 0000000E 0006 LSL R0,R0,#+24
\ 00000010 000E LSR R0,R0,#+24
\ 00000012 0190 STR R0,[SP, #+4]
560 bRequest = pUDP->UDP_FDR[0];
\ 00000014 236D LDR R3,[R4, #+80]
\ 00000016 1B06 LSL R3,R3,#+24
\ 00000018 1B0E LSR R3,R3,#+24
561 wValue = (pUDP->UDP_FDR[0] & 0xFF);
\ 0000001A FF26 MOV R6,#+255
\ 0000001C 206D LDR R0,[R4, #+80]
\ 0000001E 3040 AND R0,R6
562 wValue |= (pUDP->UDP_FDR[0] << 8);
\ 00000020 226D LDR R2,[R4, #+80]
\ 00000022 1502 LSL R5,R2,#+8
\ 00000024 0543 ORR R5,R0
\ 00000026 2D04 LSL R5,R5,#+16
\ 00000028 2D0C LSR R5,R5,#+16
563 wIndex = (pUDP->UDP_FDR[0] & 0xFF);
\ 0000002A 226D LDR R2,[R4, #+80]
\ 0000002C 3240 AND R2,R6
564 wIndex |= (pUDP->UDP_FDR[0] << 8);
\ 0000002E 206D LDR R0,[R4, #+80]
\ 00000030 0002 LSL R0,R0,#+8
\ 00000032 1043 ORR R0,R2
565 wLength = (pUDP->UDP_FDR[0] & 0xFF);
\ 00000034 226D LDR R2,[R4, #+80]
\ 00000036 1640 AND R6,R2
566 wLength |= (pUDP->UDP_FDR[0] << 8);
\ 00000038 226D LDR R2,[R4, #+80]
\ 0000003A 1202 LSL R2,R2,#+8
\ 0000003C 3243 ORR R2,R6
\ 0000003E 1204 LSL R2,R2,#+16
\ 00000040 120C LSR R2,R2,#+16
567
568 if (bmRequestType & 0x80) {
\ 00000042 019E LDR R6,[SP, #+4]
\ 00000044 3606 LSL R6,R6,#+24
\ 00000046 06D5 BPL ??AT91F_CDC_Enumerate_1
569 pUDP->UDP_CSR[0] |= AT91C_UDP_DIR;
\ 00000048 266B LDR R6,[R4, #+48]
\ 0000004A 8027 MOV R7,#+128
\ 0000004C 3743 ORR R7,R6
\ 0000004E 2763 STR R7,[R4, #+48]
570 while ( !(pUDP->UDP_CSR[0] & AT91C_UDP_DIR) );
\ ??AT91F_CDC_Enumerate_2:
\ 00000050 266B LDR R6,[R4, #+48]
\ 00000052 3606 LSL R6,R6,#+24
\ 00000054 FCD5 BPL ??AT91F_CDC_Enumerate_2
571 }
572 pUDP->UDP_CSR[0] &= ~AT91C_UDP_RXSETUP;
\ ??AT91F_CDC_Enumerate_1:
\ 00000056 266B LDR R6,[R4, #+48]
\ 00000058 0427 MOV R7,#+4
\ 0000005A BE43 BIC R6,R7
\ 0000005C 2663 STR R6,[R4, #+48]
573 while ( (pUDP->UDP_CSR[0] & AT91C_UDP_RXSETUP) );
\ ??AT91F_CDC_Enumerate_3:
\ 0000005E 266B LDR R6,[R4, #+48]
\ 00000060 7607 LSL R6,R6,#+29
\ 00000062 FCD4 BMI ??AT91F_CDC_Enumerate_3
574
575 // Handle supported standard device request Cf Table 9-3 in USB specification Rev 1.1
576 switch ((bRequest << 8) | bmRequestType) {
\ 00000064 0007 LSL R0,R0,#+28
\ 00000066 000F LSR R0,R0,#+28
\ 00000068 0026 MOV R6,#+0
\ 0000006A 1F02 LSL R7,R3,#+8
\ 0000006C 019B LDR R3,[SP, #+4]
\ 0000006E 1B06 LSL R3,R3,#+24
\ 00000070 1B0E LSR R3,R3,#+24
\ 00000072 3B43 ORR R3,R7
\ 00000074 803B SUB R3,#+128
\ 00000076 012B CMP R3,#+1
\ 00000078 6CD9 BLS ??AT91F_CDC_Enumerate_4
\ 0000007A 9B1E SUB R3,R3,#+2
\ 0000007C 6FD0 BEQ ??AT91F_CDC_Enumerate_5
\ 0000007E 7F3B SUB R3,#+127
\ 00000080 04D0 BEQ ??AT91F_CDC_Enumerate_6
\ 00000082 5B1E SUB R3,R3,#+1
\ 00000084 .... BNE .+5
\ 00000086 9DE0 B ??AT91F_CDC_Enumerate_7
\ 00000088 624F LDR R7,??AT91F_CDC_Enumerate_8 ;; 0x1ff
\ 0000008A DB1B SUB R3,R3,R7
\ ??AT91F_CDC_Enumerate_6:
\ 0000008C .... BNE .+5
\ 0000008E 95E0 B ??AT91F_CDC_Enumerate_9
\ 00000090 5B1E SUB R3,R3,#+1
\ 00000092 .... BNE .+5
\ 00000094 89E0 B ??AT91F_CDC_Enumerate_10
\ 00000096 7F1E SUB R7,R7,#+1
\ 00000098 DB1B SUB R3,R3,R7
\ 0000009A 2ED0 BEQ ??AT91F_CDC_Enumerate_11
\ 0000009C 7E3F SUB R7,#+126
\ 0000009E DB1B SUB R3,R3,R7
\ 000000A0 11D0 BEQ ??AT91F_CDC_Enumerate_12
\ 000000A2 8037 ADD R7,#+128
\ 000000A4 DB1B SUB R3,R3,R7
\ 000000A6 52D0 BEQ ??AT91F_CDC_Enumerate_13
\ 000000A8 803B SUB R3,#+128
\ 000000AA 32D0 BEQ ??AT91F_CDC_Enumerate_14
\ 000000AC 5A4F LDR R7,??AT91F_CDC_Enumerate_8+0x4 ;; 0x1721
\ 000000AE DB1B SUB R3,R3,R7
\ 000000B0 .... BNE .+5
\ 000000B2 9FE0 B ??AT91F_CDC_Enumerate_15
\ 000000B4 C027 MOV R7,#+192
\ 000000B6 7F00 LSL R7,R7,#+1 ;; #+384
\ 000000B8 DB1B SUB R3,R3,R7
\ 000000BA .... BNE .+5
\ 000000BC A2E0 B ??AT91F_CDC_Enumerate_16
\ 000000BE 803B SUB R3,#+128
\ 000000C0 .... BNE .+5
\ 000000C2 A4E0 B ??AT91F_CDC_Enumerate_17
\ 000000C4 15E0 B ??AT91F_CDC_Enumerate_18
577 case STD_GET_DESCRIPTOR:
578 if (wValue == 0x100) // Return Device Descriptor
\ ??AT91F_CDC_Enumerate_12:
\ 000000C6 5549 LDR R1,??AT91F_CDC_Enumerate_8+0x8 ;; devDescriptor
\ 000000C8 8023 MOV R3,#+128
\ 000000CA 5B00 LSL R3,R3,#+1 ;; #+256
\ 000000CC 9D42 CMP R5,R3
\ 000000CE 08D1 BNE ??AT91F_CDC_Enumerate_19
579 AT91F_USB_SendData(pUDP, devDescriptor, MIN(sizeof(devDescriptor), wLength));
\ 000000D0 132A CMP R2,#+19
\ 000000D2 00D3 BCC ??AT91F_CDC_Enumerate_20
\ 000000D4 1222 MOV R2,#+18
\ ??AT91F_CDC_Enumerate_20:
\ 000000D6 201C MOV R0,R4
\ 000000D8 ........ BL AT91F_USB_SendData
\ ??AT91F_CDC_Enumerate_0:
\ 000000DC FCBC POP {R2-R7}
\ 000000DE 01BC POP {R0}
\ 000000E0 0047 BX R0 ;; return
580 else if (wValue == 0x200) // Return Configuration Descriptor
\ ??AT91F_CDC_Enumerate_19:
\ 000000E2 5800 LSL R0,R3,#+1
\ 000000E4 8542 CMP R5,R0
\ 000000E6 04D1 BNE ??AT91F_CDC_Enumerate_18
581 AT91F_USB_SendData(pUDP, cfgDescriptor, MIN(sizeof(cfgDescriptor), wLength));
\ 000000E8 442A CMP R2,#+68
\ 000000EA 00D3 BCC ??AT91F_CDC_Enumerate_21
\ 000000EC 4322 MOV R2,#+67
\ ??AT91F_CDC_Enumerate_21:
\ 000000EE 1431 ADD R1,#+20
\ 000000F0 F1E7 B ??AT91F_CDC_Enumerate_20
582 else
583 AT91F_USB_SendStall(pUDP);
\ ??AT91F_CDC_Enumerate_18:
\ 000000F2 201C MOV R0,R4
\ 000000F4 ........ BL AT91F_USB_SendStall
\ 000000F8 F0E7 B ??AT91F_CDC_Enumerate_0
584 break;
585 case STD_SET_ADDRESS:
586 AT91F_USB_SendZlp(pUDP);
\ ??AT91F_CDC_Enumerate_11:
\ 000000FA 201C MOV R0,R4
\ 000000FC ........ BL AT91F_USB_SendZlp
587 pUDP->UDP_FADDR = (AT91C_UDP_FEN | wValue);
\ 00000100 8020 MOV R0,#+128
\ 00000102 4000 LSL R0,R0,#+1 ;; #+256
\ 00000104 2843 ORR R0,R5
\ 00000106 A060 STR R0,[R4, #+8]
588 pUDP->UDP_GLBSTATE = (wValue) ? AT91C_UDP_FADDEN : 0;
\ 00000108 281C MOV R0,R5
\ 0000010A 00D0 BEQ ??AT91F_CDC_Enumerate_22
\ 0000010C 0120 MOV R0,#+1
\ ??AT91F_CDC_Enumerate_22:
\ 0000010E 6060 STR R0,[R4, #+4]
\ 00000110 E4E7 B ??AT91F_CDC_Enumerate_0
589 break;
590 case STD_SET_CONFIGURATION:
591 pCdc->currentConfiguration = wValue;
\ ??AT91F_CDC_Enumerate_14:
\ 00000112 0D71 STRB R5,[R1, #+4]
592 AT91F_USB_SendZlp(pUDP);
\ 00000114 201C MOV R0,R4
\ 00000116 ........ BL AT91F_USB_SendZlp
593 pUDP->UDP_GLBSTATE = (wValue) ? AT91C_UDP_CONFG : AT91C_UDP_FADDEN;
\ 0000011A 281C MOV R0,R5
\ 0000011C 01D0 BEQ ??AT91F_CDC_Enumerate_23
\ 0000011E 0220 MOV R0,#+2
\ 00000120 00E0 B ??AT91F_CDC_Enumerate_24
\ ??AT91F_CDC_Enumerate_23:
\ 00000122 0120 MOV R0,#+1
\ ??AT91F_CDC_Enumerate_24:
\ 00000124 6060 STR R0,[R4, #+4]
594 pUDP->UDP_CSR[1] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT) : 0;
\ 00000126 281C MOV R0,R5
\ 00000128 02D0 BEQ ??AT91F_CDC_Enumerate_25
\ 0000012A 8220 MOV R0,#+130
\ 0000012C 0002 LSL R0,R0,#+8 ;; #+33280
\ 0000012E 00E0 B ??AT91F_CDC_Enumerate_26
\ ??AT91F_CDC_Enumerate_25:
\ 00000130 0020 MOV R0,#+0
\ ??AT91F_CDC_Enumerate_26:
\ 00000132 6063 STR R0,[R4, #+52]
595 pUDP->UDP_CSR[2] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_IN) : 0;
\ 00000134 281C MOV R0,R5
\ 00000136 02D0 BEQ ??AT91F_CDC_Enumerate_27
\ 00000138 8620 MOV R0,#+134
\ 0000013A 0002 LSL R0,R0,#+8 ;; #+34304
\ 0000013C 00E0 B ??AT91F_CDC_Enumerate_28
\ ??AT91F_CDC_Enumerate_27:
\ 0000013E 0020 MOV R0,#+0
\ ??AT91F_CDC_Enumerate_28:
\ 00000140 A063 STR R0,[R4, #+56]
596 pUDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN) : 0;
\ 00000142 002D CMP R5,#+0
\ 00000144 01D0 BEQ ??AT91F_CDC_Enumerate_29
\ 00000146 8726 MOV R6,#+135
\ 00000148 3602 LSL R6,R6,#+8 ;; #+34560
\ ??AT91F_CDC_Enumerate_29:
\ 0000014A E663 STR R6,[R4, #+60]
\ 0000014C C6E7 B ??AT91F_CDC_Enumerate_0
597 break;
598 case STD_GET_CONFIGURATION:
599 AT91F_USB_SendData(pUDP, (char *) &(pCdc->currentConfiguration), sizeof(pCdc->currentConfiguration));
\ ??AT91F_CDC_Enumerate_13:
\ 0000014E 0122 MOV R2,#+1
\ 00000150 091D ADD R1,R1,#+4
\ 00000152 C0E7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -