📄 usbd_udp.lst
字号:
289 }
290 }
291 else {
292
293 CLEAR_CSR(bEndpoint, AT91C_UDP_RX_DATA_BK1);
\ ??UDP_ClearRxFlag_0:
\ 00000078 4020C2E3 BIC R2,R2,#0x40
\ 0000007C 00208DE5 STR R2,[SP, #+0]
\ 00000080 0020A0E1 MOV R2,R0
\ 00000084 00C09DE5 LDR R12,[SP, #+0]
\ 00000088 02C183E7 STR R12,[R3, +R2, LSL #+2]
\ ??UDP_ClearRxFlag_4:
\ 0000008C 0020A0E1 MOV R2,R0
\ 00000090 022193E7 LDR R2,[R3, +R2, LSL #+2]
\ 00000094 400012E3 TST R2,#0x40
\ 00000098 FBFFFF1A BNE ??UDP_ClearRxFlag_4
294 pEndpoint->bank = 0;
\ 0000009C 0000A0E3 MOV R0,#+0
\ ??UDP_ClearRxFlag_3:
\ 000000A0 0100C1E5 STRB R0,[R1, #+1]
295 }
296 }
\ ??UDP_ClearRxFlag_2:
\ 000000A4 08D08DE2 ADD SP,SP,#+8 ;; stack cleaning
\ 000000A8 1EFF2FE1 BX LR ;; return
297
298 //------------------------------------------------------------------------------
299 /// Transfers a data payload from the current tranfer buffer to the endpoint
300 /// FIFO
301 /// \param bEndpoint Number of the endpoint which is sending data.
302 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
303 static void UDP_WritePayload(unsigned char bEndpoint)
304 {
\ UDP_WritePayload:
\ 00000000 01402DE9 PUSH {R0,LR}
305 Endpoint *pEndpoint = &(endpoints[bEndpoint]);
\ 00000004 1C30A0E3 MOV R3,#+28
\ 00000008 ........ LDR R2,??DataTable60 ;; endpoints
\ 0000000C 932022E0 MLA R2,R3,R0,R2
306 Transfer *pTransfer = &(pEndpoint->transfer);
\ 00000010 041082E2 ADD R1,R2,#+4
307 signed int size;
308
309 // Get the number of bytes to send
310 size = pEndpoint->size;
\ 00000014 B220D2E1 LDRH R2,[R2, #+2]
311 if (size > pTransfer->remaining) {
\ 00000018 0C3091E5 LDR R3,[R1, #+12]
\ 0000001C 020053E1 CMP R3,R2
312
313 size = pTransfer->remaining;
\ 00000020 0C2091B5 LDRLT R2,[R1, #+12]
314 }
315
316 // Update transfer descriptor information
317 pTransfer->buffered += size;
\ 00000024 043091E5 LDR R3,[R1, #+4]
\ 00000028 033082E0 ADD R3,R2,R3
\ 0000002C 043081E5 STR R3,[R1, #+4]
318 pTransfer->remaining -= size;
\ 00000030 0C3091E5 LDR R3,[R1, #+12]
\ 00000034 023043E0 SUB R3,R3,R2
\ 00000038 0C3081E5 STR R3,[R1, #+12]
\ 0000003C 010052E3 CMP R2,#+1
\ 00000040 ........ LDR R12,??DataTable10 ;; 0xfffb0050
\ 00000044 090000BA BLT ??UDP_WritePayload_0
319
320 // Write packet in the FIFO buffer
321 while (size > 0) {
322
323 AT91C_BASE_UDP->UDP_FDR[bEndpoint] = *(pTransfer->pData);
\ ??UDP_WritePayload_1:
\ 00000048 0030A0E1 MOV R3,R0
\ 0000004C 00E091E5 LDR LR,[R1, #+0]
\ 00000050 00E0DEE5 LDRB LR,[LR, #+0]
\ 00000054 03E18CE7 STR LR,[R12, +R3, LSL #+2]
324 pTransfer->pData++;
\ 00000058 003091E5 LDR R3,[R1, #+0]
\ 0000005C 013083E2 ADD R3,R3,#+1
\ 00000060 003081E5 STR R3,[R1, #+0]
325 size--;
\ 00000064 012042E2 SUB R2,R2,#+1
326 }
\ 00000068 010052E3 CMP R2,#+1
\ 0000006C F5FFFFAA BGE ??UDP_WritePayload_1
327 }
\ ??UDP_WritePayload_0:
\ 00000070 0050BDE8 POP {R12,LR}
\ 00000074 1EFF2FE1 BX LR ;; return
328
329
330 //------------------------------------------------------------------------------
331 /// Transfers a data payload from an endpoint FIFO to the current transfer buffer
332 /// \param bEndpoint Endpoint number.
333 /// \param wPacketSize Size of received data packet
334 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
335 static void UDP_ReadPayload(unsigned char bEndpoint, int wPacketSize)
336 {
337 Endpoint *pEndpoint = &(endpoints[bEndpoint]);
338 Transfer *pTransfer = &(pEndpoint->transfer);
\ UDP_ReadPayload:
\ 00000000 0020A0E1 MOV R2,R0
\ 00000004 1C30A0E3 MOV R3,#+28
\ 00000008 ........ LDR R12,??DataTable60 ;; endpoints
\ 0000000C 93C222E0 MLA R2,R3,R2,R12
\ 00000010 042082E2 ADD R2,R2,#+4
339
340 // Check that the requested size is not bigger than the remaining transfer
341 if (wPacketSize > pTransfer->remaining) {
\ 00000014 0C3092E5 LDR R3,[R2, #+12]
\ 00000018 010053E1 CMP R3,R1
\ 0000001C 050000AA BGE ??UDP_ReadPayload_0
342
343 pTransfer->buffered += wPacketSize - pTransfer->remaining;
^
Warning[Pa082]: undefined behavior: the order of volatile accesses is
undefined in this statement
\ 00000020 043092E5 LDR R3,[R2, #+4]
\ 00000024 031081E0 ADD R1,R1,R3
\ 00000028 0C3092E5 LDR R3,[R2, #+12]
\ 0000002C 031041E0 SUB R1,R1,R3
\ 00000030 041082E5 STR R1,[R2, #+4]
344 wPacketSize = pTransfer->remaining;
\ 00000034 0C1092E5 LDR R1,[R2, #+12]
345 }
346
347 // Update transfer descriptor information
348 pTransfer->remaining -= wPacketSize;
\ ??UDP_ReadPayload_0:
\ 00000038 0C3092E5 LDR R3,[R2, #+12]
\ 0000003C 013043E0 SUB R3,R3,R1
\ 00000040 0C3082E5 STR R3,[R2, #+12]
349 pTransfer->transferred += wPacketSize;
\ 00000044 083092E5 LDR R3,[R2, #+8]
\ 00000048 033081E0 ADD R3,R1,R3
\ 0000004C 083082E5 STR R3,[R2, #+8]
\ 00000050 010051E3 CMP R1,#+1
\ 00000054 1EFF2FB1 BXLT LR
350
351 // Retrieve packet
352 while (wPacketSize > 0) {
353
354 *(pTransfer->pData) = (char) AT91C_BASE_UDP->UDP_FDR[bEndpoint];
\ ??UDP_ReadPayload_1:
\ 00000058 0030A0E1 MOV R3,R0
\ 0000005C ........ LDR R12,??DataTable10 ;; 0xfffb0050
\ 00000060 03319CE7 LDR R3,[R12, +R3, LSL #+2]
\ 00000064 00C092E5 LDR R12,[R2, #+0]
\ 00000068 0030CCE5 STRB R3,[R12, #+0]
355 pTransfer->pData++;
\ 0000006C 003092E5 LDR R3,[R2, #+0]
\ 00000070 013083E2 ADD R3,R3,#+1
\ 00000074 003082E5 STR R3,[R2, #+0]
356 wPacketSize--;
\ 00000078 011041E2 SUB R1,R1,#+1
357 }
\ 0000007C 010051E3 CMP R1,#+1
\ 00000080 F4FFFFAA BGE ??UDP_ReadPayload_1
358 }
\ 00000084 1EFF2FE1 BX LR ;; return
359
360 //------------------------------------------------------------------------------
361 /// Received SETUP packet from endpoint 0 FIFO
362 /// \param pRequest Generic USB SETUP request sent over Control endpoints
363 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
364 static void UDP_ReadRequest(USBGenericRequest *pRequest)
365 {
366 unsigned char *pData = (unsigned char *)pRequest;
367 unsigned int i;
368
369 // Copy packet
370 for (i = 0; i < 8; i++) {
\ UDP_ReadRequest:
\ 00000000 0810A0E3 MOV R1,#+8
371
372 *pData = (unsigned char) AT91C_BASE_UDP->UDP_FDR[0];
\ ??UDP_ReadRequest_0:
\ 00000004 ........ LDR R2,??DataTable10 ;; 0xfffb0050
\ 00000008 002092E5 LDR R2,[R2, #+0]
\ 0000000C 0120C0E4 STRB R2,[R0], #+1
373 pData++;
374 }
\ 00000010 011051E2 SUBS R1,R1,#+1
\ 00000014 FAFFFF1A BNE ??UDP_ReadRequest_0
375 }
\ 00000018 1EFF2FE1 BX LR ;; return
376
377 //------------------------------------------------------------------------------
378 /// Reset all endpoint transfer descriptors
379 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
380 static void UDP_ResetEndpoints( void )
381 {
382 Endpoint *pEndpoint;
383 Transfer *pTransfer;
384 unsigned char bEndpoint;
385
386 // Reset the transfer descriptor of every endpoint
387 for (bEndpoint = 0; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++) {
\ UDP_ResetEndpoints:
\ 00000000 0000A0E3 MOV R0,#+0
\ 00000004 ........ LDR R1,??DataTable60 ;; endpoints
388
389 pEndpoint = &(endpoints[bEndpoint]);
390 pTransfer = &(pEndpoint->transfer);
\ ??UDP_ResetEndpoints_0:
\ 00000008 042081E2 ADD R2,R1,#+4
391
392 // Reset endpoint transfer descriptor
393 pTransfer->pData = 0;
\ 0000000C 0030A0E3 MOV R3,#+0
\ 00000010 003082E5 STR R3,[R2, #+0]
394 pTransfer->transferred = -1;
\ 00000014 0330E0E1 MVN R3,R3
\ 00000018 083082E5 STR R3,[R2, #+8]
395 pTransfer->buffered = -1;
\ 0000001C 043082E5 STR R3,[R2, #+4]
396 pTransfer->remaining = -1;
\ 00000020 0C3082E5 STR R3,[R2, #+12]
397 pTransfer->fCallback = 0;
\ 00000024 0030A0E3 MOV R3,#+0
\ 00000028 103082E5 STR R3,[R2, #+16]
398 pTransfer->pArgument = 0;
\ 0000002C 143082E5 STR R3,[R2, #+20]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -