; generated by ARM C/C++ Compiler, 5.03 [Build 24]
; commandline ArmCC [--list --split_sections --debug -c --asm --interleave -o.\obj\usbd.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\usbd.d --cpu=Cortex-M0 --apcs=interwork -I.\ -I..\..\..\..\Library\CMSIS\Include -I..\..\..\..\Library\Device\Nuvoton\NUC200Series\Include -I..\..\..\..\Library\StdDriver\inc -IC:\Keil\ARM\RV31\INC -IC:\Keil\ARM\CMSIS\Include -IC:\Keil\ARM\Inc\?ST\STM32F10x -D__MICROLIB --omf_browse=.\obj\usbd.crf ..\..\..\..\Library\StdDriver\src\usbd.c]
                          THUMB

                          AREA ||i.USBD_CtrlIn||, CODE, READONLY, ALIGN=2

                  USBD_CtrlIn PROC
;;;416      */
;;;417    void USBD_CtrlIn(void)
000000  b570              PUSH     {r4-r6,lr}
;;;418    {
;;;419        if(g_usbd_CtrlInSize)
000002  4d1a              LDR      r5,|L1.108|
000004  2600              MOVS     r6,#0
000006  686a              LDR      r2,[r5,#4]  ; g_usbd_CtrlInSize
;;;420        {
;;;421            // Process remained data
;;;422            if(g_usbd_CtrlInSize > g_usbd_CtrlMaxPktSize)
;;;423            {
;;;424                // Data size > MXPLD
;;;425                USBD_MemCopy((uint8_t *)USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0), g_usbd_CtrlInPointer, g_usbd_CtrlMaxPktSize);
000008  4c19              LDR      r4,|L1.112|
00000a  2a00              CMP      r2,#0                 ;419
00000c  d01c              BEQ      |L1.72|
00000e  4629              MOV      r1,r5                 ;419
000010  69eb              LDR      r3,[r5,#0x1c]  ; g_usbd_CtrlMaxPktSize
000012  4818              LDR      r0,|L1.116|
000014  6809              LDR      r1,[r1,#0]
000016  429a              CMP      r2,r3                 ;422
000018  d90d              BLS      |L1.54|
00001a  6a22              LDR      r2,[r4,#0x20]
00001c  1810              ADDS     r0,r2,r0
00001e  461a              MOV      r2,r3
000020  f7fffffe          BL       USBD_MemCopy
;;;426    			USBD_SET_PAYLOAD_LEN(EP0, g_usbd_CtrlMaxPktSize);
000024  69e8              LDR      r0,[r5,#0x1c]  ; g_usbd_CtrlMaxPktSize
000026  6260              STR      r0,[r4,#0x24]
;;;427                g_usbd_CtrlInPointer += g_usbd_CtrlMaxPktSize;
000028  6829              LDR      r1,[r5,#0]  ; g_usbd_CtrlInPointer
00002a  1809              ADDS     r1,r1,r0
;;;428                g_usbd_CtrlInSize -= g_usbd_CtrlMaxPktSize;
00002c  6029              STR      r1,[r5,#0]  ; g_usbd_CtrlInPointer
00002e  6869              LDR      r1,[r5,#4]  ; g_usbd_CtrlInSize
000030  1a08              SUBS     r0,r1,r0
000032  6068              STR      r0,[r5,#4]  ; g_usbd_CtrlInSize
;;;429            }
;;;430            else
;;;431            {
;;;432                // Data size <= MXPLD
;;;433                USBD_MemCopy((uint8_t *)USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0), g_usbd_CtrlInPointer, g_usbd_CtrlInSize);
;;;434    			USBD_SET_PAYLOAD_LEN(EP0, g_usbd_CtrlInSize);
;;;435                g_usbd_CtrlInPointer = 0;
;;;436                g_usbd_CtrlInSize = 0;
;;;437            }
;;;438        }
;;;439        else
;;;440        {   
;;;441            // In ACK for Set address
;;;442            if((g_usbd_SetupPacket[0] == 0) && (g_usbd_SetupPacket[1] == 5))
;;;443            {
;;;444                if((USBD_GET_ADDR() != g_usbd_UsbAddr) && (USBD_GET_ADDR() == 0))
;;;445                {
;;;446                    USBD_SET_ADDR(g_usbd_UsbAddr);
;;;447                }
;;;448            }
;;;449    
;;;450            // No more data for IN token
;;;451    		USBD_SET_PAYLOAD_LEN(EP0, 0);
;;;452        }
;;;453    }
000034  bd70              POP      {r4-r6,pc}
                  |L1.54|
000036  6a23              LDR      r3,[r4,#0x20]         ;433
000038  1818              ADDS     r0,r3,r0              ;433
00003a  f7fffffe          BL       USBD_MemCopy
00003e  6868              LDR      r0,[r5,#4]            ;434  ; g_usbd_CtrlInSize
000040  6260              STR      r0,[r4,#0x24]         ;434
000042  602e              STR      r6,[r5,#0]            ;436  ; g_usbd_CtrlInPointer
000044  606e              STR      r6,[r5,#4]            ;436  ; g_usbd_CtrlInSize
000046  bd70              POP      {r4-r6,pc}
                  |L1.72|
000048  4808              LDR      r0,|L1.108|
00004a  3030              ADDS     r0,r0,#0x30           ;442
00004c  7801              LDRB     r1,[r0,#0]            ;442  ; g_usbd_SetupPacket
00004e  2900              CMP      r1,#0                 ;442
000050  d10a              BNE      |L1.104|
000052  7840              LDRB     r0,[r0,#1]            ;442  ; g_usbd_SetupPacket
000054  2805              CMP      r0,#5                 ;442
000056  d107              BNE      |L1.104|
000058  68a1              LDR      r1,[r4,#8]            ;444
00005a  6968              LDR      r0,[r5,#0x14]         ;444  ; g_usbd_UsbAddr
00005c  4281              CMP      r1,r0                 ;444
00005e  d003              BEQ      |L1.104|
000060  68a1              LDR      r1,[r4,#8]            ;444
000062  2900              CMP      r1,#0                 ;444
000064  d100              BNE      |L1.104|
000066  60a0              STR      r0,[r4,#8]            ;446
                  |L1.104|
000068  6266              STR      r6,[r4,#0x24]         ;451
00006a  bd70              POP      {r4-r6,pc}
;;;454    
                          ENDP

                  |L1.108|
                          DCD      ||.data||
                  |L1.112|
                          DCD      0x40060000
                  |L1.116|
                          DCD      0x40060100

                          AREA ||i.USBD_CtrlOut||, CODE, READONLY, ALIGN=2

                  USBD_CtrlOut PROC
;;;473      */
;;;474    void USBD_CtrlOut(void)
000000  b570              PUSH     {r4-r6,lr}
;;;475    {
;;;476        uint32_t u32Size;
;;;477        
;;;478        if(g_usbd_CtrlOutSize < g_usbd_CtrlOutSizeLimit)
000002  4c0a              LDR      r4,|L2.44|
000004  6921              LDR      r1,[r4,#0x10]  ; g_usbd_CtrlOutSizeLimit
000006  68e0              LDR      r0,[r4,#0xc]  ; g_usbd_CtrlOutSize
000008  4288              CMP      r0,r1
00000a  d20e              BCS      |L2.42|
;;;479        {
;;;480            u32Size = USBD_GET_PAYLOAD_LEN(EP1);
00000c  4808              LDR      r0,|L2.48|
00000e  6b45              LDR      r5,[r0,#0x34]
;;;481            USBD_MemCopy(g_usbd_CtrlOutPointer, (uint8_t *)USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP1), u32Size);
000010  6b00              LDR      r0,[r0,#0x30]
000012  4908              LDR      r1,|L2.52|
000014  462a              MOV      r2,r5
000016  1841              ADDS     r1,r0,r1
000018  68a0              LDR      r0,[r4,#8]  ; g_usbd_CtrlOutPointer
00001a  f7fffffe          BL       USBD_MemCopy
;;;482            g_usbd_CtrlOutPointer += u32Size;
00001e  68a0              LDR      r0,[r4,#8]  ; g_usbd_CtrlOutPointer
000020  1940              ADDS     r0,r0,r5
;;;483            g_usbd_CtrlOutSize += u32Size;
000022  60a0              STR      r0,[r4,#8]  ; g_usbd_CtrlOutPointer
000024  68e0              LDR      r0,[r4,#0xc]  ; g_usbd_CtrlOutSize
000026  1940              ADDS     r0,r0,r5
000028  60e0              STR      r0,[r4,#0xc]  ; g_usbd_CtrlOutSize
                  |L2.42|
;;;484        }
;;;485    }
00002a  bd70              POP      {r4-r6,pc}
;;;486    
                          ENDP

                  |L2.44|
                          DCD      ||.data||
                  |L2.48|
                          DCD      0x40060000
                  |L2.52|
                          DCD      0x40060100

                          AREA ||i.USBD_GetDescriptor||, CODE, READONLY, ALIGN=2

                  USBD_GetDescriptor PROC
;;;146      */
;;;147    void USBD_GetDescriptor(void)
000000  b510              PUSH     {r4,lr}
;;;148    {
;;;149        uint32_t u32Len;
;;;150        
;;;151    	u32Len = 0;
;;;152    	u32Len = g_usbd_SetupPacket[7];
000002  4b26              LDR      r3,|L3.156|
000004  79d8              LDRB     r0,[r3,#7]  ; g_usbd_SetupPacket
;;;153    	u32Len <<= 8;
;;;154    	u32Len += g_usbd_SetupPacket[6];
000006  7999              LDRB     r1,[r3,#6]  ; g_usbd_SetupPacket
000008  0200              LSLS     r0,r0,#8              ;153
00000a  1809              ADDS     r1,r1,r0
;;;155    
;;;156    	switch (g_usbd_SetupPacket[3])
;;;157    	{
;;;158    		// Get Device Descriptor
;;;159            case DESC_DEVICE:
;;;160            {
;;;161                u32Len = Minimum(u32Len, LEN_DEVICE);
;;;162                USBD_PrepareCtrlIn((uint8_t *)g_usbd_sInfo->gu8DevDesc, u32Len);
00000c  4618              MOV      r0,r3
00000e  78da              LDRB     r2,[r3,#3]            ;156  ; g_usbd_SetupPacket
000010  3830              SUBS     r0,r0,#0x30
000012  6ac0              LDR      r0,[r0,#0x2c]
000014  2a03              CMP      r2,#3                 ;156
000016  d025              BEQ      |L3.100|
000018  dc04              BGT      |L3.36|
00001a  2a01              CMP      r2,#1                 ;156
00001c  d007              BEQ      |L3.46|
00001e  2a02              CMP      r2,#2                 ;156
000020  d127              BNE      |L3.114|
000022  e009              B        |L3.56|
                  |L3.36|
000024  2a21              CMP      r2,#0x21              ;156
000026  d00f              BEQ      |L3.72|
000028  2a22              CMP      r2,#0x22              ;156
00002a  d122              BNE      |L3.114|
00002c  e018              B        |L3.96|
                  |L3.46|
00002e  2912              CMP      r1,#0x12              ;161
000030  d300              BCC      |L3.52|
000032  2112              MOVS     r1,#0x12              ;161
                  |L3.52|
000034  6800              LDR      r0,[r0,#0]
;;;163                USBD_PrepareCtrlOut(0,0);
;;;164                break;
000036  e00c              B        |L3.82|
                  |L3.56|
;;;165            }
;;;166            // Get Configuration Descriptor
;;;167            case DESC_CONFIG:
;;;168            {
;;;169                uint32_t u32TotalLen;
;;;170                
;;;171                u32TotalLen = g_usbd_sInfo->gu8ConfigDesc[3];
000038  6840              LDR      r0,[r0,#4]
00003a  78c2              LDRB     r2,[r0,#3]
;;;172                u32TotalLen = g_usbd_sInfo->gu8ConfigDesc[2] + (u32TotalLen << 8);
00003c  7883              LDRB     r3,[r0,#2]
00003e  0212              LSLS     r2,r2,#8
000040  189a              ADDS     r2,r3,r2
;;;173                
;;;174                u32Len = Minimum(u32Len, u32TotalLen);
000042  4291              CMP      r1,r2
000044  d305              BCC      |L3.82|
000046  e026              B        |L3.150|
                  |L3.72|
;;;175                USBD_PrepareCtrlIn((uint8_t *)g_usbd_sInfo->gu8ConfigDesc, u32Len);
;;;176                USBD_PrepareCtrlOut(0,0);
;;;177                break;
;;;178            }
;;;179    		// Get HID Descriptor
;;;180            case DESC_HID:
;;;181            {
;;;182                u32Len = Minimum(u32Len, LEN_HID);
000048  2909              CMP      r1,#9
00004a  d300              BCC      |L3.78|
00004c  2109              MOVS     r1,#9
                  |L3.78|
;;;183                USBD_PrepareCtrlIn((uint8_t *)&g_usbd_sInfo->gu8ConfigDesc[LEN_CONFIG+LEN_INTERFACE], u32Len);
00004e  6840              LDR      r0,[r0,#4]
000050  3012              ADDS     r0,r0,#0x12
                  |L3.82|
;;;184                USBD_PrepareCtrlOut(0,0);
;;;185                break;
;;;186            }
;;;187    		// Get Report Descriptor
;;;188    		case DESC_HID_RPT:
;;;189            {
;;;190                USBD_PrepareCtrlIn((uint8_t *)g_usbd_sInfo->gu8HidReportDesc, u32Len);
000052  f7fffffe          BL       USBD_PrepareCtrlIn
;;;191                USBD_PrepareCtrlOut(0,0);
000056  2100              MOVS     r1,#0
000058  4608              MOV      r0,r1
00005a  f7fffffe          BL       USBD_PrepareCtrlOut
;;;192                break;
;;;193            }
;;;194    		// Get String Descriptor
;;;195    		case DESC_STRING:
;;;196    		{
;;;197    			// Get Language
;;;198    			if (g_usbd_SetupPacket[2] == 0)
;;;199    			{
;;;200    				u32Len = Minimum(u32Len, 4);
;;;201    	            USBD_PrepareCtrlIn((uint8_t *)g_usbd_sInfo->gu8StrLangDesc, u32Len);
;;;202    	            USBD_PrepareCtrlOut(0,0);
;;;203    			}
;;;204    			else
;;;205    			{
;;;206    				// Get String Descriptor
;;;207    				switch (g_usbd_SetupPacket[2])
;;;208    				{
;;;209        	            case 1:
;;;210        	            {
;;;211        	                u32Len = Minimum(u32Len, g_usbd_sInfo->gu8StrVendorDesc[0]);
;;;212        	                USBD_PrepareCtrlIn((uint8_t *)g_usbd_sInfo->gu8StrVendorDesc, u32Len);
;;;213        	                USBD_PrepareCtrlOut(0,0);
;;;214        	                break;
;;;215        	            }
;;;216        	            case 2:
;;;217        	            {
;;;218        	                u32Len = Minimum(u32Len, g_usbd_sInfo->gu8StrProductDesc[0]);
;;;219        	                USBD_PrepareCtrlIn((uint8_t *)g_usbd_sInfo->gu8StrProductDesc, u32Len);
;;;220        	                USBD_PrepareCtrlOut(0,0);
;;;221        	                break;
;;;222        	            }
;;;223        	            default:
;;;224    	                    // Not support. Reply STALL.
;;;225    						USBD_SetStall(EP0);
;;;226    						USBD_SetStall(EP1);
;;;227    	                    break;
;;;228    				}
;;;229    			}
;;;230    			break;
;;;231    		}
;;;232    		default:
;;;233    			// Not support. Reply STALL.
;;;234    			USBD_SetStall(EP0);
;;;235    			USBD_SetStall(EP1);
;;;236    	        break;
;;;237    	}
;;;238    }
00005e  bd10              POP      {r4,pc}
                  |L3.96|
000060  6940              LDR      r0,[r0,#0x14]         ;190
000062  e7f6              B        |L3.82|
                  |L3.100|
000064  789a              LDRB     r2,[r3,#2]            ;198  ; g_usbd_SetupPacket
000066  2a00              CMP      r2,#0                 ;198
000068  d00a              BEQ      |L3.128|
00006a  2a01              CMP      r2,#1                 ;207
00006c  d00d              BEQ      |L3.138|
00006e  2a02              CMP      r2,#2                 ;207
000070  d00d              BEQ      |L3.142|
                  |L3.114|
000072  2000              MOVS     r0,#0                 ;234
000074  f7fffffe          BL       USBD_SetStall
000078  2001              MOVS     r0,#1                 ;235
00007a  f7fffffe          BL       USBD_SetStall
00007e  bd10              POP      {r4,pc}
                  |L3.128|
000080  2904              CMP      r1,#4                 ;200
000082  d300              BCC      |L3.134|
000084  2104              MOVS     r1,#4                 ;200
                  |L3.134|
000086  6880              LDR      r0,[r0,#8]            ;201
000088  e7e3              B        |L3.82|
                  |L3.138|
00008a  68c0              LDR      r0,[r0,#0xc]          ;211
00008c  e000              B        |L3.144|
                  |L3.142|
00008e  6900              LDR      r0,[r0,#0x10]         ;218
                  |L3.144|
000090  7802              LDRB     r2,[r0,#0]            ;218
000092  428a              CMP      r2,r1                 ;218
000094  d8dd              BHI      |L3.82|
                  |L3.150|
000096  4611              MOV      r1,r2                 ;218
000098  e7db              B        |L3.82|
;;;239    
                          ENDP

00009a  0000              DCW      0x0000
                  |L3.156|
                          DCD      ||.data||+0x30

                          AREA ||i.USBD_GetSetupPacket||, CODE, READONLY, ALIGN=2

                  USBD_GetSetupPacket PROC
;;;96       */
;;;97     void USBD_GetSetupPacket(uint8_t *buf)
000000  b510              PUSH     {r4,lr}
;;;98     {
;;;99         USBD_MemCopy(buf, g_usbd_SetupPacket, 8);
000002  2208              MOVS     r2,#8
000004  4901              LDR      r1,|L4.12|
000006  f7fffffe          BL       USBD_MemCopy
;;;100    }
00000a  bd10              POP      {r4,pc}
;;;101    
                          ENDP

                  |L4.12|
                          DCD      ||.data||+0x30

                          AREA ||i.USBD_MemCopy||, CODE, READONLY, ALIGN=1

                  USBD_MemCopy PROC
;;;341      */
;;;342    static __INLINE void USBD_MemCopy(uint8_t *dest, uint8_t *src, int32_t size)
000000  e003              B        |L5.10|
                  |L5.2|
;;;343    {
;;;344        while (size--) *dest++ = *src++;
000002  780b              LDRB     r3,[r1,#0]
000004  1c49              ADDS     r1,r1,#1
000006  7003              STRB     r3,[r0,#0]
000008  1c40              ADDS     r0,r0,#1
                  |L5.10|
00000a  1e52              SUBS     r2,r2,#1
00000c  d2f9              BCS      |L5.2|
;;;345    }
00000e  4770              BX       lr
;;;346    
                          ENDP


                          AREA ||i.USBD_Open||, CODE, READONLY, ALIGN=2

                  USBD_Open PROC
;;;57       */
;;;58     void USBD_Open(S_USBD_INFO_T *param, CLASS_REQ pfnClassReq, SET_INTERFACE_REQ pfnSetInterface)
000000  4b08              LDR      r3,|L6.36|
;;;59     {
;;;60         g_usbd_sInfo = param;
;;;61         g_usbd_pfnClassRequest = pfnClassReq;
;;;62         g_usbd_pfnSetInterface = pfnSetInterface;
;;;63     
;;;64         /* get EP0 maximum packet size */
;;;65         g_usbd_CtrlMaxPktSize = g_usbd_sInfo->gu8DevDesc[7];
000002  629a              STR      r2,[r3,#0x28]  ; g_usbd_pfnSetInterface
000004  6259              STR      r1,[r3,#0x24]  ; g_usbd_pfnClassRequest
000006  62d8              STR      r0,[r3,#0x2c]  ; g_usbd_sInfo
000008  6800              LDR      r0,[r0,#0]
;;;66     
;;;67         /* Initial USB engine */
;;;68         USBD->ATTR = 0x7D0;
00000a  4907              LDR      r1,|L6.40|
00000c  79c0              LDRB     r0,[r0,#7]            ;65
00000e  61d8              STR      r0,[r3,#0x1c]  ; g_usbd_CtrlMaxPktSize
000010  207d              MOVS     r0,#0x7d
000012  0100              LSLS     r0,r0,#4
000014  6108              STR      r0,[r1,#0x10]
;;;69     	/* Force SE0, and then clear it to connect */
;;;70     	USBD_SET_SE0();
000016  4804              LDR      r0,|L6.40|
000018  3080              ADDS     r0,r0,#0x80
00001a  6901              LDR      r1,[r0,#0x10]
00001c  2201              MOVS     r2,#1
00001e  4311              ORRS     r1,r1,r2
000020  6101              STR      r1,[r0,#0x10]
;;;71     }
000022  4770              BX       lr
;;;72     
                          ENDP

                  |L6.36|
                          DCD      ||.data||
                  |L6.40|
                          DCD      0x40060000

                          AREA ||i.USBD_PrepareCtrlIn||, CODE, READONLY, ALIGN=2

                  USBD_PrepareCtrlIn PROC
;;;389      */
;;;390    void USBD_PrepareCtrlIn(uint8_t *pu8Buf, uint32_t u32Size)
000000  b5f8              PUSH     {r3-r7,lr}
;;;391    {
;;;392        if(u32Size > g_usbd_CtrlMaxPktSize)
000002  4e13              LDR      r6,|L7.80|
000004  460c              MOV      r4,r1                 ;391
000006  69f2              LDR      r2,[r6,#0x1c]  ; g_usbd_CtrlMaxPktSize
;;;393        {
;;;394            // Data size > MXPLD
;;;395            g_usbd_CtrlInPointer = pu8Buf + g_usbd_CtrlMaxPktSize;
;;;396            g_usbd_CtrlInSize = u32Size - g_usbd_CtrlMaxPktSize;
;;;397    		USBD_SET_DATA1(EP0);
000008  4d12              LDR      r5,|L7.84|
00000a  2180              MOVS     r1,#0x80
;;;398            USBD_MemCopy((uint8_t *)USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0), pu8Buf, g_usbd_CtrlMaxPktSize);
00000c  4b12              LDR      r3,|L7.88|
00000e  4294              CMP      r4,r2                 ;392
000010  d90f              BLS      |L7.50|
000012  1887              ADDS     r7,r0,r2              ;395
000014  1aa4              SUBS     r4,r4,r2              ;396
000016  6037              STR      r7,[r6,#0]            ;397  ; g_usbd_CtrlInPointer
000018  6074              STR      r4,[r6,#4]            ;397  ; g_usbd_CtrlInSize
00001a  6aac              LDR      r4,[r5,#0x28]         ;397
00001c  430c              ORRS     r4,r4,r1              ;397
00001e  62ac              STR      r4,[r5,#0x28]         ;397
000020  6a29              LDR      r1,[r5,#0x20]
000022  18cb              ADDS     r3,r1,r3
000024  4601              MOV      r1,r0
000026  4618              MOV      r0,r3
000028  f7fffffe          BL       USBD_MemCopy
;;;399    		USBD_SET_PAYLOAD_LEN(EP0, g_usbd_CtrlMaxPktSize);
00002c  69f0              LDR      r0,[r6,#0x1c]  ; g_usbd_CtrlMaxPktSize
00002e  6268              STR      r0,[r5,#0x24]
;;;400        }
;;;401        else
;;;402        {
;;;403            // Data size <= MXPLD
;;;404            g_usbd_CtrlInPointer = 0;
;;;405            g_usbd_CtrlInSize = 0;
;;;406    		USBD_SET_DATA1(EP0);
;;;407            USBD_MemCopy((uint8_t *)USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0), pu8Buf, u32Size);
;;;408    		USBD_SET_PAYLOAD_LEN(EP0, u32Size);
;;;409        }
;;;410    }
000030  bdf8              POP      {r3-r7,pc}
                  |L7.50|
000032  2200              MOVS     r2,#0                 ;404
000034  6032              STR      r2,[r6,#0]            ;405  ; g_usbd_CtrlInPointer
000036  6072              STR      r2,[r6,#4]            ;406  ; g_usbd_CtrlInSize
000038  6aaa              LDR      r2,[r5,#0x28]         ;406
00003a  430a              ORRS     r2,r2,r1              ;406
00003c  62aa              STR      r2,[r5,#0x28]         ;406
00003e  6a29              LDR      r1,[r5,#0x20]         ;407
000040  4622              MOV      r2,r4                 ;407
000042  18cb              ADDS     r3,r1,r3              ;407
000044  4601              MOV      r1,r0                 ;407
000046  4618              MOV      r0,r3                 ;407
000048  f7fffffe          BL       USBD_MemCopy
00004c  626c              STR      r4,[r5,#0x24]         ;408
00004e  bdf8              POP      {r3-r7,pc}
;;;411    
                          ENDP

                  |L7.80|
                          DCD      ||.data||
                  |L7.84|
                          DCD      0x40060000
                  |L7.88|
                          DCD      0x40060100

                          AREA ||i.USBD_PrepareCtrlOut||, CODE, READONLY, ALIGN=2

                  USBD_PrepareCtrlOut PROC
;;;460      */
;;;461    void USBD_PrepareCtrlOut(uint8_t *pu8Buf, uint32_t u32Size)
000000  4a04              LDR      r2,|L8.20|
;;;462    {
;;;463        g_usbd_CtrlOutPointer = pu8Buf;
;;;464        g_usbd_CtrlOutSize = 0;
000002  6090              STR      r0,[r2,#8]  ; g_usbd_CtrlOutPointer
;;;465        g_usbd_CtrlOutSizeLimit = u32Size;
;;;466    	USBD_SET_PAYLOAD_LEN(EP1, g_usbd_CtrlMaxPktSize);
000004  6111              STR      r1,[r2,#0x10]  ; g_usbd_CtrlOutSizeLimit
000006  2000              MOVS     r0,#0                 ;464
000008  60d0              STR      r0,[r2,#0xc]  ; g_usbd_CtrlOutSize
00000a  4903              LDR      r1,|L8.24|
00000c  69d0              LDR      r0,[r2,#0x1c]  ; g_usbd_CtrlMaxPktSize
00000e  6348              STR      r0,[r1,#0x34]
;;;467    }
000010  4770              BX       lr
;;;468    
                          ENDP

000012  0000              DCW      0x0000
                  |L8.20|
                          DCD      ||.data||
                  |L8.24|
                          DCD      0x40060000

                          AREA ||i.USBD_ProcessSetupPacket||, CODE, READONLY, ALIGN=2

                  USBD_ProcessSetupPacket PROC
;;;107      */
;;;108    void USBD_ProcessSetupPacket(void)
000000  b510              PUSH     {r4,lr}
;;;109    {
;;;110        /* Get SETUP packet from USB buffer */
;;;111        USBD_MemCopy(g_usbd_SetupPacket, (uint8_t *)USBD_BUF_BASE, 8);
000002  2208              MOVS     r2,#8
000004  490e              LDR      r1,|L9.64|
000006  480f              LDR      r0,|L9.68|
000008  f7fffffe          BL       USBD_MemCopy
;;;112        /* Check the request type */
;;;113        switch (g_usbd_SetupPacket[0] & 0x60)
00000c  480d              LDR      r0,|L9.68|
00000e  2160              MOVS     r1,#0x60
000010  7800              LDRB     r0,[r0,#0]  ; g_usbd_SetupPacket
000012  4008              ANDS     r0,r0,r1
000014  d00a              BEQ      |L9.44|
000016  2820              CMP      r0,#0x20
000018  d00b              BEQ      |L9.50|
00001a  2840              CMP      r0,#0x40
00001c  d005              BEQ      |L9.42|
;;;114        {
;;;115            case REQ_STANDARD: // Standard
;;;116            {
;;;117    			USBD_StandardRequest();
;;;118    			break;
;;;119    		}
;;;120            case REQ_CLASS: // Class
;;;121            {
;;;122    			if (g_usbd_pfnClassRequest != NULL)
;;;123                {
;;;124                    g_usbd_pfnClassRequest();
;;;125                }
;;;126                break;
;;;127            }
;;;128            case REQ_VENDOR: // Vendor
;;;129            {
;;;130                break;
;;;131            }
;;;132            default: // reserved
;;;133    		{
;;;134    	        /* Setup error, stall the device */
;;;135    			USBD_SetStall(EP0);
00001e  2000              MOVS     r0,#0
000020  f7fffffe          BL       USBD_SetStall
;;;136    			USBD_SetStall(EP1);
000024  2001              MOVS     r0,#1
000026  f7fffffe          BL       USBD_SetStall
                  |L9.42|
;;;137                break;
;;;138    		}
;;;139        }
;;;140    }
00002a  bd10              POP      {r4,pc}
                  |L9.44|
00002c  f7fffffe          BL       USBD_StandardRequest
                  |L9.48|
000030  bd10              POP      {r4,pc}
                  |L9.50|
000032  4804              LDR      r0,|L9.68|
000034  3830              SUBS     r0,r0,#0x30           ;122
000036  6a40              LDR      r0,[r0,#0x24]         ;122  ; g_usbd_pfnClassRequest
000038  2800              CMP      r0,#0                 ;122
00003a  d0f9              BEQ      |L9.48|
00003c  4780              BLX      r0                    ;124
00003e  bd10              POP      {r4,pc}
;;;141    
                          ENDP

                  |L9.64|
                          DCD      0x40060100
                  |L9.68|
                          DCD      ||.data||+0x30

                          AREA ||i.USBD_SetStall||, CODE, READONLY, ALIGN=2

                  USBD_SetStall PROC
;;;355     */
;;;356    static __INLINE void USBD_SetStall(uint8_t ep)
000000  4b0a              LDR      r3,|L10.44|
;;;357    {
;;;358    	uint32_t u32CfgAddr;
;;;359    	uint32_t u32Cfg;
;;;360        int i;
;;;361    
;;;362        for (i=0; i<USBD_MAX_EP; i++)
000002  2100              MOVS     r1,#0
                  |L10.4|
;;;363        {
;;;364            u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFG; /* USBD_CFG0 */
000004  010a              LSLS     r2,r1,#4
000006  18d2              ADDS     r2,r2,r3
;;;365            u32Cfg = *((__IO uint32_t *) (u32CfgAddr));
000008  6812              LDR      r2,[r2,#0]
;;;366    
;;;367            if ((u32Cfg & 0xf) == ep)
00000a  0712              LSLS     r2,r2,#28
00000c  0f12              LSRS     r2,r2,#28
00000e  4282              CMP      r2,r0
000010  d108              BNE      |L10.36|
;;;368            {
;;;369                u32CfgAddr = (uint32_t)(i << 4) + (uint32_t)&USBD->EP[0].CFGP; /* USBD_CFGP0 */
000012  0108              LSLS     r0,r1,#4
000014  4905              LDR      r1,|L10.44|
000016  1d09              ADDS     r1,r1,#4
000018  1840              ADDS     r0,r0,r1
;;;370                u32Cfg = *((__IO uint32_t *) (u32CfgAddr));
00001a  6801              LDR      r1,[r0,#0]
;;;371    
;;;372                *((__IO uint32_t *) (u32CfgAddr)) = (u32Cfg | USBD_CFGP_SSTALL);
00001c  2202              MOVS     r2,#2
00001e  4311              ORRS     r1,r1,r2
000020  6001              STR      r1,[r0,#0]
;;;373                break;
;;;374            }
;;;375        }
;;;376    }
000022  4770              BX       lr
                  |L10.36|
000024  1c49              ADDS     r1,r1,#1              ;362
000026  2908              CMP      r1,#8                 ;362
000028  dbec              BLT      |L10.4|
00002a  4770              BX       lr
;;;377    
                          ENDP

                  |L10.44|
                          DCD      0x40060028

                          AREA ||i.USBD_StandardRequest||, CODE, READONLY, ALIGN=2

                  USBD_StandardRequest PROC
;;;244      */
;;;245    void USBD_StandardRequest(void)
000000  b5f8              PUSH     {r3-r7,lr}
;;;246    {
;;;247        /* clear global variables for new request */
;;;248        g_usbd_CtrlInPointer = 0;
000002  4f51              LDR      r7,|L11.328|
000004  2500              MOVS     r5,#0
;;;249        g_usbd_CtrlInSize = 0;
;;;250    
;;;251        if (g_usbd_SetupPacket[0] & 0x80)	/* request data transfer direction */
000006  4638              MOV      r0,r7
000008  603d              STR      r5,[r7,#0]            ;249  ; g_usbd_CtrlInPointer
00000a  3030              ADDS     r0,r0,#0x30
00000c  607d              STR      r5,[r7,#4]  ; g_usbd_CtrlInSize
00000e  7801              LDRB     r1,[r0,#0]  ; g_usbd_SetupPacket
000010  4602              MOV      r2,r0
;;;252        {
;;;253            // Device to host
;;;254            switch (g_usbd_SetupPacket[1])
;;;255            {
;;;256                case GET_CONFIGURATION:
;;;257                {
;;;258                    // Return current configuration setting
;;;259    				/* Data stage */
;;;260                    M8(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)) = g_usbd_UsbConfig;
;;;261    				USBD_SET_DATA1(EP0);
;;;262    				USBD_SET_PAYLOAD_LEN(EP0, 1);
;;;263    				/* Status stage */
;;;264                	USBD_PrepareCtrlOut(0,0);
;;;265                    break;
;;;266                }
;;;267                case GET_DESCRIPTOR:
;;;268                {
;;;269                    USBD_GetDescriptor();
;;;270                    break;
;;;271                }
;;;272                case GET_INTERFACE:
;;;273                {
;;;274                    // Return current interface setting
;;;275    				/* Data stage */
;;;276                    M8(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)) = g_usbd_UsbAltInterface;
;;;277    				USBD_SET_DATA1(EP0);
;;;278    				USBD_SET_PAYLOAD_LEN(EP0, 1);
;;;279    				/* Status stage */
;;;280    	            USBD_PrepareCtrlOut(0,0);
;;;281                    break;
;;;282                }
;;;283                case GET_STATUS:
;;;284                {
;;;285    				// Device
;;;286    				if (g_usbd_SetupPacket[0] == 0x80)
;;;287    				{
;;;288        		    	if (g_usbd_sInfo->gu8ConfigDesc[7] & 0x40)
;;;289    	                    M8(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)) = 1;	// Self-Powered
;;;290    					else
;;;291    		                M8(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)) = 0;	// bus-Powered
;;;292    				}
;;;293    				// Interface
;;;294    				else if (g_usbd_SetupPacket[0] == 0x81)
;;;295    	                M8(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)) = 0;
;;;296    				// Endpoint
;;;297    				else if (g_usbd_SetupPacket[0] == 0x82)
;;;298    				{
;;;299    		            uint8_t ep = g_usbd_SetupPacket[4] & 0xF;
000012  7910              LDRB     r0,[r2,#4]
000014  060b              LSLS     r3,r1,#24             ;251
000016  0700              LSLS     r0,r0,#28
000018  2680              MOVS     r6,#0x80              ;261
00001a  7852              LDRB     r2,[r2,#1]            ;254
00001c  4c4b              LDR      r4,|L11.332|
00001e  0f00              LSRS     r0,r0,#28
000020  2b00              CMP      r3,#0                 ;251
000022  da56              BGE      |L11.210|
000024  4b4a              LDR      r3,|L11.336|
000026  2a00              CMP      r2,#0                 ;254
000028  d019              BEQ      |L11.94|
00002a  2a06              CMP      r2,#6                 ;254
00002c  d006              BEQ      |L11.60|
00002e  2a08              CMP      r2,#8                 ;254
000030  d002              BEQ      |L11.56|
000032  2a0a              CMP      r2,#0xa               ;254
000034  d146              BNE      |L11.196|
000036  e004              B        |L11.66|
                  |L11.56|
000038  7e38              LDRB     r0,[r7,#0x18]         ;260  ; g_usbd_UsbConfig
00003a  e003              B        |L11.68|
                  |L11.60|
00003c  f7fffffe          BL       USBD_GetDescriptor
;;;300    	                M8(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)) = USBD_GetStall(ep)? 1 : 0;
;;;301    				}
;;;302       			
;;;303                    M8(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0) + 1) = 0;
;;;304    				/* Data stage */
;;;305    				USBD_SET_DATA1(EP0);
;;;306    				USBD_SET_PAYLOAD_LEN(EP0, 2);
;;;307    				/* Status stage */
;;;308    		        USBD_PrepareCtrlOut(0,0);
;;;309                    break;
;;;310                }
;;;311                default:
;;;312    			{
;;;313    	            /* Setup error, stall the device */
;;;314    				USBD_SetStall(EP0);
;;;315    				USBD_SetStall(EP1);
;;;316                    break;
;;;317    			}
;;;318            }
;;;319    	}
;;;320    	else
;;;321    	{
;;;322            // Host to device
;;;323            switch (g_usbd_SetupPacket[1])
;;;324            {
;;;325                case CLEAR_FEATURE:
;;;326                {
;;;327    				if(g_usbd_SetupPacket[2] == FEATURE_ENDPOINT_HALT)
;;;328    					USBD_ClearStall(g_usbd_SetupPacket[4] & 0xF);
;;;329    				/* Status stage */
;;;330    				USBD_SET_DATA1(EP0);
;;;331    				USBD_SET_PAYLOAD_LEN(EP0, 0);
;;;332                    break;
;;;333                }
;;;334                case SET_ADDRESS:
;;;335                {
;;;336                    g_usbd_UsbAddr = g_usbd_SetupPacket[2];
;;;337    
;;;338                    // DATA IN for end of setup 
;;;339                    /* Status Stage */
;;;340                    USBD_SET_DATA1(EP0);
;;;341                    USBD_SET_PAYLOAD_LEN(EP0, 0);
;;;342                    break;
;;;343                }
;;;344                case SET_CONFIGURATION:
;;;345                {
;;;346                    g_usbd_UsbConfig = g_usbd_SetupPacket[2];
;;;347                           
;;;348                    // DATA IN for end of setup 
;;;349    				/* Status stage */
;;;350    				USBD_SET_DATA1(EP0);
;;;351    				USBD_SET_PAYLOAD_LEN(EP0, 0);
;;;352                    break;
;;;353                }
;;;354                case SET_FEATURE:
;;;355                {
;;;356    				if(g_usbd_SetupPacket[2] == FEATURE_ENDPOINT_HALT)
;;;357    					USBD_SetStall(g_usbd_SetupPacket[4] & 0xF);
;;;358    				/* Status stage */
;;;359    				USBD_SET_DATA1(EP0);
;;;360    				USBD_SET_PAYLOAD_LEN(EP0, 0);
;;;361                    break;
;;;362                }
;;;363                case SET_INTERFACE:
;;;364                {
;;;365    				g_usbd_UsbAltInterface = g_usbd_SetupPacket[2];
;;;366                    if (g_usbd_pfnSetInterface != NULL)
;;;367                        g_usbd_pfnSetInterface();
;;;368    				/* Status stage */
;;;369    				USBD_SET_DATA1(EP0);
;;;370    				USBD_SET_PAYLOAD_LEN(EP0, 0);
;;;371                    break;
;;;372                }
;;;373                default:
;;;374    			{
;;;375    	            /* Setup error, stall the device */
;;;376    				USBD_SetStall(EP0);
;;;377    				USBD_SetStall(EP1);
;;;378                    break;
;;;379    			}
;;;380            }                
;;;381    	}
;;;382    }
000040  bdf8              POP      {r3-r7,pc}
                  |L11.66|
000042  8c38              LDRH     r0,[r7,#0x20]         ;276  ; g_usbd_UsbAltInterface
                  |L11.68|
000044  6a21              LDR      r1,[r4,#0x20]         ;260
000046  18c9              ADDS     r1,r1,r3              ;260
000048  7008              STRB     r0,[r1,#0]            ;260
00004a  6aa0              LDR      r0,[r4,#0x28]         ;261
00004c  4330              ORRS     r0,r0,r6              ;261
00004e  62a0              STR      r0,[r4,#0x28]         ;261
000050  2001              MOVS     r0,#1                 ;262
                  |L11.82|
000052  6260              STR      r0,[r4,#0x24]         ;262
000054  2100              MOVS     r1,#0                 ;264
000056  4608              MOV      r0,r1                 ;264
000058  f7fffffe          BL       USBD_PrepareCtrlOut
00005c  bdf8              POP      {r3-r7,pc}
                  |L11.94|
00005e  2980              CMP      r1,#0x80              ;286
000060  d004              BEQ      |L11.108|
000062  2981              CMP      r1,#0x81              ;294
000064  d009              BEQ      |L11.122|
000066  2982              CMP      r1,#0x82              ;297
000068  d00b              BEQ      |L11.130|
00006a  e023              B        |L11.180|
                  |L11.108|
00006c  6af8              LDR      r0,[r7,#0x2c]         ;288  ; g_usbd_sInfo
00006e  6840              LDR      r0,[r0,#4]            ;288
000070  79c0              LDRB     r0,[r0,#7]            ;288
000072  0640              LSLS     r0,r0,#25             ;288
000074  d501              BPL      |L11.122|
                  |L11.118|
000076  2001              MOVS     r0,#1                 ;289
000078  e019              B        |L11.174|
                  |L11.122|
00007a  6a20              LDR      r0,[r4,#0x20]         ;295
00007c  18c0              ADDS     r0,r0,r3              ;295
00007e  7005              STRB     r5,[r0,#0]            ;295
000080  e018              B        |L11.180|
                  |L11.130|
000082  2100              MOVS     r1,#0                 ;295
                  |L11.132|
000084  4a31              LDR      r2,|L11.332|
000086  010f              LSLS     r7,r1,#4              ;295
000088  3228              ADDS     r2,r2,#0x28           ;295
00008a  18ba              ADDS     r2,r7,r2              ;295
00008c  6817              LDR      r7,[r2,#0]            ;295
00008e  073f              LSLS     r7,r7,#28             ;295
000090  0f3f              LSRS     r7,r7,#28             ;295
000092  4287              CMP      r7,r0                 ;295
000094  d104              BNE      |L11.160|
000096  482d              LDR      r0,|L11.332|
000098  0109              LSLS     r1,r1,#4              ;295
00009a  302c              ADDS     r0,r0,#0x2c           ;295
00009c  180a              ADDS     r2,r1,r0              ;295
00009e  e002              B        |L11.166|
                  |L11.160|
0000a0  1c49              ADDS     r1,r1,#1              ;295
0000a2  2908              CMP      r1,#8                 ;295
0000a4  dbee              BLT      |L11.132|
                  |L11.166|
0000a6  6810              LDR      r0,[r2,#0]            ;295
0000a8  2102              MOVS     r1,#2                 ;295
0000aa  4008              ANDS     r0,r0,r1              ;295
0000ac  d1e3              BNE      |L11.118|
                  |L11.174|
0000ae  6a21              LDR      r1,[r4,#0x20]         ;300
0000b0  18c9              ADDS     r1,r1,r3              ;300
0000b2  7008              STRB     r0,[r1,#0]            ;300
                  |L11.180|
0000b4  6a20              LDR      r0,[r4,#0x20]         ;303
0000b6  18c0              ADDS     r0,r0,r3              ;303
0000b8  7045              STRB     r5,[r0,#1]            ;303
0000ba  6aa0              LDR      r0,[r4,#0x28]         ;305
0000bc  4330              ORRS     r0,r0,r6              ;305
0000be  62a0              STR      r0,[r4,#0x28]         ;305
0000c0  2002              MOVS     r0,#2                 ;306
0000c2  e7c6              B        |L11.82|
                  |L11.196|
0000c4  2000              MOVS     r0,#0                 ;314
0000c6  f7fffffe          BL       USBD_SetStall
0000ca  2001              MOVS     r0,#1                 ;315
0000cc  f7fffffe          BL       USBD_SetStall
0000d0  bdf8              POP      {r3-r7,pc}
                  |L11.210|
0000d2  491d              LDR      r1,|L11.328|
0000d4  3130              ADDS     r1,r1,#0x30           ;251
0000d6  7889              LDRB     r1,[r1,#2]            ;327
0000d8  2a05              CMP      r2,#5                 ;323
0000da  d02d              BEQ      |L11.312|
0000dc  dc06              BGT      |L11.236|
0000de  2a01              CMP      r2,#1                 ;323
0000e0  d00e              BEQ      |L11.256|
0000e2  2a03              CMP      r2,#3                 ;323
0000e4  d1ee              BNE      |L11.196|
0000e6  2900              CMP      r1,#0                 ;356
0000e8  d02a              BEQ      |L11.320|
0000ea  e020              B        |L11.302|
                  |L11.236|
0000ec  2a09              CMP      r2,#9                 ;323
0000ee  d025              BEQ      |L11.316|
0000f0  2a0b              CMP      r2,#0xb               ;323
0000f2  d1e7              BNE      |L11.196|
0000f4  6239              STR      r1,[r7,#0x20]         ;366  ; g_usbd_UsbAltInterface
0000f6  6ab8              LDR      r0,[r7,#0x28]         ;366  ; g_usbd_pfnSetInterface
0000f8  2800              CMP      r0,#0                 ;366
0000fa  d018              BEQ      |L11.302|
0000fc  4780              BLX      r0                    ;367
0000fe  e016              B        |L11.302|
                  |L11.256|
000100  2900              CMP      r1,#0                 ;327
000102  d114              BNE      |L11.302|
000104  4b11              LDR      r3,|L11.332|
000106  3328              ADDS     r3,r3,#0x28           ;327
                  |L11.264|
000108  010a              LSLS     r2,r1,#4              ;327
00010a  18d2              ADDS     r2,r2,r3              ;327
00010c  6812              LDR      r2,[r2,#0]            ;327
00010e  0712              LSLS     r2,r2,#28             ;327
000110  0f12              LSRS     r2,r2,#28             ;327
000112  4282              CMP      r2,r0                 ;327
000114  d108              BNE      |L11.296|
000116  480d              LDR      r0,|L11.332|
000118  0109              LSLS     r1,r1,#4              ;327
00011a  302c              ADDS     r0,r0,#0x2c           ;327
00011c  1808              ADDS     r0,r1,r0              ;327
00011e  6801              LDR      r1,[r0,#0]            ;327
000120  2202              MOVS     r2,#2                 ;327
000122  4391              BICS     r1,r1,r2              ;327
000124  6001              STR      r1,[r0,#0]            ;327
000126  e002              B        |L11.302|
                  |L11.296|
000128  1c49              ADDS     r1,r1,#1              ;327
00012a  2908              CMP      r1,#8                 ;327
00012c  dbec              BLT      |L11.264|
                  |L11.302|
00012e  6aa0              LDR      r0,[r4,#0x28]         ;330
000130  4330              ORRS     r0,r0,r6              ;330
000132  62a0              STR      r0,[r4,#0x28]         ;330
000134  6265              STR      r5,[r4,#0x24]         ;331
000136  bdf8              POP      {r3-r7,pc}
                  |L11.312|
000138  6179              STR      r1,[r7,#0x14]         ;342  ; g_usbd_UsbAddr
00013a  e7f8              B        |L11.302|
                  |L11.316|
00013c  61b9              STR      r1,[r7,#0x18]         ;352  ; g_usbd_UsbConfig
00013e  e7f6              B        |L11.302|
                  |L11.320|
000140  f7fffffe          BL       USBD_SetStall
000144  e7f3              B        |L11.302|
;;;383    
                          ENDP

000146  0000              DCW      0x0000
                  |L11.328|
                          DCD      ||.data||
                  |L11.332|
                          DCD      0x40060000
                  |L11.336|
                          DCD      0x40060100

                          AREA ||i.USBD_Start||, CODE, READONLY, ALIGN=2

                  USBD_Start PROC
;;;78       */
;;;79     void USBD_Start(void)
000000  480c              LDR      r0,|L12.52|
000002  6801              LDR      r1,[r0,#0]  ; CyclesPerUs
000004  480c              LDR      r0,|L12.56|
000006  4341              MULS     r1,r0,r1
000008  480c              LDR      r0,|L12.60|
00000a  6141              STR      r1,[r0,#0x14]
00000c  2100              MOVS     r1,#0
00000e  6181              STR      r1,[r0,#0x18]
000010  2105              MOVS     r1,#5
000012  6101              STR      r1,[r0,#0x10]
                  |L12.20|
000014  6901              LDR      r1,[r0,#0x10]
000016  03c9              LSLS     r1,r1,#15
000018  d5fc              BPL      |L12.20|
;;;80     {
;;;81         CLK_SysTickDelay(100000);
;;;82         /* Disable software-disconnect function */
;;;83     	USBD_CLR_SE0();
00001a  4809              LDR      r0,|L12.64|
00001c  6901              LDR      r1,[r0,#0x10]
00001e  0849              LSRS     r1,r1,#1
000020  0049              LSLS     r1,r1,#1
000022  6101              STR      r1,[r0,#0x10]
;;;84         
;;;85         /* Clear USB-related interrupts before enable interrupt */
;;;86         USBD_CLR_INT_FLAG(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP);
000024  4806              LDR      r0,|L12.64|
000026  210f              MOVS     r1,#0xf
000028  3880              SUBS     r0,r0,#0x80
00002a  6041              STR      r1,[r0,#4]
;;;87         
;;;88         /* Enable USB-related interrupts. */
;;;89     	UBSD_ENABLE_INT(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP);
00002c  6802              LDR      r2,[r0,#0]
00002e  430a              ORRS     r2,r2,r1
000030  6002              STR      r2,[r0,#0]
;;;90     }
000032  4770              BX       lr
;;;91     
                          ENDP

                  |L12.52|
                          DCD      CyclesPerUs
                  |L12.56|
                          DCD      0x000186a0
                  |L12.60|
                          DCD      0xe000e000
                  |L12.64|
                          DCD      0x40060080

                          AREA ||i.USBD_SwReset||, CODE, READONLY, ALIGN=2

                  USBD_SwReset PROC
;;;491      */
;;;492    void USBD_SwReset(void)
000000  4905              LDR      r1,|L13.24|
;;;493    {
;;;494        // Reset all variables for protocol
;;;495        g_usbd_CtrlInPointer = 0;
000002  2000              MOVS     r0,#0
;;;496        g_usbd_CtrlInSize = 0;
000004  6008              STR      r0,[r1,#0]  ; g_usbd_CtrlInPointer
;;;497        g_usbd_CtrlOutPointer = 0;
000006  6048              STR      r0,[r1,#4]  ; g_usbd_CtrlInSize
;;;498        g_usbd_CtrlOutSize = 0;
000008  6088              STR      r0,[r1,#8]  ; g_usbd_CtrlOutPointer
;;;499        g_usbd_CtrlOutSizeLimit = 0;
00000a  60c8              STR      r0,[r1,#0xc]  ; g_usbd_CtrlOutSize
;;;500        memset(g_usbd_SetupPacket, 0, 8);
00000c  6108              STR      r0,[r1,#0x10]  ; g_usbd_CtrlOutSizeLimit
00000e  6308              STR      r0,[r1,#0x30]  ; g_usbd_SetupPacket
;;;501    
;;;502        // Reset USB device address
;;;503    	USBD_SET_ADDR(0);
000010  6348              STR      r0,[r1,#0x34]  ; g_usbd_SetupPacket
000012  4902              LDR      r1,|L13.28|
000014  6088              STR      r0,[r1,#8]
;;;504    }
000016  4770              BX       lr
;;;505    
                          ENDP

                  |L13.24|
                          DCD      ||.data||
                  |L13.28|
                          DCD      0x40060000

                          AREA ||.data||, DATA, ALIGN=2

                  g_usbd_CtrlInPointer
                          DCD      0x00000000
                  g_usbd_CtrlInSize
                          DCD      0x00000000
                  g_usbd_CtrlOutPointer
                          DCD      0x00000000
                  g_usbd_CtrlOutSize
                          DCD      0x00000000
                  g_usbd_CtrlOutSizeLimit
                          DCD      0x00000000
                  g_usbd_UsbAddr
                          DCD      0x00000000
                  g_usbd_UsbConfig
                          DCD      0x00000000
                  g_usbd_CtrlMaxPktSize
                          DCD      0x00000008
                  g_usbd_UsbAltInterface
                          DCD      0x00000000
                  g_usbd_pfnClassRequest
                          DCD      0x00000000
                  g_usbd_pfnSetInterface
                          DCD      0x00000000
                  g_usbd_sInfo
                          DCD      0x00000000
                  g_usbd_SetupPacket
000030  00000000          DCB      0x00,0x00,0x00,0x00
                          DCD      0x00000000

;*** Start embedded assembler ***

#line 1 "..\\..\\..\\..\\Library\\StdDriver\\src\\usbd.c"
	AREA ||.rev16_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___6_usbd_c_4b498b38____REV16|
#line 118 "..\\..\\..\\..\\Library\\CMSIS\\Include\\core_cmInstr.h"
|__asm___6_usbd_c_4b498b38____REV16| PROC
#line 119

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___6_usbd_c_4b498b38____REVSH|
#line 132
|__asm___6_usbd_c_4b498b38____REVSH| PROC
#line 133

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
