📄 usbci.lst
字号:
321: USBCtrl = (INT32U)((endp >> 1) << 2) | 0x01; /* 选择逻辑端点并使能读操作 */
00000004 A804 ADD R0,R13,#0x10
00000006 7800 LDRB R0,[R0,#0x0] ; endp
00000008 1C01 MOV R1,R0
0000000A 0849 LSR R1,R1,#0x1
0000000C 0089 LSL R1,R1,#0x2
0000000E 2001 MOV R0,#0x1
00000010 4301 ORR R1,R0
00000012 4800 LDR R0,=0xE0090028
00000014 6001 STR R1,[R0,#0x0]
324: if((endp % 2 == 0)) //判断被读取的物理端点号是否为偶数(偶数继续)
00000016 A804 ADD R0,R13,#0x10
00000018 7800 LDRB R0,[R0,#0x0] ; endp
0000001A 2102 MOV R1,#0x2
0000001C F7FF BL ?C?SDIV?T ; T=0x0001 (1) ; ?C?SDIV?T
0000001E FFF0 BL ?C?SDIV?T ; T=0x0001 (2) ; ?C?SDIV?T
00000020 1C01 MOV R1,R0
00000022 2900 CMP R1,#0x0
00000024 D104 BNE L_25 ; T=0x00000030
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 16
325: while((USBRxPLen & 0x00000C00) ==0); /* 等待数据就绪 */
00000026 L_26:
00000026 4800 LDR R0,=0xE0090020
00000028 6800 LDR R0,[R0,#0x0]
0000002A 4800 LDR R1,=0xC00
0000002C 4208 TST R0,R1
0000002E D0FA BEQ L_26 ; T=0x00000026
00000030 L_25:
328: reclen = USBRxPLen & 0x1FF; /* 获取收到的数据的字节长度 */
00000030 4800 LDR R0,=0xE0090020
00000032 6801 LDR R1,[R0,#0x0]
00000034 4800 LDR R0,=0x1FF
00000036 4001 AND R1,R0
00000038 A803 ADD R0,R13,#0xC
0000003A 6001 STR R1,[R0,#0x0] ; reclen
329: if (reclen > len)
0000003C A805 ADD R0,R13,#0x14
0000003E 7800 LDRB R0,[R0,#0x0] ; len
00000040 1C01 MOV R1,R0
00000042 A803 ADD R0,R13,#0xC
00000044 6800 LDR R0,[R0,#0x0] ; reclen
00000046 4288 CMP R0,R1
00000048 D904 BLS L_35 ; T=0x00000054
330: reclen = len;
0000004A A805 ADD R0,R13,#0x14
0000004C 7800 LDRB R0,[R0,#0x0] ; len
0000004E 1C01 MOV R1,R0
00000050 A803 ADD R0,R13,#0xC
00000052 6001 STR R1,[R0,#0x0] ; reclen
333: for (i = 0; i < (reclen / 4); i++)
00000054 L_35:
00000054 2100 MOV R1,#0x0
00000056 A801 ADD R0,R13,#0x4
00000058 6001 STR R1,[R0,#0x0] ; i
0000005A E032 B L_33 ; T=0x000000C2
0000005C L_34:
335: tmp = USBRxData;
0000005C 4800 LDR R0,=0xE0090018
0000005E 6801 LDR R1,[R0,#0x0]
00000060 A800 ADD R0,R13,#0x0
00000062 6001 STR R1,[R0,#0x0] ; tmp
336: *buf++ = (INT8U)tmp;
00000064 A800 ADD R0,R13,#0x0
00000066 6801 LDR R1,[R0,#0x0] ; tmp
00000068 0609 LSL R1,R1,#0x18
0000006A 0E09 LSR R1,R1,#0x18
0000006C AA06 ADD R2,R13,#0x18
0000006E 6810 LDR R0,[R2,#0x0] ; buf
00000070 1C03 MOV R3,R0
00000072 3301 ADD R3,#0x1
00000074 6013 STR R3,[R2,#0x0] ; buf
00000076 7001 STRB R1,[R0,#0x0]
337: *buf++ = (INT8U)(tmp >> 8);
00000078 A800 ADD R0,R13,#0x0
0000007A 6801 LDR R1,[R0,#0x0] ; tmp
0000007C 0A09 LSR R1,R1,#0x8
0000007E 0609 LSL R1,R1,#0x18
00000080 0E09 LSR R1,R1,#0x18
00000082 AA06 ADD R2,R13,#0x18
00000084 6810 LDR R0,[R2,#0x0] ; buf
00000086 1C03 MOV R3,R0
00000088 3301 ADD R3,#0x1
0000008A 6013 STR R3,[R2,#0x0] ; buf
0000008C 7001 STRB R1,[R0,#0x0]
338: *buf++ = (INT8U)(tmp >> 16);
0000008E A800 ADD R0,R13,#0x0
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 17
00000090 6801 LDR R1,[R0,#0x0] ; tmp
00000092 0C09 LSR R1,R1,#0x10
00000094 0609 LSL R1,R1,#0x18
00000096 0E09 LSR R1,R1,#0x18
00000098 AA06 ADD R2,R13,#0x18
0000009A 6810 LDR R0,[R2,#0x0] ; buf
0000009C 1C03 MOV R3,R0
0000009E 3301 ADD R3,#0x1
000000A0 6013 STR R3,[R2,#0x0] ; buf
000000A2 7001 STRB R1,[R0,#0x0]
339: *buf++ = (INT8U)(tmp >> 24);
000000A4 A800 ADD R0,R13,#0x0
000000A6 6801 LDR R1,[R0,#0x0] ; tmp
000000A8 0E09 LSR R1,R1,#0x18
000000AA 0609 LSL R1,R1,#0x18
000000AC 0E09 LSR R1,R1,#0x18
000000AE AA06 ADD R2,R13,#0x18
000000B0 6810 LDR R0,[R2,#0x0] ; buf
000000B2 1C03 MOV R3,R0
000000B4 3301 ADD R3,#0x1
000000B6 6013 STR R3,[R2,#0x0] ; buf
000000B8 7001 STRB R1,[R0,#0x0]
340: }
000000BA A801 ADD R0,R13,#0x4
000000BC 6801 LDR R1,[R0,#0x0] ; i
000000BE 3101 ADD R1,#0x1
000000C0 6001 STR R1,[R0,#0x0] ; i
000000C2 L_33:
000000C2 A803 ADD R0,R13,#0xC
000000C4 6801 LDR R1,[R0,#0x0] ; reclen
000000C6 0889 LSR R1,R1,#0x2
000000C8 A801 ADD R0,R13,#0x4
000000CA 6800 LDR R0,[R0,#0x0] ; i
000000CC 4288 CMP R0,R1
000000CE D3C5 BCC L_34 ; T=0x0000005C
342: j = reclen % 4; //读取不足4bytes的数据
000000D0 A803 ADD R0,R13,#0xC
000000D2 6801 LDR R1,[R0,#0x0] ; reclen
000000D4 2003 MOV R0,#0x3
000000D6 4001 AND R1,R0
000000D8 A802 ADD R0,R13,#0x8
000000DA 6001 STR R1,[R0,#0x0] ; j
343: if (j != 0)
000000DC A802 ADD R0,R13,#0x8
000000DE 6800 LDR R0,[R0,#0x0] ; j
000000E0 2800 CMP R0,#0x0
000000E2 D01F BEQ L_36 ; T=0x00000124
345: tmp = USBRxData;
000000E4 4800 LDR R0,=0xE0090018
000000E6 6801 LDR R1,[R0,#0x0]
000000E8 A800 ADD R0,R13,#0x0
000000EA 6001 STR R1,[R0,#0x0] ; tmp
347: for(i = 0; i < j; i++)
000000EC 2100 MOV R1,#0x0
000000EE A801 ADD R0,R13,#0x4
000000F0 6001 STR R1,[R0,#0x0] ; i
000000F2 E011 B L_39 ; T=0x00000118
000000F4 L_40:
348: *buf++ = (INT8U)(tmp >> (i << 3));
000000F4 A801 ADD R0,R13,#0x4
000000F6 6800 LDR R0,[R0,#0x0] ; i
000000F8 00C0 LSL R0,R0,#0x3
000000FA A900 ADD R1,R13,#0x0
000000FC 6809 LDR R1,[R1,#0x0] ; tmp
000000FE 40C1 LSR R1,R0
00000100 0609 LSL R1,R1,#0x18
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 18
00000102 0E09 LSR R1,R1,#0x18
00000104 AA06 ADD R2,R13,#0x18
00000106 6810 LDR R0,[R2,#0x0] ; buf
00000108 1C03 MOV R3,R0
0000010A 3301 ADD R3,#0x1
0000010C 6013 STR R3,[R2,#0x0] ; buf
0000010E 7001 STRB R1,[R0,#0x0]
00000110 A801 ADD R0,R13,#0x4
00000112 6801 LDR R1,[R0,#0x0] ; i
00000114 3101 ADD R1,#0x1
00000116 6001 STR R1,[R0,#0x0] ; i
00000118 L_39:
00000118 A802 ADD R0,R13,#0x8
0000011A 6801 LDR R1,[R0,#0x0] ; j
0000011C A801 ADD R0,R13,#0x4
0000011E 6800 LDR R0,[R0,#0x0] ; i
00000120 4288 CMP R0,R1
00000122 D3E7 BCC L_40 ; T=0x000000F4
349: }
00000124 L_36:
352: USBDevIntClr = RxENDPKT; /* 清除 RxENDPKT 位 */
00000124 2140 MOV R1,#0x40
00000126 4800 LDR R0,=0xE0090008
00000128 6001 STR R1,[R0,#0x0]
355: USB_SelectEndpoint(endp);
0000012A A804 ADD R0,R13,#0x10
0000012C 7800 LDRB R0,[R0,#0x0] ; endp
0000012E F7FF BL USB_SelectEndpoint?T ; T=0x0001 (1)
00000130 FF67 BL USB_SelectEndpoint?T ; T=0x0001 (2)
356: USB_ClearBuffer(); /* 清除OUT缓冲区 */
00000132 F7FF BL USB_ClearBuffer?T ; T=0x0001 (1)
00000134 FF65 BL USB_ClearBuffer?T ; T=0x0001 (2)
358: return reclen; /* 返回实际收到的字节数 */
00000136 A803 ADD R0,R13,#0xC
00000138 6800 LDR R0,[R0,#0x0] ; reclen
0000013A ; SCOPE-END
359: }
0000013A B004 ADD R13,#0x10
0000013C B003 ADD R13,#0xC
0000013E BC08 POP {R3}
00000140 4718 BX R3
00000142 ENDP ; 'USB_ReadEndpoint?T'
*** CODE SEGMENT '?PR?USB_WriteEndpoint?T?USBCI':
370: INT8U USB_WriteEndpoint(INT8U endp, INT8U len, INT8U *buf)
00000000 B507 PUSH {R0-R2,LR}
00000002 B083 SUB R13,#0xC
371: {
00000004 ; SCOPE-START
376: tmp = ((endp >> 1) << 2) | 0x02; /* 选择逻辑端点并使能写操作 */
00000004 A803 ADD R0,R13,#0xC
00000006 7800 LDRB R0,[R0,#0x0] ; endp
00000008 1C01 MOV R1,R0
0000000A 0849 LSR R1,R1,#0x1
0000000C 0089 LSL R1,R1,#0x2
0000000E 2002 MOV R0,#0x2
00000010 4301 ORR R1,R0
00000012 A800 ADD R0,R13,#0x0
00000014 6001 STR R1,[R0,#0x0] ; tmp
377: USBCtrl = (INT32U)tmp;
00000016 A800 ADD R0,R13,#0x0
00000018 6801 LDR R1,[R0,#0x0] ; tmp
0000001A 4800 LDR R0,=0xE0090028
0000001C 6001 STR R1,[R0,#0x0]
380: USBTxPLen = (INT32U)len; /* 写入要发送的数据的字节长度 */
0000001E A804 ADD R0,R13,#0x10
00000020 7800 LDRB R0,[R0,#0x0] ; len
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 19
00000022 1C01 MOV R1,R0
00000024 4800 LDR R0,=0xE0090024
00000026 6001 STR R1,[R0,#0x0]
383: j = len >> 2;
00000028 A804 ADD R0,R13,#0x10
0000002A 7800 LDRB R0,[R0,#0x0] ; len
0000002C 1C01 MOV R1,R0
0000002E 0889 LSR R1,R1,#0x2
00000030 A802 ADD R0,R13,#0x8
00000032 6001 STR R1,[R0,#0x0] ; j
384: for(i = 1; i <= j; i++)
00000034 2101 MOV R1,#0x1
00000036 A801 ADD R0,R13,#0x4
00000038 6001 STR R1,[R0,#0x0] ; i
0000003A E03F B L_45 ; T=0x000000BC
0000003C L_46:
386: tmp = (INT32U)*buf++;
0000003C A905 ADD R1,R13,#0x14
0000003E 6808 LDR R0,[R1,#0x0] ; buf
00000040 1C02 MOV R2,R0
0000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -