📄 cdc_enumerate.lst
字号:
385 //* \fn AT91F_UDP_IsConfigured
386 //* \brief Test if the device is configured and handle enumeration
387 //*----------------------------------------------------------------------------
\ In segment CODE, align 4, keep-with-next
388 static uchar AT91F_UDP_IsConfigured(AT91PS_CDC pCdc)
389 {
\ AT91F_UDP_IsConfigured:
\ 00000000 11B5 PUSH {R0,R4,LR}
\ 00000002 041C MOV R4,R0
390 AT91PS_UDP pUDP = pCdc->pUdp;
\ 00000004 0068 LDR R0,[R0, #+0]
391 AT91_REG isr = pUDP->UDP_ISR;
\ 00000006 C169 LDR R1,[R0, #+28]
\ 00000008 0091 STR R1,[SP, #+0]
392
393 if (isr & AT91C_UDP_ENDBUSRES) {
\ 0000000A 8021 MOV R1,#+128
\ 0000000C 4901 LSL R1,R1,#+5 ;; #+4096
\ 0000000E 009A LDR R2,[SP, #+0]
\ 00000010 0A42 TST R2,R1
\ 00000012 0BD0 BEQ ??AT91F_UDP_IsConfigured_0
394 pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
\ 00000014 0162 STR R1,[R0, #+32]
395 // reset all endpoints
396 pUDP->UDP_RSTEP = (unsigned int)-1;
\ 00000016 0021 MOV R1,#+0
\ 00000018 C943 MVN R1,R1 ;; #-1
\ 0000001A 8162 STR R1,[R0, #+40]
397 pUDP->UDP_RSTEP = 0;
\ 0000001C 0021 MOV R1,#+0
\ 0000001E 8162 STR R1,[R0, #+40]
398 // Enable the function
399 pUDP->UDP_FADDR = AT91C_UDP_FEN;
\ 00000020 8021 MOV R1,#+128
\ 00000022 4900 LSL R1,R1,#+1 ;; #+256
\ 00000024 8160 STR R1,[R0, #+8]
400 // Configure endpoint 0
401 pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
\ 00000026 C901 LSL R1,R1,#+7
\ 00000028 0163 STR R1,[R0, #+48]
\ 0000002A 07E0 B ??AT91F_UDP_IsConfigured_1
402 }
403 else if (isr & AT91C_UDP_EPINT0) {
\ ??AT91F_UDP_IsConfigured_0:
\ 0000002C 0099 LDR R1,[SP, #+0]
\ 0000002E C907 LSL R1,R1,#+31
\ 00000030 04D5 BPL ??AT91F_UDP_IsConfigured_1
404 pUDP->UDP_ICR = AT91C_UDP_EPINT0;
\ 00000032 0121 MOV R1,#+1
\ 00000034 0162 STR R1,[R0, #+32]
405 AT91F_CDC_Enumerate(pCdc);
\ 00000036 201C MOV R0,R4
\ 00000038 ........ BL AT91F_CDC_Enumerate
406 }
407 return pCdc->currentConfiguration;
\ ??AT91F_UDP_IsConfigured_1:
\ 0000003C 2079 LDRB R0,[R4, #+4]
\ 0000003E 18BC POP {R3,R4}
\ 00000040 02BC POP {R1}
\ 00000042 0847 BX R1 ;; return
408 }
409
410 //*----------------------------------------------------------------------------
411 //* \fn AT91F_UDP_Read
412 //* \brief Read available data from Endpoint OUT
413 //*----------------------------------------------------------------------------
\ In segment CODE, align 4, keep-with-next
414 static uint AT91F_UDP_Read(AT91PS_CDC pCdc, char *pData, uint length)
415 {
\ AT91F_UDP_Read:
\ 00000000 F3B5 PUSH {R0,R1,R4-R7,LR}
\ 00000002 141C MOV R4,R2
416 AT91PS_UDP pUdp = pCdc->pUdp;
\ 00000004 0568 LDR R5,[R0, #+0]
\ 00000006 0026 MOV R6,#+0
417 uint packetSize, nbBytesRcv = 0, currentReceiveBank = pCdc->currentRcvBank;
\ 00000008 8768 LDR R7,[R0, #+8]
\ 0000000A 00E0 B ??AT91F_UDP_Read_0
418
419 while (length) {
420 if ( !AT91F_UDP_IsConfigured(pCdc) )
421 break;
422 if ( pUdp->UDP_CSR[AT91C_EP_OUT] & currentReceiveBank ) {
423 packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, length);
424 length -= packetSize;
425 if (packetSize < AT91C_EP_OUT_SIZE)
426 length = 0;
427 while(packetSize--)
428 pData[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
429 pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank);
430 if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0)
431 currentReceiveBank = AT91C_UDP_RX_DATA_BK1;
\ ??AT91F_UDP_Read_1:
\ 0000000C 4027 MOV R7,#+64
\ ??AT91F_UDP_Read_0:
\ 0000000E 002C CMP R4,#+0
\ 00000010 23D0 BEQ ??AT91F_UDP_Read_2
\ ??AT91F_UDP_Read_3:
\ 00000012 0098 LDR R0,[SP, #+0]
\ 00000014 ........ BL AT91F_UDP_IsConfigured
\ 00000018 0028 CMP R0,#+0
\ 0000001A 1ED0 BEQ ??AT91F_UDP_Read_2
\ 0000001C 686B LDR R0,[R5, #+52]
\ 0000001E 3842 TST R0,R7
\ 00000020 F7D0 BEQ ??AT91F_UDP_Read_3
\ 00000022 686B LDR R0,[R5, #+52]
\ 00000024 000C LSR R0,R0,#+16
\ 00000026 A042 CMP R0,R4
\ 00000028 02D2 BCS ??AT91F_UDP_Read_4
\ 0000002A 686B LDR R0,[R5, #+52]
\ 0000002C 000C LSR R0,R0,#+16
\ 0000002E 00E0 B ??AT91F_UDP_Read_5
\ ??AT91F_UDP_Read_4:
\ 00000030 201C MOV R0,R4
\ ??AT91F_UDP_Read_5:
\ 00000032 241A SUB R4,R4,R0
\ 00000034 4028 CMP R0,#+64
\ 00000036 05D2 BCS ??AT91F_UDP_Read_6
\ 00000038 0024 MOV R4,#+0
\ 0000003A 03E0 B ??AT91F_UDP_Read_6
\ ??AT91F_UDP_Read_7:
\ 0000003C 0199 LDR R1,[SP, #+4]
\ 0000003E 6A6D LDR R2,[R5, #+84]
\ 00000040 8A55 STRB R2,[R1, R6]
\ 00000042 761C ADD R6,R6,#+1
\ ??AT91F_UDP_Read_6:
\ 00000044 011C MOV R1,R0
\ 00000046 401E SUB R0,R0,#+1
\ 00000048 0029 CMP R1,#+0
\ 0000004A F7D1 BNE ??AT91F_UDP_Read_7
\ 0000004C 686B LDR R0,[R5, #+52]
\ 0000004E B843 BIC R0,R7
\ 00000050 6863 STR R0,[R5, #+52]
\ 00000052 022F CMP R7,#+2
\ 00000054 DAD0 BEQ ??AT91F_UDP_Read_1
432 else
433 currentReceiveBank = AT91C_UDP_RX_DATA_BK0;
\ 00000056 0227 MOV R7,#+2
\ 00000058 D9E7 B ??AT91F_UDP_Read_0
434
435 }
436 }
437 pCdc->currentRcvBank = currentReceiveBank;
\ ??AT91F_UDP_Read_2:
\ 0000005A 0098 LDR R0,[SP, #+0]
\ 0000005C 8760 STR R7,[R0, #+8]
438 return nbBytesRcv;
\ 0000005E 301C MOV R0,R6
\ 00000060 FCBC POP {R2-R7}
\ 00000062 02BC POP {R1}
\ 00000064 0847 BX R1 ;; return
439
440 }
441
442 //*----------------------------------------------------------------------------
443 //* \fn AT91F_CDC_Write
444 //* \brief Send through endpoint 2
445 //*----------------------------------------------------------------------------
\ In segment CODE, align 4, keep-with-next
446 static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length)
447 {
\ AT91F_UDP_Write:
\ 00000000 F1B5 PUSH {R0,R4-R7,LR}
\ 00000002 0D1C MOV R5,R1
448 AT91PS_UDP pUdp = pCdc->pUdp;
\ 00000004 0468 LDR R4,[R0, #+0]
\ 00000006 402A CMP R2,#+64
\ 00000008 01D2 BCS ??AT91F_UDP_Write_0
\ 0000000A 101C MOV R0,R2
\ 0000000C 00E0 B ??AT91F_UDP_Write_1
\ ??AT91F_UDP_Write_0:
\ 0000000E 4020 MOV R0,#+64
449 uint cpt = 0;
450
451 // Send the first packet
452 cpt = MIN(length, AT91C_EP_IN_SIZE);
453 length -= cpt;
\ ??AT91F_UDP_Write_1:
\ 00000010 161A SUB R6,R2,R0
\ 00000012 02E0 B ??AT91F_UDP_Write_2
454 while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
\ ??AT91F_UDP_Write_3:
\ 00000014 2978 LDRB R1,[R5, #+0]
\ 00000016 A165 STR R1,[R4, #+88]
\ 00000018 6D1C ADD R5,R5,#+1
\ ??AT91F_UDP_Write_2:
\ 0000001A 011C MOV R1,R0
\ 0000001C 401E SUB R0,R0,#+1
\ 0000001E 0029 CMP R1,#+0
\ 00000020 F8D1 BNE ??AT91F_UDP_Write_3
\ 00000022 05E0 B ??AT91F_UDP_Write_4
455 pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
456
457 while (length) {
458 // Fill the second bank
459 cpt = MIN(length, AT91C_EP_IN_SIZE);
460 length -= cpt;
461 while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
462 // Wait for the the first bank to be sent
463 while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
464 if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
465 pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
\ ??AT91F_UDP_Write_5:
\ 00000024 A06B LDR R0,[R4, #+56]
\ 00000026 0740 AND R7,R0
\ 00000028 A763 STR R7,[R4, #+56]
466 while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
\ ??AT91F_UDP_Write_6:
\ 0000002A A06B LDR R0,[R4, #+56]
\ 0000002C C007 LSL R0,R0,#+31
\ 0000002E FCD4 BMI ??AT91F_UDP_Write_6
467 pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
\ ??AT91F_UDP_Write_4:
\ 00000030 A06B LDR R0,[R4, #+56]
\ 00000032 1021 MOV R1,#+16
\ 00000034 0143 ORR R1,R0
\ 00000036 A163 STR R1,[R4, #+56]
\ 00000038 0127 MOV R7,#+1
\ 0000003A FF43 MVN R7,R7 ;; #-2
\ 0000003C 002E CMP R6,#+0
\ 0000003E 1ED0 BEQ ??AT91F_UDP_Write_7
\ 00000040 402E CMP R6,#+64
\ 00000042 01D2 BCS ??AT91F_UDP_Write_8
\ 00000044 301C MOV R0,R6
\ 00000046 00E0 B ??AT91F_UDP_Write_9
\ ??AT91F_UDP_Write_8:
\ 00000048 4020 MOV R0,#+64
\ ??AT91F_UDP_Write_9:
\ 0000004A 361A SUB R6,R6,R0
\ 0000004C 02E0 B ??AT91F_UDP_Write_10
\ ??AT91F_UDP_Write_11:
\ 0000004E 2978 LDRB R1,[R5, #+0]
\ 00000050 A165 STR R1,[R4, #+88]
\ 00000052 6D1C ADD R5,R5,#+1
\ ??AT91F_UDP_Write_10:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -