usbd_udp.lst
来自「ATmel的AT91sam7SE芯片 USB固件开发源代码」· LST 代码 · 共 1,176 行 · 第 1/5 页
LST
1,176 行
\ 000000AC 4020D2E3 BICS R2,R2,#0x40
\ 000000B0 0030B0E1 MOVS R3,R0
\ 000000B4 FF3013E2 ANDS R3,R3,#0xFF ;; Zero extend
\ 000000B8 04C0A0E3 MOV R12,#+4
\ 000000BC ........ LDR LR,??DataTable70 ;; 0xfffb0030
\ 000000C0 9CE323E0 MLA R3,R12,R3,LR
\ 000000C4 002083E5 STR R2,[R3, #+0]
266 endpoint->bank = 0;
\ 000000C8 0020A0E3 MOV R2,#+0
\ 000000CC 0120C1E5 STRB R2,[R1, #+1]
267 }
268 }
\ ??UDP_ClearRxFlag_4:
\ 000000D0 0050BDE8 POP {R12,LR}
\ 000000D4 1EFF2FE1 BX LR ;; return
269
270 /*
271 Function: UDP_WritePayload
272 Writes a data payload into the current FIFO buffer of the UDP.
273
274 Parameters:
275 eptnum - Number of the endpoint which is sending data.
276 */
\ In section .text, align 4, keep-with-next
277 static void UDP_WritePayload(unsigned char eptnum)
278 {
\ UDP_WritePayload:
\ 00000000 10402DE9 PUSH {R4,LR}
279 Endpoint *endpoint = &(endpoints[eptnum]);
\ 00000004 00C0B0E1 MOVS R12,R0
\ 00000008 FFC01CE2 ANDS R12,R12,#0xFF ;; Zero extend
\ 0000000C 1CE0A0E3 MOV LR,#+28
\ 00000010 ........ LDR R4,??DataTable68 ;; endpoints
\ 00000014 9E4C2CE0 MLA R12,LR,R12,R4
\ 00000018 0C10B0E1 MOVS R1,R12
280 Transfer *transfer = &(endpoint->transfer);
\ 0000001C 04C091E2 ADDS R12,R1,#+4
\ 00000020 0C20B0E1 MOVS R2,R12
281 signed int size;
282
283 // Get the number of bytes to send
284 size = endpoint->size;
\ 00000024 B2C0D1E1 LDRH R12,[R1, #+2]
\ 00000028 0C30B0E1 MOVS R3,R12
285 if (size > transfer->remaining) {
\ 0000002C 0CC092E5 LDR R12,[R2, #+12]
\ 00000030 03005CE1 CMP R12,R3
\ 00000034 010000AA BGE ??UDP_WritePayload_0
286
287 size = transfer->remaining;
\ 00000038 0CC092E5 LDR R12,[R2, #+12]
\ 0000003C 0C30B0E1 MOVS R3,R12
288 }
289
290 // Update transfer descriptor information
291 transfer->buffered += size;
\ ??UDP_WritePayload_0:
\ 00000040 04C092E5 LDR R12,[R2, #+4]
\ 00000044 0CC093E0 ADDS R12,R3,R12
\ 00000048 04C082E5 STR R12,[R2, #+4]
292 transfer->remaining -= size;
\ 0000004C 0CC092E5 LDR R12,[R2, #+12]
\ 00000050 03C05CE0 SUBS R12,R12,R3
\ 00000054 0CC082E5 STR R12,[R2, #+12]
293
294 // Write packet in the FIFO buffer
295 while (size > 0) {
\ ??UDP_WritePayload_1:
\ 00000058 010053E3 CMP R3,#+1
\ 0000005C 0C0000BA BLT ??UDP_WritePayload_2
296
297 AT91C_BASE_UDP->UDP_FDR[eptnum] = *(transfer->data);
\ 00000060 00C0B0E1 MOVS R12,R0
\ 00000064 FFC01CE2 ANDS R12,R12,#0xFF ;; Zero extend
\ 00000068 04E0A0E3 MOV LR,#+4
\ 0000006C ........ LDR R4,??DataTable14 ;; 0xfffb0050
\ 00000070 9E4C2CE0 MLA R12,LR,R12,R4
\ 00000074 00E092E5 LDR LR,[R2, #+0]
\ 00000078 00E0DEE5 LDRB LR,[LR, #+0]
\ 0000007C 00E08CE5 STR LR,[R12, #+0]
298 transfer->data++;
\ 00000080 00C092E5 LDR R12,[R2, #+0]
\ 00000084 01C09CE2 ADDS R12,R12,#+1
\ 00000088 00C082E5 STR R12,[R2, #+0]
299 size--;
\ 0000008C 013053E2 SUBS R3,R3,#+1
\ 00000090 F0FFFFEA B ??UDP_WritePayload_1
300 }
301 }
\ ??UDP_WritePayload_2:
\ 00000094 1040BDE8 POP {R4,LR}
\ 00000098 1EFF2FE1 BX LR ;; return
302
303 /*
304 Function: UDP_ReadPayload
305 Reads a data payload from the current FIFO buffer of an endpoint.
306
307 Parameters:
308 eptnum - Endpoint number.
309 size - Size of the data to read.
310 */
\ In section .text, align 4, keep-with-next
311 static void UDP_ReadPayload(unsigned char eptnum, int size)
312 {
\ UDP_ReadPayload:
\ 00000000 10402DE9 PUSH {R4,LR}
313 Endpoint *endpoint = &(endpoints[eptnum]);
\ 00000004 00C0B0E1 MOVS R12,R0
\ 00000008 FFC01CE2 ANDS R12,R12,#0xFF ;; Zero extend
\ 0000000C 1CE0A0E3 MOV LR,#+28
\ 00000010 ........ LDR R4,??DataTable68 ;; endpoints
\ 00000014 9E4C2CE0 MLA R12,LR,R12,R4
\ 00000018 0C20B0E1 MOVS R2,R12
314 Transfer *transfer = &(endpoint->transfer);
\ 0000001C 04C092E2 ADDS R12,R2,#+4
\ 00000020 0C30B0E1 MOVS R3,R12
315
316 // Check that the requested size is not bigger than the remaining transfer
317 if (size > transfer->remaining) {
\ 00000024 0CC093E5 LDR R12,[R3, #+12]
\ 00000028 01005CE1 CMP R12,R1
\ 0000002C 060000AA BGE ??UDP_ReadPayload_0
318
319 transfer->buffered += size - transfer->remaining;
\ 00000030 04C093E5 LDR R12,[R3, #+4]
\ 00000034 0CC091E0 ADDS R12,R1,R12
\ 00000038 0CE093E5 LDR LR,[R3, #+12]
\ 0000003C 0EC05CE0 SUBS R12,R12,LR
\ 00000040 04C083E5 STR R12,[R3, #+4]
320 size = transfer->remaining;
\ 00000044 0CC093E5 LDR R12,[R3, #+12]
\ 00000048 0C10B0E1 MOVS R1,R12
321 }
322
323 // Update transfer descriptor information
324 transfer->remaining -= size;
\ ??UDP_ReadPayload_0:
\ 0000004C 0CC093E5 LDR R12,[R3, #+12]
\ 00000050 01C05CE0 SUBS R12,R12,R1
\ 00000054 0CC083E5 STR R12,[R3, #+12]
325 transfer->transferred += size;
\ 00000058 08C093E5 LDR R12,[R3, #+8]
\ 0000005C 0CC091E0 ADDS R12,R1,R12
\ 00000060 08C083E5 STR R12,[R3, #+8]
326
327 // Retrieve packet
328 while (size > 0) {
\ ??UDP_ReadPayload_1:
\ 00000064 010051E3 CMP R1,#+1
\ 00000068 0C0000BA BLT ??UDP_ReadPayload_2
329
330 *(transfer->data) = (char) AT91C_BASE_UDP->UDP_FDR[eptnum];
\ 0000006C 00C0B0E1 MOVS R12,R0
\ 00000070 FFC01CE2 ANDS R12,R12,#0xFF ;; Zero extend
\ 00000074 04E0A0E3 MOV LR,#+4
\ 00000078 ........ LDR R4,??DataTable14 ;; 0xfffb0050
\ 0000007C 9E4C2CE0 MLA R12,LR,R12,R4
\ 00000080 00C09CE5 LDR R12,[R12, #+0]
\ 00000084 00E093E5 LDR LR,[R3, #+0]
\ 00000088 00C0CEE5 STRB R12,[LR, #+0]
331 transfer->data++;
\ 0000008C 00C093E5 LDR R12,[R3, #+0]
\ 00000090 01C09CE2 ADDS R12,R12,#+1
\ 00000094 00C083E5 STR R12,[R3, #+0]
332 size--;
\ 00000098 011051E2 SUBS R1,R1,#+1
\ 0000009C F0FFFFEA B ??UDP_ReadPayload_1
333 }
334 }
\ ??UDP_ReadPayload_2:
\ 000000A0 1040BDE8 POP {R4,LR}
\ 000000A4 1EFF2FE1 BX LR ;; return
335
336 /*
337 Function: UDP_ReadRequest
338 Reads a SETUP request from the FIFO buffer of Control endpoint 0 and
339 stores it into the global <request> variable.
340 */
\ In section .text, align 4, keep-with-next
341 static void UDP_ReadRequest(USBGenericRequest *request)
342 {
343 unsigned char *data = (unsigned char *) request;
\ UDP_ReadRequest:
\ 00000000 0010B0E1 MOVS R1,R0
344 unsigned int i;
345
346 // Copy packet
347 for (i = 0; i < 8; i++) {
\ 00000004 0030A0E3 MOV R3,#+0
\ 00000008 0320B0E1 MOVS R2,R3
\ ??UDP_ReadRequest_0:
\ 0000000C 080052E3 CMP R2,#+8
\ 00000010 0500002A BCS ??UDP_ReadRequest_1
348
349 *data = (unsigned char) AT91C_BASE_UDP->UDP_FDR[0];
\ 00000014 ........ LDR R3,??DataTable14 ;; 0xfffb0050
\ 00000018 003093E5 LDR R3,[R3, #+0]
\ 0000001C 0030C1E5 STRB R3,[R1, #+0]
350 data++;
\ 00000020 011091E2 ADDS R1,R1,#+1
351 }
\ 00000024 012092E2 ADDS R2,R2,#+1
\ 00000028 F7FFFFEA B ??UDP_ReadRequest_0
352 }
\ ??UDP_ReadRequest_1:
\ 0000002C 1EFF2FE1 BX LR ;; return
353
354 /*
355 Function: UDP_ResetEndpoints
356 Resets all the endpoints of the UDP peripheral.
357 */
\ In section .text, align 4, keep-with-next
358 static void UDP_ResetEndpoints()
359 {
\ UDP_ResetEndpoints:
\ 00000000 01402DE9 PUSH {R0,LR}
360 Endpoint *endpoint;
361 Transfer *transfer;
362 unsigned char eptnum;
363
364 // Reset the transfer descriptor of every endpoint
365 for (eptnum = 0; eptnum < BOARD_USB_NUMENDPOINTS; eptnum++) {
\ 00000004 0030A0E3 MOV R3,#+0
\ 00000008 0320B0E1 MOVS R2,R3
\ ??UDP_ResetEndpoints_0:
\ 0000000C FF2012E2 ANDS R2,R2,#0xFF ;; Zero extend
\ 00000010 080052E3 CMP R2,#+8
\ 00000014 1900002A BCS ??UDP_ResetEndpoints_1
366
367 endpoint = &(endpoints[eptnum]);
\ 00000018 0230B0E1 MOVS R3,R2
\ 0000001C FF3013E2 ANDS R3,R3,#0xFF ;; Zero extend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?