⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdc_enumerate.lst

📁 关于usb的一段程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -