📄 usbd_udp.lst
字号:
\ 00000004 C00FC0E3 BIC R0,R0,#0x300
\ 00000008 801EA0E3 MOV R1,#+2048
\ 0000000C 001080E5 STR R1,[R0, #+0]
169 }
\ 00000010 1EFF2FE1 BX LR ;; return
170
\ In section .text, align 4, keep-with-next
171 static inline void UDP_DisablePeripheralClock()
172 {
173 AT91C_BASE_PMC->PMC_PCDR = 1 << AT91C_ID_UDP;
\ UDP_DisablePeripheralClock:
\ 00000000 EB00E0E3 MVN R0,#+235
\ 00000004 C00FC0E3 BIC R0,R0,#0x300
\ 00000008 801EA0E3 MOV R1,#+2048
\ 0000000C 001080E5 STR R1,[R0, #+0]
174 }
\ 00000010 1EFF2FE1 BX LR ;; return
175
176 /*
177 Functions: USB clock
178 EnableUsbClock - Enables the 48MHz USB clock.
179 DisableUsbClock - Disables the 48MHz USB clock.
180 */
\ In section .text, align 4, keep-with-next
181 static inline void UDP_EnableUsbClock()
182 {
183 AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;
\ UDP_EnableUsbClock:
\ 00000000 FF00E0E3 MVN R0,#+255
\ 00000004 C00FC0E3 BIC R0,R0,#0x300
\ 00000008 8010A0E3 MOV R1,#+128
\ 0000000C 001080E5 STR R1,[R0, #+0]
184 }
\ 00000010 1EFF2FE1 BX LR ;; return
185
\ In section .text, align 4, keep-with-next
186 static inline void UDP_DisableUsbClock()
187 {
188 AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_UDP;
\ UDP_DisableUsbClock:
\ 00000000 FB00E0E3 MVN R0,#+251
\ 00000004 C00FC0E3 BIC R0,R0,#0x300
\ 00000008 8010A0E3 MOV R1,#+128
\ 0000000C 001080E5 STR R1,[R0, #+0]
189 }
\ 00000010 1EFF2FE1 BX LR ;; return
190
191 /*
192 Functions: Transceiver
193 UDP_EnableTransceiver - Enables the UDP transceiver.
194 UDP_DisableTransceiver - Disables the UDP transceiver.
195 */
\ In section .text, align 4, keep-with-next
196 static inline void UDP_EnableTransceiver()
197 {
198 AT91C_BASE_UDP->UDP_TXVC &= ~AT91C_UDP_TXVDIS;
\ UDP_EnableTransceiver:
\ 00000000 ........ LDR R0,??DataTable3 ;; 0xfffb0074
\ 00000004 000090E5 LDR R0,[R0, #+0]
\ 00000008 400FD0E3 BICS R0,R0,#0x100
\ 0000000C ........ LDR R1,??DataTable3 ;; 0xfffb0074
\ 00000010 000081E5 STR R0,[R1, #+0]
199 }
\ 00000014 1EFF2FE1 BX LR ;; return
200
\ In section .text, align 4, keep-with-next
201 static inline void UDP_DisableTransceiver()
202 {
203 AT91C_BASE_UDP->UDP_TXVC |= AT91C_UDP_TXVDIS;
\ UDP_DisableTransceiver:
\ 00000000 ........ LDR R0,??DataTable3 ;; 0xfffb0074
\ 00000004 000090E5 LDR R0,[R0, #+0]
\ 00000008 400F90E3 ORRS R0,R0,#0x100
\ 0000000C ........ LDR R1,??DataTable3 ;; 0xfffb0074
\ 00000010 000081E5 STR R0,[R1, #+0]
204 }
\ 00000014 1EFF2FE1 BX LR ;; return
205
206 /*
207 Function: UDP_EndOfTransfer
208 Handles a completed transfer on the given endpoint, invoking the
209 configured callback if any.
210
211 Parameters:
212 eptnum - Number of the endpoint for which the transfer has completed.
213 status - Result of the USB transfer.
214 */
\ In section .text, align 4, keep-with-next
215 static void UDP_EndOfTransfer(unsigned char eptnum, char status)
216 {
\ UDP_EndOfTransfer:
\ 00000000 F1402DE9 PUSH {R0,R4-R7,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS R5,R1
217 Endpoint *endpoint = &(endpoints[eptnum]);
\ 0000000C 0400B0E1 MOVS R0,R4
\ 00000010 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000014 1C10A0E3 MOV R1,#+28
\ 00000018 ........ LDR R2,??DataTable68 ;; endpoints
\ 0000001C 912020E0 MLA R0,R1,R0,R2
\ 00000020 0060B0E1 MOVS R6,R0
218 Transfer *transfer = &(endpoint->transfer);
\ 00000024 040096E2 ADDS R0,R6,#+4
\ 00000028 0070B0E1 MOVS R7,R0
219
220 // Check that endpoint was sending or receiving data
221 if ((endpoint->state == UDP_ENDPOINT_RECEIVING)
222 || (endpoint->state == UDP_ENDPOINT_SENDING)) {
\ 0000002C 0000D6E5 LDRB R0,[R6, #+0]
\ 00000030 040050E3 CMP R0,#+4
\ 00000034 0200000A BEQ ??UDP_EndOfTransfer_0
\ 00000038 0000D6E5 LDRB R0,[R6, #+0]
\ 0000003C 030050E3 CMP R0,#+3
\ 00000040 1000001A BNE ??UDP_EndOfTransfer_1
223
224 trace_LOG(trace_INFO, "EoT ");
\ ??UDP_EndOfTransfer_0:
\ 00000044 44009FE5 LDR R0,??UDP_EndOfTransfer_2 ;; `?<Constant "EoT ">`
\ 00000048 ........ BL printf
225
226 // Endpoint returns in Idle state
227 endpoint->state = UDP_ENDPOINT_IDLE;
\ 0000004C 0200A0E3 MOV R0,#+2
\ 00000050 0000C6E5 STRB R0,[R6, #+0]
228
229 // Invoke callback is present
230 if (transfer->callback != 0) {
\ 00000054 100097E5 LDR R0,[R7, #+16]
\ 00000058 000050E3 CMP R0,#+0
\ 0000005C 0900000A BEQ ??UDP_EndOfTransfer_1
231
232 ((TransferCallback) transfer->callback)
233 (transfer->argument,
234 status,
235 transfer->transferred,
236 transfer->remaining + transfer->buffered);
\ 00000060 0C0097E5 LDR R0,[R7, #+12]
\ 00000064 041097E5 LDR R1,[R7, #+4]
\ 00000068 003091E0 ADDS R3,R1,R0
\ 0000006C 082097E5 LDR R2,[R7, #+8]
\ 00000070 0510B0E1 MOVS R1,R5
\ 00000074 FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 00000078 140097E5 LDR R0,[R7, #+20]
\ 0000007C 10C097E5 LDR R12,[R7, #+16]
\ 00000080 0FE0A0E1 MOV LR,PC
\ 00000084 1CFF2FE1 BX R12
237 }
238 }
239 }
\ ??UDP_EndOfTransfer_1:
\ 00000088 F840BDE8 POP {R3-R7,LR}
\ 0000008C 1EFF2FE1 BX LR ;; return
\ ??UDP_EndOfTransfer_2:
\ 00000090 ........ DC32 `?<Constant "EoT ">`
240
241 /*
242 Function: UDP_ClearRxFlag
243 Clears the correct reception flag (bank 0 or bank 1) of an endpoint.
244
245 Parameters:
246 eptnum - Number of an endpoint.
247 */
\ In section .text, align 4, keep-with-next
248 static void UDP_ClearRxFlag(unsigned char eptnum)
249 {
\ UDP_ClearRxFlag:
\ 00000000 01402DE9 PUSH {R0,LR}
250 Endpoint *endpoint = &(endpoints[eptnum]);
\ 00000004 0020B0E1 MOVS R2,R0
\ 00000008 FF2012E2 ANDS R2,R2,#0xFF ;; Zero extend
\ 0000000C 1C30A0E3 MOV R3,#+28
\ 00000010 ........ LDR R12,??DataTable68 ;; endpoints
\ 00000014 93C222E0 MLA R2,R3,R2,R12
\ 00000018 0210B0E1 MOVS R1,R2
251
252 // Clear flag and change banks
253 if (endpoint->bank == 0) {
\ 0000001C 0120D1E5 LDRB R2,[R1, #+1]
\ 00000020 000052E3 CMP R2,#+0
\ 00000024 1A00001A BNE ??UDP_ClearRxFlag_0
254
255 CLEAR_CSR(eptnum, AT91C_UDP_RX_DATA_BK0);
\ 00000028 0020B0E1 MOVS R2,R0
\ 0000002C FF2012E2 ANDS R2,R2,#0xFF ;; Zero extend
\ 00000030 0430A0E3 MOV R3,#+4
\ 00000034 ........ LDR R12,??DataTable70 ;; 0xfffb0030
\ 00000038 93C222E0 MLA R2,R3,R2,R12
\ 0000003C 002092E5 LDR R2,[R2, #+0]
\ 00000040 0220D2E3 BICS R2,R2,#0x2
\ 00000044 0030B0E1 MOVS R3,R0
\ 00000048 FF3013E2 ANDS R3,R3,#0xFF ;; Zero extend
\ 0000004C 04C0A0E3 MOV R12,#+4
\ 00000050 ........ LDR LR,??DataTable70 ;; 0xfffb0030
\ 00000054 9CE323E0 MLA R3,R12,R3,LR
\ 00000058 002083E5 STR R2,[R3, #+0]
256
257 // Swap bank if in dual-fifo mode
258 if (BOARD_USB_ENDPOINTS_BANKS(eptnum) > 1) {
\ 0000005C FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000060 000050E3 CMP R0,#+0
\ 00000064 0200000A BEQ ??UDP_ClearRxFlag_1
\ 00000068 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 0000006C 030050E3 CMP R0,#+3
\ 00000070 0100001A BNE ??UDP_ClearRxFlag_2
\ ??UDP_ClearRxFlag_1:
\ 00000074 0120A0E3 MOV R2,#+1
\ 00000078 000000EA B ??UDP_ClearRxFlag_3
\ ??UDP_ClearRxFlag_2:
\ 0000007C 0220A0E3 MOV R2,#+2
\ ??UDP_ClearRxFlag_3:
\ 00000080 020052E3 CMP R2,#+2
\ 00000084 110000BA BLT ??UDP_ClearRxFlag_4
259
260 endpoint->bank = 1;
\ 00000088 0120A0E3 MOV R2,#+1
\ 0000008C 0120C1E5 STRB R2,[R1, #+1]
\ 00000090 0E0000EA B ??UDP_ClearRxFlag_4
261 }
262 }
263 else {
264
265 CLEAR_CSR(eptnum, AT91C_UDP_RX_DATA_BK1);
\ ??UDP_ClearRxFlag_0:
\ 00000094 0020B0E1 MOVS R2,R0
\ 00000098 FF2012E2 ANDS R2,R2,#0xFF ;; Zero extend
\ 0000009C 0430A0E3 MOV R3,#+4
\ 000000A0 ........ LDR R12,??DataTable70 ;; 0xfffb0030
\ 000000A4 93C222E0 MLA R2,R3,R2,R12
\ 000000A8 002092E5 LDR R2,[R2, #+0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -