K22Fdevelopment.axf: file format elf32-littlearm Disassembly of section .text: 00008200 <__Vectors>: 8200: 00 00 01 20 a5 83 00 00 f1 83 00 00 4b 1c 01 00 ... ........K... 8210: f5 83 00 00 f7 83 00 00 f9 83 00 00 00 00 00 00 ................ ... 822c: fb 83 00 00 fd 83 00 00 00 00 00 00 ff 83 00 00 ................ 823c: 01 84 00 00 bd ea 00 00 c5 ea 00 00 cd ea 00 00 ................ 824c: d5 ea 00 00 dd ea 00 00 e5 ea 00 00 ed ea 00 00 ................ 825c: f5 ea 00 00 fd ea 00 00 05 eb 00 00 0d eb 00 00 ................ 826c: 15 eb 00 00 1d eb 00 00 25 eb 00 00 2d eb 00 00 ........%...-... 827c: 35 eb 00 00 3d eb 00 00 45 eb 00 00 4d eb 00 00 5...=...E...M... 828c: 55 eb 00 00 5d eb 00 00 65 eb 00 00 6d eb 00 00 U...]...e...m... 829c: 75 eb 00 00 7d eb 00 00 85 eb 00 00 8d eb 00 00 u...}........... 82ac: 95 eb 00 00 9d eb 00 00 a5 eb 00 00 ad eb 00 00 ................ 82bc: b5 eb 00 00 bd eb 00 00 c5 eb 00 00 cd eb 00 00 ................ 82cc: d5 eb 00 00 dd eb 00 00 e5 eb 00 00 ed eb 00 00 ................ 82dc: f5 eb 00 00 fd eb 00 00 05 ec 00 00 0d ec 00 00 ................ 82ec: 15 ec 00 00 1d ec 00 00 25 ec 00 00 2d ec 00 00 ........%...-... 82fc: 35 ec 00 00 ad c8 00 00 3d ec 00 00 45 ec 00 00 5.......=...E... 830c: 4d ec 00 00 55 ec 00 00 ad cb 00 00 5d ec 00 00 M...U.......]... 831c: 65 ec 00 00 6d ec 00 00 75 ec 00 00 7d ec 00 00 e...m...u...}... 832c: 85 ec 00 00 8d ec 00 00 95 ec 00 00 9d ec 00 00 ................ 833c: a5 ec 00 00 ad ec 00 00 b5 ec 00 00 bd ec 00 00 ................ 834c: c5 ec 00 00 cd ec 00 00 d5 ec 00 00 dd ec 00 00 ................ 835c: e5 ec 00 00 ed ec 00 00 f5 ec 00 00 ............ 00008368 <__data_section_table>: 8368: 0001321c .word 0x0001321c 836c: 20000000 .word 0x20000000 8370: 00000150 .word 0x00000150 8374: 0001321c .word 0x0001321c 8378: 1fff0000 .word 0x1fff0000 837c: 00000000 .word 0x00000000 8380: 0001321c .word 0x0001321c 8384: 14000000 .word 0x14000000 8388: 00000000 .word 0x00000000 0000838c <__bss_section_table>: 838c: 20000200 .word 0x20000200 8390: 000010f8 .word 0x000010f8 8394: 1fff0000 .word 0x1fff0000 8398: 00000000 .word 0x00000000 839c: 14000000 .word 0x14000000 83a0: 00000000 .word 0x00000000 000083a4 : // Reset entry point for your code. // Sets up a simple runtime environment and initializes the C/C++ // library. //***************************************************************************** __attribute__ ((section(".after_vectors.reset"))) void ResetISR(void) { 83a4: b510 push {r4, lr} // Disable interrupts __asm volatile ("cpsid i"); 83a6: b672 cpsid i #if defined (__USE_CMSIS) // If __USE_CMSIS defined, then call CMSIS SystemInit code SystemInit(); 83a8: f005 fa3c bl d824 // unsigned int LoadAddr, ExeAddr, SectionLen; unsigned int *SectionTableAddr; // Load base address of Global Section Table SectionTableAddr = &__data_section_table; 83ac: 4b0d ldr r3, [pc, #52] ; (83e4 ) // Copy the data sections from flash to SRAM. while (SectionTableAddr < &__data_section_table_end) { 83ae: e007 b.n 83c0 LoadAddr = *SectionTableAddr++; ExeAddr = *SectionTableAddr++; SectionLen = *SectionTableAddr++; 83b0: f103 040c add.w r4, r3, #12 data_init(LoadAddr, ExeAddr, SectionLen); 83b4: 689a ldr r2, [r3, #8] 83b6: 6859 ldr r1, [r3, #4] 83b8: 6818 ldr r0, [r3, #0] 83ba: f000 f823 bl 8404 SectionLen = *SectionTableAddr++; 83be: 4623 mov r3, r4 while (SectionTableAddr < &__data_section_table_end) { 83c0: 4a09 ldr r2, [pc, #36] ; (83e8 ) 83c2: 4293 cmp r3, r2 83c4: d3f4 bcc.n 83b0 83c6: e006 b.n 83d6 } // At this point, SectionTableAddr = &__bss_section_table; // Zero fill the bss segment while (SectionTableAddr < &__bss_section_table_end) { ExeAddr = *SectionTableAddr++; 83c8: 461c mov r4, r3 SectionLen = *SectionTableAddr++; bss_init(ExeAddr, SectionLen); 83ca: 6859 ldr r1, [r3, #4] 83cc: f854 0b08 ldr.w r0, [r4], #8 83d0: f000 f827 bl 8422 SectionLen = *SectionTableAddr++; 83d4: 4623 mov r3, r4 while (SectionTableAddr < &__bss_section_table_end) { 83d6: 4a05 ldr r2, [pc, #20] ; (83ec ) 83d8: 4293 cmp r3, r2 83da: d3f5 bcc.n 83c8 // __libc_init_array(); #endif // Reenable interrupts __asm volatile ("cpsie i"); 83dc: b662 cpsie i #if defined (__REDLIB__) // Call the Redlib library, which in turn calls main() __main(); 83de: f009 fd0d bl 11dfc <__main> // // main() shouldn't return, but if it does, we'll just enter an infinite loop // while (1) { ; 83e2: e7fe b.n 83e2 83e4: 00008368 .word 0x00008368 83e8: 0000838c .word 0x0000838c 83ec: 000083a4 .word 0x000083a4 000083f0 : //***************************************************************************** // Default core exception handlers. Override the ones here by defining your own // handler routines in your application code. //***************************************************************************** WEAK_AV void NMI_Handler(void) { while(1) {} 83f0: e7fe b.n 83f0 } WEAK_AV void HardFault_Handler(void) { while(1) {} 83f2: e7fe b.n 83f2 000083f4 : } WEAK_AV void MemManage_Handler(void) { while(1) {} 83f4: e7fe b.n 83f4 000083f6 : } WEAK_AV void BusFault_Handler(void) { while(1) {} 83f6: e7fe b.n 83f6 000083f8 : } WEAK_AV void UsageFault_Handler(void) { while(1) {} 83f8: e7fe b.n 83f8 000083fa : } WEAK_AV void SVC_Handler(void) { while(1) {} 83fa: e7fe b.n 83fa 000083fc : } WEAK_AV void DebugMon_Handler(void) { while(1) {} 83fc: e7fe b.n 83fc 000083fe : } WEAK_AV void PendSV_Handler(void) { while(1) {} 83fe: e7fe b.n 83fe 00008400 : } WEAK_AV void SysTick_Handler(void) { while(1) {} 8400: e7fe b.n 8400 00008402 : //***************************************************************************** // Processor ends up here if an unexpected interrupt occurs or a specific // handler is not present in the application code. //***************************************************************************** WEAK_AV void IntDefaultHandler(void) { while(1) {} 8402: e7fe b.n 8402 00008404 : for (loop = 0; loop < len; loop = loop + 4) 8404: 2300 movs r3, #0 8406: 4293 cmp r3, r2 8408: d20a bcs.n 8420 void data_init(unsigned int romstart, unsigned int start, unsigned int len) { 840a: b410 push {r4} *pulDest++ = *pulSrc++; 840c: f850 4b04 ldr.w r4, [r0], #4 8410: f841 4b04 str.w r4, [r1], #4 for (loop = 0; loop < len; loop = loop + 4) 8414: 3304 adds r3, #4 8416: 4293 cmp r3, r2 8418: d3f8 bcc.n 840c } 841a: f85d 4b04 ldr.w r4, [sp], #4 841e: 4770 bx lr 8420: 4770 bx lr 00008422 : for (loop = 0; loop < len; loop = loop + 4) 8422: 2300 movs r3, #0 8424: 428b cmp r3, r1 8426: d204 bcs.n 8432 *pulDest++ = 0; 8428: 2200 movs r2, #0 842a: f840 2b04 str.w r2, [r0], #4 for (loop = 0; loop < len; loop = loop + 4) 842e: 3304 adds r3, #4 8430: e7f8 b.n 8424 } 8432: 4770 bx lr 00008434 : * @return A USB error code or kStatus_USB_Success. */ static usb_status_t USB_DeviceControlCallback(usb_device_handle handle, usb_device_endpoint_callback_message_struct_t *message, void *callbackParam) { 8434: b5f0 push {r4, r5, r6, r7, lr} 8436: b08b sub sp, #44 ; 0x2c usb_setup_struct_t *deviceSetup, *setup; usb_device_common_class_struct_t *classHandle; uint8_t *buffer = (uint8_t *)NULL; 8438: 2300 movs r3, #0 843a: 9309 str r3, [sp, #36] ; 0x24 uint32_t length = 0U; 843c: 9308 str r3, [sp, #32] void *temp; usb_status_t status = kStatus_USB_InvalidRequest; uint8_t state = 0U; 843e: f88d 301f strb.w r3, [sp, #31] if ((0xFFFFFFFFU == message->length) || (NULL == callbackParam)) 8442: 684b ldr r3, [r1, #4] 8444: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff 8448: f000 80ed beq.w 8626 844c: 2a00 cmp r2, #0 844e: f000 80ec beq.w 862a 8452: 4616 mov r6, r2 8454: 460c mov r4, r1 8456: 4605 mov r5, r0 { return status; } classHandle = (usb_device_common_class_struct_t *)callbackParam; temp = (void *)&classHandle->setupBuffer[0]; 8458: 6897 ldr r7, [r2, #8] deviceSetup = (usb_setup_struct_t *)temp; (void)USB_DeviceGetStatus(handle, kUSB_DeviceStatusDeviceState, &state); 845a: f10d 021f add.w r2, sp, #31 845e: 2106 movs r1, #6 8460: f006 ff90 bl f384 if (0U != message->isSetup) 8464: 7a23 ldrb r3, [r4, #8] 8466: 2b00 cmp r3, #0 8468: f000 8098 beq.w 859c { if ((USB_SETUP_PACKET_SIZE != message->length) || (NULL == message->buffer)) 846c: 6863 ldr r3, [r4, #4] 846e: 2b08 cmp r3, #8 8470: f040 80dd bne.w 862e 8474: 6823 ldr r3, [r4, #0] 8476: 2b00 cmp r3, #0 8478: f000 80db beq.w 8632 /* Receive a setup request */ temp = (void *)(message->buffer); setup = (usb_setup_struct_t *)temp; /* Copy the setup packet to the application buffer */ deviceSetup->wValue = USB_SHORT_FROM_LITTLE_ENDIAN(setup->wValue); 847c: 885a ldrh r2, [r3, #2] 847e: 807a strh r2, [r7, #2] deviceSetup->wIndex = USB_SHORT_FROM_LITTLE_ENDIAN(setup->wIndex); 8480: 889a ldrh r2, [r3, #4] 8482: 80ba strh r2, [r7, #4] deviceSetup->wLength = USB_SHORT_FROM_LITTLE_ENDIAN(setup->wLength); 8484: 88d9 ldrh r1, [r3, #6] 8486: 80f9 strh r1, [r7, #6] deviceSetup->bRequest = setup->bRequest; 8488: 785a ldrb r2, [r3, #1] 848a: 707a strb r2, [r7, #1] deviceSetup->bmRequestType = setup->bmRequestType; 848c: 781b ldrb r3, [r3, #0] 848e: 703b strb r3, [r7, #0] if ((deviceSetup->bmRequestType & USB_REQUEST_TYPE_TYPE_MASK) == USB_REQUEST_TYPE_TYPE_STANDARD) 8490: f013 0f60 tst.w r3, #96 ; 0x60 8494: d10d bne.n 84b2 { /* Handle the standard request, only handle the request in request array. */ if (deviceSetup->bRequest < (sizeof(s_UsbDeviceStandardRequest) / 4U)) 8496: 2a0c cmp r2, #12 8498: d872 bhi.n 8580 { if (s_UsbDeviceStandardRequest[deviceSetup->bRequest] != (usb_standard_request_callback_t)NULL) 849a: 4b6a ldr r3, [pc, #424] ; (8644 ) 849c: f853 4022 ldr.w r4, [r3, r2, lsl #2] 84a0: 2c00 cmp r4, #0 84a2: d079 beq.n 8598 { status = s_UsbDeviceStandardRequest[deviceSetup->bRequest](classHandle, deviceSetup, &buffer, &length); 84a4: ab08 add r3, sp, #32 84a6: aa09 add r2, sp, #36 ; 0x24 84a8: 4639 mov r1, r7 84aa: 4630 mov r0, r6 84ac: 47a0 blx r4 84ae: 4602 mov r2, r0 84b0: e067 b.n 8582 } } } else { if ((0U != deviceSetup->wLength) && 84b2: 2900 cmp r1, #0 84b4: d037 beq.n 8526 84b6: f013 0f80 tst.w r3, #128 ; 0x80 84ba: d134 bne.n 8526 ((deviceSetup->bmRequestType & USB_REQUEST_TYPE_DIR_MASK) == USB_REQUEST_TYPE_DIR_OUT)) { /* Class or vendor request with the OUT data phase. */ if ((0U != deviceSetup->wLength) && 84bc: f013 0f20 tst.w r3, #32 84c0: d104 bne.n 84cc controlRequest.length = deviceSetup->wLength; status = USB_DeviceClassEvent(handle, kUSB_DeviceClassEventClassRequest, &controlRequest); length = controlRequest.length; buffer = controlRequest.buffer; } else if ((0U != deviceSetup->wLength) && 84c2: f013 0f40 tst.w r3, #64 ; 0x40 84c6: d11b bne.n 8500 usb_status_t status = kStatus_USB_InvalidRequest; 84c8: 2205 movs r2, #5 84ca: e05a b.n 8582 controlRequest.buffer = (uint8_t *)NULL; 84cc: 2300 movs r3, #0 84ce: 9304 str r3, [sp, #16] controlRequest.isSetup = 1U; 84d0: 2101 movs r1, #1 84d2: f88d 1018 strb.w r1, [sp, #24] controlRequest.setup = deviceSetup; 84d6: 9703 str r7, [sp, #12] controlRequest.length = deviceSetup->wLength; 84d8: 88fb ldrh r3, [r7, #6] 84da: 9305 str r3, [sp, #20] status = USB_DeviceClassEvent(handle, kUSB_DeviceClassEventClassRequest, &controlRequest); 84dc: aa03 add r2, sp, #12 84de: 4628 mov r0, r5 84e0: f000 f906 bl 86f0 84e4: 4602 mov r2, r0 length = controlRequest.length; 84e6: 9b05 ldr r3, [sp, #20] 84e8: 9308 str r3, [sp, #32] buffer = controlRequest.buffer; 84ea: 9b04 ldr r3, [sp, #16] 84ec: 9309 str r3, [sp, #36] ; 0x24 } else { /*no action*/ } if (kStatus_USB_Success == status) 84ee: 2a00 cmp r2, #0 84f0: d147 bne.n 8582 { /* Prime an OUT transfer */ status = USB_DeviceRecvRequest(handle, USB_CONTROL_ENDPOINT, buffer, deviceSetup->wLength); 84f2: 88fb ldrh r3, [r7, #6] 84f4: 9a09 ldr r2, [sp, #36] ; 0x24 84f6: 2100 movs r1, #0 84f8: 4628 mov r0, r5 84fa: f006 fec7 bl f28c return status; 84fe: e049 b.n 8594 controlRequest.buffer = (uint8_t *)NULL; 8500: 2300 movs r3, #0 8502: 9304 str r3, [sp, #16] controlRequest.isSetup = 1U; 8504: 2301 movs r3, #1 8506: f88d 3018 strb.w r3, [sp, #24] controlRequest.setup = deviceSetup; 850a: 9703 str r7, [sp, #12] controlRequest.length = deviceSetup->wLength; 850c: 88fb ldrh r3, [r7, #6] 850e: 9305 str r3, [sp, #20] status = USB_DeviceClassCallback(handle, (uint32_t)kUSB_DeviceEventVendorRequest, &controlRequest); 8510: aa03 add r2, sp, #12 8512: 2113 movs r1, #19 8514: 4628 mov r0, r5 8516: f000 f931 bl 877c 851a: 4602 mov r2, r0 length = controlRequest.length; 851c: 9b05 ldr r3, [sp, #20] 851e: 9308 str r3, [sp, #32] buffer = controlRequest.buffer; 8520: 9b04 ldr r3, [sp, #16] 8522: 9309 str r3, [sp, #36] ; 0x24 8524: e7e3 b.n 84ee } } else { /* Class or vendor request with the IN data phase. */ if (((deviceSetup->bmRequestType & USB_REQUEST_TYPE_TYPE_CLASS) == USB_REQUEST_TYPE_TYPE_CLASS)) 8526: f013 0f20 tst.w r3, #32 852a: d104 bne.n 8536 controlRequest.length = deviceSetup->wLength; status = USB_DeviceClassEvent(handle, kUSB_DeviceClassEventClassRequest, &controlRequest); length = controlRequest.length; buffer = controlRequest.buffer; } else if (((deviceSetup->bmRequestType & USB_REQUEST_TYPE_TYPE_VENDOR) == USB_REQUEST_TYPE_TYPE_VENDOR)) 852c: f013 0f40 tst.w r3, #64 ; 0x40 8530: d113 bne.n 855a usb_status_t status = kStatus_USB_InvalidRequest; 8532: 2205 movs r2, #5 8534: e025 b.n 8582 controlRequest.buffer = (uint8_t *)NULL; 8536: 2300 movs r3, #0 8538: 9304 str r3, [sp, #16] controlRequest.isSetup = 1U; 853a: 2101 movs r1, #1 853c: f88d 1018 strb.w r1, [sp, #24] controlRequest.setup = deviceSetup; 8540: 9703 str r7, [sp, #12] controlRequest.length = deviceSetup->wLength; 8542: 88fb ldrh r3, [r7, #6] 8544: 9305 str r3, [sp, #20] status = USB_DeviceClassEvent(handle, kUSB_DeviceClassEventClassRequest, &controlRequest); 8546: aa03 add r2, sp, #12 8548: 4628 mov r0, r5 854a: f000 f8d1 bl 86f0 854e: 4602 mov r2, r0 length = controlRequest.length; 8550: 9b05 ldr r3, [sp, #20] 8552: 9308 str r3, [sp, #32] buffer = controlRequest.buffer; 8554: 9b04 ldr r3, [sp, #16] 8556: 9309 str r3, [sp, #36] ; 0x24 8558: e013 b.n 8582 { /* Get data buffer to response the host. */ usb_device_control_request_struct_t controlRequest; controlRequest.buffer = (uint8_t *)NULL; 855a: 2300 movs r3, #0 855c: 9304 str r3, [sp, #16] controlRequest.isSetup = 1U; 855e: 2301 movs r3, #1 8560: f88d 3018 strb.w r3, [sp, #24] controlRequest.setup = deviceSetup; 8564: 9703 str r7, [sp, #12] controlRequest.length = deviceSetup->wLength; 8566: 88fb ldrh r3, [r7, #6] 8568: 9305 str r3, [sp, #20] status = USB_DeviceClassCallback(handle, (uint32_t)kUSB_DeviceEventVendorRequest, &controlRequest); 856a: aa03 add r2, sp, #12 856c: 2113 movs r1, #19 856e: 4628 mov r0, r5 8570: f000 f904 bl 877c 8574: 4602 mov r2, r0 length = controlRequest.length; 8576: 9b05 ldr r3, [sp, #20] 8578: 9308 str r3, [sp, #32] buffer = controlRequest.buffer; 857a: 9b04 ldr r3, [sp, #16] 857c: 9309 str r3, [sp, #36] ; 0x24 857e: e000 b.n 8582 usb_status_t status = kStatus_USB_InvalidRequest; 8580: 2205 movs r2, #5 /*no action*/ } } } /* Send the response to the host. */ status = USB_DeviceControlCallbackFeedback(handle, deviceSetup, status, kUSB_DeviceControlPipeSetupStage, 8582: ab08 add r3, sp, #32 8584: 9301 str r3, [sp, #4] 8586: ab09 add r3, sp, #36 ; 0x24 8588: 9300 str r3, [sp, #0] 858a: 2300 movs r3, #0 858c: 4639 mov r1, r7 858e: 4628 mov r0, r5 8590: f006 fd83 bl f09a else { /*no action*/ } return status; } 8594: b00b add sp, #44 ; 0x2c 8596: bdf0 pop {r4, r5, r6, r7, pc} usb_status_t status = kStatus_USB_InvalidRequest; 8598: 2205 movs r2, #5 859a: e7f2 b.n 8582 else if ((uint8_t)kUSB_DeviceStateAddressing == state) 859c: f89d 301f ldrb.w r3, [sp, #31] 85a0: 2b03 cmp r3, #3 85a2: d01a beq.n 85da else if ((0U != message->length) && (0U != deviceSetup->wLength) && 85a4: 6863 ldr r3, [r4, #4] 85a6: 2b00 cmp r3, #0 85a8: d045 beq.n 8636 85aa: 88fa ldrh r2, [r7, #6] 85ac: 2a00 cmp r2, #0 85ae: d044 beq.n 863a ((deviceSetup->bmRequestType & USB_REQUEST_TYPE_DIR_MASK) == USB_REQUEST_TYPE_DIR_OUT)) 85b0: 783a ldrb r2, [r7, #0] else if ((0U != message->length) && (0U != deviceSetup->wLength) && 85b2: f012 0f80 tst.w r2, #128 ; 0x80 85b6: d142 bne.n 863e if (((deviceSetup->bmRequestType & USB_REQUEST_TYPE_TYPE_CLASS) == USB_REQUEST_TYPE_TYPE_CLASS)) 85b8: f012 0f20 tst.w r2, #32 85bc: d117 bne.n 85ee else if (((deviceSetup->bmRequestType & USB_REQUEST_TYPE_TYPE_VENDOR) == USB_REQUEST_TYPE_TYPE_VENDOR)) 85be: f012 0f40 tst.w r2, #64 ; 0x40 85c2: d122 bne.n 860a usb_status_t status = kStatus_USB_InvalidRequest; 85c4: 2205 movs r2, #5 status = USB_DeviceControlCallbackFeedback(handle, deviceSetup, status, kUSB_DeviceControlPipeDataStage, 85c6: ab08 add r3, sp, #32 85c8: 9301 str r3, [sp, #4] 85ca: ab09 add r3, sp, #36 ; 0x24 85cc: 9300 str r3, [sp, #0] 85ce: 2301 movs r3, #1 85d0: 4639 mov r1, r7 85d2: 4628 mov r0, r5 85d4: f006 fd61 bl f09a 85d8: e7dc b.n 8594 status = s_UsbDeviceStandardRequest[deviceSetup->bRequest](classHandle, deviceSetup, &buffer, &length); 85da: 787a ldrb r2, [r7, #1] 85dc: 4b19 ldr r3, [pc, #100] ; (8644 ) 85de: f853 4022 ldr.w r4, [r3, r2, lsl #2] 85e2: ab08 add r3, sp, #32 85e4: aa09 add r2, sp, #36 ; 0x24 85e6: 4639 mov r1, r7 85e8: 4630 mov r0, r6 85ea: 47a0 blx r4 85ec: e7d2 b.n 8594 controlRequest.buffer = message->buffer; 85ee: 6822 ldr r2, [r4, #0] 85f0: 9204 str r2, [sp, #16] controlRequest.isSetup = 0U; 85f2: 2200 movs r2, #0 85f4: f88d 2018 strb.w r2, [sp, #24] controlRequest.setup = deviceSetup; 85f8: 9703 str r7, [sp, #12] controlRequest.length = message->length; 85fa: 9305 str r3, [sp, #20] status = USB_DeviceClassEvent(handle, kUSB_DeviceClassEventClassRequest, &controlRequest); 85fc: aa03 add r2, sp, #12 85fe: 2101 movs r1, #1 8600: 4628 mov r0, r5 8602: f000 f875 bl 86f0 8606: 4602 mov r2, r0 8608: e7dd b.n 85c6 controlRequest.buffer = message->buffer; 860a: 6822 ldr r2, [r4, #0] 860c: 9204 str r2, [sp, #16] controlRequest.isSetup = 0U; 860e: 2200 movs r2, #0 8610: f88d 2018 strb.w r2, [sp, #24] controlRequest.setup = deviceSetup; 8614: 9703 str r7, [sp, #12] controlRequest.length = message->length; 8616: 9305 str r3, [sp, #20] status = USB_DeviceClassCallback(handle, (uint32_t)kUSB_DeviceEventVendorRequest, &controlRequest); 8618: aa03 add r2, sp, #12 861a: 2113 movs r1, #19 861c: 4628 mov r0, r5 861e: f000 f8ad bl 877c 8622: 4602 mov r2, r0 8624: e7cf b.n 85c6 return status; 8626: 2005 movs r0, #5 8628: e7b4 b.n 8594 862a: 2005 movs r0, #5 862c: e7b2 b.n 8594 return status; 862e: 2005 movs r0, #5 8630: e7b0 b.n 8594 8632: 2005 movs r0, #5 8634: e7ae b.n 8594 usb_status_t status = kStatus_USB_InvalidRequest; 8636: 2005 movs r0, #5 8638: e7ac b.n 8594 863a: 2005 movs r0, #5 863c: e7aa b.n 8594 863e: 2005 movs r0, #5 8640: e7a8 b.n 8594 8642: bf00 nop 8644: 000123d4 .word 0x000123d4 00008648 : * @param param The up layer handle. * * @return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceControlPipeInit(usb_device_handle handle, void *param) { 8648: b530 push {r4, r5, lr} 864a: b087 sub sp, #28 864c: 4605 mov r5, r0 usb_device_endpoint_init_struct_t epInitStruct; usb_device_endpoint_callback_struct_t epCallback; usb_status_t status; epCallback.callbackFn = USB_DeviceControlCallback; 864e: 4b15 ldr r3, [pc, #84] ; (86a4 ) 8650: 9301 str r3, [sp, #4] epCallback.callbackParam = param; 8652: 9102 str r1, [sp, #8] epInitStruct.zlt = 1U; 8654: 2301 movs r3, #1 8656: f88d 3014 strb.w r3, [sp, #20] epInitStruct.transferType = USB_ENDPOINT_CONTROL; 865a: 2300 movs r3, #0 865c: f88d 3013 strb.w r3, [sp, #19] epInitStruct.interval = 0; 8660: f88d 3015 strb.w r3, [sp, #21] epInitStruct.endpointAddress = USB_CONTROL_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); 8664: 2380 movs r3, #128 ; 0x80 8666: f88d 3012 strb.w r3, [sp, #18] epInitStruct.maxPacketSize = USB_CONTROL_MAX_PACKET_SIZE; 866a: 2340 movs r3, #64 ; 0x40 866c: f8ad 3010 strh.w r3, [sp, #16] /* Initialize the control IN pipe */ status = USB_DeviceInitEndpoint(handle, &epInitStruct, &epCallback); 8670: aa01 add r2, sp, #4 8672: a904 add r1, sp, #16 8674: f006 fe1c bl f2b0 if (kStatus_USB_Success != status) 8678: 4604 mov r4, r0 867a: b110 cbz r0, 8682 handle, USB_CONTROL_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT)); return status; } return kStatus_USB_Success; } 867c: 4620 mov r0, r4 867e: b007 add sp, #28 8680: bd30 pop {r4, r5, pc} epInitStruct.endpointAddress = USB_CONTROL_ENDPOINT | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); 8682: 2300 movs r3, #0 8684: f88d 3012 strb.w r3, [sp, #18] status = USB_DeviceInitEndpoint(handle, &epInitStruct, &epCallback); 8688: aa01 add r2, sp, #4 868a: a904 add r1, sp, #16 868c: 4628 mov r0, r5 868e: f006 fe0f bl f2b0 if (kStatus_USB_Success != status) 8692: 4604 mov r4, r0 8694: 2800 cmp r0, #0 8696: d0f1 beq.n 867c (void)USB_DeviceDeinitEndpoint( 8698: 2180 movs r1, #128 ; 0x80 869a: 4628 mov r0, r5 869c: f006 fe2e bl f2fc return status; 86a0: e7ec b.n 867c 86a2: bf00 nop 86a4: 00008435 .word 0x00008435 000086a8 : OSA_SR_ALLOC(); OSA_ENTER_CRITICAL(); for (; count < USB_DEVICE_CONFIG_NUM; count++) { if ((NULL != s_UsbDeviceCommonClassStruct[count].handle) && 86a8: 4b08 ldr r3, [pc, #32] ; (86cc ) 86aa: 681b ldr r3, [r3, #0] 86ac: b15b cbz r3, 86c6 (controllerId == s_UsbDeviceCommonClassStruct[count].controllerId)) 86ae: 4b07 ldr r3, [pc, #28] ; (86cc ) if ((NULL != s_UsbDeviceCommonClassStruct[count].handle) && 86b0: 7b9b ldrb r3, [r3, #14] 86b2: 4283 cmp r3, r0 86b4: d001 beq.n 86ba return kStatus_USB_Success; } } OSA_EXIT_CRITICAL(); return kStatus_USB_InvalidParameter; 86b6: 2004 movs r0, #4 } 86b8: 4770 bx lr s_UsbDeviceCommonClassStruct[count].handle = NULL; 86ba: 4b04 ldr r3, [pc, #16] ; (86cc ) 86bc: 2000 movs r0, #0 86be: 6018 str r0, [r3, #0] s_UsbDeviceCommonClassStruct[count].configList = (usb_device_class_config_list_struct_t *)NULL; 86c0: 6058 str r0, [r3, #4] s_UsbDeviceCommonClassStruct[count].controllerId = 0U; 86c2: 7398 strb r0, [r3, #14] return kStatus_USB_Success; 86c4: 4770 bx lr return kStatus_USB_InvalidParameter; 86c6: 2004 movs r0, #4 86c8: 4770 bx lr 86ca: bf00 nop 86cc: 20000400 .word 0x20000400 000086d0 : OSA_SR_ALLOC(); OSA_ENTER_CRITICAL(); for (; count < USB_DEVICE_CONFIG_NUM; count++) { if ((NULL != s_UsbDeviceCommonClassStruct[count].handle) && 86d0: 4b06 ldr r3, [pc, #24] ; (86ec ) 86d2: 681b ldr r3, [r3, #0] 86d4: b143 cbz r3, 86e8 (controllerId == s_UsbDeviceCommonClassStruct[count].controllerId)) 86d6: 4a05 ldr r2, [pc, #20] ; (86ec ) if ((NULL != s_UsbDeviceCommonClassStruct[count].handle) && 86d8: 7b92 ldrb r2, [r2, #14] 86da: 4282 cmp r2, r0 86dc: d001 beq.n 86e2 OSA_EXIT_CRITICAL(); return kStatus_USB_Success; } } OSA_EXIT_CRITICAL(); return kStatus_USB_InvalidParameter; 86de: 2004 movs r0, #4 } 86e0: 4770 bx lr *handle = s_UsbDeviceCommonClassStruct[count].handle; 86e2: 600b str r3, [r1, #0] return kStatus_USB_Success; 86e4: 2000 movs r0, #0 86e6: 4770 bx lr return kStatus_USB_InvalidParameter; 86e8: 2004 movs r0, #4 86ea: 4770 bx lr 86ec: 20000400 .word 0x20000400 000086f0 : * @retval kStatus_USB_Success A valid request has been handled. * @retval kStatus_USB_InvalidParameter The device handle not be found. * @retval kStatus_USB_InvalidRequest The request is invalid, and the control pipe will be stalled by the caller. */ usb_status_t USB_DeviceClassEvent(usb_device_handle handle, usb_device_class_event_t event, void *param) { 86f0: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} uint8_t mapIndex; uint8_t classIndex; usb_status_t errorReturn; usb_status_t status = kStatus_USB_Error; if (NULL == param) 86f4: 2a00 cmp r2, #0 86f6: d038 beq.n 876a 86f8: 4690 mov r8, r2 if (deviceHandle == s_UsbDeviceCommonClassStruct[count].handle) 86fa: 4b1e ldr r3, [pc, #120] ; (8774 ) 86fc: 681b ldr r3, [r3, #0] 86fe: 4298 cmp r0, r3 /* Get the common class handle according to the device handle. */ errorReturn = USB_DeviceClassGetHandleByDeviceHandle(handle, &classHandle); if (kStatus_USB_Success != errorReturn) { return kStatus_USB_InvalidParameter; 8700: bf18 it ne 8702: 2604 movne r6, #4 if (deviceHandle == s_UsbDeviceCommonClassStruct[count].handle) 8704: d002 beq.n 870c } } } return status; } 8706: 4630 mov r0, r6 8708: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} for (classIndex = 0U; classIndex < classHandle->configList->count; classIndex++) 870c: 4b19 ldr r3, [pc, #100] ; (8774 ) 870e: 685a ldr r2, [r3, #4] 8710: 7a13 ldrb r3, [r2, #8] usb_status_t status = kStatus_USB_Error; 8712: 2601 movs r6, #1 for (classIndex = 0U; classIndex < classHandle->configList->count; classIndex++) 8714: 2b00 cmp r3, #0 8716: d0f6 beq.n 8706 8718: 468b mov fp, r1 871a: 2400 movs r4, #0 usb_status_t status = kStatus_USB_Error; 871c: 2601 movs r6, #1 errorReturn = s_UsbDeviceClassInterfaceMap[mapIndex].classEventCallback( 871e: f8df 9058 ldr.w r9, [pc, #88] ; 8778 if (s_UsbDeviceClassInterfaceMap[mapIndex].type == 8722: 46a2 mov sl, r4 for (classIndex = 0U; classIndex < classHandle->configList->count; classIndex++) 8724: 4d13 ldr r5, [pc, #76] ; (8774 ) classHandle->configList->config[classIndex].classInfomation->type) 8726: b2e3 uxtb r3, r4 8728: eb03 0343 add.w r3, r3, r3, lsl #1 872c: 6812 ldr r2, [r2, #0] 872e: eb02 0383 add.w r3, r2, r3, lsl #2 8732: 689a ldr r2, [r3, #8] 8734: 7912 ldrb r2, [r2, #4] if (s_UsbDeviceClassInterfaceMap[mapIndex].type == 8736: 2a03 cmp r2, #3 8738: d015 beq.n 8766 873a: b132 cbz r2, 874a for (classIndex = 0U; classIndex < classHandle->configList->count; classIndex++) 873c: 686a ldr r2, [r5, #4] 873e: 3401 adds r4, #1 8740: 7a11 ldrb r1, [r2, #8] 8742: b2e3 uxtb r3, r4 8744: 4299 cmp r1, r3 8746: d8ee bhi.n 8726 8748: e7dd b.n 8706 if (s_UsbDeviceClassInterfaceMap[mapIndex].type == 874a: 2201 movs r2, #1 errorReturn = s_UsbDeviceClassInterfaceMap[mapIndex].classEventCallback( 874c: eb09 1202 add.w r2, r9, r2, lsl #4 8750: 6897 ldr r7, [r2, #8] 8752: 4642 mov r2, r8 8754: 4659 mov r1, fp 8756: 6858 ldr r0, [r3, #4] 8758: 47b8 blx r7 if (kStatus_USB_InvalidRequest == errorReturn) 875a: 2805 cmp r0, #5 875c: d007 beq.n 876e status = kStatus_USB_Success; 875e: 2800 cmp r0, #0 8760: bf08 it eq 8762: 4606 moveq r6, r0 8764: e7ea b.n 873c if (s_UsbDeviceClassInterfaceMap[mapIndex].type == 8766: 4652 mov r2, sl 8768: e7f0 b.n 874c return kStatus_USB_InvalidParameter; 876a: 2604 movs r6, #4 876c: e7cb b.n 8706 return kStatus_USB_InvalidRequest; 876e: 4606 mov r6, r0 8770: e7c9 b.n 8706 8772: bf00 nop 8774: 20000400 .word 0x20000400 8778: 00012408 .word 0x00012408 0000877c : * @param param The param type is determined by the event code. * * @return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceClassCallback(usb_device_handle handle, uint32_t event, void *param) { 877c: b5f8 push {r3, r4, r5, r6, r7, lr} if (deviceHandle == s_UsbDeviceCommonClassStruct[count].handle) 877e: 4b0f ldr r3, [pc, #60] ; (87bc ) 8780: 681b ldr r3, [r3, #0] 8782: 4298 cmp r0, r3 return kStatus_USB_InvalidParameter; 8784: bf18 it ne 8786: 2004 movne r0, #4 if (deviceHandle == s_UsbDeviceCommonClassStruct[count].handle) 8788: d000 beq.n 878c /* Call the application device callback function. deviceCallback is from the second parameter of USB_DeviceClassInit */ status = classHandle->configList->deviceCallback(handle, event, param); return status; } 878a: bdf8 pop {r3, r4, r5, r6, r7, pc} 878c: 4616 mov r6, r2 878e: 460d mov r5, r1 8790: 4604 mov r4, r0 if ((uint32_t)kUSB_DeviceEventBusReset == event) 8792: 2901 cmp r1, #1 8794: d007 beq.n 87a6 status = classHandle->configList->deviceCallback(handle, event, param); 8796: 4b09 ldr r3, [pc, #36] ; (87bc ) 8798: 685b ldr r3, [r3, #4] 879a: 685b ldr r3, [r3, #4] 879c: 4632 mov r2, r6 879e: 4629 mov r1, r5 87a0: 4620 mov r0, r4 87a2: 4798 blx r3 return status; 87a4: e7f1 b.n 878a (void)USB_DeviceControlPipeInit(handle, classHandle); 87a6: 4f05 ldr r7, [pc, #20] ; (87bc ) 87a8: 4639 mov r1, r7 87aa: f7ff ff4d bl 8648 (void)USB_DeviceClassEvent(handle, kUSB_DeviceClassEventDeviceReset, classHandle); 87ae: 463a mov r2, r7 87b0: 2102 movs r1, #2 87b2: 4620 mov r0, r4 87b4: f7ff ff9c bl 86f0 87b8: e7ed b.n 8796 87ba: bf00 nop 87bc: 20000400 .word 0x20000400 000087c0 : usb_status_t USB_DeviceClassInit( uint8_t controllerId, /*!< [IN] Controller ID */ usb_device_class_config_list_struct_t *configList, /*!< [IN] Pointer to class configuration list */ usb_device_handle *handle /*!< [OUT] Pointer to the device handle */ ) { 87c0: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} usb_device_common_class_struct_t *classHandle; usb_status_t error; uint8_t mapIndex; uint8_t classIndex; if ((NULL == handle) || (NULL == configList) || ((usb_device_callback_t)NULL == configList->deviceCallback)) 87c4: 2a00 cmp r2, #0 87c6: d043 beq.n 8850 87c8: 4691 mov r9, r2 87ca: 2900 cmp r1, #0 87cc: d043 beq.n 8856 87ce: 684b ldr r3, [r1, #4] 87d0: 2b00 cmp r3, #0 87d2: d043 beq.n 885c if ((NULL != s_UsbDeviceCommonClassStruct[count].handle) && 87d4: 4b2d ldr r3, [pc, #180] ; (888c ) 87d6: 681b ldr r3, [r3, #0] 87d8: 2b00 cmp r3, #0 87da: d042 beq.n 8862 (controllerId == s_UsbDeviceCommonClassStruct[count].controllerId)) 87dc: 4b2b ldr r3, [pc, #172] ; (888c ) if ((NULL != s_UsbDeviceCommonClassStruct[count].handle) && 87de: f893 800e ldrb.w r8, [r3, #14] return kStatus_USB_Busy; 87e2: 4580 cmp r8, r0 87e4: bf0c ite eq 87e6: f04f 0801 moveq.w r8, #1 87ea: f04f 0802 movne.w r8, #2 } } *handle = classHandle->handle; return error; } 87ee: 4640 mov r0, r8 87f0: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} (void)USB_DeviceDeinit(classHandle->handle); 87f4: 4b25 ldr r3, [pc, #148] ; (888c ) 87f6: 6818 ldr r0, [r3, #0] 87f8: f006 fd2f bl f25a (void)USB_DeviceClassFreeHandle(controllerId); 87fc: 4638 mov r0, r7 87fe: f7ff ff53 bl 86a8 return error; 8802: e7f4 b.n 87ee 8804: 3501 adds r5, #1 for (classIndex = 0U; classIndex < classHandle->configList->count; classIndex++) 8806: 6873 ldr r3, [r6, #4] 8808: 7a1a ldrb r2, [r3, #8] 880a: b2eb uxtb r3, r5 880c: 429a cmp r2, r3 880e: d91a bls.n 8846 if (classHandle->configList->config[classIndex].classInfomation->type == 8810: b2ec uxtb r4, r5 8812: eb04 0444 add.w r4, r4, r4, lsl #1 8816: 00a4 lsls r4, r4, #2 8818: 6873 ldr r3, [r6, #4] 881a: 6819 ldr r1, [r3, #0] 881c: 4421 add r1, r4 881e: 688b ldr r3, [r1, #8] 8820: 791b ldrb r3, [r3, #4] 8822: 2b03 cmp r3, #3 8824: d00a beq.n 883c 8826: 6873 ldr r3, [r6, #4] 8828: 6819 ldr r1, [r3, #0] 882a: 4421 add r1, r4 882c: 688b ldr r3, [r1, #8] 882e: 791b ldrb r3, [r3, #4] 8830: 2b00 cmp r3, #0 8832: d1e7 bne.n 8804 (void)s_UsbDeviceClassInterfaceMap[mapIndex].classInit( 8834: 1d0a adds r2, r1, #4 8836: 4638 mov r0, r7 8838: 47d0 blx sl 883a: e7e3 b.n 8804 883c: 1d0a adds r2, r1, #4 883e: 4638 mov r0, r7 8840: f000 f994 bl 8b6c 8844: e7ef b.n 8826 *handle = classHandle->handle; 8846: 4b11 ldr r3, [pc, #68] ; (888c ) 8848: 681b ldr r3, [r3, #0] 884a: f8c9 3000 str.w r3, [r9] return error; 884e: e7ce b.n 87ee return kStatus_USB_InvalidParameter; 8850: f04f 0804 mov.w r8, #4 8854: e7cb b.n 87ee 8856: f04f 0804 mov.w r8, #4 885a: e7c8 b.n 87ee 885c: f04f 0804 mov.w r8, #4 8860: e7c5 b.n 87ee 8862: 4607 mov r7, r0 s_UsbDeviceCommonClassStruct[count].controllerId = controllerId; 8864: 4a09 ldr r2, [pc, #36] ; (888c ) 8866: 7390 strb r0, [r2, #14] s_UsbDeviceCommonClassStruct[count].setupBuffer = s_UsbDeviceSetupBuffer[count]; 8868: 4b09 ldr r3, [pc, #36] ; (8890 ) 886a: 6093 str r3, [r2, #8] classHandle->configList = configList; 886c: 6051 str r1, [r2, #4] error = USB_DeviceInit(controllerId, USB_DeviceClassCallback, &classHandle->handle); 886e: 4909 ldr r1, [pc, #36] ; (8894 ) 8870: f000 f812 bl 8898 if (kStatus_USB_Success != error) 8874: 4680 mov r8, r0 8876: 2800 cmp r0, #0 8878: d1bc bne.n 87f4 for (classIndex = 0U; classIndex < classHandle->configList->count; classIndex++) 887a: 4b04 ldr r3, [pc, #16] ; (888c ) 887c: 685b ldr r3, [r3, #4] 887e: 7a1b ldrb r3, [r3, #8] 8880: 2b00 cmp r3, #0 8882: d0e0 beq.n 8846 8884: 2500 movs r5, #0 if (classHandle->configList->config[classIndex].classInfomation->type == 8886: 4e01 ldr r6, [pc, #4] ; (888c ) (void)s_UsbDeviceClassInterfaceMap[mapIndex].classInit( 8888: 46aa mov sl, r5 888a: e7c1 b.n 8810 888c: 20000400 .word 0x20000400 8890: 20000410 .word 0x20000410 8894: 0000877d .word 0x0000877d 00008898 : * @retval kStatus_USB_Error The macro USB_DEVICE_CONFIG_ENDPOINTS is more than IP's endpoint number. * Or, the device has been initialized. * Or, the message queue is created failed. */ usb_status_t USB_DeviceInit(uint8_t controllerId, usb_device_callback_t deviceCallback, usb_device_handle *handle) { 8898: b538 push {r3, r4, r5, lr} usb_device_struct_t *deviceHandle = NULL; usb_status_t error; uint32_t count; if (NULL == handle) 889a: b192 cbz r2, 88c2 889c: 4615 mov r5, r2 if ((NULL != s_UsbDevice[count].controllerHandle) && (controllerId == s_UsbDevice[count].controllerId)) 889e: 4b20 ldr r3, [pc, #128] ; (8920 ) 88a0: 681b ldr r3, [r3, #0] 88a2: b1bb cbz r3, 88d4 88a4: 4b1e ldr r3, [pc, #120] ; (8920 ) 88a6: f893 406d ldrb.w r4, [r3, #109] ; 0x6d return kStatus_USB_Busy; 88aa: 4284 cmp r4, r0 88ac: bf0c ite eq 88ae: 2401 moveq r4, #1 88b0: 2402 movne r4, #2 } /* Set the device to deafult state */ deviceHandle->state = (uint8_t)kUSB_DeviceStateDefault; return error; } 88b2: 4620 mov r0, r4 88b4: bd38 pop {r3, r4, r5, pc} (void)USB_DeviceDeinit(deviceHandle); 88b6: 481a ldr r0, [pc, #104] ; (8920 ) 88b8: f006 fccf bl f25a *handle = NULL; 88bc: 2300 movs r3, #0 88be: 602b str r3, [r5, #0] return error; 88c0: e7f7 b.n 88b2 return kStatus_USB_InvalidHandle; 88c2: 2403 movs r4, #3 88c4: e7f5 b.n 88b2 handle->controllerHandle = NULL; 88c6: 4b16 ldr r3, [pc, #88] ; (8920 ) 88c8: 2200 movs r2, #0 88ca: 601a str r2, [r3, #0] handle->controllerId = 0U; 88cc: f883 206d strb.w r2, [r3, #109] ; 0x6d usb_status_t error = kStatus_USB_ControllerNotFound; 88d0: 2406 movs r4, #6 88d2: e7ee b.n 88b2 deviceHandle->deviceCallback = deviceCallback; 88d4: 4a12 ldr r2, [pc, #72] ; (8920 ) 88d6: 6091 str r1, [r2, #8] deviceHandle->controllerId = controllerId; 88d8: f882 006d strb.w r0, [r2, #109] ; 0x6d deviceHandle->deviceAddress = 0U; 88dc: 2300 movs r3, #0 88de: f882 306c strb.w r3, [r2, #108] ; 0x6c deviceHandle->isResetting = 0U; 88e2: f882 306f strb.w r3, [r2, #111] ; 0x6f for (count = 0U; count < (USB_DEVICE_CONFIG_ENDPOINTS * 2U); count++) 88e6: 4613 mov r3, r2 88e8: f102 0160 add.w r1, r2, #96 ; 0x60 deviceHandle->epCallback[count].callbackFn = (usb_device_endpoint_callback_t)NULL; 88ec: 2200 movs r2, #0 88ee: 60da str r2, [r3, #12] deviceHandle->epCallback[count].callbackParam = NULL; 88f0: 611a str r2, [r3, #16] deviceHandle->epCallback[count].isBusy = 0U; 88f2: 751a strb r2, [r3, #20] 88f4: 330c adds r3, #12 for (count = 0U; count < (USB_DEVICE_CONFIG_ENDPOINTS * 2U); count++) 88f6: 4299 cmp r1, r3 88f8: d1f9 bne.n 88ee if ((kUSB_ControllerKhci0 == controlerIndex) || (kUSB_ControllerKhci1 == controlerIndex)) 88fa: 2801 cmp r0, #1 88fc: d8e3 bhi.n 88c6 *controllerInterface = (const usb_device_controller_interface_struct_t *)&s_UsbDeviceKhciInterface; 88fe: 4908 ldr r1, [pc, #32] ; (8920 ) 8900: 4b08 ldr r3, [pc, #32] ; (8924 ) 8902: 604b str r3, [r1, #4] *handle = deviceHandle; 8904: 6029 str r1, [r5, #0] error = deviceHandle->controllerInterface->deviceInit(controllerId, deviceHandle, &deviceHandle->controllerHandle); 8906: 684b ldr r3, [r1, #4] 8908: 681b ldr r3, [r3, #0] 890a: 460a mov r2, r1 890c: 4798 blx r3 if (kStatus_USB_Success != error) 890e: 4604 mov r4, r0 8910: 2800 cmp r0, #0 8912: d1d0 bne.n 88b6 deviceHandle->state = (uint8_t)kUSB_DeviceStateDefault; 8914: 4b02 ldr r3, [pc, #8] ; (8920 ) 8916: 2202 movs r2, #2 8918: f883 206e strb.w r2, [r3, #110] ; 0x6e return error; 891c: e7c9 b.n 88b2 891e: bf00 nop 8920: 20000418 .word 0x20000418 8924: 00012428 .word 0x00012428 00008928 : * * @return A USB error code or kStatus_USB_Success. */ static usb_status_t USB_DeviceKhciEndpointTransfer( usb_device_khci_state_struct_t *khciState, uint8_t endpoint, uint8_t direction, uint8_t *buffer, uint32_t length) { 8928: b470 push {r4, r5, r6} uint32_t index = ((uint32_t)endpoint << 1U) | (uint32_t)direction; 892a: ea42 0541 orr.w r5, r2, r1, lsl #1 /* Enter critical */ OSA_ENTER_CRITICAL(); /* Flag the endpoint is busy. */ khciState->endpointState[index].stateUnion.stateBitField.transferring = 1U; 892e: eb00 1505 add.w r5, r0, r5, lsl #4 8932: f895 402d ldrb.w r4, [r5, #45] ; 0x2d 8936: f044 0440 orr.w r4, r4, #64 ; 0x40 893a: f885 402d strb.w r4, [r5, #45] ; 0x2d /* Add the data buffer address to the BDT. */ USB_KHCI_BDT_SET_ADDRESS((uint32_t)khciState->bdt, endpoint, direction, 893e: 0149 lsls r1, r1, #5 8940: f401 71f0 and.w r1, r1, #480 ; 0x1e0 8944: 0112 lsls r2, r2, #4 8946: f002 0210 and.w r2, r2, #16 894a: 6844 ldr r4, [r0, #4] 894c: f424 74ff bic.w r4, r4, #510 ; 0x1fe 8950: f024 0401 bic.w r4, r4, #1 8954: 4314 orrs r4, r2 8956: 430c orrs r4, r1 8958: f895 602d ldrb.w r6, [r5, #45] ; 0x2d 895c: f3c6 1600 ubfx r6, r6, #4, #1 8960: ea44 04c6 orr.w r4, r4, r6, lsl #3 8964: 6063 str r3, [r4, #4] khciState->endpointState[index].stateUnion.stateBitField.bdtOdd, (uint32_t)buffer); /* Change the BDT control field to start the transfer. */ USB_KHCI_BDT_SET_CONTROL( 8966: 6843 ldr r3, [r0, #4] 8968: f423 73ff bic.w r3, r3, #510 ; 0x1fe 896c: f023 0301 bic.w r3, r3, #1 8970: 4313 orrs r3, r2 8972: 430b orrs r3, r1 8974: f895 102d ldrb.w r1, [r5, #45] ; 0x2d 8978: f3c1 1200 ubfx r2, r1, #4, #1 897c: ea43 03c2 orr.w r3, r3, r2, lsl #3 8980: 9c03 ldr r4, [sp, #12] 8982: 4a0a ldr r2, [pc, #40] ; (89ac ) 8984: ea02 4204 and.w r2, r2, r4, lsl #16 8988: f3c1 01c0 ubfx r1, r1, #3, #1 898c: ea42 1281 orr.w r2, r2, r1, lsl #6 8990: f042 0288 orr.w r2, r2, #136 ; 0x88 8994: 601a str r2, [r3, #0] /* Exit critical */ OSA_EXIT_CRITICAL(); /* Clear the token busy state */ khciState->registerBase->CTL &= (uint8_t)(~USB_CTL_TXSUSPENDTOKENBUSY_MASK); 8996: 6882 ldr r2, [r0, #8] 8998: f892 3094 ldrb.w r3, [r2, #148] ; 0x94 899c: f003 03df and.w r3, r3, #223 ; 0xdf 89a0: f882 3094 strb.w r3, [r2, #148] ; 0x94 return kStatus_USB_Success; } 89a4: 2000 movs r0, #0 89a6: bc70 pop {r4, r5, r6} 89a8: 4770 bx lr 89aa: bf00 nop 89ac: 03ff0000 .word 0x03ff0000 000089b0 : usb_device_controller_handle *khciHandle) { usb_device_khci_state_struct_t *khciState; uint32_t khci_base[] = USB_BASE_ADDRS; if (((controllerId - (uint8_t)kUSB_ControllerKhci0) >= (uint8_t)USB_DEVICE_CONFIG_KHCI) || 89b0: bb38 cbnz r0, 8a02 { 89b2: b5f8 push {r3, r4, r5, r6, r7, lr} 89b4: 4605 mov r5, r0 89b6: 4617 mov r7, r2 89b8: 460e mov r6, r1 { return kStatus_USB_ControllerNotFound; } khciState = &s_UsbDeviceKhciState[controllerId - (uint8_t)kUSB_ControllerKhci0]; khciState->controllerId = controllerId; 89ba: 4c13 ldr r4, [pc, #76] ; (8a08 ) 89bc: 2200 movs r2, #0 89be: f884 20a2 strb.w r2, [r4, #162] ; 0xa2 khciState->registerBase = (USB_Type *)khci_base[controllerId - (uint8_t)kUSB_ControllerKhci0]; 89c2: 4b12 ldr r3, [pc, #72] ; (8a0c ) 89c4: 60a3 str r3, [r4, #8] khciState->dmaAlignBuffer = 89c6: 4912 ldr r1, [pc, #72] ; (8a10 ) 89c8: 61e1 str r1, [r4, #28] (uint8_t *)&s_UsbDeviceKhciDmaAlignBuffer[controllerId - (uint8_t)kUSB_ControllerKhci0][0]; /* Clear all interrupt flags. */ khciState->registerBase->ISTAT = 0xFFU; 89ca: 21ff movs r1, #255 ; 0xff 89cc: f883 1080 strb.w r1, [r3, #128] ; 0x80 #if (defined(USB_DEVICE_CONFIG_OTG) && (USB_DEVICE_CONFIG_OTG)) khciState->otgStatus = 0U; #else /* Disable the device functionality. */ (void)USB_DeviceKhciControl(khciState, kUSB_DeviceControlStop, NULL); 89d0: 2101 movs r1, #1 89d2: 4620 mov r0, r4 89d4: f006 ff0b bl f7ee #endif khciState->bdt = s_UsbDeviceKhciBdtBuffer[controllerId - (uint8_t)kUSB_ControllerKhci0]; 89d8: 4b0e ldr r3, [pc, #56] ; (8a14 ) 89da: 6063 str r3, [r4, #4] /* Set BDT buffer address */ khciState->registerBase->BDTPAGE1 = (uint8_t)((((uint32_t)khciState->bdt) >> 8U) & 0xFFU); 89dc: 68a2 ldr r2, [r4, #8] 89de: f3c3 2107 ubfx r1, r3, #8, #8 89e2: f882 109c strb.w r1, [r2, #156] ; 0x9c khciState->registerBase->BDTPAGE2 = (uint8_t)((((uint32_t)khciState->bdt) >> 16U) & 0xFFU); 89e6: f3c3 4107 ubfx r1, r3, #16, #8 89ea: f882 10b0 strb.w r1, [r2, #176] ; 0xb0 khciState->registerBase->BDTPAGE3 = (uint8_t)((((uint32_t)khciState->bdt) >> 24U) & 0xFFU); 89ee: 0e1b lsrs r3, r3, #24 89f0: f882 30b4 strb.w r3, [r2, #180] ; 0xb4 #if defined(FSL_FEATURE_USB_KHCI_HAS_STALL_LOW) && (FSL_FEATURE_USB_KHCI_HAS_STALL_LOW > 0U) khciState->registerBase->MISCCTRL |= USB_MISCCTRL_STL_ADJ_EN_MASK; #endif /* Set KHCI device state to default value. */ USB_DeviceKhciSetDefaultState(khciState); 89f4: 4620 mov r0, r4 89f6: f006 fd50 bl f49a *khciHandle = khciState; 89fa: 603c str r4, [r7, #0] khciState->deviceHandle = (usb_device_struct_t *)handle; 89fc: 6026 str r6, [r4, #0] return kStatus_USB_Success; 89fe: 4628 mov r0, r5 } 8a00: bdf8 pop {r3, r4, r5, r6, r7, pc} return kStatus_USB_ControllerNotFound; 8a02: 2006 movs r0, #6 } 8a04: 4770 bx lr 8a06: bf00 nop 8a08: 200004c8 .word 0x200004c8 8a0c: 40072000 .word 0x40072000 8a10: 20000488 .word 0x20000488 8a14: 20000200 .word 0x20000200 00008a18 : usb_status_t error = kStatus_USB_Error; uint32_t count; uint32_t index; /* Check the configuration is valid or not. */ if ((0U == mscHandle->configuration) || 8a18: f890 3094 ldrb.w r3, [r0, #148] ; 0x94 8a1c: 2b00 cmp r3, #0 8a1e: f000 808d beq.w 8b3c (mscHandle->configuration > mscHandle->configurationStruct->classInfomation->configurations)) 8a22: 6842 ldr r2, [r0, #4] 8a24: 6892 ldr r2, [r2, #8] if ((0U == mscHandle->configuration) || 8a26: 7951 ldrb r1, [r2, #5] 8a28: 4299 cmp r1, r3 8a2a: f0c0 8089 bcc.w 8b40 return error; } /* Get the interface list of the new configuration. */ /* Check the interface list is valid or not. */ if (NULL == mscHandle->configurationStruct->classInfomation->interfaceList) 8a2e: 6812 ldr r2, [r2, #0] 8a30: 2a00 cmp r2, #0 8a32: f000 8087 beq.w 8b44 { 8a36: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 8a3a: b086 sub sp, #24 { return error; } interfaceList = &mscHandle->configurationStruct->classInfomation->interfaceList[mscHandle->configuration - 1U]; 8a3c: f103 5300 add.w r3, r3, #536870912 ; 0x20000000 8a40: 3b01 subs r3, #1 8a42: eb02 01c3 add.w r1, r2, r3, lsl #3 /* Find interface by using the alternate setting of the interface. */ for (count = 0; count < interfaceList->count; count++) 8a46: f812 6033 ldrb.w r6, [r2, r3, lsl #3] 8a4a: 2e00 cmp r6, #0 8a4c: d07c beq.n 8b48 { if (USB_DEVICE_CONFIG_MSC_CLASS_CODE == interfaceList->interfaces[count].classCode) 8a4e: 684d ldr r5, [r1, #4] 8a50: 782b ldrb r3, [r5, #0] 8a52: 2b08 cmp r3, #8 8a54: d009 beq.n 8a6a 8a56: 462b mov r3, r5 for (count = 0; count < interfaceList->count; count++) 8a58: 2200 movs r2, #0 8a5a: 3201 adds r2, #1 8a5c: 42b2 cmp r2, r6 8a5e: d069 beq.n 8b34 if (USB_DEVICE_CONFIG_MSC_CLASS_CODE == interfaceList->interfaces[count].classCode) 8a60: 330c adds r3, #12 8a62: 461d mov r5, r3 8a64: 7819 ldrb r1, [r3, #0] 8a66: 2908 cmp r1, #8 8a68: d1f7 bne.n 8a5a { for (index = 0; index < interfaceList->interfaces[count].count; index++) 8a6a: 7a2c ldrb r4, [r5, #8] 8a6c: 2c00 cmp r4, #0 8a6e: d073 beq.n 8b58 { if (interfaceList->interfaces[count].interface[index].alternateSetting == mscHandle->alternate) 8a70: 686f ldr r7, [r5, #4] 8a72: f890 6093 ldrb.w r6, [r0, #147] ; 0x93 8a76: 783b ldrb r3, [r7, #0] 8a78: 42b3 cmp r3, r6 8a7a: d069 beq.n 8b50 8a7c: 463b mov r3, r7 for (index = 0; index < interfaceList->interfaces[count].count; index++) 8a7e: 2200 movs r2, #0 8a80: 3201 adds r2, #1 8a82: 42a2 cmp r2, r4 8a84: d068 beq.n 8b58 if (interfaceList->interfaces[count].interface[index].alternateSetting == mscHandle->alternate) 8a86: 3310 adds r3, #16 8a88: 461f mov r7, r3 8a8a: 7819 ldrb r1, [r3, #0] 8a8c: 42b1 cmp r1, r6 8a8e: d1f7 bne.n 8a80 { interface = &interfaceList->interfaces[count].interface[index]; break; } } mscHandle->interfaceNumber = interfaceList->interfaces[count].interfaceNumber; 8a90: 78ea ldrb r2, [r5, #3] 8a92: f880 2095 strb.w r2, [r0, #149] ; 0x95 break; } } if (NULL == interface) 8a96: 2b00 cmp r3, #0 8a98: d058 beq.n 8b4c 8a9a: 4604 mov r4, r0 /* Return error if the interface is not found. */ return error; } /* Keep new interface handle. */ mscHandle->interfaceHandle = interface; 8a9c: 6087 str r7, [r0, #8] /* Initialize the endpoints of the new interface. */ for (count = 0; count < interface->endpointList.count; count++) 8a9e: 793b ldrb r3, [r7, #4] 8aa0: 2b00 cmp r3, #0 8aa2: d049 beq.n 8b38 8aa4: 2500 movs r5, #0 8aa6: 462e mov r6, r5 { usb_device_endpoint_init_struct_t epInitStruct; usb_device_endpoint_callback_struct_t epCallback; epInitStruct.zlt = 0U; 8aa8: 46a8 mov r8, r5 epCallback.callbackFn = USB_DeviceMscBulkIn; } else { mscHandle->bulkOutEndpoint = epInitStruct.endpointAddress; epCallback.callbackFn = USB_DeviceMscBulkOut; 8aaa: f8df 90b8 ldr.w r9, [pc, #184] ; 8b64 epCallback.callbackFn = USB_DeviceMscBulkIn; 8aae: f8df a0b8 ldr.w sl, [pc, #184] ; 8b68 epInitStruct.zlt = 0U; 8ab2: f88d 8008 strb.w r8, [sp, #8] epInitStruct.interval = interface->endpointList.endpoint[count].interval; 8ab6: 68ba ldr r2, [r7, #8] 8ab8: 1953 adds r3, r2, r5 8aba: 7919 ldrb r1, [r3, #4] 8abc: f88d 1009 strb.w r1, [sp, #9] epInitStruct.endpointAddress = interface->endpointList.endpoint[count].endpointAddress; 8ac0: 5d52 ldrb r2, [r2, r5] 8ac2: f88d 2006 strb.w r2, [sp, #6] epInitStruct.maxPacketSize = interface->endpointList.endpoint[count].maxPacketSize; 8ac6: 8859 ldrh r1, [r3, #2] 8ac8: f8ad 1004 strh.w r1, [sp, #4] epInitStruct.transferType = interface->endpointList.endpoint[count].transferType; 8acc: 785b ldrb r3, [r3, #1] 8ace: f88d 3007 strb.w r3, [sp, #7] if (USB_IN == ((epInitStruct.endpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) >> 8ad2: 09d3 lsrs r3, r2, #7 mscHandle->bulkInEndpoint = epInitStruct.endpointAddress; 8ad4: bf19 ittee ne 8ad6: f884 2091 strbne.w r2, [r4, #145] ; 0x91 epCallback.callbackFn = USB_DeviceMscBulkIn; 8ada: f8cd a00c strne.w sl, [sp, #12] mscHandle->bulkOutEndpoint = epInitStruct.endpointAddress; 8ade: f884 2092 strbeq.w r2, [r4, #146] ; 0x92 epCallback.callbackFn = USB_DeviceMscBulkOut; 8ae2: f8cd 900c streq.w r9, [sp, #12] } epCallback.callbackParam = mscHandle; 8ae6: 9404 str r4, [sp, #16] error = USB_DeviceInitEndpoint(mscHandle->handle, &epInitStruct, &epCallback); 8ae8: aa03 add r2, sp, #12 8aea: a901 add r1, sp, #4 8aec: 6820 ldr r0, [r4, #0] 8aee: f006 fbdf bl f2b0 for (count = 0; count < interface->endpointList.count; count++) 8af2: 3601 adds r6, #1 8af4: 3506 adds r5, #6 8af6: 793b ldrb r3, [r7, #4] 8af8: 42b3 cmp r3, r6 8afa: d8da bhi.n 8ab2 } mscHandle->dataOutFlag = 0U; 8afc: 2300 movs r3, #0 8afe: f884 3084 strb.w r3, [r4, #132] ; 0x84 mscHandle->dataInFlag = 0U; 8b02: f884 3085 strb.w r3, [r4, #133] ; 0x85 mscHandle->outEndpointStallFlag = 0U; 8b06: f884 3087 strb.w r3, [r4, #135] ; 0x87 mscHandle->inEndpointStallFlag = 0U; 8b0a: f884 3086 strb.w r3, [r4, #134] ; 0x86 mscHandle->needOutStallFlag = 0U; 8b0e: f884 308c strb.w r3, [r4, #140] ; 0x8c mscHandle->needInStallFlag = 0U; 8b12: f884 308b strb.w r3, [r4, #139] ; 0x8b mscHandle->cbwValidFlag = 1U; 8b16: 2201 movs r2, #1 8b18: f884 2088 strb.w r2, [r4, #136] ; 0x88 mscHandle->transferRemaining = 0U; 8b1c: 60e3 str r3, [r4, #12] mscHandle->performResetRecover = 0U; 8b1e: f884 3089 strb.w r3, [r4, #137] ; 0x89 mscHandle->performResetDoneFlag = 0U; 8b22: f884 308a strb.w r3, [r4, #138] ; 0x8a mscHandle->stallStatus = 0U; 8b26: f884 308f strb.w r3, [r4, #143] ; 0x8f mscHandle->inEndpointCswCancelFlag = 0U; 8b2a: f884 3096 strb.w r3, [r4, #150] ; 0x96 return error; } 8b2e: b006 add sp, #24 8b30: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} return error; 8b34: 2001 movs r0, #1 8b36: e7fa b.n 8b2e usb_status_t error = kStatus_USB_Error; 8b38: 2001 movs r0, #1 8b3a: e7df b.n 8afc return error; 8b3c: 2001 movs r0, #1 8b3e: 4770 bx lr 8b40: 2001 movs r0, #1 8b42: 4770 bx lr return error; 8b44: 2001 movs r0, #1 } 8b46: 4770 bx lr return error; 8b48: 2001 movs r0, #1 8b4a: e7f0 b.n 8b2e 8b4c: 2001 movs r0, #1 8b4e: e7ee b.n 8b2e mscHandle->interfaceNumber = interfaceList->interfaces[count].interfaceNumber; 8b50: 78eb ldrb r3, [r5, #3] 8b52: f880 3095 strb.w r3, [r0, #149] ; 0x95 if (NULL == interface) 8b56: e7a0 b.n 8a9a mscHandle->interfaceNumber = interfaceList->interfaces[count].interfaceNumber; 8b58: 78eb ldrb r3, [r5, #3] 8b5a: f880 3095 strb.w r3, [r0, #149] ; 0x95 return error; 8b5e: 2001 movs r0, #1 8b60: e7e5 b.n 8b2e 8b62: bf00 nop 8b64: 00008d81 .word 0x00008d81 8b68: 00008c1d .word 0x00008c1d 00008b6c : * @param handle It is out parameter, is used to return pointer of the msc class handle to the caller. * * @return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscInit(uint8_t controllerId, usb_device_class_config_struct_t *config, class_handle_t *handle) { 8b6c: b570 push {r4, r5, r6, lr} if (NULL == g_msc_handle[count].handle) 8b6e: 4b24 ldr r3, [pc, #144] ; (8c00 ) 8b70: 681b ldr r3, [r3, #0] return kStatus_USB_Busy; 8b72: 2402 movs r4, #2 if (NULL == g_msc_handle[count].handle) 8b74: b10b cbz r3, 8b7a mscHandle->cbwPrimeFlag = 0U; mscHandle->cswPrimeFlag = 0U; *handle = (class_handle_t)mscHandle; return error; } 8b76: 4620 mov r0, r4 8b78: bd70 pop {r4, r5, r6, pc} 8b7a: 4615 mov r5, r2 8b7c: 460e mov r6, r1 g_msc_handle[count].mscCbw = (cbw_array[count]); 8b7e: 4920 ldr r1, [pc, #128] ; (8c00 ) 8b80: 4b20 ldr r3, [pc, #128] ; (8c04 ) 8b82: 618b str r3, [r1, #24] g_msc_handle[count].mscCsw = (csw_array[count]); 8b84: 4b20 ldr r3, [pc, #128] ; (8c08 ) 8b86: 61cb str r3, [r1, #28] g_msc_handle[count].mscUfi.requestSense = (sense[count]); 8b88: 4b20 ldr r3, [pc, #128] ; (8c0c ) 8b8a: 620b str r3, [r1, #32] g_msc_handle[count].mscUfi.readCapacity = (capacity_array[count]); 8b8c: 4b20 ldr r3, [pc, #128] ; (8c10 ) 8b8e: 63cb str r3, [r1, #60] ; 0x3c g_msc_handle[count].mscUfi.readCapacity16 = (capacity16_array[count]); 8b90: 4b20 ldr r3, [pc, #128] ; (8c14 ) 8b92: 640b str r3, [r1, #64] ; 0x40 g_msc_handle[count].mscUfi.formatCapacityData = (formatCapacityData[count]); 8b94: 4b20 ldr r3, [pc, #128] ; (8c18 ) 8b96: 650b str r3, [r1, #80] ; 0x50 error = USB_DeviceClassGetDeviceHandle(controllerId, &mscHandle->handle); 8b98: f7ff fd9a bl 86d0 if (kStatus_USB_Success != error) 8b9c: 4604 mov r4, r0 8b9e: b9e8 cbnz r0, 8bdc if (NULL == mscHandle->handle) 8ba0: 4b17 ldr r3, [pc, #92] ; (8c00 ) 8ba2: 681b ldr r3, [r3, #0] 8ba4: b31b cbz r3, 8bee mscHandle->configurationStruct = config; 8ba6: 4b16 ldr r3, [pc, #88] ; (8c00 ) 8ba8: 605e str r6, [r3, #4] mscHandle->configuration = 0U; 8baa: 2100 movs r1, #0 8bac: f883 1094 strb.w r1, [r3, #148] ; 0x94 mscHandle->alternate = 0xffU; 8bb0: 22ff movs r2, #255 ; 0xff 8bb2: f883 2093 strb.w r2, [r3, #147] ; 0x93 mscHandle->implementingDiskDrive = implementingDiskDrive; 8bb6: 6159 str r1, [r3, #20] ufi->requestSense->validErrorCode = USB_DEVICE_MSC_UFI_REQ_SENSE_VALID_ERROR_CODE; 8bb8: 6a1a ldr r2, [r3, #32] 8bba: 2070 movs r0, #112 ; 0x70 8bbc: 7010 strb r0, [r2, #0] ufi->requestSense->additionalSenseLength = USB_DEVICE_MSC_UFI_REQ_SENSE_ADDITIONAL_SENSE_LEN; 8bbe: 6a1a ldr r2, [r3, #32] 8bc0: 200a movs r0, #10 8bc2: 71d0 strb r0, [r2, #7] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_NO_SENSE; 8bc4: 6a1a ldr r2, [r3, #32] 8bc6: 7091 strb r1, [r2, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_NO_SENSE; 8bc8: 6a1a ldr r2, [r3, #32] 8bca: 7311 strb r1, [r2, #12] ufi->requestSense->additionalSenseQualifer = USB_DEVICE_MSC_UFI_NO_SENSE; 8bcc: 6a1a ldr r2, [r3, #32] 8bce: 7351 strb r1, [r2, #13] mscHandle->cbwPrimeFlag = 0U; 8bd0: f883 108d strb.w r1, [r3, #141] ; 0x8d mscHandle->cswPrimeFlag = 0U; 8bd4: f883 108e strb.w r1, [r3, #142] ; 0x8e *handle = (class_handle_t)mscHandle; 8bd8: 602b str r3, [r5, #0] return error; 8bda: e7cc b.n 8b76 handle->handle = NULL; 8bdc: 4b08 ldr r3, [pc, #32] ; (8c00 ) 8bde: 2200 movs r2, #0 8be0: 601a str r2, [r3, #0] handle->configurationStruct = (usb_device_class_config_struct_t *)NULL; 8be2: 605a str r2, [r3, #4] handle->configuration = 0; 8be4: f883 2094 strb.w r2, [r3, #148] ; 0x94 handle->alternate = 0; 8be8: f883 2093 strb.w r2, [r3, #147] ; 0x93 return kStatus_USB_Success; 8bec: e7c3 b.n 8b76 handle->configurationStruct = (usb_device_class_config_struct_t *)NULL; 8bee: 4b04 ldr r3, [pc, #16] ; (8c00 ) 8bf0: 2200 movs r2, #0 8bf2: 605a str r2, [r3, #4] handle->configuration = 0; 8bf4: f883 2094 strb.w r2, [r3, #148] ; 0x94 handle->alternate = 0; 8bf8: f883 2093 strb.w r2, [r3, #147] ; 0x93 return kStatus_USB_InvalidHandle; 8bfc: 2403 movs r4, #3 8bfe: e7ba b.n 8b76 8c00: 20000590 .word 0x20000590 8c04: 20000650 .word 0x20000650 8c08: 20000670 .word 0x20000670 8c0c: 2000063c .word 0x2000063c 8c10: 20000628 .word 0x20000628 8c14: 20000630 .word 0x20000630 8c18: 2000056c .word 0x2000056c 00008c1c : { 8c1c: b570 push {r4, r5, r6, lr} 8c1e: b084 sub sp, #16 8c20: 460e mov r6, r1 8c22: 4614 mov r4, r2 if (message->length == USB_UNINITIALIZED_VAL_32) 8c24: 684b ldr r3, [r1, #4] 8c26: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff 8c2a: d013 beq.n 8c54 if (mscHandle->transferRemaining >= message->length) 8c2c: 68d2 ldr r2, [r2, #12] 8c2e: 4293 cmp r3, r2 mscHandle->transferRemaining -= message->length; 8c30: bf9c itt ls 8c32: 1ad3 subls r3, r2, r3 8c34: 60e3 strls r3, [r4, #12] if (mscHandle->needInStallFlag == 1U) 8c36: f894 508b ldrb.w r5, [r4, #139] ; 0x8b 8c3a: 2d01 cmp r5, #1 8c3c: d03a beq.n 8cb4 if ((0U == mscHandle->dataInFlag) && (message->length == USB_DEVICE_MSC_CSW_LENGTH)) 8c3e: f894 3085 ldrb.w r3, [r4, #133] ; 0x85 8c42: 2b00 cmp r3, #0 8c44: d174 bne.n 8d30 8c46: 684b ldr r3, [r1, #4] 8c48: 2b0d cmp r3, #13 8c4a: d041 beq.n 8cd0 usb_status_t error = kStatus_USB_Error; 8c4c: 2501 movs r5, #1 } 8c4e: 4628 mov r0, r5 8c50: b004 add sp, #16 8c52: bd70 pop {r4, r5, r6, pc} if ((0U != mscHandle->dataInFlag) && (mscHandle->configurationStruct->classCallback != NULL) && 8c54: f892 3085 ldrb.w r3, [r2, #133] ; 0x85 8c58: b143 cbz r3, 8c6c 8c5a: 6852 ldr r2, [r2, #4] 8c5c: 6813 ldr r3, [r2, #0] 8c5e: b12b cbz r3, 8c6c ((USB_DEVICE_MSC_READ_10_COMMAND == mscHandle->mscCbw->cbwcb[0]) || 8c60: 69a1 ldr r1, [r4, #24] if ((0U != mscHandle->dataInFlag) && (mscHandle->configurationStruct->classCallback != NULL) && 8c62: 7bcb ldrb r3, [r1, #15] 8c64: f003 037f and.w r3, r3, #127 ; 0x7f 8c68: 2b28 cmp r3, #40 ; 0x28 8c6a: d005 beq.n 8c78 if (mscHandle->inEndpointCswCancelFlag == 1U) 8c6c: f894 5096 ldrb.w r5, [r4, #150] ; 0x96 8c70: 2d01 cmp r5, #1 8c72: d00f beq.n 8c94 return error; 8c74: 2501 movs r5, #1 8c76: e7ea b.n 8c4e lbaData.size = 0; 8c78: 2300 movs r3, #0 8c7a: 9301 str r3, [sp, #4] lbaData.buffer = message->buffer; 8c7c: 6830 ldr r0, [r6, #0] 8c7e: 9002 str r0, [sp, #8] lbaData.offset = 0; 8c80: 9300 str r3, [sp, #0] lbaData.lun = mscHandle->mscCbw->logicalUnitNumber; 8c82: 7b4b ldrb r3, [r1, #13] 8c84: f88d 300c strb.w r3, [sp, #12] (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 8c88: 6813 ldr r3, [r2, #0] 8c8a: 466a mov r2, sp 8c8c: 2101 movs r1, #1 8c8e: 4620 mov r0, r4 8c90: 4798 blx r3 8c92: e7eb b.n 8c6c mscHandle->inEndpointCswCancelFlag = 0U; 8c94: 2600 movs r6, #0 8c96: f884 6096 strb.w r6, [r4, #150] ; 0x96 (void)USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, (uint8_t *)mscHandle->mscCsw, 8c9a: 230d movs r3, #13 8c9c: 69e2 ldr r2, [r4, #28] 8c9e: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 8ca2: 6820 ldr r0, [r4, #0] 8ca4: f006 faea bl f27c mscHandle->cswPrimeFlag = 1; 8ca8: 2301 movs r3, #1 8caa: f884 308e strb.w r3, [r4, #142] ; 0x8e mscHandle->stallStatus = 0; 8cae: f884 608f strb.w r6, [r4, #143] ; 0x8f 8cb2: e7cc b.n 8c4e mscHandle->needInStallFlag = 0U; 8cb4: 2300 movs r3, #0 8cb6: f884 308b strb.w r3, [r4, #139] ; 0x8b mscHandle->inEndpointStallFlag = 1U; 8cba: 2201 movs r2, #1 8cbc: f884 2086 strb.w r2, [r4, #134] ; 0x86 mscHandle->dataInFlag = 0U; 8cc0: f884 3085 strb.w r3, [r4, #133] ; 0x85 (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkInEndpoint); 8cc4: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 8cc8: 6820 ldr r0, [r4, #0] 8cca: f006 fb39 bl f340 return error; 8cce: e7be b.n 8c4e else if ((message->length == USB_DEVICE_MSC_CSW_LENGTH) && (USB_DEVICE_MSC_DCSWSIGNATURE == csw->signature)) 8cd0: 680b ldr r3, [r1, #0] 8cd2: 681a ldr r2, [r3, #0] 8cd4: 4b29 ldr r3, [pc, #164] ; (8d7c ) 8cd6: 429a cmp r2, r3 8cd8: d01a beq.n 8d10 usb_status_t error = kStatus_USB_Error; 8cda: 2501 movs r5, #1 8cdc: e7b7 b.n 8c4e (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 8cde: 6813 ldr r3, [r2, #0] 8ce0: 466a mov r2, sp 8ce2: 2101 movs r1, #1 8ce4: 4620 mov r0, r4 8ce6: 4798 blx r3 8ce8: e034 b.n 8d54 (message->length / mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba); 8cea: 69a3 ldr r3, [r4, #24] 8cec: 7b5a ldrb r2, [r3, #13] 8cee: eb04 1202 add.w r2, r4, r2, lsl #4 8cf2: 6873 ldr r3, [r6, #4] 8cf4: 6d92 ldr r2, [r2, #88] ; 0x58 8cf6: fbb3 f2f2 udiv r2, r3, r2 mscHandle->currentOffset += 8cfa: 6923 ldr r3, [r4, #16] 8cfc: 4413 add r3, r2 8cfe: 6123 str r3, [r4, #16] error = USB_DeviceMscSend(mscHandle); 8d00: 4620 mov r0, r4 8d02: f007 fa2f bl 10164 8d06: 4605 mov r5, r0 if (0U == mscHandle->transferRemaining) 8d08: 68e3 ldr r3, [r4, #12] 8d0a: 2b00 cmp r3, #0 8d0c: d19f bne.n 8c4e 8d0e: e025 b.n 8d5c mscHandle->cbwValidFlag = 1U; 8d10: 2501 movs r5, #1 8d12: f884 5088 strb.w r5, [r4, #136] ; 0x88 mscHandle->cswPrimeFlag = 0U; 8d16: 2300 movs r3, #0 8d18: f884 308e strb.w r3, [r4, #142] ; 0x8e (void)USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, (uint8_t *)mscHandle->mscCbw, 8d1c: 231f movs r3, #31 8d1e: 69a2 ldr r2, [r4, #24] 8d20: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 8d24: 6820 ldr r0, [r4, #0] 8d26: f006 fab1 bl f28c mscHandle->cbwPrimeFlag = 1U; 8d2a: f884 508d strb.w r5, [r4, #141] ; 0x8d 8d2e: e78e b.n 8c4e if ((mscHandle->configurationStruct->classCallback != NULL)) 8d30: 6862 ldr r2, [r4, #4] 8d32: 6813 ldr r3, [r2, #0] 8d34: b303 cbz r3, 8d78 lbaData.size = message->length; 8d36: 6873 ldr r3, [r6, #4] 8d38: 9301 str r3, [sp, #4] lbaData.buffer = message->buffer; 8d3a: 6833 ldr r3, [r6, #0] 8d3c: 9302 str r3, [sp, #8] lbaData.offset = mscHandle->currentOffset; 8d3e: 6923 ldr r3, [r4, #16] 8d40: 9300 str r3, [sp, #0] lbaData.lun = mscHandle->mscCbw->logicalUnitNumber; 8d42: 69a3 ldr r3, [r4, #24] 8d44: 7b59 ldrb r1, [r3, #13] 8d46: f88d 100c strb.w r1, [sp, #12] if ((USB_DEVICE_MSC_READ_10_COMMAND == mscHandle->mscCbw->cbwcb[0]) || 8d4a: 7bdb ldrb r3, [r3, #15] 8d4c: f003 037f and.w r3, r3, #127 ; 0x7f 8d50: 2b28 cmp r3, #40 ; 0x28 8d52: d0c4 beq.n 8cde if (0U != mscHandle->transferRemaining) 8d54: 68e3 ldr r3, [r4, #12] 8d56: 2b00 cmp r3, #0 8d58: d1c7 bne.n 8cea usb_status_t error = kStatus_USB_Error; 8d5a: 2501 movs r5, #1 mscHandle->dataInFlag = 0U; 8d5c: 2300 movs r3, #0 8d5e: f884 3085 strb.w r3, [r4, #133] ; 0x85 mscHandle->cswPrimeFlag = 1U; 8d62: 2301 movs r3, #1 8d64: f884 308e strb.w r3, [r4, #142] ; 0x8e (void)USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, (uint8_t *)mscHandle->mscCsw, 8d68: 230d movs r3, #13 8d6a: 69e2 ldr r2, [r4, #28] 8d6c: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 8d70: 6820 ldr r0, [r4, #0] 8d72: f006 fa83 bl f27c 8d76: e76a b.n 8c4e usb_status_t error = kStatus_USB_Error; 8d78: 2501 movs r5, #1 8d7a: e768 b.n 8c4e 8d7c: 53425355 .word 0x53425355 00008d80 : { 8d80: b570 push {r4, r5, r6, lr} 8d82: b084 sub sp, #16 8d84: 460e mov r6, r1 8d86: 4614 mov r4, r2 if (message->length == USB_UNINITIALIZED_VAL_32) 8d88: 684b ldr r3, [r1, #4] 8d8a: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff 8d8e: d038 beq.n 8e02 if (mscHandle->transferRemaining >= message->length) 8d90: 68d2 ldr r2, [r2, #12] 8d92: 4293 cmp r3, r2 mscHandle->transferRemaining -= message->length; 8d94: bf9c itt ls 8d96: 1ad3 subls r3, r2, r3 8d98: 60e3 strls r3, [r4, #12] if ((USB_DEVICE_MSC_MODE_SELECT_10_COMMAND == mscHandle->mscCbw->cbwcb[0]) || 8d9a: 69a3 ldr r3, [r4, #24] 8d9c: 7bdb ldrb r3, [r3, #15] 8d9e: f003 03bf and.w r3, r3, #191 ; 0xbf 8da2: 2b15 cmp r3, #21 8da4: d05b beq.n 8e5e if (mscHandle->needOutStallFlag == 1U) 8da6: f894 308c ldrb.w r3, [r4, #140] ; 0x8c 8daa: 2b01 cmp r3, #1 8dac: d060 beq.n 8e70 if (0U != mscHandle->dataOutFlag) 8dae: f894 5084 ldrb.w r5, [r4, #132] ; 0x84 8db2: 2d00 cmp r5, #0 8db4: f000 8084 beq.w 8ec0 lbaData.size = message->length; 8db8: 6873 ldr r3, [r6, #4] 8dba: 9301 str r3, [sp, #4] lbaData.buffer = message->buffer; 8dbc: 6833 ldr r3, [r6, #0] 8dbe: 9302 str r3, [sp, #8] lbaData.offset = mscHandle->currentOffset; 8dc0: 6923 ldr r3, [r4, #16] 8dc2: 9300 str r3, [sp, #0] lbaData.lun = mscHandle->mscCbw->logicalUnitNumber; 8dc4: 69a3 ldr r3, [r4, #24] 8dc6: 7b5a ldrb r2, [r3, #13] 8dc8: f88d 200c strb.w r2, [sp, #12] if ((mscHandle->configurationStruct->classCallback != NULL)) 8dcc: 6862 ldr r2, [r4, #4] 8dce: 6815 ldr r5, [r2, #0] 8dd0: 2d00 cmp r5, #0 8dd2: d071 beq.n 8eb8 if ((USB_DEVICE_MSC_WRITE_10_COMMAND == mscHandle->mscCbw->cbwcb[0]) || 8dd4: 7bdb ldrb r3, [r3, #15] 8dd6: f003 037f and.w r3, r3, #127 ; 0x7f 8dda: 2b2a cmp r3, #42 ; 0x2a 8ddc: d057 beq.n 8e8e if (0U != mscHandle->transferRemaining) 8dde: 68e3 ldr r3, [r4, #12] 8de0: 2b00 cmp r3, #0 8de2: d159 bne.n 8e98 usb_status_t error = kStatus_USB_Success; 8de4: 2500 movs r5, #0 mscHandle->dataOutFlag = 0U; 8de6: 2300 movs r3, #0 8de8: f884 3084 strb.w r3, [r4, #132] ; 0x84 (void)USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, (uint8_t *)mscHandle->mscCsw, 8dec: 230d movs r3, #13 8dee: 69e2 ldr r2, [r4, #28] 8df0: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 8df4: 6820 ldr r0, [r4, #0] 8df6: f006 fa41 bl f27c mscHandle->cswPrimeFlag = 1U; 8dfa: 2301 movs r3, #1 8dfc: f884 308e strb.w r3, [r4, #142] ; 0x8e 8e00: e07c b.n 8efc if ((0U != mscHandle->dataOutFlag) && (mscHandle->configurationStruct->classCallback != NULL) && 8e02: f892 3084 ldrb.w r3, [r2, #132] ; 0x84 8e06: b143 cbz r3, 8e1a 8e08: 6852 ldr r2, [r2, #4] 8e0a: 6813 ldr r3, [r2, #0] 8e0c: b12b cbz r3, 8e1a ((USB_DEVICE_MSC_WRITE_10_COMMAND == mscHandle->mscCbw->cbwcb[0]) || 8e0e: 69a1 ldr r1, [r4, #24] if ((0U != mscHandle->dataOutFlag) && (mscHandle->configurationStruct->classCallback != NULL) && 8e10: 7bcb ldrb r3, [r1, #15] 8e12: f003 037f and.w r3, r3, #127 ; 0x7f 8e16: 2b2a cmp r3, #42 ; 0x2a 8e18: d013 beq.n 8e42 if ((mscHandle->cbwPrimeFlag == 0U) && (mscHandle->inEndpointStallFlag == 0U) && 8e1a: f894 508d ldrb.w r5, [r4, #141] ; 0x8d 8e1e: 2d00 cmp r5, #0 8e20: f040 81c2 bne.w 91a8 8e24: f8b4 3086 ldrh.w r3, [r4, #134] ; 0x86 8e28: 2b00 cmp r3, #0 8e2a: d167 bne.n 8efc (void)USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, (uint8_t *)mscHandle->mscCbw, 8e2c: 231f movs r3, #31 8e2e: 69a2 ldr r2, [r4, #24] 8e30: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 8e34: 6820 ldr r0, [r4, #0] 8e36: f006 fa29 bl f28c mscHandle->cbwPrimeFlag = 1U; 8e3a: 2301 movs r3, #1 8e3c: f884 308d strb.w r3, [r4, #141] ; 0x8d 8e40: e05c b.n 8efc lbaData.size = 0; 8e42: 2300 movs r3, #0 8e44: 9301 str r3, [sp, #4] lbaData.buffer = message->buffer; 8e46: 6830 ldr r0, [r6, #0] 8e48: 9002 str r0, [sp, #8] lbaData.offset = 0; 8e4a: 9300 str r3, [sp, #0] lbaData.lun = mscHandle->mscCbw->logicalUnitNumber; 8e4c: 7b4b ldrb r3, [r1, #13] 8e4e: f88d 300c strb.w r3, [sp, #12] (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 8e52: 6813 ldr r3, [r2, #0] 8e54: 466a mov r2, sp 8e56: 2102 movs r1, #2 8e58: 4620 mov r0, r4 8e5a: 4798 blx r3 8e5c: e7dd b.n 8e1a if ((mscHandle->configurationStruct->classCallback != NULL)) 8e5e: 6863 ldr r3, [r4, #4] 8e60: 681b ldr r3, [r3, #0] 8e62: 2b00 cmp r3, #0 8e64: d09f beq.n 8da6 (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 8e66: 2200 movs r2, #0 8e68: 210b movs r1, #11 8e6a: 4620 mov r0, r4 8e6c: 4798 blx r3 8e6e: e79a b.n 8da6 mscHandle->needOutStallFlag = 0U; 8e70: 2500 movs r5, #0 8e72: f884 508c strb.w r5, [r4, #140] ; 0x8c mscHandle->outEndpointStallFlag = 1U; 8e76: f884 3087 strb.w r3, [r4, #135] ; 0x87 mscHandle->dataOutFlag = 0U; 8e7a: f884 5084 strb.w r5, [r4, #132] ; 0x84 mscHandle->cbwPrimeFlag = 0U; 8e7e: f884 508d strb.w r5, [r4, #141] ; 0x8d (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkOutEndpoint); 8e82: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 8e86: 6820 ldr r0, [r4, #0] 8e88: f006 fa5a bl f340 return error; 8e8c: e036 b.n 8efc (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 8e8e: 466a mov r2, sp 8e90: 2102 movs r1, #2 8e92: 4620 mov r0, r4 8e94: 47a8 blx r5 8e96: e7a2 b.n 8dde (message->length / mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba); 8e98: 69a3 ldr r3, [r4, #24] 8e9a: 7b5a ldrb r2, [r3, #13] 8e9c: eb04 1202 add.w r2, r4, r2, lsl #4 8ea0: 6873 ldr r3, [r6, #4] 8ea2: 6d92 ldr r2, [r2, #88] ; 0x58 8ea4: fbb3 f2f2 udiv r2, r3, r2 mscHandle->currentOffset += 8ea8: 6923 ldr r3, [r4, #16] 8eaa: 4413 add r3, r2 8eac: 6123 str r3, [r4, #16] error = USB_DeviceMscRecv(mscHandle); 8eae: 4620 mov r0, r4 8eb0: f007 f998 bl 101e4 8eb4: 4605 mov r5, r0 8eb6: e000 b.n 8eba usb_status_t error = kStatus_USB_Success; 8eb8: 2500 movs r5, #0 if (0U == mscHandle->transferRemaining) 8eba: 68e3 ldr r3, [r4, #12] 8ebc: b9f3 cbnz r3, 8efc 8ebe: e792 b.n 8de6 else if ((0U != mscHandle->cbwValidFlag) && (message->length == USB_DEVICE_MSC_CBW_LENGTH) && 8ec0: f894 3088 ldrb.w r3, [r4, #136] ; 0x88 8ec4: b113 cbz r3, 8ecc 8ec6: 6873 ldr r3, [r6, #4] 8ec8: 2b1f cmp r3, #31 8eca: d01a beq.n 8f02 (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkOutEndpoint); 8ecc: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 8ed0: 6820 ldr r0, [r4, #0] 8ed2: f006 fa35 bl f340 (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkInEndpoint); 8ed6: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 8eda: 6820 ldr r0, [r4, #0] 8edc: f006 fa30 bl f340 mscHandle->cbwPrimeFlag = 0U; 8ee0: 2300 movs r3, #0 8ee2: f884 308d strb.w r3, [r4, #141] ; 0x8d mscHandle->cbwValidFlag = 0U; 8ee6: f884 3088 strb.w r3, [r4, #136] ; 0x88 mscHandle->outEndpointStallFlag = 1U; 8eea: 2301 movs r3, #1 8eec: f884 3087 strb.w r3, [r4, #135] ; 0x87 mscHandle->inEndpointStallFlag = 1U; 8ef0: f884 3086 strb.w r3, [r4, #134] ; 0x86 mscHandle->stallStatus = (uint8_t)USB_DEVICE_MSC_STALL_IN_CBW; 8ef4: f884 308f strb.w r3, [r4, #143] ; 0x8f mscHandle->performResetRecover = 1; 8ef8: f884 3089 strb.w r3, [r4, #137] ; 0x89 } 8efc: 4628 mov r0, r5 8efe: b004 add sp, #16 8f00: bd70 pop {r4, r5, r6, pc} (USB_DEVICE_MSC_DCBWSIGNATURE == mscHandle->mscCbw->signature) && 8f02: 69a3 ldr r3, [r4, #24] else if ((0U != mscHandle->cbwValidFlag) && (message->length == USB_DEVICE_MSC_CBW_LENGTH) && 8f04: 6819 ldr r1, [r3, #0] 8f06: 4a57 ldr r2, [pc, #348] ; (9064 ) 8f08: 4291 cmp r1, r2 8f0a: d1df bne.n 8ecc (!((0U != (mscHandle->mscCbw->logicalUnitNumber & 0xF0U)) || 8f0c: 7b5a ldrb r2, [r3, #13] (USB_DEVICE_MSC_DCBWSIGNATURE == mscHandle->mscCbw->signature) && 8f0e: f012 0ff0 tst.w r2, #240 ; 0xf0 8f12: d1db bne.n 8ecc (0U != (mscHandle->mscCbw->cbLength & 0xE0U)))) && 8f14: 7b9b ldrb r3, [r3, #14] (!((0U != (mscHandle->mscCbw->logicalUnitNumber & 0xF0U)) || 8f16: f013 00e0 ands.w r0, r3, #224 ; 0xe0 8f1a: d1d7 bne.n 8ecc (mscHandle->mscCbw->logicalUnitNumber < (mscHandle->logicalUnitNumber + 1U)) && 8f1c: f894 1090 ldrb.w r1, [r4, #144] ; 0x90 8f20: 3101 adds r1, #1 (0U != (mscHandle->mscCbw->cbLength & 0xE0U)))) && 8f22: 428a cmp r2, r1 8f24: d2d2 bcs.n 8ecc ((mscHandle->mscCbw->cbLength >= 0x01U) && (mscHandle->mscCbw->cbLength <= 0x10U))) 8f26: 3b01 subs r3, #1 (mscHandle->mscCbw->logicalUnitNumber < (mscHandle->logicalUnitNumber + 1U)) && 8f28: b2db uxtb r3, r3 8f2a: 2b0f cmp r3, #15 8f2c: d8ce bhi.n 8ecc mscHandle->cbwPrimeFlag = 0U; 8f2e: 2300 movs r3, #0 8f30: f884 308d strb.w r3, [r4, #141] ; 0x8d mscHandle->transferRemaining = 0U; 8f34: 60e3 str r3, [r4, #12] mscHandle->mscCsw->signature = USB_DEVICE_MSC_DCSWSIGNATURE; 8f36: 69e2 ldr r2, [r4, #28] 8f38: 494b ldr r1, [pc, #300] ; (9068 ) 8f3a: 6011 str r1, [r2, #0] mscHandle->mscCsw->dataResidue = 0U; 8f3c: 69e2 ldr r2, [r4, #28] 8f3e: 6093 str r3, [r2, #8] mscHandle->mscCsw->tag = mscHandle->mscCbw->tag; 8f40: 69e2 ldr r2, [r4, #28] 8f42: 69a1 ldr r1, [r4, #24] 8f44: 6849 ldr r1, [r1, #4] 8f46: 6051 str r1, [r2, #4] mscHandle->cbwValidFlag = 0U; 8f48: f884 3088 strb.w r3, [r4, #136] ; 0x88 mscHandle->mscCbw->dataTransferLength = USB_LONG_FROM_LITTLE_ENDIAN(mscHandle->mscCbw->dataTransferLength); 8f4c: 69a3 ldr r3, [r4, #24] 8f4e: 689a ldr r2, [r3, #8] mscHandle->dataOutFlag = (uint8_t)(((0U == (mscHandle->mscCbw->flags & USB_DEVICE_MSC_CBW_DIRECTION_BIT)) && 8f50: f993 100c ldrsb.w r1, [r3, #12] 8f54: 2900 cmp r1, #0 8f56: db02 blt.n 8f5e 8f58: 1c10 adds r0, r2, #0 8f5a: bf18 it ne 8f5c: 2001 movne r0, #1 8f5e: f884 0084 strb.w r0, [r4, #132] ; 0x84 mscHandle->dataInFlag = (uint8_t)(((0U != (mscHandle->mscCbw->flags & USB_DEVICE_MSC_CBW_DIRECTION_BIT)) && 8f62: f993 200c ldrsb.w r2, [r3, #12] 8f66: 2a00 cmp r2, #0 8f68: db03 blt.n 8f72 8f6a: 2200 movs r2, #0 8f6c: f884 2085 strb.w r2, [r4, #133] ; 0x85 if ((0U != mscHandle->dataInFlag) && (0U != mscHandle->inEndpointStallFlag)) 8f70: e00a b.n 8f88 mscHandle->dataInFlag = (uint8_t)(((0U != (mscHandle->mscCbw->flags & USB_DEVICE_MSC_CBW_DIRECTION_BIT)) && 8f72: 689a ldr r2, [r3, #8] 8f74: 2a00 cmp r2, #0 8f76: d0f8 beq.n 8f6a 8f78: 2201 movs r2, #1 8f7a: f884 2085 strb.w r2, [r4, #133] ; 0x85 if ((0U != mscHandle->dataInFlag) && (0U != mscHandle->inEndpointStallFlag)) 8f7e: f894 2086 ldrb.w r2, [r4, #134] ; 0x86 8f82: 2a00 cmp r2, #0 8f84: f040 8112 bne.w 91ac if (USB_DEVICE_MSC_REQUEST_SENSE_COMMAND != mscHandle->mscCbw->cbwcb[0]) 8f88: 7bdb ldrb r3, [r3, #15] 8f8a: 2b03 cmp r3, #3 8f8c: d006 beq.n 8f9c ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_NO_SENSE; 8f8e: 6a22 ldr r2, [r4, #32] 8f90: 2300 movs r3, #0 8f92: 7093 strb r3, [r2, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_NO_SENSE; 8f94: 6a22 ldr r2, [r4, #32] 8f96: 7313 strb r3, [r2, #12] ufi->requestSense->additionalSenseQualifer = USB_DEVICE_MSC_UFI_NO_SENSE; 8f98: 6a22 ldr r2, [r4, #32] 8f9a: 7353 strb r3, [r2, #13] ufi->thirteenCase.hostExpectedDataLength = mscHandle->mscCbw->dataTransferLength; 8f9c: 69a3 ldr r3, [r4, #24] 8f9e: 689a ldr r2, [r3, #8] 8fa0: 6262 str r2, [r4, #36] ; 0x24 ufi->thirteenCase.hostExpectedDirection = (uint8_t)(mscHandle->mscCbw->flags >> USB_DEVICE_MSC_CBW_DIRECTION_SHIFT); 8fa2: 7b1a ldrb r2, [r3, #12] 8fa4: 09d2 lsrs r2, r2, #7 8fa6: f884 2039 strb.w r2, [r4, #57] ; 0x39 switch (mscHandle->mscCbw->cbwcb[0]) 8faa: 7bdb ldrb r3, [r3, #15] 8fac: 2baa cmp r3, #170 ; 0xaa 8fae: f200 80d6 bhi.w 915e 8fb2: e8df f003 tbb [pc, r3] 8fb6: d491 .short 0xd491 8fb8: d4a08cd4 .word 0xd4a08cd4 8fbc: d4d4d4d4 .word 0xd4d4d4d4 8fc0: d4d4d4d4 .word 0xd4d4d4d4 8fc4: d4d4d4d4 .word 0xd4d4d4d4 8fc8: afd4d45b .word 0xafd4d45b 8fcc: d4d4d4d4 .word 0xd4d4d4d4 8fd0: b9d4c3aa .word 0xb9d4c3aa 8fd4: d4d4d49b .word 0xd4d4d49b 8fd8: a5d4b4d4 .word 0xa5d4b4d4 8fdc: d487d4d4 .word 0xd487d4d4 8fe0: d4d4d496 .word 0xd4d4d496 8fe4: d4d4bed4 .word 0xd4d4bed4 8fe8: d4d4d4d4 .word 0xd4d4d4d4 8fec: d4d4d4d4 .word 0xd4d4d4d4 8ff0: d4d4d4d4 .word 0xd4d4d4d4 8ff4: d4d4d4d4 .word 0xd4d4d4d4 8ff8: d4d4d4d4 .word 0xd4d4d4d4 8ffc: d4d4d4d4 .word 0xd4d4d4d4 9000: d4d4d4d4 .word 0xd4d4d4d4 9004: d4d4d4d4 .word 0xd4d4d4d4 9008: afd4d4d4 .word 0xafd4d4d4 900c: d4d4d4d4 .word 0xd4d4d4d4 9010: d4d4d4aa .word 0xd4d4d4aa 9014: d4d4d4d4 .word 0xd4d4d4d4 9018: d4d4d4d4 .word 0xd4d4d4d4 901c: d4d4d4d4 .word 0xd4d4d4d4 9020: d4d4d4d4 .word 0xd4d4d4d4 9024: d4d4d4d4 .word 0xd4d4d4d4 9028: d4d4d4d4 .word 0xd4d4d4d4 902c: d4d4d4d4 .word 0xd4d4d4d4 9030: d4d4d4d4 .word 0xd4d4d4d4 9034: d4d4d4d4 .word 0xd4d4d4d4 9038: d4d4d4d4 .word 0xd4d4d4d4 903c: d4d4d4d4 .word 0xd4d4d4d4 9040: d4d4d4d4 .word 0xd4d4d4d4 9044: d4d4d4d4 .word 0xd4d4d4d4 9048: d4d4d4d4 .word 0xd4d4d4d4 904c: d4d4d4d4 .word 0xd4d4d4d4 9050: d4d4d4d4 .word 0xd4d4d4d4 9054: d4d4d4a5 .word 0xd4d4d4a5 9058: d4d4d4d4 .word 0xd4d4d4d4 905c: d487d4d4 .word 0xd487d4d4 9060: 96 .byte 0x96 9061: 00 .byte 0x00 9062: bf00 nop 9064: 43425355 .word 0x43425355 9068: 53425355 .word 0x53425355 status = USB_DeviceMscUfiInquiryCommand(mscHandle); 906c: 4620 mov r0, r4 906e: f007 faa0 bl 105b2 9072: 4605 mov r5, r0 if ((USB_DEVICE_MSC_UFI_NO_SENSE != ufi->requestSense->senseKey) && 9074: 6a23 ldr r3, [r4, #32] 9076: 789b ldrb r3, [r3, #2] 9078: b143 cbz r3, 908c (USB_DEVICE_MSC_COMMAND_PASSED == mscHandle->mscCsw->cswStatus) && 907a: 69e3 ldr r3, [r4, #28] if ((USB_DEVICE_MSC_UFI_NO_SENSE != ufi->requestSense->senseKey) && 907c: 7b1a ldrb r2, [r3, #12] 907e: b92a cbnz r2, 908c (USB_DEVICE_MSC_REQUEST_SENSE_COMMAND != mscHandle->mscCbw->cbwcb[0])) 9080: 69a2 ldr r2, [r4, #24] (USB_DEVICE_MSC_COMMAND_PASSED == mscHandle->mscCsw->cswStatus) && 9082: 7bd2 ldrb r2, [r2, #15] 9084: 2a03 cmp r2, #3 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 9086: bf1c itt ne 9088: 2201 movne r2, #1 908a: 731a strbne r2, [r3, #12] if (error == kStatus_USB_InvalidRequest) 908c: 2d05 cmp r5, #5 908e: d06b beq.n 9168 if (!((0U != mscHandle->dataOutFlag) || ((0U != mscHandle->dataInFlag) || (0U != mscHandle->needInStallFlag)))) 9090: f894 3084 ldrb.w r3, [r4, #132] ; 0x84 9094: 2b00 cmp r3, #0 9096: f47f af31 bne.w 8efc 909a: f894 3085 ldrb.w r3, [r4, #133] ; 0x85 909e: 2b00 cmp r3, #0 90a0: f47f af2c bne.w 8efc 90a4: f894 308b ldrb.w r3, [r4, #139] ; 0x8b 90a8: 2b00 cmp r3, #0 90aa: f47f af27 bne.w 8efc (void)USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, (uint8_t *)mscHandle->mscCsw, 90ae: 230d movs r3, #13 90b0: 69e2 ldr r2, [r4, #28] 90b2: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 90b6: 6820 ldr r0, [r4, #0] 90b8: f006 f8e0 bl f27c mscHandle->cswPrimeFlag = 1U; 90bc: 2301 movs r3, #1 90be: f884 308e strb.w r3, [r4, #142] ; 0x8e 90c2: e71b b.n 8efc status = USB_DeviceMscUfiReadCommand(mscHandle); 90c4: 4620 mov r0, r4 90c6: f007 fa98 bl 105fa 90ca: 4605 mov r5, r0 break; 90cc: e7d2 b.n 9074 status = USB_DeviceMscUfiRequestSenseCommand(mscHandle); 90ce: 4620 mov r0, r4 90d0: f007 fa4e bl 10570 90d4: 4605 mov r5, r0 break; 90d6: e7cd b.n 9074 status = USB_DeviceMscUfiTestUnitReadyCommand(mscHandle); 90d8: 4620 mov r0, r4 90da: f007 faf8 bl 106ce 90de: 4605 mov r5, r0 break; 90e0: e7c8 b.n 9074 status = USB_DeviceMscUfiWriteCommand(mscHandle); 90e2: 4620 mov r0, r4 90e4: f007 fabe bl 10664 90e8: 4605 mov r5, r0 break; 90ea: e7c3 b.n 9074 status = USB_DeviceMscUfiPreventAllowMediumCommand(mscHandle); 90ec: 4620 mov r0, r4 90ee: f007 fcb6 bl 10a5e 90f2: 4605 mov r5, r0 break; 90f4: e7be b.n 9074 status = USB_DeviceMscUfiFormatUnitCommand(mscHandle); 90f6: 4620 mov r0, r4 90f8: f007 fc8f bl 10a1a 90fc: 4605 mov r5, r0 break; 90fe: e7b9 b.n 9074 status = USB_DeviceMscUfiReadCapacityCommand(mscHandle); 9100: 4620 mov r0, r4 9102: f007 fb63 bl 107cc 9106: 4605 mov r5, r0 break; 9108: e7b4 b.n 9074 status = USB_DeviceMscUfiModeSenseCommand(mscHandle); 910a: 4620 mov r0, r4 910c: f007 fb0c bl 10728 9110: 4605 mov r5, r0 break; 9112: e7af b.n 9074 status = USB_DeviceMscUfiModeSelectCommand(mscHandle); 9114: 4620 mov r0, r4 9116: f007 fb2b bl 10770 911a: 4605 mov r5, r0 break; 911c: e7aa b.n 9074 status = USB_DeviceMscUfiReadFormatCapacityCommand(mscHandle); 911e: 4620 mov r0, r4 9120: f007 fbdd bl 108de 9124: 4605 mov r5, r0 break; 9126: e7a5 b.n 9074 status = USB_DeviceMscUfiSendDiagnosticCommand(mscHandle); 9128: 4620 mov r0, r4 912a: f007 fcb9 bl 10aa0 912e: 4605 mov r5, r0 break; 9130: e7a0 b.n 9074 status = USB_DeviceMscUfiVerifyCommand(mscHandle); 9132: 4620 mov r0, r4 9134: f007 faec bl 10710 9138: 4605 mov r5, r0 break; 913a: e79b b.n 9074 status = USB_DeviceMscUfiStartStopUnitCommand(mscHandle); 913c: 4620 mov r0, r4 913e: f007 fcd0 bl 10ae2 9142: 4605 mov r5, r0 if (mscHandle->mscCbw->cbwcb[5]==0) 9144: 69a3 ldr r3, [r4, #24] 9146: 7d1b ldrb r3, [r3, #20] 9148: 2b00 cmp r3, #0 914a: d193 bne.n 9074 MSDEJECTEDEVENT = 1;/*(08/25/20)*/ 914c: 4a18 ldr r2, [pc, #96] ; (91b0 ) 914e: 7813 ldrb r3, [r2, #0] 9150: f043 0302 orr.w r3, r3, #2 9154: 7013 strb r3, [r2, #0] t10ms.IndicateWrite = t10msQuarterSec;/*!!!!*/ 9156: 4b17 ldr r3, [pc, #92] ; (91b4 ) 9158: 2219 movs r2, #25 915a: 709a strb r2, [r3, #2] 915c: e78a b.n 9074 status = USB_DeviceMscUfiUnsupportCommand(mscHandle); 915e: 4620 mov r0, r4 9160: f007 fce4 bl 10b2c 9164: 4605 mov r5, r0 break; 9166: e785 b.n 9074 if (mscHandle->dataOutFlag == 1U) 9168: f894 3084 ldrb.w r3, [r4, #132] ; 0x84 916c: 2b01 cmp r3, #1 916e: d007 beq.n 9180 else if (mscHandle->dataInFlag == 1U) 9170: f894 3085 ldrb.w r3, [r4, #133] ; 0x85 9174: 2b01 cmp r3, #1 9176: d00d beq.n 9194 mscHandle->stallStatus = (uint8_t)USB_DEVICE_MSC_STALL_IN_DATA; 9178: 2302 movs r3, #2 917a: f884 308f strb.w r3, [r4, #143] ; 0x8f 917e: e787 b.n 9090 if (mscHandle->outEndpointStallFlag == 0U) 9180: f894 3087 ldrb.w r3, [r4, #135] ; 0x87 9184: b913 cbnz r3, 918c mscHandle->needOutStallFlag = 1U; 9186: 2301 movs r3, #1 9188: f884 308c strb.w r3, [r4, #140] ; 0x8c mscHandle->dataOutFlag = 0U; 918c: 2300 movs r3, #0 918e: f884 3084 strb.w r3, [r4, #132] ; 0x84 9192: e7f1 b.n 9178 if (mscHandle->inEndpointStallFlag == 0U) 9194: f894 3086 ldrb.w r3, [r4, #134] ; 0x86 9198: b913 cbnz r3, 91a0 mscHandle->needInStallFlag = 1U; 919a: 2301 movs r3, #1 919c: f884 308b strb.w r3, [r4, #139] ; 0x8b mscHandle->dataInFlag = 0U; 91a0: 2300 movs r3, #0 91a2: f884 3085 strb.w r3, [r4, #133] ; 0x85 91a6: e7e7 b.n 9178 return error; 91a8: 2500 movs r5, #0 91aa: e6a7 b.n 8efc return error; 91ac: 2501 movs r5, #1 91ae: e6a5 b.n 8efc 91b0: 2000096c .word 0x2000096c 91b4: 20000980 .word 0x20000980 000091b8 : /*------------------------------------------------------------------*/ /* CANbus MAINLOOP HANDLER */ /*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/ void do_CAN(void) { 91b8: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} 91bc: b085 sub sp, #20 struct CANBUSBUFFER thisentry; byte ptr, x; /*!!!!*/ FRESULT result; if (rawUPBUTTON) 91be: 4ba9 ldr r3, [pc, #676] ; (9464 ) 91c0: f893 3032 ldrb.w r3, [r3, #50] ; 0x32 91c4: f013 0f08 tst.w r3, #8 91c8: d003 beq.n 91d2 { if (filelogging==0) 91ca: 4ba7 ldr r3, [pc, #668] ; (9468 ) 91cc: 781b ldrb r3, [r3, #0] 91ce: 2b00 cmp r3, #0 91d0: d036 beq.n 9240 calcs.LCDbotline[x] = CANBUSLOGBEGIN[x]; } } } } if (rawDOWNBUTTON) 91d2: 4ba4 ldr r3, [pc, #656] ; (9464 ) 91d4: f893 3032 ldrb.w r3, [r3, #50] ; 0x32 91d8: f013 0f04 tst.w r3, #4 91dc: d003 beq.n 91e6 { if (filelogging==1) 91de: 4ba2 ldr r3, [pc, #648] ; (9468 ) 91e0: 781b ldrb r3, [r3, #0] 91e2: 2b01 cmp r3, #1 91e4: d04a beq.n 927c } } } /*!!!!*/ if (calcs.CANBUSstatus<100) 91e6: 4b9f ldr r3, [pc, #636] ; (9464 ) 91e8: 789b ldrb r3, [r3, #2] 91ea: 2b63 cmp r3, #99 ; 0x63 91ec: d95e bls.n 92ac calcs.CANBUFFERfirst = 0; calcs.CANBUFFERlast = 0; } else { debugESR1 = CAN0->ESR1; /* What is the state of CANbus? */ 91ee: 4a9f ldr r2, [pc, #636] ; (946c ) 91f0: 6a13 ldr r3, [r2, #32] CAN0->ESR1 = debugESR1; /*(clear any set flags)*/ 91f2: 6213 str r3, [r2, #32] if ((t10ms.CANBUStimeout==0)&&(CANBUSACTIVITYFOUND==0)) 91f4: 4a9e ldr r2, [pc, #632] ; (9470 ) 91f6: 7852 ldrb r2, [r2, #1] 91f8: f002 0202 and.w r2, r2, #2 91fc: 499d ldr r1, [pc, #628] ; (9474 ) 91fe: 7b09 ldrb r1, [r1, #12] 9200: 4311 orrs r1, r2 9202: f000 8173 beq.w 94ec { calcs.CANBUSstatus = 0; /* No CANbus found (at this speed), try again */ return; } if (debugESR1&CAN_ESR1_BOFFINT_MASK) 9206: f013 0304 ands.w r3, r3, #4 920a: f040 8173 bne.w 94f4 { calcs.CANBUSstatus = 0; /* CANbus is bus-off! Force a reset */ return; } if (calcs.CANBUFFERlast)/*!!!!*/ 920e: 4995 ldr r1, [pc, #596] ; (9464 ) 9210: f891 1031 ldrb.w r1, [r1, #49] ; 0x31 9214: 2900 cmp r1, #0 9216: f000 818b beq.w 9530 { if (CANBUSACTIVITYFOUND==0) 921a: 2a00 cmp r2, #0 921c: f040 8188 bne.w 9530 { CANBUSACTIVITYFOUND = 1; /* CANbus is active! */ 9220: 4993 ldr r1, [pc, #588] ; (9470 ) 9222: 784a ldrb r2, [r1, #1] 9224: f042 0202 orr.w r2, r2, #2 9228: 704a strb r2, [r1, #1] for (x=0; x<18; x++) /*!!!!*/ { switch (calcs.CANbusspeed) 922a: 4c8e ldr r4, [pc, #568] ; (9464 ) 922c: 78e1 ldrb r1, [r4, #3] 922e: f104 021d add.w r2, r4, #29 9232: 342f adds r4, #47 ; 0x2f { case 125: calcs.LCDtopline[x] = CANBUSTOPLINE125K[x]; 9234: f8df c284 ldr.w ip, [pc, #644] ; 94bc break; case 250: calcs.LCDtopline[x] = CANBUSTOPLINE250K[x]; 9238: 4f8f ldr r7, [pc, #572] ; (9478 ) break; case 50: calcs.LCDtopline[x] = CANBUSTOPLINE50K[x]; break; default: calcs.LCDtopline[x] = ' '; 923a: 2020 movs r0, #32 calcs.LCDtopline[x] = CANBUSTOPLINE50K[x]; 923c: 4e8f ldr r6, [pc, #572] ; (947c ) 923e: e166 b.n 950e result = f_open(&fileCANBUSdebuglog, _T("CANBUSLOG.txt"), (FA_WRITE|FA_OPEN_APPEND)); 9240: 2232 movs r2, #50 ; 0x32 9242: 498f ldr r1, [pc, #572] ; (9480 ) 9244: 488f ldr r0, [pc, #572] ; (9484 ) 9246: f008 f9b0 bl 115aa if (result) 924a: b118 cbz r0, 9254 filelogging = 255;/*EEK!*/ 924c: 4b86 ldr r3, [pc, #536] ; (9468 ) 924e: 22ff movs r2, #255 ; 0xff 9250: 701a strb r2, [r3, #0] if (rawDOWNBUTTON) 9252: e7c8 b.n 91e6 filelogging = 1; 9254: 4b84 ldr r3, [pc, #528] ; (9468 ) 9256: 2201 movs r2, #1 9258: 701a strb r2, [r3, #0] (void)f_printf(&fileCANBUSdebuglog, "%09lu CANBUSLOG BEGIN\r\n",debugCounter1ms); 925a: 4b8b ldr r3, [pc, #556] ; (9488 ) 925c: 681a ldr r2, [r3, #0] 925e: 498b ldr r1, [pc, #556] ; (948c ) 9260: 4888 ldr r0, [pc, #544] ; (9484 ) 9262: f002 faa7 bl b7b4 for (x=0; x<18; x++) /*!!!!*/ 9266: 488a ldr r0, [pc, #552] ; (9490 ) 9268: 1e43 subs r3, r0, #1 926a: 4a8a ldr r2, [pc, #552] ; (9494 ) 926c: 3011 adds r0, #17 calcs.LCDbotline[x] = CANBUSLOGBEGIN[x]; 926e: f813 1f01 ldrb.w r1, [r3, #1]! 9272: f802 1f01 strb.w r1, [r2, #1]! for (x=0; x<18; x++) /*!!!!*/ 9276: 4283 cmp r3, r0 9278: d1f9 bne.n 926e 927a: e7aa b.n 91d2 (void)f_printf(&fileCANBUSdebuglog, "%09lu CANBUSLOG END\r\n\r\n",debugCounter1ms); 927c: 4c81 ldr r4, [pc, #516] ; (9484 ) 927e: 4b82 ldr r3, [pc, #520] ; (9488 ) 9280: 681a ldr r2, [r3, #0] 9282: 4985 ldr r1, [pc, #532] ; (9498 ) 9284: 4620 mov r0, r4 9286: f002 fa95 bl b7b4 result = f_close(&fileCANBUSdebuglog); 928a: 4620 mov r0, r4 928c: f008 fbfc bl 11a88 filelogging = 0; 9290: 4b75 ldr r3, [pc, #468] ; (9468 ) 9292: 2200 movs r2, #0 9294: 701a strb r2, [r3, #0] for (x=0; x<18; x++) /*!!!!*/ 9296: 4881 ldr r0, [pc, #516] ; (949c ) 9298: 1e43 subs r3, r0, #1 929a: 4a7e ldr r2, [pc, #504] ; (9494 ) 929c: 3011 adds r0, #17 calcs.LCDbotline[x] = CANBUSLOGEND[x]; 929e: f813 1f01 ldrb.w r1, [r3, #1]! 92a2: f802 1f01 strb.w r1, [r2, #1]! for (x=0; x<18; x++) /*!!!!*/ 92a6: 4283 cmp r3, r0 92a8: d1f9 bne.n 929e 92aa: e79c b.n 91e6 static void Initialize_CAN(void) { longword CANCTRL1value; byte x; switch (calcs.CANbusspeed) /* Select bus speed configuration */ 92ac: 4a6d ldr r2, [pc, #436] ; (9464 ) 92ae: 78d1 ldrb r1, [r2, #3] 92b0: 297d cmp r1, #125 ; 0x7d 92b2: d00c beq.n 92ce case 250: CANCTRL1value = CANCTRL1_250KHz; break; case 50: default: CANCTRL1value = CANCTRL1_50KHz; 92b4: 4a7a ldr r2, [pc, #488] ; (94a0 ) 92b6: 487b ldr r0, [pc, #492] ; (94a4 ) 92b8: 29fa cmp r1, #250 ; 0xfa 92ba: bf18 it ne 92bc: 4602 movne r2, r0 break; } switch (calcs.CANBUSstatus) 92be: 2b05 cmp r3, #5 92c0: f200 8110 bhi.w 94e4 92c4: e8df f003 tbb [pc, r3] 92c8: 95402e05 .word 0x95402e05 92cc: c1b6 .short 0xc1b6 CANCTRL1value = CANCTRL1_125KHz; 92ce: 4a76 ldr r2, [pc, #472] ; (94a8 ) 92d0: e7f5 b.n 92be */ __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) { if ((int32_t)(IRQn) >= 0) { NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); 92d2: 4b76 ldr r3, [pc, #472] ; (94ac ) 92d4: f44f 6200 mov.w r2, #2048 ; 0x800 92d8: f8c3 2088 str.w r2, [r3, #136] ; 0x88 \details Acts as a special kind of Data Memory Barrier. It completes when all explicit memory accesses before this instruction complete. */ __STATIC_FORCEINLINE void __DSB(void) { __ASM volatile ("dsb 0xF":::"memory"); 92dc: f3bf 8f4f dsb sy __ASM volatile ("isb 0xF":::"memory"); 92e0: f3bf 8f6f isb sy * @param name Which clock to enable, see \ref clock_ip_name_t. */ static inline void CLOCK_EnableClock(clock_ip_name_t name) { uint32_t regAddr = SIM_BASE + CLK_GATE_ABSTRACT_REG_OFFSET((uint32_t)name); (*(volatile uint32_t *)regAddr) |= (1U << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name)); 92e4: 4a72 ldr r2, [pc, #456] ; (94b0 ) 92e6: 6813 ldr r3, [r2, #0] 92e8: f043 0310 orr.w r3, r3, #16 92ec: 6013 str r3, [r2, #0] { case 0: DisableIRQ(CAN0_ORed_Message_buffer_IRQn);/* Cancel interrupts in case they were active */ CLOCK_EnableClock(kCLOCK_Flexcan0); /* Enable clock for FLEXCAN0 */ calcs.CANBUSstatus++; 92ee: 4a5d ldr r2, [pc, #372] ; (9464 ) 92f0: 7893 ldrb r3, [r2, #2] 92f2: 3301 adds r3, #1 92f4: 7093 strb r3, [r2, #2] t10ms.CANBUStimeout = t10msQuarterSec; 92f6: 4b5f ldr r3, [pc, #380] ; (9474 ) 92f8: 2219 movs r2, #25 92fa: 731a strb r2, [r3, #12] if (CANBUSACTIVITYFOUND==0) 92fc: 4b5c ldr r3, [pc, #368] ; (9470 ) 92fe: 785b ldrb r3, [r3, #1] 9300: f013 0f02 tst.w r3, #2 9304: d156 bne.n 93b4 { if (calcs.CANbusspeed==50) /* On each reset, try a different CANbus speed! */ 9306: 4b57 ldr r3, [pc, #348] ; (9464 ) 9308: 78db ldrb r3, [r3, #3] 930a: 2b32 cmp r3, #50 ; 0x32 930c: d006 beq.n 931c { calcs.CANbusspeed = 250; } else if (calcs.CANbusspeed==250) 930e: 2bfa cmp r3, #250 ; 0xfa { calcs.CANbusspeed = 125; 9310: 4b54 ldr r3, [pc, #336] ; (9464 ) 9312: bf0c ite eq 9314: 227d moveq r2, #125 ; 0x7d } else { calcs.CANbusspeed = 50; 9316: 2232 movne r2, #50 ; 0x32 9318: 70da strb r2, [r3, #3] 931a: e04b b.n 93b4 calcs.CANbusspeed = 250; 931c: 4b51 ldr r3, [pc, #324] ; (9464 ) 931e: 22fa movs r2, #250 ; 0xfa 9320: 70da strb r2, [r3, #3] 9322: e047 b.n 93b4 } } break; case 1: PORTA->PCR[13] = PORTMODE_NOTUSED; /* Disconnect FLEXCAN0 RX to ensure that CAN will disable! */ 9324: 4b63 ldr r3, [pc, #396] ; (94b4 ) 9326: 2200 movs r2, #0 9328: 635a str r2, [r3, #52] ; 0x34 CAN0->MCR |= CAN_MCR_MDIS_MASK; /* Ask CAN to go to disable mode and wait till it does */ 932a: f5a3 3314 sub.w r3, r3, #151552 ; 0x25000 932e: 681a ldr r2, [r3, #0] 9330: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000 9334: 601a str r2, [r3, #0] if (CAN0->MCR&CAN_MCR_LPMACK_MASK) 9336: 681b ldr r3, [r3, #0] 9338: f413 1f80 tst.w r3, #1048576 ; 0x100000 933c: d03a beq.n 93b4 { calcs.CANBUSstatus++; 933e: 4a49 ldr r2, [pc, #292] ; (9464 ) 9340: 7893 ldrb r3, [r2, #2] 9342: 3301 adds r3, #1 9344: 7093 strb r3, [r2, #2] 9346: e035 b.n 93b4 } break; case 2: CAN0->CTRL1 = CANCTRL1value; /* Set bus speed (and select peripheral clock) */ 9348: 4b48 ldr r3, [pc, #288] ; (946c ) 934a: 605a str r2, [r3, #4] CAN0->MCR = CAN_MCR_FRZ_MASK+CAN_MCR_HALT_MASK;/* Get CAN into freeze mode */ 934c: f04f 42a0 mov.w r2, #1342177280 ; 0x50000000 9350: 601a str r2, [r3, #0] if (CAN0->MCR&CAN_MCR_FRZACK_MASK) 9352: 681b ldr r3, [r3, #0] 9354: f013 7f80 tst.w r3, #16777216 ; 0x1000000 9358: d003 beq.n 9362 { calcs.CANBUSstatus++; /* Advance when in freeze mode */ 935a: 4a42 ldr r2, [pc, #264] ; (9464 ) 935c: 7893 ldrb r3, [r2, #2] 935e: 3301 adds r3, #1 9360: 7093 strb r3, [r2, #2] } /*!!!!*/ calcs.LCDbotline[0] = 'T'; 9362: 4b40 ldr r3, [pc, #256] ; (9464 ) 9364: 2254 movs r2, #84 ; 0x54 9366: 779a strb r2, [r3, #30] calcs.LCDbotline[1] = 'R'; 9368: 2252 movs r2, #82 ; 0x52 936a: 77da strb r2, [r3, #31] calcs.LCDbotline[2] = 'Y'; 936c: 2259 movs r2, #89 ; 0x59 936e: f883 2020 strb.w r2, [r3, #32] calcs.LCDbotline[3] = ' '; 9372: 2220 movs r2, #32 9374: f883 2021 strb.w r2, [r3, #33] ; 0x21 switch (calcs.CANbusspeed) 9378: 78db ldrb r3, [r3, #3] 937a: 2b7d cmp r3, #125 ; 0x7d 937c: d00c beq.n 9398 937e: 2bfa cmp r3, #250 ; 0xfa 9380: d021 beq.n 93c6 9382: 2b32 cmp r3, #50 ; 0x32 9384: d02a beq.n 93dc calcs.LCDbotline[4] = '5'; calcs.LCDbotline[5] = '0'; calcs.LCDbotline[6] = ' '; break; default: calcs.LCDbotline[4] = '?'; 9386: 4b37 ldr r3, [pc, #220] ; (9464 ) 9388: 223f movs r2, #63 ; 0x3f 938a: f883 2022 strb.w r2, [r3, #34] ; 0x22 calcs.LCDbotline[5] = '?'; 938e: f883 2023 strb.w r2, [r3, #35] ; 0x23 calcs.LCDbotline[6] = '?'; 9392: f883 2024 strb.w r2, [r3, #36] ; 0x24 break; 9396: e009 b.n 93ac calcs.LCDbotline[4] = '1'; 9398: 4b32 ldr r3, [pc, #200] ; (9464 ) 939a: 2231 movs r2, #49 ; 0x31 939c: f883 2022 strb.w r2, [r3, #34] ; 0x22 calcs.LCDbotline[5] = '2'; 93a0: 2232 movs r2, #50 ; 0x32 93a2: f883 2023 strb.w r2, [r3, #35] ; 0x23 calcs.LCDbotline[6] = '5'; 93a6: 2235 movs r2, #53 ; 0x35 93a8: f883 2024 strb.w r2, [r3, #36] ; 0x24 } calcs.LCDbotline[7] = ' '; 93ac: 4b2d ldr r3, [pc, #180] ; (9464 ) 93ae: 2220 movs r2, #32 93b0: f883 2025 strb.w r2, [r3, #37] ; 0x25 calcs.CANBUFFERfirst = 0; 93b4: 4b2b ldr r3, [pc, #172] ; (9464 ) 93b6: 2200 movs r2, #0 93b8: f883 2030 strb.w r2, [r3, #48] ; 0x30 calcs.CANBUFFERlast = 0; 93bc: f883 2031 strb.w r2, [r3, #49] ; 0x31 } 93c0: b005 add sp, #20 93c2: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} calcs.LCDbotline[4] = '2'; 93c6: 4b27 ldr r3, [pc, #156] ; (9464 ) 93c8: 2232 movs r2, #50 ; 0x32 93ca: f883 2022 strb.w r2, [r3, #34] ; 0x22 calcs.LCDbotline[5] = '5'; 93ce: 2235 movs r2, #53 ; 0x35 93d0: f883 2023 strb.w r2, [r3, #35] ; 0x23 calcs.LCDbotline[6] = '0'; 93d4: 2230 movs r2, #48 ; 0x30 93d6: f883 2024 strb.w r2, [r3, #36] ; 0x24 break; 93da: e7e7 b.n 93ac calcs.LCDbotline[4] = '5'; 93dc: 4b21 ldr r3, [pc, #132] ; (9464 ) 93de: 2235 movs r2, #53 ; 0x35 93e0: f883 2022 strb.w r2, [r3, #34] ; 0x22 calcs.LCDbotline[5] = '0'; 93e4: 2230 movs r2, #48 ; 0x30 93e6: f883 2023 strb.w r2, [r3, #35] ; 0x23 calcs.LCDbotline[6] = ' '; 93ea: 2220 movs r2, #32 93ec: f883 2024 strb.w r2, [r3, #36] ; 0x24 break; 93f0: e7dc b.n 93ac /*!!!!*/ break; case 3: CAN0->CTRL1 = CANCTRL1value; /* Set bus speed (again?) */ 93f2: 4b1e ldr r3, [pc, #120] ; (946c ) 93f4: 605a str r2, [r3, #4] CAN0->MCR &= ~CAN_MCR_RFEN_MASK; /*(11/25/20) Make sure FIFO is disabled, so we can write to all the mailboxes! */ 93f6: 681a ldr r2, [r3, #0] 93f8: f022 5200 bic.w r2, r2, #536870912 ; 0x20000000 93fc: 601a str r2, [r3, #0] 93fe: 2300 movs r3, #0 for (x=0; x<16; x++) { CAN0->MB[x].CS = 0; /* Set all mailboxes to "inactive" */ 9400: 481a ldr r0, [pc, #104] ; (946c ) 9402: 4619 mov r1, r3 9404: f103 0208 add.w r2, r3, #8 9408: 0112 lsls r2, r2, #4 940a: 5081 str r1, [r0, r2] CAN0->RXIMR[x] = 0; /* And set the filter mask to "don't care" */ 940c: f503 7208 add.w r2, r3, #544 ; 0x220 9410: f840 1022 str.w r1, [r0, r2, lsl #2] 9414: 3301 adds r3, #1 for (x=0; x<16; x++) 9416: 2b10 cmp r3, #16 9418: d1f4 bne.n 9404 } CAN0->CTRL2 = CAN_CTRL2_RFFN(0)+CAN_CTRL2_MRP(1);/* Set default 8 RX FIFO filter elements, with mailbox check before FIFO */ 941a: 4b14 ldr r3, [pc, #80] ; (946c ) 941c: f44f 2280 mov.w r2, #262144 ; 0x40000 9420: 635a str r2, [r3, #52] ; 0x34 CAN0->RXFGMASK = 0; /* Set RX FIFO filter mask to "don't care" */ 9422: 2200 movs r2, #0 9424: 649a str r2, [r3, #72] ; 0x48 CAN0->IMASK1 = CAN_IFLAG1_BUF5I_MASK;/* Allow interrupt from FIFO */ 9426: 2220 movs r2, #32 9428: 629a str r2, [r3, #40] ; 0x28 calcs.CANBUSstatus++; 942a: 4a0e ldr r2, [pc, #56] ; (9464 ) 942c: 7893 ldrb r3, [r2, #2] 942e: 3301 adds r3, #1 9430: 7093 strb r3, [r2, #2] break; 9432: e7bf b.n 93b4 case 4: CAN0->MCR = CAN_MCR_SRXDIS_MASK+CANMCR_DEFAULT;/* Complete configuration (set active mailboxes), get out of freeze mode */ 9434: 4b0d ldr r3, [pc, #52] ; (946c ) 9436: 4a20 ldr r2, [pc, #128] ; (94b8 ) 9438: 601a str r2, [r3, #0] t10ms.CANBUStimeout = t10msQuarterSec; 943a: 4b0e ldr r3, [pc, #56] ; (9474 ) 943c: 2219 movs r2, #25 943e: 731a strb r2, [r3, #12] calcs.CANBUSstatus++; 9440: 4a08 ldr r2, [pc, #32] ; (9464 ) 9442: 7893 ldrb r3, [r2, #2] 9444: 3301 adds r3, #1 9446: 7093 strb r3, [r2, #2] break; 9448: e7b4 b.n 93b4 case 5: if (CAN0->MCR&CAN_MCR_NOTRDY_MASK) /* We should now not be "not ready" */ 944a: 4b08 ldr r3, [pc, #32] ; (946c ) 944c: 681b ldr r3, [r3, #0] 944e: f013 6f00 tst.w r3, #134217728 ; 0x8000000 9452: d035 beq.n 94c0 { if (t10ms.CANBUStimeout==0) 9454: 4b07 ldr r3, [pc, #28] ; (9474 ) 9456: 7b1b ldrb r3, [r3, #12] 9458: 2b00 cmp r3, #0 945a: d1ab bne.n 93b4 { calcs.CANBUSstatus = 0; /* EEK */ 945c: 4b01 ldr r3, [pc, #4] ; (9464 ) 945e: 2200 movs r2, #0 9460: 709a strb r2, [r3, #2] 9462: e7a7 b.n 93b4 9464: 20000934 .word 0x20000934 9468: 200012ea .word 0x200012ea 946c: 40024000 .word 0x40024000 9470: 2000096c .word 0x2000096c 9474: 20000980 .word 0x20000980 9478: 0001247c .word 0x0001247c 947c: 00012490 .word 0x00012490 9480: 000124a4 .word 0x000124a4 9484: 20000680 .word 0x20000680 9488: 20000968 .word 0x20000968 948c: 000124b4 .word 0x000124b4 9490: 00012440 .word 0x00012440 9494: 20000951 .word 0x20000951 9498: 000124cc .word 0x000124cc 949c: 00012454 .word 0x00012454 94a0: 07090002 .word 0x07090002 94a4: 1f120002 .word 0x1f120002 94a8: 0f090002 .word 0x0f090002 94ac: e000e100 .word 0xe000e100 94b0: 4004803c .word 0x4004803c 94b4: 40049000 .word 0x40049000 94b8: 2002000f .word 0x2002000f 94bc: 00012468 .word 0x00012468 } } else { calcs.CANBUSstatus = 100; /* Yes - ready to run! */ 94c0: 4b51 ldr r3, [pc, #324] ; (9608 ) 94c2: 2264 movs r2, #100 ; 0x64 94c4: 709a strb r2, [r3, #2] t10ms.CANBUStimeout = t10msQuarterSec; 94c6: 4b51 ldr r3, [pc, #324] ; (960c ) 94c8: 2219 movs r2, #25 94ca: 731a strb r2, [r3, #12] */ __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { if ((int32_t)(IRQn) >= 0) { NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); 94cc: 4b50 ldr r3, [pc, #320] ; (9610 ) 94ce: 2230 movs r2, #48 ; 0x30 94d0: f883 234b strb.w r2, [r3, #843] ; 0x34b NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); 94d4: f44f 6200 mov.w r2, #2048 ; 0x800 94d8: 609a str r2, [r3, #8] NVIC_SetPriority(CAN0_ORed_Message_buffer_IRQn, 3);/* Enable interrupts for the FIFO */ EnableIRQ(CAN0_ORed_Message_buffer_IRQn); PORTA->PCR[13] = PORTMODE_ALT2; /* Configure FLEXCAN0 RX */ 94da: 4b4e ldr r3, [pc, #312] ; (9614 ) 94dc: f44f 7200 mov.w r2, #512 ; 0x200 94e0: 635a str r2, [r3, #52] ; 0x34 94e2: e767 b.n 93b4 } break; default: calcs.CANBUSstatus = 0; /* EEK! */ 94e4: 4b48 ldr r3, [pc, #288] ; (9608 ) 94e6: 2200 movs r2, #0 94e8: 709a strb r2, [r3, #2] break; 94ea: e763 b.n 93b4 calcs.CANBUSstatus = 0; /* No CANbus found (at this speed), try again */ 94ec: 4b46 ldr r3, [pc, #280] ; (9608 ) 94ee: 2200 movs r2, #0 94f0: 709a strb r2, [r3, #2] return; 94f2: e765 b.n 93c0 calcs.CANBUSstatus = 0; /* CANbus is bus-off! Force a reset */ 94f4: 4b44 ldr r3, [pc, #272] ; (9608 ) 94f6: 2200 movs r2, #0 94f8: 709a strb r2, [r3, #2] return; 94fa: e761 b.n 93c0 calcs.LCDtopline[x] = CANBUSTOPLINE125K[x]; 94fc: f813 500c ldrb.w r5, [r3, ip] 9500: f802 5c11 strb.w r5, [r2, #-17] calcs.LCDbotline[x] = ' '; 9504: f802 0f01 strb.w r0, [r2, #1]! 9508: 3301 adds r3, #1 for (x=0; x<18; x++) /*!!!!*/ 950a: 42a2 cmp r2, r4 950c: d010 beq.n 9530 switch (calcs.CANbusspeed) 950e: 297d cmp r1, #125 ; 0x7d 9510: d0f4 beq.n 94fc 9512: 29fa cmp r1, #250 ; 0xfa 9514: d004 beq.n 9520 9516: 2932 cmp r1, #50 ; 0x32 9518: d006 beq.n 9528 calcs.LCDtopline[x] = ' '; 951a: f802 0c11 strb.w r0, [r2, #-17] break; 951e: e7f1 b.n 9504 calcs.LCDtopline[x] = CANBUSTOPLINE250K[x]; 9520: 5ddd ldrb r5, [r3, r7] 9522: f802 5c11 strb.w r5, [r2, #-17] break; 9526: e7ed b.n 9504 calcs.LCDtopline[x] = CANBUSTOPLINE50K[x]; 9528: 5d9d ldrb r5, [r3, r6] 952a: f802 5c11 strb.w r5, [r2, #-17] break; 952e: e7e9 b.n 9504 while (calcs.CANBUFFERfirst!=calcs.CANBUFFERlast)/* If there's stuff in the buffer, deal with it */ 9530: 4c35 ldr r4, [pc, #212] ; (9608 ) thisentry = buffer[ptr]; 9532: 4d39 ldr r5, [pc, #228] ; (9618 ) if (filelogging==1) 9534: 4e39 ldr r6, [pc, #228] ; (961c ) 9536: e002 b.n 953e 9538: 7831 ldrb r1, [r6, #0] 953a: 2901 cmp r1, #1 953c: d032 beq.n 95a4 while (calcs.CANBUFFERfirst!=calcs.CANBUFFERlast)/* If there's stuff in the buffer, deal with it */ 953e: f894 1030 ldrb.w r1, [r4, #48] ; 0x30 9542: f894 3031 ldrb.w r3, [r4, #49] ; 0x31 9546: 428b cmp r3, r1 9548: d037 beq.n 95ba thisentry = buffer[ptr]; 954a: eb01 0381 add.w r3, r1, r1, lsl #2 954e: eb05 0083 add.w r0, r5, r3, lsl #2 9552: f855 2023 ldr.w r2, [r5, r3, lsl #2] 9556: 6843 ldr r3, [r0, #4] 9558: f890 e008 ldrb.w lr, [r0, #8] 955c: 7a47 ldrb r7, [r0, #9] 955e: f8d0 800c ldr.w r8, [r0, #12] 9562: f8d0 9010 ldr.w r9, [r0, #16] buffer[ptr].flags = 0; /* Mark the entry as no longer new */ 9566: f04f 0c00 mov.w ip, #0 956a: f880 c009 strb.w ip, [r0, #9] ptr++; /* And move buffer to next entry */ 956e: 3101 adds r1, #1 9570: b2c9 uxtb r1, r1 ptr = 0; 9572: 2964 cmp r1, #100 ; 0x64 9574: bf28 it cs 9576: 4661 movcs r1, ip calcs.CANBUFFERfirst = ptr; 9578: f884 1030 strb.w r1, [r4, #48] ; 0x30 if (thisentry.flags&1) /* This bit indicates there is received data */ 957c: f017 0f01 tst.w r7, #1 9580: d0dd beq.n 953e if (thisentry.flags&2) /* This bit indicates extended ID */ 9582: f017 0f02 tst.w r7, #2 9586: d0d7 beq.n 9538 if (filelogging==1) 9588: 7831 ldrb r1, [r6, #0] 958a: 2901 cmp r1, #1 958c: d1d7 bne.n 953e (void)f_printf(&fileCANBUSdebuglog, "%09lu %08LX/%u %08LX%08LX\r\n",thisentry.time, thisentry.ID, thisentry.DLC, thisentry.word0, thisentry.word1); 958e: f8cd 9008 str.w r9, [sp, #8] 9592: f8cd 8004 str.w r8, [sp, #4] 9596: f8cd e000 str.w lr, [sp] 959a: 4921 ldr r1, [pc, #132] ; (9620 ) 959c: 4821 ldr r0, [pc, #132] ; (9624 ) 959e: f002 f909 bl b7b4 95a2: e7cc b.n 953e (void)f_printf(&fileCANBUSdebuglog, "%09lu %04LX/%u %08LX%08LX\r\n",thisentry.time, thisentry.ID, thisentry.DLC, thisentry.word0, thisentry.word1); 95a4: f8cd 9008 str.w r9, [sp, #8] 95a8: f8cd 8004 str.w r8, [sp, #4] 95ac: f8cd e000 str.w lr, [sp] 95b0: 491d ldr r1, [pc, #116] ; (9628 ) 95b2: 481c ldr r0, [pc, #112] ; (9624 ) 95b4: f002 f8fe bl b7b4 95b8: e7c1 b.n 953e if (CANBUSBUFFEROVERFLOW) 95ba: 4b1c ldr r3, [pc, #112] ; (962c ) 95bc: 785b ldrb r3, [r3, #1] 95be: f013 0f04 tst.w r3, #4 95c2: d114 bne.n 95ee if (CAN0->IFLAG1&CAN_IFLAG1_BUF7I_MASK)/* Buffer overflow? */ 95c4: 4b1a ldr r3, [pc, #104] ; (9630 ) 95c6: 6b1b ldr r3, [r3, #48] ; 0x30 95c8: f013 0f80 tst.w r3, #128 ; 0x80 95cc: f43f aef8 beq.w 93c0 CAN0->IFLAG1 = CAN_IFLAG1_BUF7I_MASK;/* Clear it */ 95d0: 4b17 ldr r3, [pc, #92] ; (9630 ) 95d2: 2280 movs r2, #128 ; 0x80 95d4: 631a str r2, [r3, #48] ; 0x30 if (filelogging==1) 95d6: 4b11 ldr r3, [pc, #68] ; (961c ) 95d8: 781b ldrb r3, [r3, #0] 95da: 2b01 cmp r3, #1 95dc: f47f aef0 bne.w 93c0 (void)f_printf(&fileCANBUSdebuglog, "%09lu HWOVF\r\n",debugCounter1ms); 95e0: 4b14 ldr r3, [pc, #80] ; (9634 ) 95e2: 681a ldr r2, [r3, #0] 95e4: 4914 ldr r1, [pc, #80] ; (9638 ) 95e6: 480f ldr r0, [pc, #60] ; (9624 ) 95e8: f002 f8e4 bl b7b4 95ec: e6e8 b.n 93c0 (void)f_printf(&fileCANBUSdebuglog, "%09lu BUFOVF\r\n",debugCounter1ms); 95ee: 4b11 ldr r3, [pc, #68] ; (9634 ) 95f0: 681a ldr r2, [r3, #0] 95f2: 4912 ldr r1, [pc, #72] ; (963c ) 95f4: 480b ldr r0, [pc, #44] ; (9624 ) 95f6: f002 f8dd bl b7b4 CANBUSBUFFEROVERFLOW = 0; 95fa: 4b0c ldr r3, [pc, #48] ; (962c ) 95fc: 785a ldrb r2, [r3, #1] 95fe: f36f 0282 bfc r2, #2, #1 9602: 705a strb r2, [r3, #1] 9604: e7de b.n 95c4 9606: bf00 nop 9608: 20000934 .word 0x20000934 960c: 20000980 .word 0x20000980 9610: e000e100 .word 0xe000e100 9614: 40049000 .word 0x40049000 9618: 1fff0000 .word 0x1fff0000 961c: 200012ea .word 0x200012ea 9620: 000124e4 .word 0x000124e4 9624: 20000680 .word 0x20000680 9628: 00012500 .word 0x00012500 962c: 2000096c .word 0x2000096c 9630: 40024000 .word 0x40024000 9634: 20000968 .word 0x20000968 9638: 0001252c .word 0x0001252c 963c: 0001251c .word 0x0001251c 00009640 : /*------------------------------------------------------------------*/ /* INITIALIZE "CHINA" LCD (called for states 1-10) */ /*------------------------------------------------------------------*/ void LCDinitializeChina(void) { switch (calcs.LCDstate) 9640: 4b41 ldr r3, [pc, #260] ; (9748 ) 9642: 7a9a ldrb r2, [r3, #10] 9644: 1e53 subs r3, r2, #1 9646: 2b07 cmp r3, #7 9648: d879 bhi.n 973e 964a: e8df f003 tbb [pc, r3] 964e: 1604 .short 0x1604 9650: 4e4e3c29 .word 0x4e4e3c29 9654: 7461 .short 0x7461 uint32_t result; #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); 9656: 2338 movs r3, #56 ; 0x38 9658: fa93 f3a3 rbit r3, r3 /*------------------------------------------------------------------*/ static byte ReverseData(byte d) { longword tmp = d; tmp = __RBIT(tmp); /* Reverse all bits 0-31 */ tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 965c: 0e1b lsrs r3, r3, #24 return (byte)tmp; 965e: 4a3b ldr r2, [pc, #236] ; (974c ) 9660: 7013 strb r3, [r2, #0] LCDCONTROL_RS_CLEAR; 9662: 4b3b ldr r3, [pc, #236] ; (9750 ) 9664: 2200 movs r2, #0 9666: 701a strb r2, [r3, #0] LCDCONTROL_E_SET; /* When this is set, we toggle E low/high/low to send the data to LCD (then set it low again!) */ 9668: 4b3a ldr r3, [pc, #232] ; (9754 ) 966a: 2201 movs r2, #1 966c: 701a strb r2, [r3, #0] calcs.LCDstate++; 966e: 2302 movs r3, #2 9670: 4a35 ldr r2, [pc, #212] ; (9748 ) 9672: 7293 strb r3, [r2, #10] Int100usLCDdelay = DELAY100us_SHORT; 9674: 4a38 ldr r2, [pc, #224] ; (9758 ) 9676: 8013 strh r3, [r2, #0] break; 9678: 4770 bx lr 967a: 230c movs r3, #12 967c: fa93 f3a3 rbit r3, r3 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 9680: 0e1b lsrs r3, r3, #24 return (byte)tmp; 9682: 4a32 ldr r2, [pc, #200] ; (974c ) 9684: 7013 strb r3, [r2, #0] LCDCONTROL_RS_CLEAR; 9686: 4b32 ldr r3, [pc, #200] ; (9750 ) 9688: 2200 movs r2, #0 968a: 701a strb r2, [r3, #0] LCDCONTROL_E_SET; 968c: 4b31 ldr r3, [pc, #196] ; (9754 ) 968e: 2201 movs r2, #1 9690: 701a strb r2, [r3, #0] calcs.LCDstate++; 9692: 4b2d ldr r3, [pc, #180] ; (9748 ) 9694: 2203 movs r2, #3 9696: 729a strb r2, [r3, #10] Int100usLCDdelay = DELAY100us_SHORT; 9698: 4b2f ldr r3, [pc, #188] ; (9758 ) 969a: 2202 movs r2, #2 969c: 801a strh r2, [r3, #0] break; 969e: 4770 bx lr 96a0: 2306 movs r3, #6 96a2: fa93 f3a3 rbit r3, r3 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 96a6: 0e1b lsrs r3, r3, #24 return (byte)tmp; 96a8: 4a28 ldr r2, [pc, #160] ; (974c ) 96aa: 7013 strb r3, [r2, #0] LCDCONTROL_RS_CLEAR; 96ac: 4b28 ldr r3, [pc, #160] ; (9750 ) 96ae: 2200 movs r2, #0 96b0: 701a strb r2, [r3, #0] LCDCONTROL_E_SET; 96b2: 4b28 ldr r3, [pc, #160] ; (9754 ) 96b4: 2201 movs r2, #1 96b6: 701a strb r2, [r3, #0] calcs.LCDstate++; 96b8: 4b23 ldr r3, [pc, #140] ; (9748 ) 96ba: 2204 movs r2, #4 96bc: 729a strb r2, [r3, #10] Int100usLCDdelay = DELAY100us_SHORT; 96be: 4b26 ldr r3, [pc, #152] ; (9758 ) 96c0: 2202 movs r2, #2 96c2: 801a strh r2, [r3, #0] break; 96c4: 4770 bx lr 96c6: 2201 movs r2, #1 96c8: fa92 f3a2 rbit r3, r2 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 96cc: 0e1b lsrs r3, r3, #24 return (byte)tmp; 96ce: 491f ldr r1, [pc, #124] ; (974c ) 96d0: 700b strb r3, [r1, #0] LCDCONTROL_RS_CLEAR; 96d2: 4b1f ldr r3, [pc, #124] ; (9750 ) 96d4: 2100 movs r1, #0 96d6: 7019 strb r1, [r3, #0] LCDCONTROL_E_SET; 96d8: 4b1e ldr r3, [pc, #120] ; (9754 ) 96da: 701a strb r2, [r3, #0] calcs.LCDstate++; 96dc: 4b1a ldr r3, [pc, #104] ; (9748 ) 96de: 2205 movs r2, #5 96e0: 729a strb r2, [r3, #10] Int100usLCDdelay = DELAY100us_LONG; /* Delay >1.5ms */ 96e2: 4b1d ldr r3, [pc, #116] ; (9758 ) 96e4: 2210 movs r2, #16 96e6: 801a strh r2, [r3, #0] break; 96e8: 4770 bx lr 96ea: 233c movs r3, #60 ; 0x3c 96ec: fa93 f3a3 rbit r3, r3 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 96f0: 0e1b lsrs r3, r3, #24 return (byte)tmp; 96f2: 4916 ldr r1, [pc, #88] ; (974c ) 96f4: 700b strb r3, [r1, #0] LCDCONTROL_RS_CLEAR; 96f6: 4b16 ldr r3, [pc, #88] ; (9750 ) 96f8: 2100 movs r1, #0 96fa: 7019 strb r1, [r3, #0] LCDCONTROL_E_SET; 96fc: 4b15 ldr r3, [pc, #84] ; (9754 ) 96fe: 2101 movs r1, #1 9700: 7019 strb r1, [r3, #0] calcs.LCDstate++; 9702: 440a add r2, r1 9704: 4b10 ldr r3, [pc, #64] ; (9748 ) 9706: 729a strb r2, [r3, #10] Int100usLCDdelay = DELAY100us_SHORT; 9708: 4b13 ldr r3, [pc, #76] ; (9758 ) 970a: 2202 movs r2, #2 970c: 801a strh r2, [r3, #0] break; 970e: 4770 bx lr 9710: 2338 movs r3, #56 ; 0x38 9712: fa93 f3a3 rbit r3, r3 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 9716: 0e1b lsrs r3, r3, #24 return (byte)tmp; 9718: 4a0c ldr r2, [pc, #48] ; (974c ) 971a: 7013 strb r3, [r2, #0] LCDCONTROL_RS_CLEAR; 971c: 4b0c ldr r3, [pc, #48] ; (9750 ) 971e: 2200 movs r2, #0 9720: 701a strb r2, [r3, #0] LCDCONTROL_E_SET; 9722: 4b0c ldr r3, [pc, #48] ; (9754 ) 9724: 2201 movs r2, #1 9726: 701a strb r2, [r3, #0] calcs.LCDstate++; 9728: 4b07 ldr r3, [pc, #28] ; (9748 ) 972a: 2208 movs r2, #8 972c: 729a strb r2, [r3, #10] Int100usLCDdelay = DELAY100us_SHORT; 972e: 4b0a ldr r3, [pc, #40] ; (9758 ) 9730: 2202 movs r2, #2 9732: 801a strh r2, [r3, #0] break; 9734: 4770 bx lr calcs.LCDstate = 100; /* Finished initialisation, now load display text (top line then bottom line) */ 9736: 4b04 ldr r3, [pc, #16] ; (9748 ) 9738: 2264 movs r2, #100 ; 0x64 973a: 729a strb r2, [r3, #10] break; 973c: 4770 bx lr calcs.LCDstate = 0; /*EEK!*/ 973e: 4b02 ldr r3, [pc, #8] ; (9748 ) 9740: 2200 movs r2, #0 9742: 729a strb r2, [r3, #10] } 9744: 4770 bx lr 9746: bf00 nop 9748: 20000934 .word 0x20000934 974c: 200012f4 .word 0x200012f4 9750: 200012f3 .word 0x200012f3 9754: 200012f2 .word 0x200012f2 9758: 200012e2 .word 0x200012e2 0000975c : if (Int100usLCDdelay) 975c: 4b7b ldr r3, [pc, #492] ; (994c ) 975e: 881b ldrh r3, [r3, #0] 9760: 2b00 cmp r3, #0 9762: f040 80f2 bne.w 994a { 9766: b570 push {r4, r5, r6, lr} switch (calcs.LCDstate) 9768: 4b79 ldr r3, [pc, #484] ; (9950 ) 976a: 7a9b ldrb r3, [r3, #10] 976c: 2b64 cmp r3, #100 ; 0x64 976e: d06f beq.n 9850 9770: d927 bls.n 97c2 9772: 2bc8 cmp r3, #200 ; 0xc8 9774: f000 8090 beq.w 9898 9778: d92a bls.n 97d0 977a: 2bc9 cmp r3, #201 ; 0xc9 977c: f000 80a0 beq.w 98c0 9780: 2bfa cmp r3, #250 ; 0xfa 9782: f040 80cf bne.w 9924 if (t10ms.LCDflashdelay==0) 9786: 4b73 ldr r3, [pc, #460] ; (9954 ) 9788: 78db ldrb r3, [r3, #3] 978a: 2b00 cmp r3, #0 978c: d150 bne.n 9830 calcs.LCDstate = 100; /* Regularly update the display, in case there's any flashing characters */ 978e: 4a70 ldr r2, [pc, #448] ; (9950 ) 9790: 2364 movs r3, #100 ; 0x64 9792: 7293 strb r3, [r2, #10] if (flashflag) /* Alternate flashing on/off at each update */ 9794: 4970 ldr r1, [pc, #448] ; (9958 ) 9796: 780b ldrb r3, [r1, #0] 9798: fab3 f383 clz r3, r3 979c: 095b lsrs r3, r3, #5 979e: 700b strb r3, [r1, #0] analogs.DACoutput += 512;/*!!!!*/ 97a0: 496e ldr r1, [pc, #440] ; (995c ) 97a2: 890b ldrh r3, [r1, #8] 97a4: f503 7300 add.w r3, r3, #512 ; 0x200 97a8: 810b strh r3, [r1, #8] calcs.LCDtopline[17]++;/*!!!!*/ 97aa: 7f52 ldrb r2, [r2, #29] if ((calcs.LCDtopline[17]<'0')||(calcs.LCDtopline[17]>'9')) 97ac: f1a2 032f sub.w r3, r2, #47 ; 0x2f 97b0: b2db uxtb r3, r3 97b2: 2b09 cmp r3, #9 calcs.LCDtopline[17]++;/*!!!!*/ 97b4: bf99 ittee ls 97b6: 3201 addls r2, #1 97b8: 4b65 ldrls r3, [pc, #404] ; (9950 ) calcs.LCDtopline[17] = '0';/*!!!!*/ 97ba: 4b65 ldrhi r3, [pc, #404] ; (9950 ) 97bc: 2230 movhi r2, #48 ; 0x30 97be: 775a strb r2, [r3, #29] 97c0: e036 b.n 9830 switch (calcs.LCDstate) 97c2: b33b cbz r3, 9814 97c4: 2b13 cmp r3, #19 97c6: f200 80ad bhi.w 9924 LCDinitializeChina(); 97ca: f7ff ff39 bl 9640 break; 97ce: e02f b.n 9830 switch (calcs.LCDstate) 97d0: 2b65 cmp r3, #101 ; 0x65 97d2: f040 80a7 bne.w 9924 if (calcs.LCDindex) 97d8: 7adb ldrb r3, [r3, #11] 97da: 2b11 cmp r3, #17 97dc: d858 bhi.n 9890 LCDDATABYTE = calcs.LCDtopline[calcs.LCDindex];/* Write one character at a time to LCD */ 97de: 4a5c ldr r2, [pc, #368] ; (9950 ) 97e0: 441a add r2, r3 97e2: 7b12 ldrb r2, [r2, #12] if (LCDDATABYTE&0x80) /* Is bit 7 set (which means flash)? */ 97e4: f012 0f80 tst.w r2, #128 ; 0x80 97e8: d146 bne.n 9878 LCDDATABYTE = calcs.LCDtopline[calcs.LCDindex];/* Write one character at a time to LCD */ 97ea: 495d ldr r1, [pc, #372] ; (9960 ) 97ec: 700a strb r2, [r1, #0] LCDDATABYTE = ReverseData(LCDDATABYTE); 97ee: 495c ldr r1, [pc, #368] ; (9960 ) longword tmp = d; 97f0: 780a ldrb r2, [r1, #0] 97f2: fa92 f2a2 rbit r2, r2 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 97f6: 0e12 lsrs r2, r2, #24 return (byte)tmp; 97f8: 700a strb r2, [r1, #0] LCDCONTROL_RS_SET; 97fa: 4a5a ldr r2, [pc, #360] ; (9964 ) 97fc: 2104 movs r1, #4 97fe: 7011 strb r1, [r2, #0] LCDCONTROL_E_SET; 9800: 4a59 ldr r2, [pc, #356] ; (9968 ) 9802: 2101 movs r1, #1 9804: 7011 strb r1, [r2, #0] calcs.LCDindex++; 9806: 440b add r3, r1 9808: 4a51 ldr r2, [pc, #324] ; (9950 ) 980a: 72d3 strb r3, [r2, #11] Int100usLCDdelay = DELAY100us_SHORT; 980c: 4b4f ldr r3, [pc, #316] ; (994c ) 980e: 2202 movs r2, #2 9810: 801a strh r2, [r3, #0] 9812: e00d b.n 9830 LCDDATABYTE = 0; /* Set data, RS and E all to 0 */ 9814: 2300 movs r3, #0 9816: 4a52 ldr r2, [pc, #328] ; (9960 ) 9818: 7013 strb r3, [r2, #0] LCDCONTROLBYTE_E = 0; 981a: 4a53 ldr r2, [pc, #332] ; (9968 ) 981c: 7013 strb r3, [r2, #0] LCDCONTROLBYTE_RS = 0; 981e: 4a51 ldr r2, [pc, #324] ; (9964 ) 9820: 7013 strb r3, [r2, #0] Int100usLCDdelay = DELAY100us_STARTUP;/* LCD can take a while to get ready ... */ 9822: 4b4a ldr r3, [pc, #296] ; (994c ) 9824: f44f 72fa mov.w r2, #500 ; 0x1f4 9828: 801a strh r2, [r3, #0] calcs.LCDstate++; 982a: 4b49 ldr r3, [pc, #292] ; (9950 ) 982c: 2201 movs r2, #1 982e: 729a strb r2, [r3, #10] portdata = (LCDCONTROLBYTE_RS<<8)+LCDDATABYTE;/* Write LCD data out to port */ 9830: 4b4c ldr r3, [pc, #304] ; (9964 ) 9832: 781b ldrb r3, [r3, #0] 9834: 4a4a ldr r2, [pc, #296] ; (9960 ) 9836: 7814 ldrb r4, [r2, #0] 9838: eb04 2403 add.w r4, r4, r3, lsl #8 983c: b2a4 uxth r4, r4 GPIOC->PDOR = portdata; 983e: 4b4b ldr r3, [pc, #300] ; (996c ) 9840: 601c str r4, [r3, #0] DelayOneMicrosecond(); 9842: f007 f986 bl 10b52 if (LCDCONTROLBYTE_E) 9846: 4b48 ldr r3, [pc, #288] ; (9968 ) 9848: 781b ldrb r3, [r3, #0] 984a: 2b00 cmp r3, #0 984c: d16e bne.n 992c } 984e: bd70 pop {r4, r5, r6, pc} calcs.LCDindex = 0; /* Write top line characters to display */ 9850: 4a3f ldr r2, [pc, #252] ; (9950 ) 9852: 2100 movs r1, #0 9854: 72d1 strb r1, [r2, #11] 9856: 2380 movs r3, #128 ; 0x80 9858: fa93 f3a3 rbit r3, r3 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 985c: 0e1b lsrs r3, r3, #24 return (byte)tmp; 985e: 4840 ldr r0, [pc, #256] ; (9960 ) 9860: 7003 strb r3, [r0, #0] LCDCONTROL_RS_CLEAR; 9862: 4b40 ldr r3, [pc, #256] ; (9964 ) 9864: 7019 strb r1, [r3, #0] LCDCONTROL_E_SET; 9866: 4b40 ldr r3, [pc, #256] ; (9968 ) 9868: 2101 movs r1, #1 986a: 7019 strb r1, [r3, #0] calcs.LCDstate++; 986c: 2365 movs r3, #101 ; 0x65 986e: 7293 strb r3, [r2, #10] Int100usLCDdelay = DELAY100us_SHORT; 9870: 4b36 ldr r3, [pc, #216] ; (994c ) 9872: 2202 movs r2, #2 9874: 801a strh r2, [r3, #0] break; 9876: e7db b.n 9830 LCDDATABYTE &= 0x7F; /* Clear bit 7 to get the character */ 9878: f002 027f and.w r2, r2, #127 ; 0x7f 987c: 4938 ldr r1, [pc, #224] ; (9960 ) 987e: 700a strb r2, [r1, #0] if (flashflag) 9880: 4a35 ldr r2, [pc, #212] ; (9958 ) 9882: 7812 ldrb r2, [r2, #0] 9884: 2a00 cmp r2, #0 9886: d0b2 beq.n 97ee LCDDATABYTE = 255; /* To flash it, replace with a solid square */ 9888: 460a mov r2, r1 988a: 21ff movs r1, #255 ; 0xff 988c: 7011 strb r1, [r2, #0] 988e: e7ae b.n 97ee calcs.LCDstate = 200; /* After top line, do bottom line */} 9890: 4b2f ldr r3, [pc, #188] ; (9950 ) 9892: 22c8 movs r2, #200 ; 0xc8 9894: 729a strb r2, [r3, #10] 9896: e7cb b.n 9830 calcs.LCDindex = 0; /* Write bottom line characters to display */ 9898: 4a2d ldr r2, [pc, #180] ; (9950 ) 989a: 2100 movs r1, #0 989c: 72d1 strb r1, [r2, #11] 989e: 2390 movs r3, #144 ; 0x90 98a0: fa93 f3a3 rbit r3, r3 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 98a4: 0e1b lsrs r3, r3, #24 return (byte)tmp; 98a6: 482e ldr r0, [pc, #184] ; (9960 ) 98a8: 7003 strb r3, [r0, #0] LCDCONTROL_RS_CLEAR; 98aa: 4b2e ldr r3, [pc, #184] ; (9964 ) 98ac: 7019 strb r1, [r3, #0] LCDCONTROL_E_SET; 98ae: 4b2e ldr r3, [pc, #184] ; (9968 ) 98b0: 2101 movs r1, #1 98b2: 7019 strb r1, [r3, #0] calcs.LCDstate++; 98b4: 23c9 movs r3, #201 ; 0xc9 98b6: 7293 strb r3, [r2, #10] Int100usLCDdelay = DELAY100us_SHORT; 98b8: 4b24 ldr r3, [pc, #144] ; (994c ) 98ba: 2202 movs r2, #2 98bc: 801a strh r2, [r3, #0] break; 98be: e7b7 b.n 9830 if (calcs.LCDindex) 98c2: 7adb ldrb r3, [r3, #11] 98c4: 2b11 cmp r3, #17 98c6: d826 bhi.n 9916 LCDDATABYTE = calcs.LCDbotline[calcs.LCDindex];/* Write one character at a time to LCD */ 98c8: 4a21 ldr r2, [pc, #132] ; (9950 ) 98ca: 441a add r2, r3 98cc: 7f92 ldrb r2, [r2, #30] if (LCDDATABYTE&0x80) /* Is bit 7 set (which means flash)? */ 98ce: f012 0f80 tst.w r2, #128 ; 0x80 98d2: d114 bne.n 98fe LCDDATABYTE = calcs.LCDbotline[calcs.LCDindex];/* Write one character at a time to LCD */ 98d4: 4922 ldr r1, [pc, #136] ; (9960 ) 98d6: 700a strb r2, [r1, #0] LCDDATABYTE = ReverseData(LCDDATABYTE); 98d8: 4921 ldr r1, [pc, #132] ; (9960 ) longword tmp = d; 98da: 780a ldrb r2, [r1, #0] 98dc: fa92 f2a2 rbit r2, r2 tmp = tmp>>24; /* Then shift back to get just bits 0-7 reversed */ 98e0: 0e12 lsrs r2, r2, #24 return (byte)tmp; 98e2: 700a strb r2, [r1, #0] LCDCONTROL_RS_SET; 98e4: 4a1f ldr r2, [pc, #124] ; (9964 ) 98e6: 2104 movs r1, #4 98e8: 7011 strb r1, [r2, #0] LCDCONTROL_E_SET; 98ea: 4a1f ldr r2, [pc, #124] ; (9968 ) 98ec: 2101 movs r1, #1 98ee: 7011 strb r1, [r2, #0] calcs.LCDindex++; 98f0: 440b add r3, r1 98f2: 4a17 ldr r2, [pc, #92] ; (9950 ) 98f4: 72d3 strb r3, [r2, #11] Int100usLCDdelay = DELAY100us_SHORT; 98f6: 4b15 ldr r3, [pc, #84] ; (994c ) 98f8: 2202 movs r2, #2 98fa: 801a strh r2, [r3, #0] 98fc: e798 b.n 9830 LCDDATABYTE &= 0x7F; /* Clear bit 7 to get the character */ 98fe: f002 027f and.w r2, r2, #127 ; 0x7f 9902: 4917 ldr r1, [pc, #92] ; (9960 ) 9904: 700a strb r2, [r1, #0] if (flashflag) 9906: 4a14 ldr r2, [pc, #80] ; (9958 ) 9908: 7812 ldrb r2, [r2, #0] 990a: 2a00 cmp r2, #0 990c: d0e4 beq.n 98d8 LCDDATABYTE = 255; /* To flash it, replace with a solid square */ 990e: 460a mov r2, r1 9910: 21ff movs r1, #255 ; 0xff 9912: 7011 strb r1, [r2, #0] 9914: e7e0 b.n 98d8 calcs.LCDstate = 250; /* Finished */ 9916: 4b0e ldr r3, [pc, #56] ; (9950 ) 9918: 22fa movs r2, #250 ; 0xfa 991a: 729a strb r2, [r3, #10] t10ms.LCDflashdelay = t10msQuarterSec; 991c: 4b0d ldr r3, [pc, #52] ; (9954 ) 991e: 2219 movs r2, #25 9920: 70da strb r2, [r3, #3] 9922: e785 b.n 9830 calcs.LCDstate = 0; /*EEK!*/ 9924: 4b0a ldr r3, [pc, #40] ; (9950 ) 9926: 2200 movs r2, #0 9928: 729a strb r2, [r3, #10] break; 992a: e781 b.n 9830 DisableInterrupts;/*(12/11/20)*/ 992c: b672 cpsid i portdatawithE = portdata+(LCDCONTROLBYTE_E<<8);/* When E is set, we want to write low/high/low to pulse data into the LCD */ 992e: 4d0e ldr r5, [pc, #56] ; (9968 ) 9930: 782b ldrb r3, [r5, #0] 9932: eb04 2303 add.w r3, r4, r3, lsl #8 GPIOC->PDOR = portdatawithE; /* Repeat write to waste some time */ 9936: b29b uxth r3, r3 9938: 4e0c ldr r6, [pc, #48] ; (996c ) 993a: 6033 str r3, [r6, #0] DelayOneMicrosecond(); 993c: f007 f909 bl 10b52 GPIOC->PDOR = portdata; /* Set low again */ 9940: 6034 str r4, [r6, #0] LCDCONTROLBYTE_E = 0; /* We only need to do it once */ 9942: 2300 movs r3, #0 9944: 702b strb r3, [r5, #0] EnableInterrupts;/*(12/11/20)*/ 9946: b662 cpsie i 9948: e781 b.n 984e 994a: 4770 bx lr 994c: 200012e2 .word 0x200012e2 9950: 20000934 .word 0x20000934 9954: 20000980 .word 0x20000980 9958: 200012f5 .word 0x200012f5 995c: 20000928 .word 0x20000928 9960: 200012f4 .word 0x200012f4 9964: 200012f3 .word 0x200012f3 9968: 200012f2 .word 0x200012f2 996c: 400ff080 .word 0x400ff080 00009970 : { 9970: b410 push {r4} calcs.LCDstate = 0; /* We have to initialize the LCD at power on */ 9972: 4b0e ldr r3, [pc, #56] ; (99ac ) 9974: 2200 movs r2, #0 9976: 729a strb r2, [r3, #10] flashflag = 0; 9978: 490d ldr r1, [pc, #52] ; (99b0 ) 997a: 700a strb r2, [r1, #0] Int100usLCDdelay = 0; 997c: 490d ldr r1, [pc, #52] ; (99b4 ) 997e: 800a strh r2, [r1, #0] for (x=0; x) 9982: 1e62 subs r2, r4, #1 9984: 330b adds r3, #11 9986: 490d ldr r1, [pc, #52] ; (99bc ) 9988: 3411 adds r4, #17 calcs.LCDtopline[x] = INITIALTOPLINE[x]; 998a: f812 0f01 ldrb.w r0, [r2, #1]! 998e: f803 0f01 strb.w r0, [r3, #1]! calcs.LCDbotline[x] = INITIALBOTLINE[x]; 9992: f811 0f01 ldrb.w r0, [r1, #1]! 9996: 7498 strb r0, [r3, #18] for (x=0; x analogs.DACoutput = 512;/*!!!!*/ 999c: 4b08 ldr r3, [pc, #32] ; (99c0 ) 999e: f44f 7200 mov.w r2, #512 ; 0x200 99a2: 811a strh r2, [r3, #8] } 99a4: f85d 4b04 ldr.w r4, [sp], #4 99a8: 4770 bx lr 99aa: bf00 nop 99ac: 20000934 .word 0x20000934 99b0: 200012f5 .word 0x200012f5 99b4: 200012e2 .word 0x200012e2 99b8: 00012578 .word 0x00012578 99bc: 00012563 .word 0x00012563 99c0: 20000928 .word 0x20000928 000099c4 : if (debug==1) 99c4: 2801 cmp r0, #1 99c6: d00c beq.n 99e2 if (debug==2) 99c8: 2802 cmp r0, #2 99ca: d109 bne.n 99e0 99cc: 480a ldr r0, [pc, #40] ; (99f8 ) 99ce: 1e43 subs r3, r0, #1 99d0: 4a0a ldr r2, [pc, #40] ; (99fc ) 99d2: 3011 adds r0, #17 calcs.LCDbotline[x] = DEBUG2BOTLINE[x]; 99d4: f813 1f01 ldrb.w r1, [r3, #1]! 99d8: f802 1f01 strb.w r1, [r2, #1]! for (x=0; x } 99e0: 4770 bx lr 99e2: 4807 ldr r0, [pc, #28] ; (9a00 ) 99e4: 1e43 subs r3, r0, #1 99e6: 4a05 ldr r2, [pc, #20] ; (99fc ) 99e8: 3011 adds r0, #17 calcs.LCDbotline[x] = DEBUG1BOTLINE[x]; 99ea: f813 1f01 ldrb.w r1, [r3, #1]! 99ee: f802 1f01 strb.w r1, [r2, #1]! for (x=0; x 99f6: 4770 bx lr 99f8: 00012550 .word 0x00012550 99fc: 20000951 .word 0x20000951 9a00: 0001253c .word 0x0001253c 00009a04 : { /* We have received a message - is it valid? */ } } if (t1ms.DEBUGRS232timeout==0) 9a04: 4b10 ldr r3, [pc, #64] ; (9a48 ) 9a06: 791b ldrb r3, [r3, #4] 9a08: b9e3 cbnz r3, 9a44 { /* !!!! DEBUG TRANSMIT !!!! */ DEBUGRS232ptr = 0; DEBUGRS232buf[DEBUGRS232ptr++] = 'D'; 9a0a: 4b10 ldr r3, [pc, #64] ; (9a4c ) 9a0c: 2244 movs r2, #68 ; 0x44 9a0e: 701a strb r2, [r3, #0] DEBUGRS232buf[DEBUGRS232ptr++] = 'E'; 9a10: 2245 movs r2, #69 ; 0x45 9a12: 705a strb r2, [r3, #1] DEBUGRS232buf[DEBUGRS232ptr++] = 'B'; 9a14: 2242 movs r2, #66 ; 0x42 9a16: 709a strb r2, [r3, #2] DEBUGRS232buf[DEBUGRS232ptr++] = 'U'; 9a18: 2255 movs r2, #85 ; 0x55 9a1a: 70da strb r2, [r3, #3] DEBUGRS232buf[DEBUGRS232ptr++] = 'G'; 9a1c: 2247 movs r2, #71 ; 0x47 9a1e: 711a strb r2, [r3, #4] DEBUGRS232buf[DEBUGRS232ptr++] = 13; 9a20: 220d movs r2, #13 9a22: 715a strb r2, [r3, #5] DEBUGRS232buf[DEBUGRS232ptr++] = 10; 9a24: 220a movs r2, #10 9a26: 719a strb r2, [r3, #6] DEBUGRS232len = DEBUGRS232ptr; /* Set up length to transmit */ 9a28: 4b09 ldr r3, [pc, #36] ; (9a50 ) 9a2a: 2207 movs r2, #7 9a2c: 701a strb r2, [r3, #0] DEBUGRS232ptr = 0; /* And prepare to transmit */ 9a2e: 4b09 ldr r3, [pc, #36] ; (9a54 ) 9a30: 2200 movs r2, #0 9a32: 701a strb r2, [r3, #0] UART0->C2 |= UART_C2_TIE_MASK; /* Re-activate transmit interrupts */ 9a34: 4a08 ldr r2, [pc, #32] ; (9a58 ) 9a36: 78d3 ldrb r3, [r2, #3] 9a38: f043 0380 orr.w r3, r3, #128 ; 0x80 9a3c: 70d3 strb r3, [r2, #3] t1ms.DEBUGRS232timeout = 255; 9a3e: 4b02 ldr r3, [pc, #8] ; (9a48 ) 9a40: 22ff movs r2, #255 ; 0xff 9a42: 711a strb r2, [r3, #4] } } 9a44: 4770 bx lr 9a46: bf00 nop 9a48: 20000990 .word 0x20000990 9a4c: 200008a8 .word 0x200008a8 9a50: 200012eb .word 0x200012eb 9a54: 200012ec .word 0x200012ec 9a58: 4006a000 .word 0x4006a000 00009a5c : /* Set RS232 to 9600baud, initialize buffers and set up interrupts */ /* The baud is generated from BUSCLOCK */ /*------------------------------------------------------------------*/ void Initialize_UART0(void) { DEBUGRS232ptr = 0; /* Initialize RS232 buffer */ 9a5c: 2200 movs r2, #0 9a5e: 4b0e ldr r3, [pc, #56] ; (9a98 ) 9a60: 701a strb r2, [r3, #0] DEBUGRS232len = 0; 9a62: 4b0e ldr r3, [pc, #56] ; (9a9c ) 9a64: 701a strb r2, [r3, #0] 9a66: 490e ldr r1, [pc, #56] ; (9aa0 ) 9a68: 680b ldr r3, [r1, #0] 9a6a: f443 6380 orr.w r3, r3, #1024 ; 0x400 9a6e: 600b str r3, [r1, #0] CLOCK_EnableClock(kCLOCK_Uart0); /* Enable clock for UART0 */ UART0->BDH = (byte)(UARTbaud230400>>8); /* Set UART0 baud rate */ 9a70: 4b0c ldr r3, [pc, #48] ; (9aa4 ) 9a72: 701a strb r2, [r3, #0] UART0->BDL = (byte)(UARTbaud230400); 9a74: 210d movs r1, #13 9a76: 7059 strb r1, [r3, #1] UART0->S2 = 0; 9a78: 715a strb r2, [r3, #5] UART0->C1 = 0; /* No interrupts */ 9a7a: 709a strb r2, [r3, #2] UART0->C3 = 0; 9a7c: 719a strb r2, [r3, #6] UART0->C2 = 0x2C; /* Enable transmit and receive and activate receive interrupts */ 9a7e: 222c movs r2, #44 ; 0x2c 9a80: 70da strb r2, [r3, #3] UART0->C3 = 0x08; /* Enable overrun interrupt, too */ 9a82: 2208 movs r2, #8 9a84: 719a strb r2, [r3, #6] NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); 9a86: 4b08 ldr r3, [pc, #32] ; (9aa8 ) 9a88: 2220 movs r2, #32 9a8a: f883 231f strb.w r2, [r3, #799] ; 0x31f NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); 9a8e: f04f 4200 mov.w r2, #2147483648 ; 0x80000000 9a92: 601a str r2, [r3, #0] NVIC_SetPriority(UART0_RX_TX_IRQn, 2); /* Enable interrupts */ EnableIRQ(UART0_RX_TX_IRQn); } 9a94: 4770 bx lr 9a96: bf00 nop 9a98: 200012ec .word 0x200012ec 9a9c: 200012eb .word 0x200012eb 9aa0: 40048034 .word 0x40048034 9aa4: 4006a000 .word 0x4006a000 9aa8: e000e100 .word 0xe000e100 00009aac : void UART0_RX_TX_DriverIRQHandler(void) { byte c; if (UART0->C2&UART_C2_TIE_MASK) 9aac: 4b34 ldr r3, [pc, #208] ; (9b80 ) 9aae: 78db ldrb r3, [r3, #3] 9ab0: f013 0f80 tst.w r3, #128 ; 0x80 9ab4: d10e bne.n 9ad4 { (void)UART0->D; /* If so, discard and ignore */ } } else if (UART0->C2&UART_C2_TCIE_MASK) 9ab6: 4b32 ldr r3, [pc, #200] ; (9b80 ) 9ab8: 78db ldrb r3, [r3, #3] 9aba: f013 0f40 tst.w r3, #64 ; 0x40 9abe: d035 beq.n 9b2c { UART0->C2 &= ~UART_C2_TCIE_MASK; /* Last character transmitted - back to receive now! */ 9ac0: 4b2f ldr r3, [pc, #188] ; (9b80 ) 9ac2: 78da ldrb r2, [r3, #3] 9ac4: f002 02bf and.w r2, r2, #191 ; 0xbf 9ac8: 70da strb r2, [r3, #3] UART0->C2 |= UART_C2_RIE_MASK; 9aca: 78da ldrb r2, [r3, #3] 9acc: f042 0220 orr.w r2, r2, #32 9ad0: 70da strb r2, [r3, #3] 9ad2: 4770 bx lr if (DEBUGRS232len) /* We are transmitting - any more characters? */ 9ad4: 4b2b ldr r3, [pc, #172] ; (9b84 ) 9ad6: 781b ldrb r3, [r3, #0] 9ad8: b18b cbz r3, 9afe if (UART0->S1&UART_S1_TDRE_MASK) 9ada: 4a29 ldr r2, [pc, #164] ; (9b80 ) 9adc: 7912 ldrb r2, [r2, #4] 9ade: f012 0f80 tst.w r2, #128 ; 0x80 9ae2: d01b beq.n 9b1c DEBUGRS232len--; /* Transmit (and count) next character */ 9ae4: 3b01 subs r3, #1 9ae6: b2db uxtb r3, r3 9ae8: 4a26 ldr r2, [pc, #152] ; (9b84 ) 9aea: 7013 strb r3, [r2, #0] UART0->D = DEBUGRS232buf[DEBUGRS232ptr++]; 9aec: 4926 ldr r1, [pc, #152] ; (9b88 ) 9aee: 780a ldrb r2, [r1, #0] 9af0: 1c50 adds r0, r2, #1 9af2: 7008 strb r0, [r1, #0] 9af4: 4925 ldr r1, [pc, #148] ; (9b8c ) 9af6: 5c89 ldrb r1, [r1, r2] 9af8: 4a21 ldr r2, [pc, #132] ; (9b80 ) 9afa: 71d1 strb r1, [r2, #7] if (DEBUGRS232len==0) 9afc: b973 cbnz r3, 9b1c UART0->C2 &= ~UART_C2_TIE_MASK; /* No more data to transmit - turn off transmit interrupt and turn on transmit end interrupt */ 9afe: 4b20 ldr r3, [pc, #128] ; (9b80 ) 9b00: 78da ldrb r2, [r3, #3] 9b02: f002 027f and.w r2, r2, #127 ; 0x7f 9b06: 70da strb r2, [r3, #3] UART0->C2 |= UART_C2_TCIE_MASK; 9b08: 78da ldrb r2, [r3, #3] 9b0a: f042 0240 orr.w r2, r2, #64 ; 0x40 9b0e: 70da strb r2, [r3, #3] DEBUGRS232ptr = 0; /* and prepare to receive! */ 9b10: 4b1d ldr r3, [pc, #116] ; (9b88 ) 9b12: 2200 movs r2, #0 9b14: 701a strb r2, [r3, #0] t1ms.DEBUGRS232timeout = 255; 9b16: 4b1e ldr r3, [pc, #120] ; (9b90 ) 9b18: 22ff movs r2, #255 ; 0xff 9b1a: 711a strb r2, [r3, #4] if (UART0->S1&(UART_S1_RDRF_MASK+UART_S1_OR_MASK+UART_S1_NF_MASK+UART_S1_FE_MASK+UART_S1_PF_MASK))/* Are we receiving during transmit? */ 9b1c: 4b18 ldr r3, [pc, #96] ; (9b80 ) 9b1e: 791b ldrb r3, [r3, #4] 9b20: f013 0f2f tst.w r3, #47 ; 0x2f 9b24: d02a beq.n 9b7c (void)UART0->D; /* If so, discard and ignore */ 9b26: 4b16 ldr r3, [pc, #88] ; (9b80 ) 9b28: 79db ldrb r3, [r3, #7] 9b2a: 4770 bx lr } else { if (UART0->S1&(UART_S1_OR_MASK||UART_S1_NF_MASK||UART_S1_FE_MASK||UART_S1_PF_MASK))/* We must be receiving! Any error? */ 9b2c: 4b14 ldr r3, [pc, #80] ; (9b80 ) 9b2e: 791b ldrb r3, [r3, #4] 9b30: f013 0f01 tst.w r3, #1 9b34: d008 beq.n 9b48 { (void)UART0->D; /* Error in receive - discard & restart! */ 9b36: 4b12 ldr r3, [pc, #72] ; (9b80 ) 9b38: 79db ldrb r3, [r3, #7] DEBUGRS232ptr = 0; 9b3a: 4b13 ldr r3, [pc, #76] ; (9b88 ) 9b3c: 2200 movs r2, #0 9b3e: 701a strb r2, [r3, #0] t1ms.DEBUGRS232timeout = 255; 9b40: 4b13 ldr r3, [pc, #76] ; (9b90 ) 9b42: 22ff movs r2, #255 ; 0xff 9b44: 711a strb r2, [r3, #4] 9b46: 4770 bx lr } else if (UART0->S1&UART_S1_RDRF_MASK) 9b48: 4b0d ldr r3, [pc, #52] ; (9b80 ) 9b4a: 791b ldrb r3, [r3, #4] 9b4c: f013 0f20 tst.w r3, #32 9b50: d014 beq.n 9b7c { if (DEBUGRS232ptr<64) /* Receive - store the character & restart timeout */ 9b52: 4b0d ldr r3, [pc, #52] ; (9b88 ) 9b54: 781b ldrb r3, [r3, #0] 9b56: 2b3f cmp r3, #63 ; 0x3f 9b58: d80b bhi.n 9b72 { c = UART0->D; 9b5a: 4a09 ldr r2, [pc, #36] ; (9b80 ) 9b5c: 79d2 ldrb r2, [r2, #7] 9b5e: b2d2 uxtb r2, r2 if ((c==0)&&(DEBUGRS232ptr==0)) 9b60: ea53 0102 orrs.w r1, r3, r2 9b64: d007 beq.n 9b76 { /* Ignore null bytes at start of message! */ } else { DEBUGRS232buf[DEBUGRS232ptr++] = c; 9b66: 1c58 adds r0, r3, #1 9b68: 4907 ldr r1, [pc, #28] ; (9b88 ) 9b6a: 7008 strb r0, [r1, #0] 9b6c: 4907 ldr r1, [pc, #28] ; (9b8c ) 9b6e: 54ca strb r2, [r1, r3] 9b70: e001 b.n 9b76 } } else { (void)UART0->D; 9b72: 4b03 ldr r3, [pc, #12] ; (9b80 ) 9b74: 79db ldrb r3, [r3, #7] } t1ms.DEBUGRS232timeout = RS232replyWindow+RS232replyTimeout; 9b76: 4b06 ldr r3, [pc, #24] ; (9b90 ) 9b78: 222b movs r2, #43 ; 0x2b 9b7a: 711a strb r2, [r3, #4] } else { /* We are not transmitting or receiving! */ } } } 9b7c: 4770 bx lr 9b7e: bf00 nop 9b80: 4006a000 .word 0x4006a000 9b84: 200012eb .word 0x200012eb 9b88: 200012ec .word 0x200012ec 9b8c: 200008a8 .word 0x200008a8 9b90: 20000990 .word 0x20000990 00009b94 : /* Set RS232 to 9600baud, initialize buffers and set up interrupts */ /* The baud is generated from BUSCLOCK */ /*------------------------------------------------------------------*/ void Initialize_UART1(void) { MAINRS232ptr = 0; /* Initialize RS232 buffer */ 9b94: 2200 movs r2, #0 9b96: 4b0f ldr r3, [pc, #60] ; (9bd4 ) 9b98: 701a strb r2, [r3, #0] MAINRS232len = 0; 9b9a: 4b0f ldr r3, [pc, #60] ; (9bd8 ) 9b9c: 701a strb r2, [r3, #0] calcs.RS232debug = 0;/*!!!!*/ 9b9e: 4b0f ldr r3, [pc, #60] ; (9bdc ) 9ba0: f883 2033 strb.w r2, [r3, #51] ; 0x33 9ba4: 490e ldr r1, [pc, #56] ; (9be0 ) 9ba6: 680b ldr r3, [r1, #0] 9ba8: f443 6300 orr.w r3, r3, #2048 ; 0x800 9bac: 600b str r3, [r1, #0] CLOCK_EnableClock(kCLOCK_Uart1); /* Enable clock for UART1 */ UART1->BDH = (byte)(UARTbaud9600>>8); /* Set UART1 baud rate */ 9bae: 4b0d ldr r3, [pc, #52] ; (9be4 ) 9bb0: 2101 movs r1, #1 9bb2: 7019 strb r1, [r3, #0] UART1->BDL = (byte)(UARTbaud9600); 9bb4: 2138 movs r1, #56 ; 0x38 9bb6: 7059 strb r1, [r3, #1] UART1->S2 = 0; 9bb8: 715a strb r2, [r3, #5] UART1->C1 = 0; /* No interrupts */ 9bba: 709a strb r2, [r3, #2] UART1->C3 = 0; 9bbc: 719a strb r2, [r3, #6] UART1->C2 = 0x2C; /* Enable transmit and receive and activate receive interrupts */ 9bbe: 222c movs r2, #44 ; 0x2c 9bc0: 70da strb r2, [r3, #3] UART1->C3 = 0x08; /* Enable overrun interrupt, too */ 9bc2: 2208 movs r2, #8 9bc4: 719a strb r2, [r3, #6] NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); 9bc6: 4b08 ldr r3, [pc, #32] ; (9be8 ) 9bc8: 2220 movs r2, #32 9bca: f883 2321 strb.w r2, [r3, #801] ; 0x321 NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); 9bce: 2202 movs r2, #2 9bd0: 605a str r2, [r3, #4] NVIC_SetPriority(UART1_RX_TX_IRQn, 2); /* Enable interrupts */ EnableIRQ(UART1_RX_TX_IRQn); } 9bd2: 4770 bx lr 9bd4: 200012ef .word 0x200012ef 9bd8: 200012ee .word 0x200012ee 9bdc: 20000934 .word 0x20000934 9be0: 40048034 .word 0x40048034 9be4: 4006b000 .word 0x4006b000 9be8: e000e100 .word 0xe000e100 00009bec : void UART1_RX_TX_DriverIRQHandler(void) { byte c; if (UART1->C2&UART_C2_TIE_MASK) 9bec: 4b34 ldr r3, [pc, #208] ; (9cc0 ) 9bee: 78db ldrb r3, [r3, #3] 9bf0: f013 0f80 tst.w r3, #128 ; 0x80 9bf4: d10e bne.n 9c14 { (void)UART1->D; /* If so, discard and ignore */ } } else if (UART1->C2&UART_C2_TCIE_MASK) 9bf6: 4b32 ldr r3, [pc, #200] ; (9cc0 ) 9bf8: 78db ldrb r3, [r3, #3] 9bfa: f013 0f40 tst.w r3, #64 ; 0x40 9bfe: d035 beq.n 9c6c { UART1->C2 &= ~UART_C2_TCIE_MASK; /* Last character transmitted - back to receive now! */ 9c00: 4b2f ldr r3, [pc, #188] ; (9cc0 ) 9c02: 78da ldrb r2, [r3, #3] 9c04: f002 02bf and.w r2, r2, #191 ; 0xbf 9c08: 70da strb r2, [r3, #3] UART1->C2 |= UART_C2_RIE_MASK; 9c0a: 78da ldrb r2, [r3, #3] 9c0c: f042 0220 orr.w r2, r2, #32 9c10: 70da strb r2, [r3, #3] 9c12: 4770 bx lr if (MAINRS232len) /* We are transmitting - any more characters? */ 9c14: 4b2b ldr r3, [pc, #172] ; (9cc4 ) 9c16: 781b ldrb r3, [r3, #0] 9c18: b18b cbz r3, 9c3e if (UART1->S1&UART_S1_TDRE_MASK) 9c1a: 4a29 ldr r2, [pc, #164] ; (9cc0 ) 9c1c: 7912 ldrb r2, [r2, #4] 9c1e: f012 0f80 tst.w r2, #128 ; 0x80 9c22: d01b beq.n 9c5c MAINRS232len--; /* Transmit (and count) next character */ 9c24: 3b01 subs r3, #1 9c26: b2db uxtb r3, r3 9c28: 4a26 ldr r2, [pc, #152] ; (9cc4 ) 9c2a: 7013 strb r3, [r2, #0] UART1->D = MAINRS232buf[MAINRS232ptr++]; 9c2c: 4926 ldr r1, [pc, #152] ; (9cc8 ) 9c2e: 780a ldrb r2, [r1, #0] 9c30: 1c50 adds r0, r2, #1 9c32: 7008 strb r0, [r1, #0] 9c34: 4925 ldr r1, [pc, #148] ; (9ccc ) 9c36: 5c89 ldrb r1, [r1, r2] 9c38: 4a21 ldr r2, [pc, #132] ; (9cc0 ) 9c3a: 71d1 strb r1, [r2, #7] if (MAINRS232len==0) 9c3c: b973 cbnz r3, 9c5c UART1->C2 &= ~UART_C2_TIE_MASK; /* No more data to transmit - turn off transmit interrupt and turn on transmit end interrupt */ 9c3e: 4b20 ldr r3, [pc, #128] ; (9cc0 ) 9c40: 78da ldrb r2, [r3, #3] 9c42: f002 027f and.w r2, r2, #127 ; 0x7f 9c46: 70da strb r2, [r3, #3] UART1->C2 |= UART_C2_TCIE_MASK; 9c48: 78da ldrb r2, [r3, #3] 9c4a: f042 0240 orr.w r2, r2, #64 ; 0x40 9c4e: 70da strb r2, [r3, #3] MAINRS232ptr = 0; /* and prepare to receive! */ 9c50: 4b1d ldr r3, [pc, #116] ; (9cc8 ) 9c52: 2200 movs r2, #0 9c54: 701a strb r2, [r3, #0] t1ms.MAINRS232timeout = 255; 9c56: 4b1e ldr r3, [pc, #120] ; (9cd0 ) 9c58: 22ff movs r2, #255 ; 0xff 9c5a: 70da strb r2, [r3, #3] if (UART1->S1&(UART_S1_RDRF_MASK+UART_S1_OR_MASK+UART_S1_NF_MASK+UART_S1_FE_MASK+UART_S1_PF_MASK))/* Are we receiving during transmit? */ 9c5c: 4b18 ldr r3, [pc, #96] ; (9cc0 ) 9c5e: 791b ldrb r3, [r3, #4] 9c60: f013 0f2f tst.w r3, #47 ; 0x2f 9c64: d02a beq.n 9cbc (void)UART1->D; /* If so, discard and ignore */ 9c66: 4b16 ldr r3, [pc, #88] ; (9cc0 ) 9c68: 79db ldrb r3, [r3, #7] 9c6a: 4770 bx lr } else { if (UART1->S1&(UART_S1_OR_MASK||UART_S1_NF_MASK||UART_S1_FE_MASK||UART_S1_PF_MASK))/* We must be receiving! Any error? */ 9c6c: 4b14 ldr r3, [pc, #80] ; (9cc0 ) 9c6e: 791b ldrb r3, [r3, #4] 9c70: f013 0f01 tst.w r3, #1 9c74: d008 beq.n 9c88 { (void)UART1->D; /* Error in receive - discard & restart! */ 9c76: 4b12 ldr r3, [pc, #72] ; (9cc0 ) 9c78: 79db ldrb r3, [r3, #7] MAINRS232ptr = 0; 9c7a: 4b13 ldr r3, [pc, #76] ; (9cc8 ) 9c7c: 2200 movs r2, #0 9c7e: 701a strb r2, [r3, #0] t1ms.MAINRS232timeout = 255; 9c80: 4b13 ldr r3, [pc, #76] ; (9cd0 ) 9c82: 22ff movs r2, #255 ; 0xff 9c84: 70da strb r2, [r3, #3] 9c86: 4770 bx lr } else if (UART1->S1&UART_S1_RDRF_MASK) 9c88: 4b0d ldr r3, [pc, #52] ; (9cc0 ) 9c8a: 791b ldrb r3, [r3, #4] 9c8c: f013 0f20 tst.w r3, #32 9c90: d014 beq.n 9cbc { if (MAINRS232ptr<64) /* Receive - store the character & restart timeout */ 9c92: 4b0d ldr r3, [pc, #52] ; (9cc8 ) 9c94: 781b ldrb r3, [r3, #0] 9c96: 2b3f cmp r3, #63 ; 0x3f 9c98: d80b bhi.n 9cb2 { c = UART1->D; 9c9a: 4a09 ldr r2, [pc, #36] ; (9cc0 ) 9c9c: 79d2 ldrb r2, [r2, #7] 9c9e: b2d2 uxtb r2, r2 if ((c==0)&&(MAINRS232ptr==0)) 9ca0: ea53 0102 orrs.w r1, r3, r2 9ca4: d007 beq.n 9cb6 { /* Ignore null bytes at start of message! */ } else { MAINRS232buf[MAINRS232ptr++] = c; 9ca6: 1c58 adds r0, r3, #1 9ca8: 4907 ldr r1, [pc, #28] ; (9cc8 ) 9caa: 7008 strb r0, [r1, #0] 9cac: 4907 ldr r1, [pc, #28] ; (9ccc ) 9cae: 54ca strb r2, [r1, r3] 9cb0: e001 b.n 9cb6 } } else { (void)UART1->D; 9cb2: 4b03 ldr r3, [pc, #12] ; (9cc0 ) 9cb4: 79db ldrb r3, [r3, #7] } t1ms.MAINRS232timeout = RS232replyWindow+RS232replyTimeout; 9cb6: 4b06 ldr r3, [pc, #24] ; (9cd0 ) 9cb8: 222b movs r2, #43 ; 0x2b 9cba: 70da strb r2, [r3, #3] } else { /* We are not transmitting or receiving! */ } } } 9cbc: 4770 bx lr 9cbe: bf00 nop 9cc0: 4006b000 .word 0x4006b000 9cc4: 200012ee .word 0x200012ee 9cc8: 200012ef .word 0x200012ef 9ccc: 200008e8 .word 0x200008e8 9cd0: 20000990 .word 0x20000990 00009cd4 : /*------------------------------------------------------------------*/ /* ADC mainloop (updates measurements, regularly) */ /*------------------------------------------------------------------*/ void ADC_MainLoop(void) { 9cd4: b530 push {r4, r5, lr} 9cd6: b083 sub sp, #12 adc16_channel_config_t adc16ChannelConfigStruct; longword tmp; signedword signedtmp; switch (calcs.ADCstate) 9cd8: 4b60 ldr r3, [pc, #384] ; (9e5c ) 9cda: 785b ldrb r3, [r3, #1] 9cdc: 2b05 cmp r3, #5 9cde: f200 80b9 bhi.w 9e54 9ce2: e8df f003 tbb [pc, r3] 9ce6: 0d03 .short 0x0d03 9ce8: ae8a6438 .word 0xae8a6438 { case 0: if (t10ms.ADCdelay==0) 9cec: 4b5c ldr r3, [pc, #368] ; (9e60 ) 9cee: 791b ldrb r3, [r3, #4] 9cf0: bb43 cbnz r3, 9d44 { calcs.ADCstate++; /* Run ADC updates every 60ms */ 9cf2: 4b5a ldr r3, [pc, #360] ; (9e5c ) 9cf4: 2201 movs r2, #1 9cf6: 705a strb r2, [r3, #1] t10ms.ADCdelay = 6; 9cf8: 4b59 ldr r3, [pc, #356] ; (9e60 ) 9cfa: 2206 movs r2, #6 9cfc: 711a strb r2, [r3, #4] 9cfe: e021 b.n 9d44 } break; case 1: adc16ChannelConfigStruct.channelNumber = 0;/* Measure channel 0 (DP0) */ 9d00: 2100 movs r1, #0 9d02: 9100 str r1, [sp, #0] adc16ChannelConfigStruct.enableDifferentialConversion = false; 9d04: f88d 1005 strb.w r1, [sp, #5] adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false; 9d08: f88d 1004 strb.w r1, [sp, #4] ADC16_SetChannelConfig(ADC0, 0, &adc16ChannelConfigStruct); 9d0c: 466a mov r2, sp 9d0e: 4855 ldr r0, [pc, #340] ; (9e64 ) 9d10: f003 f81e bl cd50 while ((ADC16_GetChannelStatusFlags(ADC0, 0)&kADC16_ChannelConversionDoneFlag)==0) 9d14: 4d53 ldr r5, [pc, #332] ; (9e64 ) 9d16: 2400 movs r4, #0 9d18: 4621 mov r1, r4 9d1a: 4628 mov r0, r5 9d1c: f003 f834 bl cd88 9d20: f010 0f80 tst.w r0, #128 ; 0x80 9d24: d0f8 beq.n 9d18 */ static inline uint32_t ADC16_GetChannelConversionValue(ADC_Type *base, uint32_t channelGroup) { assert(channelGroup < ADC_R_COUNT); return base->R[channelGroup]; 9d26: 4b4f ldr r3, [pc, #316] ; (9e64 ) 9d28: 691b ldr r3, [r3, #16] { /* Wait for ADC conversion to complete */ } tmp = ADC16_GetChannelConversionValue(ADC0, 0);/* Get result (0-4095 = 0-76V with 33K/1K5) */ LatestDP0value = tmp; 9d2a: 4a4f ldr r2, [pc, #316] ; (9e68 ) 9d2c: 8013 strh r3, [r2, #0] tmp = tmp*16; /* Convert to tenths of volts (can't overflow), and store */ 9d2e: 011b lsls r3, r3, #4 tmp = tmp/86; 9d30: 4a4e ldr r2, [pc, #312] ; (9e6c ) 9d32: fba2 2303 umull r2, r3, r2, r3 9d36: 091b lsrs r3, r3, #4 analogs.SupplyRS232 = tmp; 9d38: 4a4d ldr r2, [pc, #308] ; (9e70 ) 9d3a: 8013 strh r3, [r2, #0] calcs.ADCstate++; 9d3c: 4a47 ldr r2, [pc, #284] ; (9e5c ) 9d3e: 7853 ldrb r3, [r2, #1] 9d40: 3301 adds r3, #1 9d42: 7053 strb r3, [r2, #1] default: calcs.ADCstate = 0; /*EEK!*/ break; } DAC0->DAT[0].DATL = (byte)analogs.DACoutput;/* !!!! Write value to DAC !!!! */ 9d44: 4b4a ldr r3, [pc, #296] ; (9e70 ) 9d46: 7a19 ldrb r1, [r3, #8] 9d48: 4a4a ldr r2, [pc, #296] ; (9e74 ) 9d4a: 7011 strb r1, [r2, #0] DAC0->DAT[0].DATH = (byte)(analogs.DACoutput>>8); 9d4c: 891b ldrh r3, [r3, #8] 9d4e: 0a1b lsrs r3, r3, #8 9d50: 7053 strb r3, [r2, #1] } 9d52: b003 add sp, #12 9d54: bd30 pop {r4, r5, pc} adc16ChannelConfigStruct.channelNumber = 0;/* Measure channel 0 in differential mode (DP0-DM0) - it's the only way to measure the USB voltage! */ 9d56: 2100 movs r1, #0 9d58: 9100 str r1, [sp, #0] adc16ChannelConfigStruct.enableDifferentialConversion = true; 9d5a: 2301 movs r3, #1 9d5c: f88d 3005 strb.w r3, [sp, #5] adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false; 9d60: f88d 1004 strb.w r1, [sp, #4] ADC16_SetChannelConfig(ADC0, 0, &adc16ChannelConfigStruct); 9d64: 466a mov r2, sp 9d66: 483f ldr r0, [pc, #252] ; (9e64 ) 9d68: f002 fff2 bl cd50 while ((ADC16_GetChannelStatusFlags(ADC0, 0)&kADC16_ChannelConversionDoneFlag)==0) 9d6c: 4d3d ldr r5, [pc, #244] ; (9e64 ) 9d6e: 2400 movs r4, #0 9d70: 4621 mov r1, r4 9d72: 4628 mov r0, r5 9d74: f003 f808 bl cd88 9d78: f010 0f80 tst.w r0, #128 ; 0x80 9d7c: d0f8 beq.n 9d70 9d7e: 4b39 ldr r3, [pc, #228] ; (9e64 ) 9d80: 691a ldr r2, [r3, #16] if (signedtmp>LatestDP0value) 9d82: 4b39 ldr r3, [pc, #228] ; (9e68 ) 9d84: 881b ldrh r3, [r3, #0] 9d86: b211 sxth r1, r2 9d88: 4299 cmp r1, r3 signedtmp = LatestDP0value-tmp; /* Calculate USB rail by reversing delta */ 9d8a: bfda itte le 9d8c: 1a9b suble r3, r3, r2 9d8e: b21b sxthle r3, r3 signedtmp = 0; /* This shouldn't happen! */ 9d90: 2300 movgt r3, #0 signedtmp = signedtmp/62; /* Convert to tenths of volts, and store */ 9d92: 4a39 ldr r2, [pc, #228] ; (9e78 ) 9d94: fb82 1203 smull r1, r2, r2, r3 9d98: 441a add r2, r3 9d9a: 17db asrs r3, r3, #31 9d9c: ebc3 1362 rsb r3, r3, r2, asr #5 analogs.SupplyUSB = signedtmp; 9da0: 4a33 ldr r2, [pc, #204] ; (9e70 ) 9da2: 8053 strh r3, [r2, #2] calcs.ADCstate++; 9da4: 4a2d ldr r2, [pc, #180] ; (9e5c ) 9da6: 7853 ldrb r3, [r2, #1] 9da8: 3301 adds r3, #1 9daa: 7053 strb r3, [r2, #1] break; 9dac: e7ca b.n 9d44 adc16ChannelConfigStruct.channelNumber = 26;/* Measure channel 26 (temperature sensor) */ 9dae: 231a movs r3, #26 9db0: 9300 str r3, [sp, #0] adc16ChannelConfigStruct.enableDifferentialConversion = false; 9db2: 2100 movs r1, #0 9db4: f88d 1005 strb.w r1, [sp, #5] adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false; 9db8: f88d 1004 strb.w r1, [sp, #4] ADC16_SetChannelConfig(ADC0, 0, &adc16ChannelConfigStruct); 9dbc: 466a mov r2, sp 9dbe: 4829 ldr r0, [pc, #164] ; (9e64 ) 9dc0: f002 ffc6 bl cd50 while ((ADC16_GetChannelStatusFlags(ADC0, 0)&kADC16_ChannelConversionDoneFlag)==0) 9dc4: 4d27 ldr r5, [pc, #156] ; (9e64 ) 9dc6: 2400 movs r4, #0 9dc8: 4621 mov r1, r4 9dca: 4628 mov r0, r5 9dcc: f002 ffdc bl cd88 9dd0: f010 0f80 tst.w r0, #128 ; 0x80 9dd4: d0f8 beq.n 9dc8 9dd6: 4b23 ldr r3, [pc, #140] ; (9e64 ) 9dd8: 691b ldr r3, [r3, #16] analogs.RAWANAinternaltemperature = tmp; 9dda: 4a25 ldr r2, [pc, #148] ; (9e70 ) 9ddc: 80d3 strh r3, [r2, #6] if (tmp>TEMPERATUREbase) 9dde: f240 32ba movw r2, #954 ; 0x3ba 9de2: 4293 cmp r3, r2 calcs.InternalTemperature = TEMPERATUREbase-tmp; 9de4: bf9a itte ls 9de6: f1c3 03ba rsbls r3, r3, #186 ; 0xba 9dea: b2db uxtbls r3, r3 calcs.InternalTemperature = 0; 9dec: 2300 movhi r3, #0 9dee: 4a1b ldr r2, [pc, #108] ; (9e5c ) 9df0: 7113 strb r3, [r2, #4] calcs.ADCstate++; 9df2: 7853 ldrb r3, [r2, #1] 9df4: 3301 adds r3, #1 9df6: 7053 strb r3, [r2, #1] break; 9df8: e7a4 b.n 9d44 adc16ChannelConfigStruct.channelNumber = 27;/* Measure channel 26 (bandgap) */ 9dfa: 231b movs r3, #27 9dfc: 9300 str r3, [sp, #0] adc16ChannelConfigStruct.enableDifferentialConversion = false; 9dfe: 2100 movs r1, #0 9e00: f88d 1005 strb.w r1, [sp, #5] adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false; 9e04: f88d 1004 strb.w r1, [sp, #4] ADC16_SetChannelConfig(ADC0, 0, &adc16ChannelConfigStruct); 9e08: 466a mov r2, sp 9e0a: 4816 ldr r0, [pc, #88] ; (9e64 ) 9e0c: f002 ffa0 bl cd50 while ((ADC16_GetChannelStatusFlags(ADC0, 0)&kADC16_ChannelConversionDoneFlag)==0) 9e10: 4d14 ldr r5, [pc, #80] ; (9e64 ) 9e12: 2400 movs r4, #0 9e14: 4621 mov r1, r4 9e16: 4628 mov r0, r5 9e18: f002 ffb6 bl cd88 9e1c: f010 0f80 tst.w r0, #128 ; 0x80 9e20: d0f8 beq.n 9e14 9e22: 4b10 ldr r3, [pc, #64] ; (9e64 ) 9e24: 691a ldr r2, [r3, #16] tmp = tmp*100; 9e26: 2364 movs r3, #100 ; 0x64 9e28: fb03 f302 mul.w r3, r3, r2 tmp = tmp/BANDGAPbase; 9e2c: 4a13 ldr r2, [pc, #76] ; (9e7c ) 9e2e: fba2 2303 umull r2, r3, r2, r3 9e32: 0a1b lsrs r3, r3, #8 analogs.SupplyBANDGAP = tmp; 9e34: 4a0e ldr r2, [pc, #56] ; (9e70 ) 9e36: 8093 strh r3, [r2, #4] calcs.ADCstate++; 9e38: 4a08 ldr r2, [pc, #32] ; (9e5c ) 9e3a: 7853 ldrb r3, [r2, #1] 9e3c: 3301 adds r3, #1 9e3e: 7053 strb r3, [r2, #1] break; 9e40: e780 b.n 9d44 ADCSUPDATED = 1; /* Indicate new analogs available */ 9e42: 4a0f ldr r2, [pc, #60] ; (9e80 ) 9e44: 7813 ldrb r3, [r2, #0] 9e46: f043 0304 orr.w r3, r3, #4 9e4a: 7013 strb r3, [r2, #0] calcs.ADCstate = 0; 9e4c: 4b03 ldr r3, [pc, #12] ; (9e5c ) 9e4e: 2200 movs r2, #0 9e50: 705a strb r2, [r3, #1] break; 9e52: e777 b.n 9d44 calcs.ADCstate = 0; /*EEK!*/ 9e54: 4b01 ldr r3, [pc, #4] ; (9e5c ) 9e56: 2200 movs r2, #0 9e58: 705a strb r2, [r3, #1] break; 9e5a: e773 b.n 9d44 9e5c: 20000934 .word 0x20000934 9e60: 20000980 .word 0x20000980 9e64: 4003b000 .word 0x4003b000 9e68: 200012e6 .word 0x200012e6 9e6c: 2fa0be83 .word 0x2fa0be83 9e70: 20000928 .word 0x20000928 9e74: 400cc000 .word 0x400cc000 9e78: 84210843 .word 0x84210843 9e7c: 34cf1c43 .word 0x34cf1c43 9e80: 2000096c .word 0x2000096c 00009e84 : { 9e84: b510 push {r4, lr} 9e86: b084 sub sp, #16 PMC->REGSC = PMC_REGSC_BGBE_MASK; /* Turn on the bandgap reference */ 9e88: 4b17 ldr r3, [pc, #92] ; (9ee8 ) 9e8a: 2201 movs r2, #1 9e8c: 709a strb r2, [r3, #2] 9e8e: 4a17 ldr r2, [pc, #92] ; (9eec ) 9e90: 6813 ldr r3, [r2, #0] 9e92: f443 5380 orr.w r3, r3, #4096 ; 0x1000 9e96: 6013 str r3, [r2, #0] DAC0->C0 = DAC_C0_DACEN_MASK+DAC_C0_DACRFS_MASK; 9e98: 4b15 ldr r3, [pc, #84] ; (9ef0 ) 9e9a: 22c0 movs r2, #192 ; 0xc0 9e9c: f883 2021 strb.w r2, [r3, #33] ; 0x21 ADC16_GetDefaultConfig(&adc16ConfigStruct); 9ea0: a801 add r0, sp, #4 9ea2: f002 ff3f bl cd24 ADC16_Init(ADC0, &adc16ConfigStruct); 9ea6: 4c13 ldr r4, [pc, #76] ; (9ef4 ) 9ea8: a901 add r1, sp, #4 9eaa: 4620 mov r0, r4 9eac: f002 fee2 bl cc74 base->SC2 &= ~ADC_SC2_ADTRG_MASK; 9eb0: 6a23 ldr r3, [r4, #32] 9eb2: f023 0340 bic.w r3, r3, #64 ; 0x40 9eb6: 6223 str r3, [r4, #32] (void)ADC16_DoAutoCalibration(ADC0); /* We need to calibrate ADC before we can use it - assume it works! */ 9eb8: 4620 mov r0, r4 9eba: f007 fefa bl 11cb2 calcs.ADCstate = 0; 9ebe: 2100 movs r1, #0 9ec0: 4b0d ldr r3, [pc, #52] ; (9ef8 ) 9ec2: 7059 strb r1, [r3, #1] ADCSUPDATED = 0; 9ec4: 4a0d ldr r2, [pc, #52] ; (9efc ) 9ec6: 7813 ldrb r3, [r2, #0] 9ec8: f361 0382 bfi r3, r1, #2, #1 9ecc: 7013 strb r3, [r2, #0] while (ADCSUPDATED==0) 9ece: f013 0f04 tst.w r3, #4 9ed2: d106 bne.n 9ee2 9ed4: 4614 mov r4, r2 ADC_MainLoop(); /* We need a first set of measurements before rest of program runs! */ 9ed6: f7ff fefd bl 9cd4 while (ADCSUPDATED==0) 9eda: 7823 ldrb r3, [r4, #0] 9edc: f013 0f04 tst.w r3, #4 9ee0: d0f9 beq.n 9ed6 } 9ee2: b004 add sp, #16 9ee4: bd10 pop {r4, pc} 9ee6: bf00 nop 9ee8: 4007d000 .word 0x4007d000 9eec: 4004802c .word 0x4004802c 9ef0: 400cc000 .word 0x400cc000 9ef4: 4003b000 .word 0x4003b000 9ef8: 20000934 .word 0x20000934 9efc: 2000096c .word 0x2000096c 00009f00 : 9f00: 4b2a ldr r3, [pc, #168] ; (9fac ) 9f02: 681a ldr r2, [r3, #0] 9f04: f442 7200 orr.w r2, r2, #512 ; 0x200 9f08: 601a str r2, [r3, #0] 9f0a: 681a ldr r2, [r3, #0] 9f0c: f442 6280 orr.w r2, r2, #1024 ; 0x400 9f10: 601a str r2, [r3, #0] 9f12: 681a ldr r2, [r3, #0] 9f14: f442 6200 orr.w r2, r2, #2048 ; 0x800 9f18: 601a str r2, [r3, #0] 9f1a: 681a ldr r2, [r3, #0] 9f1c: f442 5280 orr.w r2, r2, #4096 ; 0x1000 9f20: 601a str r2, [r3, #0] 9f22: 681a ldr r2, [r3, #0] 9f24: f442 5200 orr.w r2, r2, #8192 ; 0x2000 9f28: 601a str r2, [r3, #0] CLOCK_EnableClock(kCLOCK_PortB); CLOCK_EnableClock(kCLOCK_PortC); CLOCK_EnableClock(kCLOCK_PortD); CLOCK_EnableClock(kCLOCK_PortE); PORTD->PCR[6] = PORTMODE_ALT3; /* Configure UART0 TX/RX */ 9f2a: 4b21 ldr r3, [pc, #132] ; (9fb0 ) 9f2c: f44f 7240 mov.w r2, #768 ; 0x300 9f30: 619a str r2, [r3, #24] PORTD->PCR[7] = PORTMODE_ALT3; 9f32: 61da str r2, [r3, #28] PORTE->PCR[0] = PORTMODE_ALT3; /* Configure UART1 TX/RX */ 9f34: 491f ldr r1, [pc, #124] ; (9fb4 ) 9f36: 600a str r2, [r1, #0] PORTE->PCR[1] = PORTMODE_ALT3; 9f38: 604a str r2, [r1, #4] SIM->SOPT5 = 0; /* Make sure UARTs are configured normally */ 9f3a: 2000 movs r0, #0 9f3c: f5a1 41c0 sub.w r1, r1, #24576 ; 0x6000 9f40: f241 0210 movw r2, #4112 ; 0x1010 9f44: 5088 str r0, [r1, r2] PORTD->PCR[0] = PORTMODE_ALT2; /* Configure SPI0 CS0/SCK/SOUT/SIN */ 9f46: f44f 7100 mov.w r1, #512 ; 0x200 9f4a: 6019 str r1, [r3, #0] PORTD->PCR[1] = PORTMODE_ALT2; 9f4c: 6059 str r1, [r3, #4] PORTD->PCR[2] = PORTMODE_ALT2; 9f4e: 6099 str r1, [r3, #8] PORTD->PCR[3] = PORTMODE_ALT2; 9f50: 60d9 str r1, [r3, #12] GPIOB->PDDR = 0x00000; /* Configure keypad switch inputs (including input direction for port pins, and pull-ups) */ 9f52: f503 2333 add.w r3, r3, #733184 ; 0xb3000 9f56: 3340 adds r3, #64 ; 0x40 9f58: 6158 str r0, [r3, #20] PORTB->PCR[0] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f5a: 4b17 ldr r3, [pc, #92] ; (9fb8 ) 9f5c: f240 1203 movw r2, #259 ; 0x103 9f60: 601a str r2, [r3, #0] PORTB->PCR[1] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f62: 605a str r2, [r3, #4] PORTB->PCR[2] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f64: 609a str r2, [r3, #8] PORTB->PCR[3] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f66: 60da str r2, [r3, #12] PORTB->PCR[16] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f68: 641a str r2, [r3, #64] ; 0x40 PORTB->PCR[17] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f6a: 645a str r2, [r3, #68] ; 0x44 PORTB->PCR[18] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f6c: 649a str r2, [r3, #72] ; 0x48 PORTB->PCR[19] = PORTMODE_GPIO+PORTMODE_PULLUP; 9f6e: 64da str r2, [r3, #76] ; 0x4c GPIOC->PDDR = 0x005FF; /* Configure LCD outputs DATA0-7, E, RS (including output direction for port pins) */ 9f70: f503 2335 add.w r3, r3, #741376 ; 0xb5000 9f74: 3380 adds r3, #128 ; 0x80 9f76: f240 52ff movw r2, #1535 ; 0x5ff 9f7a: 615a str r2, [r3, #20] PORTC->PCR[0] = PORTMODE_GPIO; 9f7c: 4a0f ldr r2, [pc, #60] ; (9fbc ) 9f7e: f44f 7380 mov.w r3, #256 ; 0x100 9f82: 6013 str r3, [r2, #0] PORTC->PCR[1] = PORTMODE_GPIO; 9f84: 6053 str r3, [r2, #4] PORTC->PCR[2] = PORTMODE_GPIO; 9f86: 6093 str r3, [r2, #8] PORTC->PCR[3] = PORTMODE_GPIO; 9f88: 60d3 str r3, [r2, #12] PORTC->PCR[4] = PORTMODE_GPIO; 9f8a: 6113 str r3, [r2, #16] PORTC->PCR[5] = PORTMODE_GPIO; 9f8c: 6153 str r3, [r2, #20] PORTC->PCR[6] = PORTMODE_GPIO; 9f8e: 6193 str r3, [r2, #24] PORTC->PCR[7] = PORTMODE_GPIO; 9f90: 61d3 str r3, [r2, #28] PORTC->PCR[8] = PORTMODE_GPIO; 9f92: 6213 str r3, [r2, #32] PORTC->PCR[10] = PORTMODE_GPIO; 9f94: 6293 str r3, [r2, #40] ; 0x28 GPIOA->PDDR = 0x00000; /* Configure LCD backlight outputs (but input direction for port pins, so backlight is off for now) */ 9f96: f502 2234 add.w r2, r2, #737280 ; 0xb4000 9f9a: 6150 str r0, [r2, #20] PORTA->PCR[1] = PORTMODE_GPIO; 9f9c: f5a2 2236 sub.w r2, r2, #745472 ; 0xb6000 9fa0: 6053 str r3, [r2, #4] PORTA->PCR[2] = PORTMODE_GPIO; 9fa2: 6093 str r3, [r2, #8] PORTA->PCR[4] = PORTMODE_GPIO; 9fa4: 6113 str r3, [r2, #16] PORTA->PCR[5] = PORTMODE_GPIO; 9fa6: 6153 str r3, [r2, #20] //!!!! PORTA->PCR[12] = PORTMODE_ALT2; /* Configure FLEXCAN0 TX/RX */ PORTA->PCR[13] = PORTMODE_ALT2; 9fa8: 6351 str r1, [r2, #52] ; 0x34 } 9faa: 4770 bx lr 9fac: 40048038 .word 0x40048038 9fb0: 4004c000 .word 0x4004c000 9fb4: 4004d000 .word 0x4004d000 9fb8: 4004a000 .word 0x4004a000 9fbc: 4004b000 .word 0x4004b000 00009fc0 : /******************************************************************************* * Code for BOARD_BootClockRUN configuration ******************************************************************************/ void BOARD_BootClockRUN(void) { 9fc0: b508 push {r3, lr} * * @param config Pointer to the configure structure. */ static inline void CLOCK_SetSimSafeDivs(void) { SIM->CLKDIV1 = 0x13070000U; 9fc2: 4a10 ldr r2, [pc, #64] ; (a004 ) 9fc4: f241 0344 movw r3, #4164 ; 0x1044 9fc8: 490f ldr r1, [pc, #60] ; (a008 ) 9fca: 50d1 str r1, [r2, r3] /* Set the system clock dividers in SIM to safe value. */ CLOCK_SetSimSafeDivs(); /* Initializes OSC0 according to board configuration. */ CLOCK_InitOsc0(&oscConfig_BOARD_BootClockRUN); 9fcc: 480f ldr r0, [pc, #60] ; (a00c ) 9fce: f003 f991 bl d2f4 * * @param freq The XTAL0/EXTAL0 input clock frequency in Hz. */ static inline void CLOCK_SetXtal0Freq(uint32_t freq) { g_xtal0Freq = freq; 9fd2: 4b0f ldr r3, [pc, #60] ; (a010 ) 9fd4: 4a0f ldr r2, [pc, #60] ; (a014 ) 9fd6: 601a str r2, [r3, #0] CLOCK_SetXtal0Freq(oscConfig_BOARD_BootClockRUN.freq); /* Configure the Internal Reference clock (MCGIRCLK). */ CLOCK_SetInternalRefClkConfig(mcgConfig_BOARD_BootClockRUN.irclkEnableMode, mcgConfig_BOARD_BootClockRUN.ircs, 9fd8: 2200 movs r2, #0 9fda: 4611 mov r1, r2 9fdc: 2002 movs r0, #2 9fde: f003 f91f bl d220 MCG->C1 = ((MCG->C1 & ~MCG_C1_FRDIV_MASK) | MCG_C1_FRDIV(frdiv)); 9fe2: 4a0d ldr r2, [pc, #52] ; (a018 ) 9fe4: 7813 ldrb r3, [r2, #0] 9fe6: f003 03c7 and.w r3, r3, #199 ; 0xc7 9fea: 7013 strb r3, [r2, #0] /* Configure FLL external reference divider (FRDIV). */ CLOCK_CONFIG_SetFllExtRefDiv(mcgConfig_BOARD_BootClockRUN.frdiv); /* Set MCG to PEE mode. */ CLOCK_BootToPeeMode(mcgConfig_BOARD_BootClockRUN.oscsel, kMCG_PllClkSelPll0, 9fec: 4a0b ldr r2, [pc, #44] ; (a01c ) 9fee: 2100 movs r1, #0 9ff0: 4608 mov r0, r1 9ff2: f003 f9e7 bl d3c4 &mcgConfig_BOARD_BootClockRUN.pll0Config); /* Set the clock configuration in SIM module. */ CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN); 9ff6: 480a ldr r0, [pc, #40] ; (a020 ) 9ff8: f002 ff76 bl cee8 /* Set SystemCoreClock variable. */ SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK; 9ffc: 4b09 ldr r3, [pc, #36] ; (a024 ) 9ffe: 4a0a ldr r2, [pc, #40] ; (a028 ) a000: 601a str r2, [r3, #0] } a002: bd08 pop {r3, pc} a004: 40047000 .word 0x40047000 a008: 13070000 .word 0x13070000 a00c: 00012598 .word 0x00012598 a010: 20001200 .word 0x20001200 a014: 00f42400 .word 0x00f42400 a018: 40064000 .word 0x40064000 a01c: 00012594 .word 0x00012594 a020: 000125a0 .word 0x000125a0 a024: 2000014c .word 0x2000014c a028: 1c9c3800 .word 0x1c9c3800 0000a02c : /*-----------------------------------------------------------------------*/ static FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ DIR* dp /* Pointer to the directory object with the file name */ ) { a02c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} a030: b087 sub sp, #28 a032: 4604 mov r4, r0 FRESULT res; FATFS *fs = dp->obj.fs; a034: f8d0 b000 ldr.w fp, [r0] BYTE c; #if FF_USE_LFN BYTE a, ord, sum; #endif res = dir_sdi(dp, 0); /* Rewind directory object */ a038: 2100 movs r1, #0 a03a: f007 f8e7 bl 1120c if (res != FR_OK) return res; a03e: 4602 mov r2, r0 a040: 2800 cmp r0, #0 a042: f040 80c0 bne.w a1c6 return res; } #endif /* On the FAT/FAT32 volume */ #if FF_USE_LFN ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ a046: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff a04a: 62e3 str r3, [r4, #44] ; 0x2c a04c: f04f 08ff mov.w r8, #255 ; 0xff a050: 46c1 mov r9, r8 c = dp->dir[DIR_Name]; if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ #if FF_USE_LFN /* LFN configuration */ dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ a052: 461f mov r7, r3 a054: e00a b.n a06c a056: 62e7 str r7, [r4, #44] ; 0x2c a058: f04f 09ff mov.w r9, #255 ; 0xff } #else /* Non LFN configuration */ dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; if (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ #endif res = dir_next(dp, 0); /* Next entry */ a05c: 2100 movs r1, #0 a05e: 4620 mov r0, r4 a060: f007 fa05 bl 1146e } while (res == FR_OK); a064: 4602 mov r2, r0 a066: 2800 cmp r0, #0 a068: f040 80ad bne.w a1c6 res = move_window(fs, dp->sect); a06c: 69a1 ldr r1, [r4, #24] a06e: 4658 mov r0, fp a070: f006 fe4a bl 10d08 if (res != FR_OK) break; a074: 4602 mov r2, r0 a076: 2800 cmp r0, #0 a078: f040 80a5 bne.w a1c6 c = dp->dir[DIR_Name]; a07c: 69e5 ldr r5, [r4, #28] a07e: 782e ldrb r6, [r5, #0] if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ a080: 2e00 cmp r6, #0 a082: f000 809f beq.w a1c4 dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; a086: 7aeb ldrb r3, [r5, #11] a088: f003 023f and.w r2, r3, #63 ; 0x3f a08c: 71a2 strb r2, [r4, #6] if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ a08e: 2ee5 cmp r6, #229 ; 0xe5 a090: d0e1 beq.n a056 a092: f013 0f08 tst.w r3, #8 a096: d015 beq.n a0c4 a098: 2a0f cmp r2, #15 a09a: d1dc bne.n a056 if (!(dp->fn[NSFLAG] & NS_NOLFN)) { a09c: f894 302b ldrb.w r3, [r4, #43] ; 0x2b a0a0: f013 0f40 tst.w r3, #64 ; 0x40 a0a4: d1da bne.n a05c if (c & LLEF) { /* Is it start of LFN sequence? */ a0a6: f016 0f40 tst.w r6, #64 ; 0x40 a0aa: d030 beq.n a10e sum = dp->dir[LDIR_Chksum]; a0ac: f895 800d ldrb.w r8, [r5, #13] c &= (BYTE)~LLEF; ord = c; /* LFN start order */ a0b0: f006 06bf and.w r6, r6, #191 ; 0xbf dp->blk_ofs = dp->dptr; /* Start offset of LFN */ a0b4: 6923 ldr r3, [r4, #16] a0b6: 62e3 str r3, [r4, #44] ; 0x2c ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a0b8: 7b6b ldrb r3, [r5, #13] a0ba: 4543 cmp r3, r8 a0bc: d02d beq.n a11a a0be: f04f 09ff mov.w r9, #255 ; 0xff a0c2: e7cb b.n a05c if (a == AM_LFN) { /* An LFN entry is found */ a0c4: 2a0f cmp r2, #15 a0c6: d0e9 beq.n a09c if (ord == 0 && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ a0c8: f1b9 0f00 cmp.w r9, #0 a0cc: d104 bne.n a0d8 a0ce: 4628 mov r0, r5 a0d0: f006 fd9a bl 10c08 a0d4: 4540 cmp r0, r8 a0d6: d07a beq.n a1ce if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ a0d8: f894 202b ldrb.w r2, [r4, #43] ; 0x2b a0dc: f012 0201 ands.w r2, r2, #1 a0e0: d111 bne.n a106 r = *d++ - *s++; a0e2: 1c69 adds r1, r5, #1 a0e4: f104 0021 add.w r0, r4, #33 ; 0x21 a0e8: f815 3b0b ldrb.w r3, [r5], #11 a0ec: f894 6020 ldrb.w r6, [r4, #32] a0f0: 1b9b subs r3, r3, r6 } while (--cnt && r == 0); a0f2: b943 cbnz r3, a106 r = *d++ - *s++; a0f4: f811 3b01 ldrb.w r3, [r1], #1 a0f8: f810 6b01 ldrb.w r6, [r0], #1 a0fc: 1b9b subs r3, r3, r6 } while (--cnt && r == 0); a0fe: 428d cmp r5, r1 a100: d1f7 bne.n a0f2 if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ a102: 2b00 cmp r3, #0 a104: d05f beq.n a1c6 ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ a106: 62e7 str r7, [r4, #44] ; 0x2c a108: f04f 09ff mov.w r9, #255 ; 0xff a10c: e7a6 b.n a05c ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a10e: 45b1 cmp r9, r6 a110: bf18 it ne a112: f04f 09ff movne.w r9, #255 ; 0xff a116: d1a1 bne.n a05c a118: e7ce b.n a0b8 rv = rv << 8 | ptr[0]; a11a: 7eea ldrb r2, [r5, #27] a11c: 7eab ldrb r3, [r5, #26] if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ a11e: ea53 2302 orrs.w r3, r3, r2, lsl #8 a122: d15b bne.n a1dc ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a124: f8db 000c ldr.w r0, [fp, #12] a128: 9005 str r0, [sp, #20] i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ a12a: 782b ldrb r3, [r5, #0] a12c: f003 033f and.w r3, r3, #63 ; 0x3f a130: 3b01 subs r3, #1 a132: eb03 0243 add.w r2, r3, r3, lsl #1 a136: eb03 0382 add.w r3, r3, r2, lsl #2 for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ a13a: f8df a0c4 ldr.w sl, [pc, #196] ; a200 a13e: 2101 movs r1, #1 a140: f8cd 8004 str.w r8, [sp, #4] a144: f8cd b008 str.w fp, [sp, #8] a148: 9604 str r6, [sp, #16] a14a: 4698 mov r8, r3 a14c: 9403 str r4, [sp, #12] a14e: 4604 mov r4, r0 a150: e006 b.n a160 if (uc != 0xFFFF) return 0; /* Check filler */ a152: f64f 73ff movw r3, #65535 ; 0xffff a156: 429e cmp r6, r3 a158: d149 bne.n a1ee for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ a15a: 4b28 ldr r3, [pc, #160] ; (a1fc ) a15c: 459a cmp sl, r3 a15e: d01a beq.n a196 uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ a160: f81a 3b01 ldrb.w r3, [sl], #1 a164: 18ea adds r2, r5, r3 rv = rv << 8 | ptr[0]; a166: 7852 ldrb r2, [r2, #1] a168: 5cee ldrb r6, [r5, r3] a16a: ea46 2602 orr.w r6, r6, r2, lsl #8 if (wc != 0) { a16e: 2900 cmp r1, #0 a170: d0ef beq.n a152 if (i >= FF_MAX_LFN + 1 || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ a172: f1b8 0fff cmp.w r8, #255 ; 0xff a176: d82c bhi.n a1d2 a178: 4630 mov r0, r6 a17a: f001 fcf1 bl bb60 a17e: 4683 mov fp, r0 a180: f108 0901 add.w r9, r8, #1 a184: f834 0018 ldrh.w r0, [r4, r8, lsl #1] a188: f001 fcea bl bb60 a18c: 4583 cmp fp, r0 a18e: d128 bne.n a1e2 wc = uc; a190: 4631 mov r1, r6 if (i >= FF_MAX_LFN + 1 || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ a192: 46c8 mov r8, r9 a194: e7e1 b.n a15a a196: f8dd b008 ldr.w fp, [sp, #8] a19a: 9e04 ldr r6, [sp, #16] a19c: 4642 mov r2, r8 a19e: f8dd 8004 ldr.w r8, [sp, #4] a1a2: 9c03 ldr r4, [sp, #12] if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ a1a4: 782b ldrb r3, [r5, #0] a1a6: f013 0f40 tst.w r3, #64 ; 0x40 a1aa: d004 beq.n a1b6 a1ac: b119 cbz r1, a1b6 ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a1ae: 9b05 ldr r3, [sp, #20] a1b0: f833 3012 ldrh.w r3, [r3, r2, lsl #1] a1b4: b91b cbnz r3, a1be a1b6: 3e01 subs r6, #1 a1b8: fa5f f986 uxtb.w r9, r6 a1bc: e74e b.n a05c a1be: f04f 09ff mov.w r9, #255 ; 0xff a1c2: e74b b.n a05c if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ a1c4: 2204 movs r2, #4 return res; } a1c6: 4610 mov r0, r2 a1c8: b007 add sp, #28 a1ca: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} res = move_window(fs, dp->sect); a1ce: 464a mov r2, r9 a1d0: e7f9 b.n a1c6 a1d2: f8dd 8004 ldr.w r8, [sp, #4] a1d6: f8dd b008 ldr.w fp, [sp, #8] a1da: 9c03 ldr r4, [sp, #12] ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a1dc: f04f 09ff mov.w r9, #255 ; 0xff a1e0: e73c b.n a05c a1e2: f8dd 8004 ldr.w r8, [sp, #4] a1e6: f8dd b008 ldr.w fp, [sp, #8] a1ea: 9c03 ldr r4, [sp, #12] a1ec: e7f6 b.n a1dc a1ee: f8dd 8004 ldr.w r8, [sp, #4] a1f2: f8dd b008 ldr.w fp, [sp, #8] a1f6: 9c03 ldr r4, [sp, #12] a1f8: e7f0 b.n a1dc a1fa: bf00 nop a1fc: 00012635 .word 0x00012635 a200: 00012628 .word 0x00012628 0000a204 : /*-----------------------------------------------------------------------*/ static FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ DIR* dp /* Target directory with object name to be created */ ) { a204: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} a208: b08b sub sp, #44 ; 0x2c #if FF_USE_LFN /* LFN configuration */ UINT n, nlen, nent; BYTE sn[12], sum; if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ a20a: f890 302b ldrb.w r3, [r0, #43] ; 0x2b a20e: f013 0fa0 tst.w r3, #160 ; 0xa0 a212: f040 8109 bne.w a428 FATFS *fs = dp->obj.fs; a216: 6805 ldr r5, [r0, #0] for (nlen = 0; fs->lfnbuf[nlen]; nlen++) ; /* Get lfn length */ a218: 68eb ldr r3, [r5, #12] a21a: 881a ldrh r2, [r3, #0] a21c: b342 cbz r2, a270 a21e: f04f 0900 mov.w r9, #0 a222: f109 0901 add.w r9, r9, #1 a226: f833 2f02 ldrh.w r2, [r3, #2]! a22a: 2a00 cmp r2, #0 a22c: d1f9 bne.n a222 a22e: 4604 mov r4, r0 create_xdir(fs->dirbuf, fs->lfnbuf); /* Create on-memory directory block to be written later */ return FR_OK; } #endif /* On the FAT/FAT32 volume */ mem_cpy(sn, dp->fn, 12); a230: f100 0320 add.w r3, r0, #32 a234: 461e mov r6, r3 a236: 9301 str r3, [sp, #4] a238: 220c movs r2, #12 a23a: 4619 mov r1, r3 a23c: a807 add r0, sp, #28 a23e: f006 fcc8 bl 10bd2 if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ a242: f89d 3027 ldrb.w r3, [sp, #39] ; 0x27 a246: f013 0f01 tst.w r3, #1 a24a: f000 808a beq.w a362 dp->fn[NSFLAG] = NS_NOLFN; /* Find only SFN */ a24e: 2340 movs r3, #64 ; 0x40 a250: f884 302b strb.w r3, [r4, #43] ; 0x2b mem_cpy(dst, src, 11); a254: 220b movs r2, #11 a256: a907 add r1, sp, #28 a258: 4630 mov r0, r6 a25a: f006 fcba bl 10bd2 for (n = 1; n < 100; n++) { a25e: f04f 0801 mov.w r8, #1 a262: 4643 mov r3, r8 a264: 46a3 mov fp, r4 a266: f06f 0a1e mvn.w sl, #30 a26a: ebaa 0a04 sub.w sl, sl, r4 a26e: e003 b.n a278 for (nlen = 0; fs->lfnbuf[nlen]; nlen++) ; /* Get lfn length */ a270: f04f 0900 mov.w r9, #0 a274: e7db b.n a22e for (n = 1; n < 100; n++) { a276: 4643 mov r3, r8 a278: f10d 061b add.w r6, sp, #27 a27c: 2207 movs r2, #7 a27e: e000 b.n a282 seq /= 16; a280: 460b mov r3, r1 c = (BYTE)((seq % 16) + '0'); a282: f003 000f and.w r0, r3, #15 a286: f100 0130 add.w r1, r0, #48 ; 0x30 if (c > '9') c += 7; a28a: 2939 cmp r1, #57 ; 0x39 a28c: bf88 it hi a28e: f100 0137 addhi.w r1, r0, #55 ; 0x37 ns[i--] = c; a292: 3a01 subs r2, #1 a294: f806 1901 strb.w r1, [r6], #-1 seq /= 16; a298: 0919 lsrs r1, r3, #4 } while (seq); a29a: 2b0f cmp r3, #15 a29c: d8f0 bhi.n a280 ns[i] = '~'; a29e: 217e movs r1, #126 ; 0x7e a2a0: ab0a add r3, sp, #40 ; 0x28 a2a2: 4413 add r3, r2 a2a4: f803 1c14 strb.w r1, [r3, #-20] for (j = 0; j < i && dst[j] != ' '; j++) { a2a8: b1ba cbz r2, a2da a2aa: f894 3020 ldrb.w r3, [r4, #32] a2ae: 2b20 cmp r3, #32 a2b0: d015 beq.n a2de a2b2: f104 0120 add.w r1, r4, #32 a2b6: f104 001f add.w r0, r4, #31 a2ba: 4410 add r0, r2 if (c != 0) return 0; /* Always false */ a2bc: eb0a 0301 add.w r3, sl, r1 for (j = 0; j < i && dst[j] != ' '; j++) { a2c0: 4281 cmp r1, r0 a2c2: d003 beq.n a2cc a2c4: f811 6f01 ldrb.w r6, [r1, #1]! a2c8: 2e20 cmp r6, #32 a2ca: d1f7 bne.n a2bc a2cc: 3320 adds r3, #32 a2ce: 4423 add r3, r4 dst[j++] = (i < 8) ? ns[i++] : ' '; a2d0: 2620 movs r6, #32 } while (j < 8); a2d2: f06f 001f mvn.w r0, #31 a2d6: 1b00 subs r0, r0, r4 a2d8: e009 b.n a2ee for (j = 0; j < i && dst[j] != ' '; j++) { a2da: 4613 mov r3, r2 a2dc: e7f6 b.n a2cc a2de: 2300 movs r3, #0 a2e0: e7f4 b.n a2cc dst[j++] = (i < 8) ? ns[i++] : ' '; a2e2: 4631 mov r1, r6 a2e4: f803 1b01 strb.w r1, [r3], #1 } while (j < 8); a2e8: 18c1 adds r1, r0, r3 a2ea: 2907 cmp r1, #7 a2ec: d807 bhi.n a2fe dst[j++] = (i < 8) ? ns[i++] : ' '; a2ee: 2a07 cmp r2, #7 a2f0: d8f7 bhi.n a2e2 a2f2: a90a add r1, sp, #40 ; 0x28 a2f4: 4411 add r1, r2 a2f6: f811 1c14 ldrb.w r1, [r1, #-20] a2fa: 3201 adds r2, #1 a2fc: e7f2 b.n a2e4 gen_numname(dp->fn, sn, fs->lfnbuf, n); /* Generate a numbered name */ res = dir_find(dp); /* Check if the name collides with existing SFN */ a2fe: 4658 mov r0, fp a300: f7ff fe94 bl a02c if (res != FR_OK) break; a304: 4607 mov r7, r0 a306: bb18 cbnz r0, a350 for (n = 1; n < 100; n++) { a308: f108 0801 add.w r8, r8, #1 a30c: f1b8 0f64 cmp.w r8, #100 ; 0x64 a310: d04d beq.n a3ae gen_numname(dp->fn, sn, fs->lfnbuf, n); /* Generate a numbered name */ a312: 68ee ldr r6, [r5, #12] mem_cpy(dst, src, 11); a314: 220b movs r2, #11 a316: a907 add r1, sp, #28 a318: 9801 ldr r0, [sp, #4] a31a: f006 fc5a bl 10bd2 if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ a31e: f1b8 0f05 cmp.w r8, #5 a322: d9a8 bls.n a276 a324: 1eb0 subs r0, r6, #2 for (n = 1; n < 100; n++) { a326: 4643 mov r3, r8 while (*lfn) { /* Create a CRC as hash value */ a328: f830 2f02 ldrh.w r2, [r0, #2]! a32c: 2a00 cmp r2, #0 a32e: d0a3 beq.n a278 a330: 2110 movs r1, #16 sreg = (sreg << 1) + (wc & 1); a332: f002 0601 and.w r6, r2, #1 a336: eb06 0343 add.w r3, r6, r3, lsl #1 wc >>= 1; a33a: 0852 lsrs r2, r2, #1 if (sreg & 0x10000) sreg ^= 0x11021; a33c: f413 3f80 tst.w r3, #65536 ; 0x10000 a340: bf1c itt ne a342: f483 3388 eorne.w r3, r3, #69632 ; 0x11000 a346: f083 0321 eorne.w r3, r3, #33 ; 0x21 for (i = 0; i < 16; i++) { a34a: 3901 subs r1, #1 a34c: d1f1 bne.n a332 a34e: e7eb b.n a328 } if (n == 100) return FR_DENIED; /* Abort if too many collisions */ a350: f1b8 0f64 cmp.w r8, #100 ; 0x64 a354: d06d beq.n a432 if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ a356: 2804 cmp r0, #4 a358: d167 bne.n a42a dp->fn[NSFLAG] = sn[NSFLAG]; a35a: f89d 3027 ldrb.w r3, [sp, #39] ; 0x27 a35e: f884 302b strb.w r3, [r4, #43] ; 0x2b } /* Create an SFN with/without LFNs. */ nent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1; /* Number of entries to allocate */ a362: f89d 3027 ldrb.w r3, [sp, #39] ; 0x27 a366: f013 0f02 tst.w r3, #2 a36a: f000 8081 beq.w a470 a36e: f109 090c add.w r9, r9, #12 a372: 4b50 ldr r3, [pc, #320] ; (a4b4 ) a374: fba3 2309 umull r2, r3, r3, r9 a378: 089e lsrs r6, r3, #2 res = dir_alloc(dp, nent); /* Allocate entries */ a37a: 1c71 adds r1, r6, #1 a37c: 4620 mov r0, r4 a37e: f007 f8da bl 11536 if (res == FR_OK && --nent) { /* Set LFN entry if needed */ a382: 4607 mov r7, r0 a384: 2800 cmp r0, #0 a386: d150 bne.n a42a a388: f1b9 0f0c cmp.w r9, #12 a38c: d977 bls.n a47e res = dir_sdi(dp, dp->dptr - nent * SZDIRE); a38e: 6921 ldr r1, [r4, #16] a390: eba1 1146 sub.w r1, r1, r6, lsl #5 a394: 4620 mov r0, r4 a396: f006 ff39 bl 1120c if (res == FR_OK) { a39a: 4607 mov r7, r0 a39c: 2800 cmp r0, #0 a39e: d144 bne.n a42a sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ a3a0: 9801 ldr r0, [sp, #4] a3a2: f006 fc31 bl 10c08 a3a6: 9002 str r0, [sp, #8] s = wc = 0; a3a8: 2300 movs r3, #0 a3aa: 9303 str r3, [sp, #12] a3ac: e018 b.n a3e0 if (n == 100) return FR_DENIED; /* Abort if too many collisions */ a3ae: 2707 movs r7, #7 a3b0: e03b b.n a42a if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ a3b2: 4660 mov r0, ip a3b4: e047 b.n a446 if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ a3b6: f64f 72ff movw r2, #65535 ; 0xffff a3ba: 4293 cmp r3, r2 a3bc: d002 beq.n a3c4 a3be: f838 3010 ldrh.w r3, [r8, r0, lsl #1] a3c2: b90b cbnz r3, a3c8 a3c4: f04a 0a40 orr.w sl, sl, #64 ; 0x40 dir[LDIR_Ord] = ord; /* Set the LFN order */ a3c8: f881 a000 strb.w sl, [r1] do { /* Store LFN entries in bottom first */ res = move_window(fs, dp->sect); if (res != FR_OK) break; put_lfn(fs->lfnbuf, dp->dir, (BYTE)nent, sum); fs->wflag = 1; a3cc: 2301 movs r3, #1 a3ce: 70eb strb r3, [r5, #3] res = dir_next(dp, 0); /* Next entry */ a3d0: 2100 movs r1, #0 a3d2: 4620 mov r0, r4 a3d4: f007 f84b bl 1146e } while (res == FR_OK && --nent); a3d8: 4607 mov r7, r0 a3da: bb30 cbnz r0, a42a a3dc: 3e01 subs r6, #1 a3de: d04e beq.n a47e res = move_window(fs, dp->sect); a3e0: 69a1 ldr r1, [r4, #24] a3e2: 4628 mov r0, r5 a3e4: f006 fc90 bl 10d08 if (res != FR_OK) break; a3e8: 4607 mov r7, r0 a3ea: b9f0 cbnz r0, a42a put_lfn(fs->lfnbuf, dp->dir, (BYTE)nent, sum); a3ec: f8d5 800c ldr.w r8, [r5, #12] a3f0: 69e1 ldr r1, [r4, #28] a3f2: fa5f fa86 uxtb.w sl, r6 dir[LDIR_Chksum] = sum; /* Set checksum */ a3f6: 9b02 ldr r3, [sp, #8] a3f8: 734b strb r3, [r1, #13] dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ a3fa: f04f 030f mov.w r3, #15 a3fe: 72cb strb r3, [r1, #11] dir[LDIR_Type] = 0; a400: f04f 0300 mov.w r3, #0 a404: 730b strb r3, [r1, #12] *ptr++ = (BYTE)val; val >>= 8; a406: 768b strb r3, [r1, #26] *ptr++ = (BYTE)val; a408: 76cb strb r3, [r1, #27] i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ a40a: f10a 30ff add.w r0, sl, #4294967295 ; 0xffffffff a40e: eb00 0340 add.w r3, r0, r0, lsl #1 a412: eb00 0083 add.w r0, r0, r3, lsl #2 s = wc = 0; a416: 4a28 ldr r2, [pc, #160] ; (a4b8 ) a418: f102 0e0d add.w lr, r2, #13 a41c: 9b03 ldr r3, [sp, #12] if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ a41e: f64f 77ff movw r7, #65535 ; 0xffff *ptr++ = (BYTE)val; val >>= 8; a422: f04f 09ff mov.w r9, #255 ; 0xff a426: e011 b.n a44c if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ a428: 2706 movs r7, #6 fs->wflag = 1; } } return res; } a42a: 4638 mov r0, r7 a42c: b00b add sp, #44 ; 0x2c a42e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} if (n == 100) return FR_DENIED; /* Abort if too many collisions */ a432: 2707 movs r7, #7 a434: e7f9 b.n a42a st_word(dir + LfnOfs[s], wc); /* Put it */ a436: f892 c000 ldrb.w ip, [r2] a43a: eb01 0b0c add.w fp, r1, ip *ptr++ = (BYTE)val; val >>= 8; a43e: f801 900c strb.w r9, [r1, ip] *ptr++ = (BYTE)val; a442: f88b 9001 strb.w r9, [fp, #1] if (wc == 0) wc = 0xFFFF; /* Padding characters for following items */ a446: 3201 adds r2, #1 } while (++s < 13); a448: 4596 cmp lr, r2 a44a: d0b4 beq.n a3b6 if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ a44c: 42bb cmp r3, r7 a44e: d0f2 beq.n a436 a450: f100 0c01 add.w ip, r0, #1 a454: f838 3010 ldrh.w r3, [r8, r0, lsl #1] st_word(dir + LfnOfs[s], wc); /* Put it */ a458: 7810 ldrb r0, [r2, #0] a45a: eb01 0b00 add.w fp, r1, r0 *ptr++ = (BYTE)val; val >>= 8; a45e: 540b strb r3, [r1, r0] a460: 0a18 lsrs r0, r3, #8 *ptr++ = (BYTE)val; a462: f88b 0001 strb.w r0, [fp, #1] if (wc == 0) wc = 0xFFFF; /* Padding characters for following items */ a466: 2b00 cmp r3, #0 a468: d1a3 bne.n a3b2 if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ a46a: 4660 mov r0, ip if (wc == 0) wc = 0xFFFF; /* Padding characters for following items */ a46c: 463b mov r3, r7 a46e: e7ea b.n a446 res = dir_alloc(dp, nent); /* Allocate entries */ a470: 2101 movs r1, #1 a472: 4620 mov r0, r4 a474: f007 f85f bl 11536 if (res == FR_OK && --nent) { /* Set LFN entry if needed */ a478: 4607 mov r7, r0 a47a: 2800 cmp r0, #0 a47c: d1d5 bne.n a42a res = move_window(fs, dp->sect); a47e: 69a1 ldr r1, [r4, #24] a480: 4628 mov r0, r5 a482: f006 fc41 bl 10d08 if (res == FR_OK) { a486: 4607 mov r7, r0 a488: 2800 cmp r0, #0 a48a: d1ce bne.n a42a mem_set(dp->dir, 0, SZDIRE); /* Clean the entry */ a48c: 2220 movs r2, #32 a48e: 2100 movs r1, #0 a490: 69e0 ldr r0, [r4, #28] a492: f006 fba8 bl 10be6 mem_cpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ a496: 220b movs r2, #11 a498: 9901 ldr r1, [sp, #4] a49a: 69e0 ldr r0, [r4, #28] a49c: f006 fb99 bl 10bd2 dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ a4a0: 69e2 ldr r2, [r4, #28] a4a2: f894 302b ldrb.w r3, [r4, #43] ; 0x2b a4a6: f003 0318 and.w r3, r3, #24 a4aa: 7313 strb r3, [r2, #12] fs->wflag = 1; a4ac: 2301 movs r3, #1 a4ae: 70eb strb r3, [r5, #3] a4b0: e7bb b.n a42a a4b2: bf00 nop a4b4: 4ec4ec4f .word 0x4ec4ec4f a4b8: 00012628 .word 0x00012628 0000a4bc : static UINT check_fs ( /* 0:FAT VBR, 1:exFAT VBR, 2:Not FAT and valid BS, 3:Not FAT and invalid BS, 4:Disk error */ FATFS* fs, /* Filesystem object */ LBA_t sect /* Sector to load and check if it is an FAT-VBR or not */ ) { a4bc: b570 push {r4, r5, r6, lr} a4be: 4604 mov r4, r0 WORD w, sign; BYTE b; fs->wflag = 0; fs->winsect = (LBA_t)0 - 1; /* Invaidate window */ a4c0: 2300 movs r3, #0 a4c2: 70c3 strb r3, [r0, #3] a4c4: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff a4c8: 6303 str r3, [r0, #48] ; 0x30 if (move_window(fs, sect) != FR_OK) return 4; /* Load the boot sector */ a4ca: f006 fc1d bl 10d08 a4ce: bbb0 cbnz r0, a53e rv = rv << 8 | ptr[0]; a4d0: f894 3233 ldrb.w r3, [r4, #563] ; 0x233 a4d4: f894 0232 ldrb.w r0, [r4, #562] ; 0x232 a4d8: ea40 2003 orr.w r0, r0, r3, lsl #8 sign = ld_word(fs->win + BS_55AA); #if FF_FS_EXFAT if (sign == 0xAA55 && !mem_cmp(fs->win + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11)) return 1; /* It is an exFAT VBR */ #endif b = fs->win[BS_JmpBoot]; a4dc: f894 3034 ldrb.w r3, [r4, #52] ; 0x34 if (b == 0xEB || b == 0xE9 || b == 0xE8) { /* Valid JumpBoot code? (short jump, near jump or near call) */ a4e0: 2beb cmp r3, #235 ; 0xeb a4e2: d00a beq.n a4fa a4e4: 3318 adds r3, #24 a4e6: b2db uxtb r3, r3 a4e8: 2b01 cmp r3, #1 a4ea: d906 bls.n a4fa && ld_word(fs->win + BPB_FATSz16) != 0) { /* Properness of FAT size */ return 0; /* Sector can be presumed an FAT VBR */ } } } return sign == 0xAA55 ? 2 : 3; /* Not an FAT VBR (valid or invalid BS) */ a4ec: f64a 2355 movw r3, #43605 ; 0xaa55 a4f0: 4298 cmp r0, r3 a4f2: bf0c ite eq a4f4: 2002 moveq r0, #2 a4f6: 2003 movne r0, #3 } a4f8: bd70 pop {r4, r5, r6, pc} if (sign == 0xAA55 && !mem_cmp(fs->win + BS_FilSysType32, "FAT32 ", 8)) return 0; /* It is an FAT32 VBR */ a4fa: f64a 2355 movw r3, #43605 ; 0xaa55 a4fe: 4298 cmp r0, r3 a500: d00a beq.n a518 rv = rv << 8 | ptr[0]; a502: f894 2040 ldrb.w r2, [r4, #64] ; 0x40 a506: f894 303f ldrb.w r3, [r4, #63] ; 0x3f a50a: ea43 2302 orr.w r3, r3, r2, lsl #8 if ((w & (w - 1)) == 0 && w >= FF_MIN_SS && w <= FF_MAX_SS) { /* Properness of sector size */ a50e: 1e5a subs r2, r3, #1 a510: 421a tst r2, r3 a512: d043 beq.n a59c return sign == 0xAA55 ? 2 : 3; /* Not an FAT VBR (valid or invalid BS) */ a514: 2003 movs r0, #3 a516: e7ef b.n a4f8 r = *d++ - *s++; a518: f104 0287 add.w r2, r4, #135 ; 0x87 a51c: f894 3086 ldrb.w r3, [r4, #134] ; 0x86 a520: 3b46 subs r3, #70 ; 0x46 a522: f104 068e add.w r6, r4, #142 ; 0x8e a526: 4920 ldr r1, [pc, #128] ; (a5a8 ) } while (--cnt && r == 0); a528: b96b cbnz r3, a546 r = *d++ - *s++; a52a: f812 3b01 ldrb.w r3, [r2], #1 a52e: f811 5b01 ldrb.w r5, [r1], #1 a532: 1b5b subs r3, r3, r5 } while (--cnt && r == 0); a534: 42b2 cmp r2, r6 a536: d1f7 bne.n a528 if (sign == 0xAA55 && !mem_cmp(fs->win + BS_FilSysType32, "FAT32 ", 8)) return 0; /* It is an FAT32 VBR */ a538: b92b cbnz r3, a546 a53a: 2000 movs r0, #0 a53c: e7dc b.n a4f8 if (move_window(fs, sect) != FR_OK) return 4; /* Load the boot sector */ a53e: 2004 movs r0, #4 a540: e7da b.n a4f8 return sign == 0xAA55 ? 2 : 3; /* Not an FAT VBR (valid or invalid BS) */ a542: 2002 movs r0, #2 a544: e7d8 b.n a4f8 rv = rv << 8 | ptr[0]; a546: f894 2040 ldrb.w r2, [r4, #64] ; 0x40 a54a: f894 303f ldrb.w r3, [r4, #63] ; 0x3f a54e: ea43 2302 orr.w r3, r3, r2, lsl #8 if ((w & (w - 1)) == 0 && w >= FF_MIN_SS && w <= FF_MAX_SS) { /* Properness of sector size */ a552: 1e5a subs r2, r3, #1 a554: 421a tst r2, r3 a556: d1f4 bne.n a542 a558: f5b3 7f00 cmp.w r3, #512 ; 0x200 a55c: d11c bne.n a598 b = fs->win[BPB_SecPerClus]; a55e: f894 3041 ldrb.w r3, [r4, #65] ; 0x41 if (b != 0 && (b & (b - 1)) == 0 /* Properness of cluster size */ a562: 2b00 cmp r3, #0 a564: d0c2 beq.n a4ec a566: 1e5a subs r2, r3, #1 a568: 421a tst r2, r3 a56a: d1bf bne.n a4ec && (fs->win[BPB_NumFATs] == 1 || fs->win[BPB_NumFATs] == 2) /* Properness of number of FATs */ a56c: f894 3044 ldrb.w r3, [r4, #68] ; 0x44 a570: 3b01 subs r3, #1 a572: b2db uxtb r3, r3 a574: 2b01 cmp r3, #1 a576: d8b9 bhi.n a4ec rv = rv << 8 | ptr[0]; a578: f894 2046 ldrb.w r2, [r4, #70] ; 0x46 a57c: f894 3045 ldrb.w r3, [r4, #69] ; 0x45 && ld_word(fs->win + BPB_RootEntCnt) != 0 /* Properness of root entry count */ a580: ea53 2302 orrs.w r3, r3, r2, lsl #8 a584: d0b2 beq.n a4ec rv = rv << 8 | ptr[0]; a586: f894 204b ldrb.w r2, [r4, #75] ; 0x4b a58a: f894 304a ldrb.w r3, [r4, #74] ; 0x4a && ld_word(fs->win + BPB_FATSz16) != 0) { /* Properness of FAT size */ a58e: ea53 2302 orrs.w r3, r3, r2, lsl #8 a592: d0ab beq.n a4ec return 0; /* Sector can be presumed an FAT VBR */ a594: 2000 movs r0, #0 a596: e7af b.n a4f8 return sign == 0xAA55 ? 2 : 3; /* Not an FAT VBR (valid or invalid BS) */ a598: 2002 movs r0, #2 a59a: e7ad b.n a4f8 if ((w & (w - 1)) == 0 && w >= FF_MIN_SS && w <= FF_MAX_SS) { /* Properness of sector size */ a59c: f5b3 7f00 cmp.w r3, #512 ; 0x200 a5a0: d0dd beq.n a55e return sign == 0xAA55 ? 2 : 3; /* Not an FAT VBR (valid or invalid BS) */ a5a2: 2003 movs r0, #3 a5a4: e7a8 b.n a4f8 a5a6: bf00 nop a5a8: 0001264d .word 0x0001264d 0000a5ac : static FRESULT mount_volume ( /* FR_OK(0): successful, !=0: an error occurred */ const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ FATFS** rfs, /* Pointer to pointer to the found filesystem object */ BYTE mode /* !=0: Check write protection for write access */ ) { a5ac: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} a5b0: b085 sub sp, #20 a5b2: 460e mov r6, r1 a5b4: 4615 mov r5, r2 FATFS *fs; UINT fmt; /* Get logical drive number */ *rfs = 0; a5b6: 2300 movs r3, #0 a5b8: 600b str r3, [r1, #0] vol = get_ldnumber(path); a5ba: f006 fb34 bl 10c26 if (vol < 0) return FR_INVALID_DRIVE; a5be: 1e07 subs r7, r0, #0 a5c0: f2c0 8102 blt.w a7c8 /* Check if the filesystem object is valid or not */ fs = FatFs[vol]; /* Get pointer to the filesystem object */ a5c4: 4bc9 ldr r3, [pc, #804] ; (a8ec ) a5c6: f853 4027 ldr.w r4, [r3, r7, lsl #2] if (!fs) return FR_NOT_ENABLED; /* Is the filesystem object available? */ a5ca: 2c00 cmp r4, #0 a5cc: f000 8101 beq.w a7d2 #if FF_FS_REENTRANT if (!lock_fs(fs)) return FR_TIMEOUT; /* Lock the volume */ #endif *rfs = fs; /* Return pointer to the filesystem object */ a5d0: 6034 str r4, [r6, #0] mode &= (BYTE)~FA_READ; /* Desired access mode, write access or not */ a5d2: f005 05fe and.w r5, r5, #254 ; 0xfe if (fs->fs_type != 0) { /* If the volume has been mounted */ a5d6: 7823 ldrb r3, [r4, #0] a5d8: b173 cbz r3, a5f8 stat = disk_status(fs->pdrv); a5da: 7860 ldrb r0, [r4, #1] a5dc: f006 facb bl 10b76 if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ a5e0: f010 0f01 tst.w r0, #1 a5e4: d108 bne.n a5f8 if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ a5e6: 2d00 cmp r5, #0 a5e8: f000 80ef beq.w a7ca a5ec: f000 0504 and.w r5, r0, #4 return FR_WRITE_PROTECTED; a5f0: 2d00 cmp r5, #0 a5f2: bf18 it ne a5f4: 250a movne r5, #10 a5f6: e0e8 b.n a7ca } /* The filesystem object is not valid. */ /* Following code attempts to mount the volume. (find a FAT volume, analyze the BPB and initialize the filesystem object) */ fs->fs_type = 0; /* Clear the filesystem object */ a5f8: 2300 movs r3, #0 a5fa: 7023 strb r3, [r4, #0] fs->pdrv = LD2PD(vol); /* Volume hosting physical drive */ a5fc: b2f8 uxtb r0, r7 a5fe: 7060 strb r0, [r4, #1] stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */ a600: f006 fac0 bl 10b84 if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ a604: f010 0701 ands.w r7, r0, #1 a608: f040 80e5 bne.w a7d6 return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ } if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ a60c: b11d cbz r5, a616 a60e: f010 0f04 tst.w r0, #4 a612: f040 80e2 bne.w a7da fmt = check_fs(fs, 0); /* Load sector 0 and check if it is an FAT VBR as SFD */ a616: 2100 movs r1, #0 a618: 4620 mov r0, r4 a61a: f7ff ff4f bl a4bc if (fmt != 2 && (fmt >= 3 || part == 0)) return fmt; /* Returns if it is a FAT VBR as auto scan, not a BS or disk error */ a61e: 2802 cmp r0, #2 a620: f000 80a7 beq.w a772 if (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR; #endif /* Find an FAT volume on the drive */ fmt = find_volume(fs, LD2PT(vol)); if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ a624: 2804 cmp r0, #4 a626: f000 80da beq.w a7de if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ a62a: 2801 cmp r0, #1 a62c: f200 80d9 bhi.w a7e2 rv = rv << 8 | ptr[0]; a630: f894 2040 ldrb.w r2, [r4, #64] ; 0x40 a634: f894 303f ldrb.w r3, [r4, #63] ; 0x3f a638: ea43 2302 orr.w r3, r3, r2, lsl #8 #endif fmt = FS_EXFAT; /* FAT sub-type */ } else #endif /* FF_FS_EXFAT */ { if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ a63c: b21b sxth r3, r3 a63e: f5b3 7f00 cmp.w r3, #512 ; 0x200 a642: f040 80d0 bne.w a7e6 rv = rv << 8 | ptr[0]; a646: f894 504b ldrb.w r5, [r4, #75] ; 0x4b a64a: f894 304a ldrb.w r3, [r4, #74] ; 0x4a fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); a64e: ea53 2505 orrs.w r5, r3, r5, lsl #8 a652: d104 bne.n a65e a654: f104 0058 add.w r0, r4, #88 ; 0x58 a658: f006 fab0 bl 10bbc a65c: 4605 mov r5, r0 bsect = fs->winsect; /* Volume location */ a65e: f8d4 9030 ldr.w r9, [r4, #48] ; 0x30 fs->fsize = fasize; a662: 61e5 str r5, [r4, #28] fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ a664: f894 6044 ldrb.w r6, [r4, #68] ; 0x44 a668: 70a6 strb r6, [r4, #2] if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ a66a: 1e73 subs r3, r6, #1 a66c: b2db uxtb r3, r3 a66e: 2b01 cmp r3, #1 a670: f200 80bb bhi.w a7ea fasize *= fs->n_fats; /* Number of sectors for FAT area */ fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ a674: f894 8041 ldrb.w r8, [r4, #65] ; 0x41 a678: fa1f f388 uxth.w r3, r8 a67c: 8163 strh r3, [r4, #10] if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ a67e: 2b00 cmp r3, #0 a680: f000 80b5 beq.w a7ee a684: f108 33ff add.w r3, r8, #4294967295 ; 0xffffffff a688: ea13 0f08 tst.w r3, r8 a68c: f040 80b1 bne.w a7f2 rv = rv << 8 | ptr[0]; a690: f894 3046 ldrb.w r3, [r4, #70] ; 0x46 a694: f894 a045 ldrb.w sl, [r4, #69] ; 0x45 a698: ea4a 2a03 orr.w sl, sl, r3, lsl #8 a69c: fa0f fa8a sxth.w sl, sl a6a0: fa1f fb8a uxth.w fp, sl fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ a6a4: f8a4 b008 strh.w fp, [r4, #8] if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ a6a8: f01b 0f0f tst.w fp, #15 a6ac: f040 80a3 bne.w a7f6 rv = rv << 8 | ptr[0]; a6b0: f894 3048 ldrb.w r3, [r4, #72] ; 0x48 a6b4: f894 0047 ldrb.w r0, [r4, #71] ; 0x47 tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); a6b8: ea50 2003 orrs.w r0, r0, r3, lsl #8 a6bc: d103 bne.n a6c6 a6be: f104 0054 add.w r0, r4, #84 ; 0x54 a6c2: f006 fa7b bl 10bbc rv = rv << 8 | ptr[0]; a6c6: f894 2043 ldrb.w r2, [r4, #67] ; 0x43 a6ca: f894 3042 ldrb.w r3, [r4, #66] ; 0x42 nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ a6ce: ea53 2202 orrs.w r2, r3, r2, lsl #8 a6d2: f000 8092 beq.w a7fa fasize *= fs->n_fats; /* Number of sectors for FAT area */ a6d6: fb05 fc06 mul.w ip, r5, r6 /* Determine the FAT sub type */ sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ a6da: eb02 131b add.w r3, r2, fp, lsr #4 a6de: 4463 add r3, ip if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ a6e0: 4298 cmp r0, r3 a6e2: f0c0 808c bcc.w a7fe nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ a6e6: 1ac0 subs r0, r0, r3 a6e8: fbb0 f1f8 udiv r1, r0, r8 if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ a6ec: 4540 cmp r0, r8 a6ee: f0c0 8088 bcc.w a802 fmt = 0; if (nclst <= MAX_FAT32) fmt = FS_FAT32; a6f2: 487f ldr r0, [pc, #508] ; (a8f0 ) a6f4: 4281 cmp r1, r0 a6f6: f200 8092 bhi.w a81e if (nclst <= MAX_FAT16) fmt = FS_FAT16; a6fa: f64f 70f5 movw r0, #65525 ; 0xfff5 a6fe: 4281 cmp r1, r0 if (nclst <= MAX_FAT32) fmt = FS_FAT32; a700: bf88 it hi a702: f04f 0803 movhi.w r8, #3 if (nclst <= MAX_FAT16) fmt = FS_FAT16; a706: f200 808c bhi.w a822 if (nclst <= MAX_FAT12) fmt = FS_FAT12; a70a: f640 70f5 movw r0, #4085 ; 0xff5 a70e: 4281 cmp r1, r0 if (nclst <= MAX_FAT16) fmt = FS_FAT16; a710: bf88 it hi a712: f04f 0802 movhi.w r8, #2 if (nclst <= MAX_FAT12) fmt = FS_FAT12; a716: f200 8087 bhi.w a828 if (fmt == 0) return FR_NO_FILESYSTEM; /* Boundaries and Limits */ fs->n_fatent = nclst + 2; /* Number of FAT entries */ a71a: 1c8e adds r6, r1, #2 a71c: 61a6 str r6, [r4, #24] fs->volbase = bsect; /* Volume start sector */ a71e: f8c4 9020 str.w r9, [r4, #32] fs->fatbase = bsect + nrsv; /* FAT start sector */ a722: 444a add r2, r9 a724: 6262 str r2, [r4, #36] ; 0x24 fs->database = bsect + sysect; /* Data start sector */ a726: 444b add r3, r9 a728: 62e3 str r3, [r4, #44] ; 0x2c if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ if (fs->n_rootdir != 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ } else { if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ a72a: f1bb 0f00 cmp.w fp, #0 a72e: d072 beq.n a816 fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ a730: 4462 add r2, ip a732: 62a2 str r2, [r4, #40] ; 0x28 if (nclst <= MAX_FAT12) fmt = FS_FAT12; a734: f04f 0801 mov.w r8, #1 szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); a738: eb06 0246 add.w r2, r6, r6, lsl #1 a73c: f006 0301 and.w r3, r6, #1 a740: eb03 0352 add.w r3, r3, r2, lsr #1 } if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ a744: f203 13ff addw r3, r3, #511 ; 0x1ff a748: ebb5 2f53 cmp.w r5, r3, lsr #9 a74c: d361 bcc.n a812 #if !FF_FS_READONLY /* Get FSInfo if available */ fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ a74e: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff a752: 6163 str r3, [r4, #20] a754: 6123 str r3, [r4, #16] fs->fsi_flag = 0x80; a756: 2380 movs r3, #128 ; 0x80 a758: 7123 strb r3, [r4, #4] } #endif /* (FF_FS_NOFSINFO & 3) != 3 */ #endif /* !FF_FS_READONLY */ } fs->fs_type = (BYTE)fmt;/* FAT sub-type */ a75a: f884 8000 strb.w r8, [r4] fs->id = ++Fsid; /* Volume mount ID */ a75e: 4a65 ldr r2, [pc, #404] ; (a8f4 ) a760: 8813 ldrh r3, [r2, #0] a762: 3301 adds r3, #1 a764: b29b uxth r3, r3 a766: 8013 strh r3, [r2, #0] a768: 80e3 strh r3, [r4, #6] #if FF_USE_LFN == 1 fs->lfnbuf = LfnBuf; /* Static LFN working buffer */ a76a: 4b63 ldr r3, [pc, #396] ; (a8f8 ) a76c: 60e3 str r3, [r4, #12] fs->cdir = 0; /* Initialize current directory */ #endif #if FF_FS_LOCK != 0 /* Clear file lock semaphores */ clear_lock(fs); #endif return FR_OK; a76e: 463d mov r5, r7 a770: e02b b.n a7ca a772: f504 75fd add.w r5, r4, #506 ; 0x1fa a776: 466e mov r6, sp a778: f204 293a addw r9, r4, #570 ; 0x23a if (fmt != 2 && (fmt >= 3 || part == 0)) return fmt; /* Returns if it is a FAT VBR as auto scan, not a BS or disk error */ a77c: 46b0 mov r8, r6 mbr_pt[i] = ld_dword(fs->win + MBR_Table + i * SZ_PTE + PTE_StLba); a77e: 4628 mov r0, r5 a780: f006 fa1c bl 10bbc a784: f848 0b04 str.w r0, [r8], #4 a788: 3510 adds r5, #16 for (i = 0; i < 4; i++) { /* Load partition offset in the MBR */ a78a: 454d cmp r5, r9 a78c: d1f7 bne.n a77e a78e: f106 0810 add.w r8, r6, #16 fmt = mbr_pt[i] ? check_fs(fs, mbr_pt[i]) : 3; /* Check if the partition is FAT */ a792: 2503 movs r5, #3 a794: e008 b.n a7a8 a796: 4620 mov r0, r4 a798: f7ff fe90 bl a4bc } while (part == 0 && fmt >= 2 && ++i < 4); a79c: 2801 cmp r0, #1 a79e: f67f af47 bls.w a630 a7a2: 4546 cmp r6, r8 a7a4: f43f af3e beq.w a624 fmt = mbr_pt[i] ? check_fs(fs, mbr_pt[i]) : 3; /* Check if the partition is FAT */ a7a8: f856 1b04 ldr.w r1, [r6], #4 a7ac: 2900 cmp r1, #0 a7ae: d1f2 bne.n a796 a7b0: 4628 mov r0, r5 a7b2: e7f6 b.n a7a2 if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ a7b4: f1bb 0f00 cmp.w fp, #0 a7b8: d029 beq.n a80e fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ a7ba: 4462 add r2, ip a7bc: 62a2 str r2, [r4, #40] ; 0x28 fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); a7be: f1b8 0f02 cmp.w r8, #2 a7c2: d1b9 bne.n a738 a7c4: 0073 lsls r3, r6, #1 a7c6: e7bd b.n a744 if (vol < 0) return FR_INVALID_DRIVE; a7c8: 250b movs r5, #11 } a7ca: 4628 mov r0, r5 a7cc: b005 add sp, #20 a7ce: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} if (!fs) return FR_NOT_ENABLED; /* Is the filesystem object available? */ a7d2: 250c movs r5, #12 a7d4: e7f9 b.n a7ca return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ a7d6: 2503 movs r5, #3 a7d8: e7f7 b.n a7ca return FR_WRITE_PROTECTED; a7da: 250a movs r5, #10 a7dc: e7f5 b.n a7ca if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ a7de: 2501 movs r5, #1 a7e0: e7f3 b.n a7ca if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ a7e2: 250d movs r5, #13 a7e4: e7f1 b.n a7ca if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ a7e6: 250d movs r5, #13 a7e8: e7ef b.n a7ca if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ a7ea: 250d movs r5, #13 a7ec: e7ed b.n a7ca if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ a7ee: 250d movs r5, #13 a7f0: e7eb b.n a7ca a7f2: 250d movs r5, #13 a7f4: e7e9 b.n a7ca if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ a7f6: 250d movs r5, #13 a7f8: e7e7 b.n a7ca if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ a7fa: 250d movs r5, #13 a7fc: e7e5 b.n a7ca if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ a7fe: 250d movs r5, #13 a800: e7e3 b.n a7ca if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ a802: 250d movs r5, #13 a804: e7e1 b.n a7ca if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ a806: 250d movs r5, #13 a808: e7df b.n a7ca if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ a80a: 250d movs r5, #13 a80c: e7dd b.n a7ca if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ a80e: 250d movs r5, #13 a810: e7db b.n a7ca if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ a812: 250d movs r5, #13 a814: e7d9 b.n a7ca if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ a816: 250d movs r5, #13 a818: e7d7 b.n a7ca if (fmt == 0) return FR_NO_FILESYSTEM; a81a: 250d movs r5, #13 a81c: e7d5 b.n a7ca fmt = 0; a81e: f04f 0800 mov.w r8, #0 if (fmt == 0) return FR_NO_FILESYSTEM; a822: f1b8 0f00 cmp.w r8, #0 a826: d0f8 beq.n a81a fs->n_fatent = nclst + 2; /* Number of FAT entries */ a828: 1c8e adds r6, r1, #2 a82a: 61a6 str r6, [r4, #24] fs->volbase = bsect; /* Volume start sector */ a82c: f8c4 9020 str.w r9, [r4, #32] fs->fatbase = bsect + nrsv; /* FAT start sector */ a830: 444a add r2, r9 a832: 6262 str r2, [r4, #36] ; 0x24 fs->database = bsect + sysect; /* Data start sector */ a834: 444b add r3, r9 a836: 62e3 str r3, [r4, #44] ; 0x2c if (fmt == FS_FAT32) { a838: f1b8 0f03 cmp.w r8, #3 a83c: d1ba bne.n a7b4 rv = rv << 8 | ptr[0]; a83e: f894 205f ldrb.w r2, [r4, #95] ; 0x5f a842: f894 305e ldrb.w r3, [r4, #94] ; 0x5e a846: ea43 2302 orr.w r3, r3, r2, lsl #8 if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ a84a: fa1f fa8a uxth.w sl, sl a84e: ea5a 0303 orrs.w r3, sl, r3 a852: d1d8 bne.n a806 fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ a854: f104 0060 add.w r0, r4, #96 ; 0x60 a858: f006 f9b0 bl 10bbc a85c: 62a0 str r0, [r4, #40] ; 0x28 szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ a85e: 00b3 lsls r3, r6, #2 if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ a860: f203 13ff addw r3, r3, #511 ; 0x1ff a864: ebb5 2f53 cmp.w r5, r3, lsr #9 a868: d3cf bcc.n a80a fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ a86a: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff a86e: 6163 str r3, [r4, #20] a870: 6123 str r3, [r4, #16] fs->fsi_flag = 0x80; a872: 2380 movs r3, #128 ; 0x80 a874: 7123 strb r3, [r4, #4] rv = rv << 8 | ptr[0]; a876: f894 2065 ldrb.w r2, [r4, #101] ; 0x65 a87a: f894 3064 ldrb.w r3, [r4, #100] ; 0x64 a87e: ea43 2302 orr.w r3, r3, r2, lsl #8 && ld_word(fs->win + BPB_FSInfo32) == 1 a882: b21b sxth r3, r3 a884: 2b01 cmp r3, #1 a886: f47f af68 bne.w a75a && move_window(fs, bsect + 1) == FR_OK) a88a: f109 0101 add.w r1, r9, #1 a88e: 4620 mov r0, r4 a890: f006 fa3a bl 10d08 a894: 2800 cmp r0, #0 a896: f47f af60 bne.w a75a fs->fsi_flag = 0; a89a: 2300 movs r3, #0 a89c: 7123 strb r3, [r4, #4] rv = rv << 8 | ptr[0]; a89e: f894 2233 ldrb.w r2, [r4, #563] ; 0x233 a8a2: f894 3232 ldrb.w r3, [r4, #562] ; 0x232 a8a6: ea43 2302 orr.w r3, r3, r2, lsl #8 if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSInfo data if available */ a8aa: b21b sxth r3, r3 a8ac: 4a13 ldr r2, [pc, #76] ; (a8fc ) a8ae: 4293 cmp r3, r2 a8b0: f47f af53 bne.w a75a && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 a8b4: f104 0034 add.w r0, r4, #52 ; 0x34 a8b8: f006 f980 bl 10bbc a8bc: 4b10 ldr r3, [pc, #64] ; (a900 ) a8be: 4298 cmp r0, r3 a8c0: f47f af4b bne.w a75a && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) a8c4: f504 7006 add.w r0, r4, #536 ; 0x218 a8c8: f006 f978 bl 10bbc a8cc: 4b0d ldr r3, [pc, #52] ; (a904 ) a8ce: 4298 cmp r0, r3 a8d0: f47f af43 bne.w a75a fs->free_clst = ld_dword(fs->win + FSI_Free_Count); a8d4: f504 7007 add.w r0, r4, #540 ; 0x21c a8d8: f006 f970 bl 10bbc a8dc: 6160 str r0, [r4, #20] fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); a8de: f504 7008 add.w r0, r4, #544 ; 0x220 a8e2: f006 f96b bl 10bbc a8e6: 6120 str r0, [r4, #16] a8e8: e737 b.n a75a a8ea: bf00 nop a8ec: 200009a4 .word 0x200009a4 a8f0: 0ffffff5 .word 0x0ffffff5 a8f4: 200012e8 .word 0x200012e8 a8f8: 200009a8 .word 0x200009a8 a8fc: ffffaa55 .word 0xffffaa55 a900: 41615252 .word 0x41615252 a904: 61417272 .word 0x61417272 0000a908 : { a908: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} a90c: b083 sub sp, #12 a90e: 4604 mov r4, r0 a910: 4689 mov r9, r1 FATFS *fs = dp->obj.fs; a912: 6807 ldr r7, [r0, #0] BYTE ord = 0xFF, sum = 0xFF; a914: f04f 0aff mov.w sl, #255 ; 0xff a918: 4655 mov r5, sl FRESULT res = FR_NO_FILE; a91a: 2604 movs r6, #4 ord = 0xFF; a91c: 46d0 mov r8, sl if (uc != 0xFFFF) return 0; /* Check filler */ a91e: f64f 7bff movw fp, #65535 ; 0xffff while (dp->sect) { a922: e064 b.n a9ee if (attr == AM_LFN) { /* An LFN entry is found */ a924: 2a0f cmp r2, #15 a926: d150 bne.n a9ca if (b & LLEF) { /* Is it start of an LFN sequence? */ a928: f013 0f40 tst.w r3, #64 ; 0x40 a92c: d00a beq.n a944 sum = dp->dir[LDIR_Chksum]; a92e: f890 a00d ldrb.w sl, [r0, #13] b &= (BYTE)~LLEF; ord = b; a932: f003 03bf and.w r3, r3, #191 ; 0xbf dp->blk_ofs = dp->dptr; a936: 6922 ldr r2, [r4, #16] a938: 62e2 str r2, [r4, #44] ; 0x2c ord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a93a: 7b42 ldrb r2, [r0, #13] a93c: 4552 cmp r2, sl a93e: d006 beq.n a94e a940: 4645 mov r5, r8 a942: e04e b.n a9e2 a944: 429d cmp r5, r3 a946: bf18 it ne a948: 4645 movne r5, r8 a94a: d14a bne.n a9e2 a94c: e7f5 b.n a93a rv = rv << 8 | ptr[0]; a94e: 7ec1 ldrb r1, [r0, #27] a950: 7e82 ldrb r2, [r0, #26] if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO is 0 */ a952: ea52 2201 orrs.w r2, r2, r1, lsl #8 a956: d16f bne.n aa38 ord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a958: 68fe ldr r6, [r7, #12] a95a: 9601 str r6, [sp, #4] i = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13; /* Offset in the LFN buffer */ a95c: 7805 ldrb r5, [r0, #0] a95e: f025 0540 bic.w r5, r5, #64 ; 0x40 a962: 3d01 subs r5, #1 a964: eb05 0245 add.w r2, r5, r5, lsl #1 a968: eb05 0582 add.w r5, r5, r2, lsl #2 for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ a96c: 4933 ldr r1, [pc, #204] ; (aa3c ) a96e: f101 0e0d add.w lr, r1, #13 a972: f04f 0c01 mov.w ip, #1 a976: 9300 str r3, [sp, #0] a978: 4663 mov r3, ip a97a: 46b4 mov ip, r6 a97c: e003 b.n a986 if (uc != 0xFFFF) return 0; /* Check filler */ a97e: 455a cmp r2, fp a980: d15a bne.n aa38 for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ a982: 4571 cmp r1, lr a984: d00f beq.n a9a6 uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ a986: f811 2b01 ldrb.w r2, [r1], #1 a98a: 1886 adds r6, r0, r2 rv = rv << 8 | ptr[0]; a98c: 7876 ldrb r6, [r6, #1] a98e: 5c82 ldrb r2, [r0, r2] a990: ea42 2206 orr.w r2, r2, r6, lsl #8 if (wc != 0) { a994: 2b00 cmp r3, #0 a996: d0f2 beq.n a97e if (i >= FF_MAX_LFN + 1) return 0; /* Buffer overflow? */ a998: 2dff cmp r5, #255 ; 0xff a99a: d84d bhi.n aa38 lfnbuf[i++] = wc = uc; /* Store it */ a99c: f82c 2015 strh.w r2, [ip, r5, lsl #1] a9a0: 4613 mov r3, r2 a9a2: 3501 adds r5, #1 a9a4: e7ed b.n a982 a9a6: 469c mov ip, r3 a9a8: 9b00 ldr r3, [sp, #0] if (dir[LDIR_Ord] & LLEF && wc != 0) { /* Put terminator if it is the last LFN part and not terminated */ a9aa: 7802 ldrb r2, [r0, #0] a9ac: f012 0f40 tst.w r2, #64 ; 0x40 a9b0: d008 beq.n a9c4 a9b2: f1bc 0f00 cmp.w ip, #0 a9b6: d005 beq.n a9c4 if (i >= FF_MAX_LFN + 1) return 0; /* Buffer overflow? */ a9b8: 2dff cmp r5, #255 ; 0xff a9ba: d83d bhi.n aa38 lfnbuf[i] = 0; a9bc: 2200 movs r2, #0 a9be: 9901 ldr r1, [sp, #4] a9c0: f821 2015 strh.w r2, [r1, r5, lsl #1] ord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; a9c4: 3b01 subs r3, #1 a9c6: b2dd uxtb r5, r3 a9c8: e00b b.n a9e2 if (ord != 0 || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ a9ca: b91d cbnz r5, a9d4 a9cc: f006 f91c bl 10c08 a9d0: 4550 cmp r0, sl a9d2: d02d beq.n aa30 dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ a9d4: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff a9d8: 62e3 str r3, [r4, #44] ; 0x2c a9da: e029 b.n aa30 ord = 0xFF; a9dc: 4645 mov r5, r8 a9de: e000 b.n a9e2 a9e0: 4645 mov r5, r8 res = dir_next(dp, 0); /* Next entry */ a9e2: 2100 movs r1, #0 a9e4: 4620 mov r0, r4 a9e6: f006 fd42 bl 1146e if (res != FR_OK) break; a9ea: 4606 mov r6, r0 a9ec: b9f0 cbnz r0, aa2c while (dp->sect) { a9ee: 69a1 ldr r1, [r4, #24] a9f0: b1c9 cbz r1, aa26 res = move_window(fs, dp->sect); a9f2: 4638 mov r0, r7 a9f4: f006 f988 bl 10d08 if (res != FR_OK) break; a9f8: 4606 mov r6, r0 a9fa: b9b8 cbnz r0, aa2c b = dp->dir[DIR_Name]; /* Test for the entry type */ a9fc: 69e0 ldr r0, [r4, #28] a9fe: 7803 ldrb r3, [r0, #0] if (b == 0) { aa00: b19b cbz r3, aa2a dp->obj.attr = attr = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ aa02: 7ac2 ldrb r2, [r0, #11] aa04: f002 023f and.w r2, r2, #63 ; 0x3f aa08: 71a2 strb r2, [r4, #6] if (b == DDEM || b == '.' || (int)((attr & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ aa0a: 2be5 cmp r3, #229 ; 0xe5 aa0c: d0e6 beq.n a9dc aa0e: 2b2e cmp r3, #46 ; 0x2e aa10: d0e6 beq.n a9e0 aa12: f022 0120 bic.w r1, r2, #32 aa16: 2908 cmp r1, #8 aa18: bf14 ite ne aa1a: 2100 movne r1, #0 aa1c: 2101 moveq r1, #1 aa1e: 4549 cmp r1, r9 aa20: d080 beq.n a924 ord = 0xFF; aa22: 4645 mov r5, r8 aa24: e7dd b.n a9e2 if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ aa26: b11e cbz r6, aa30 aa28: e000 b.n aa2c res = FR_NO_FILE; break; /* Reached to end of the directory */ aa2a: 2604 movs r6, #4 if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ aa2c: 2300 movs r3, #0 aa2e: 61a3 str r3, [r4, #24] } aa30: 4630 mov r0, r6 aa32: b003 add sp, #12 aa34: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} ord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; aa38: 4645 mov r5, r8 aa3a: e7d2 b.n a9e2 aa3c: 00012628 .word 0x00012628 0000aa40 : { aa40: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} aa44: b087 sub sp, #28 aa46: 4681 mov r9, r0 FATFS *fs = dp->obj.fs; aa48: 6803 ldr r3, [r0, #0] aa4a: 9303 str r3, [sp, #12] while (*path == '/' || *path == '\\') path++; /* Strip heading separator */ aa4c: 460a mov r2, r1 aa4e: f811 3b01 ldrb.w r3, [r1], #1 aa52: 2b2f cmp r3, #47 ; 0x2f aa54: d0fa beq.n aa4c aa56: 2b5c cmp r3, #92 ; 0x5c aa58: d0f8 beq.n aa4c aa5a: 9202 str r2, [sp, #8] dp->obj.sclust = 0; /* Start from root directory */ aa5c: 2300 movs r3, #0 aa5e: f8c9 3008 str.w r3, [r9, #8] if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ aa62: 7813 ldrb r3, [r2, #0] aa64: 2b1f cmp r3, #31 aa66: f200 811b bhi.w aca0 dp->fn[NSFLAG] = NS_NONAME; aa6a: 2380 movs r3, #128 ; 0x80 aa6c: f889 302b strb.w r3, [r9, #43] ; 0x2b res = dir_sdi(dp, 0); aa70: 2100 movs r1, #0 aa72: 4648 mov r0, r9 aa74: f006 fbca bl 1120c aa78: 4602 mov r2, r0 } aa7a: 4610 mov r0, r2 aa7c: b007 add sp, #28 aa7e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} wc = (WCHAR)uc; aa82: b283 uxth r3, r0 if (wc < ' ' || wc == '/' || wc == '\\') break; /* Break if end of the path or a separator is found */ aa84: 2b1f cmp r3, #31 aa86: d937 bls.n aaf8 aa88: 2b2f cmp r3, #47 ; 0x2f aa8a: d028 beq.n aade aa8c: 2b5c cmp r3, #92 ; 0x5c aa8e: d026 beq.n aade if (wc < 0x80 && chk_chr("\"*:<>\?|\x7F", wc)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ aa90: 2b7f cmp r3, #127 ; 0x7f aa92: d914 bls.n aabe if (di >= FF_MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ aa94: 2cfe cmp r4, #254 ; 0xfe aa96: f200 809c bhi.w abd2 lfn[di++] = wc; /* Store the Unicode character */ aa9a: f826 3014 strh.w r3, [r6, r4, lsl #1] aa9e: 3401 adds r4, #1 uc = tchar2uni(&p); /* Get a character */ aaa0: a805 add r0, sp, #20 aaa2: f006 f97d bl 10da0 if (uc == 0xFFFFFFFF) return FR_INVALID_NAME; /* Invalid code or UTF decode error */ aaa6: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff aaaa: f000 8092 beq.w abd2 if (uc >= 0x10000) lfn[di++] = (WCHAR)(uc >> 16); /* Store high surrogate if needed */ aaae: f5b0 3f80 cmp.w r0, #65536 ; 0x10000 aab2: d3e6 bcc.n aa82 aab4: 0c03 lsrs r3, r0, #16 aab6: f826 3014 strh.w r3, [r6, r4, lsl #1] aaba: 3401 adds r4, #1 aabc: e7e1 b.n aa82 aabe: 4618 mov r0, r3 while (*str && *str != chr) str++; aac0: 2b22 cmp r3, #34 ; 0x22 aac2: f000 8086 beq.w abd2 aac6: 222a movs r2, #42 ; 0x2a aac8: 49a3 ldr r1, [pc, #652] ; (ad58 ) aaca: 4290 cmp r0, r2 aacc: f000 8081 beq.w abd2 aad0: f811 2f01 ldrb.w r2, [r1, #1]! aad4: 2a00 cmp r2, #0 aad6: d1f8 bne.n aaca aad8: e7dc b.n aa94 while (*p == '/' || *p == '\\') p++; /* Skip duplicated separators if exist */ aada: 3301 adds r3, #1 aadc: 9305 str r3, [sp, #20] aade: 9b05 ldr r3, [sp, #20] aae0: 781a ldrb r2, [r3, #0] aae2: 2a2f cmp r2, #47 ; 0x2f aae4: d0f9 beq.n aada aae6: 2a5c cmp r2, #92 ; 0x5c aae8: d0f7 beq.n aada cf = 0; /* Next segment follows */ aaea: 2500 movs r5, #0 while (di) { /* Snip off trailing spaces and dots if exist */ aaec: 2c00 cmp r4, #0 aaee: f000 8130 beq.w ad52 aaf2: eb06 0244 add.w r2, r6, r4, lsl #1 aaf6: e003 b.n ab00 cf = NS_LAST; /* Set last segment flag */ aaf8: 2504 movs r5, #4 aafa: e7f7 b.n aaec while (di) { /* Snip off trailing spaces and dots if exist */ aafc: 3c01 subs r4, #1 aafe: d064 beq.n abca wc = lfn[di - 1]; ab00: f832 3d02 ldrh.w r3, [r2, #-2]! if (wc != ' ' && wc != '.') break; ab04: 2b20 cmp r3, #32 ab06: d0f9 beq.n aafc ab08: 2b2e cmp r3, #46 ; 0x2e ab0a: d0f7 beq.n aafc *path = p; /* Return pointer to the next segment */ ab0c: 9b05 ldr r3, [sp, #20] ab0e: 9302 str r3, [sp, #8] lfn[di] = 0; /* LFN is created into the working buffer */ ab10: 0061 lsls r1, r4, #1 ab12: 2300 movs r3, #0 ab14: f826 3014 strh.w r3, [r6, r4, lsl #1] if (di == 0) return FR_INVALID_NAME; /* Reject null name */ ab18: 2c00 cmp r4, #0 ab1a: d05a beq.n abd2 for (si = 0; lfn[si] == ' '; si++) ; /* Remove leading spaces */ ab1c: 8833 ldrh r3, [r6, #0] ab1e: 2b20 cmp r3, #32 ab20: d159 bne.n abd6 ab22: 4632 mov r2, r6 ab24: 2700 movs r7, #0 ab26: 3701 adds r7, #1 ab28: f832 3f02 ldrh.w r3, [r2, #2]! ab2c: 2b20 cmp r3, #32 ab2e: d0fa beq.n ab26 if (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN; /* Is there any leading space or dot? */ ab30: 2f00 cmp r7, #0 ab32: d051 beq.n abd8 ab34: f045 0503 orr.w r5, r5, #3 ab38: b2ed uxtb r5, r5 while (di > 0 && lfn[di - 1] != '.') di--; /* Find last dot (di<=si: no extension) */ ab3a: 1e8a subs r2, r1, #2 ab3c: 18b3 adds r3, r6, r2 ab3e: 5ab2 ldrh r2, [r6, r2] ab40: 2a2e cmp r2, #46 ; 0x2e ab42: d005 beq.n ab50 ab44: 3c01 subs r4, #1 ab46: d003 beq.n ab50 ab48: f833 2d02 ldrh.w r2, [r3, #-2]! ab4c: 2a2e cmp r2, #46 ; 0x2e ab4e: d1f9 bne.n ab44 mem_set(dp->fn, ' ', 11); ab50: 220b movs r2, #11 ab52: 2120 movs r1, #32 ab54: eb09 0001 add.w r0, r9, r1 ab58: f006 f845 bl 10be6 i = b = 0; ni = 8; ab5c: f04f 0b08 mov.w fp, #8 ab60: 2300 movs r3, #0 ab62: 9301 str r3, [sp, #4] ab64: 469a mov sl, r3 wc = lfn[si++]; /* Get an LFN character */ ab66: f107 0801 add.w r8, r7, #1 ab6a: f836 0017 ldrh.w r0, [r6, r7, lsl #1] if (wc == 0) break; /* Break on end of the LFN */ ab6e: 2800 cmp r0, #0 ab70: d052 beq.n ac18 if (wc == ' ' || (wc == '.' && si != di)) { /* Remove embedded spaces and dots */ ab72: 2820 cmp r0, #32 ab74: d042 beq.n abfc ab76: 282e cmp r0, #46 ; 0x2e ab78: d031 beq.n abde if (i >= ni || si == di) { /* End of field? */ ab7a: 9b01 ldr r3, [sp, #4] ab7c: 455b cmp r3, fp ab7e: d242 bcs.n ac06 ab80: 45a0 cmp r8, r4 ab82: d02e beq.n abe2 if (wc >= 0x80) { /* Is this a non-ASCII character? */ ab84: 287f cmp r0, #127 ; 0x7f ab86: f200 809f bhi.w acc8 while (*str && *str != chr) str++; ab8a: 282b cmp r0, #43 ; 0x2b ab8c: bf08 it eq ab8e: 462f moveq r7, r5 ab90: f000 80a9 beq.w ace6 ab94: 232c movs r3, #44 ; 0x2c ab96: 4a71 ldr r2, [pc, #452] ; (ad5c ) ab98: b29b uxth r3, r3 ab9a: 4283 cmp r3, r0 ab9c: f000 80c7 beq.w ad2e aba0: f812 3f01 ldrb.w r3, [r2, #1]! aba4: 2b00 cmp r3, #0 aba6: d1f7 bne.n ab98 if (IsUpper(wc)) { /* ASCII upper case? */ aba8: f1a0 0341 sub.w r3, r0, #65 ; 0x41 abac: b29b uxth r3, r3 abae: 2b19 cmp r3, #25 abb0: f240 80bf bls.w ad32 if (IsLower(wc)) { /* ASCII lower case? */ abb4: f1a0 0361 sub.w r3, r0, #97 ; 0x61 abb8: b29b uxth r3, r3 abba: 2b19 cmp r3, #25 b |= 1; wc -= 0x20; abbc: bf9e ittt ls abbe: f04a 0a01 orrls.w sl, sl, #1 abc2: 3820 subls r0, #32 abc4: b280 uxthls r0, r0 if (IsLower(wc)) { /* ASCII lower case? */ abc6: 9b01 ldr r3, [sp, #4] abc8: e092 b.n acf0 abca: 46b3 mov fp, r6 lfn[di] = 0; /* LFN is created into the working buffer */ abcc: 2300 movs r3, #0 abce: f8ab 3000 strh.w r3, [fp] if (res != FR_OK) break; abd2: 2206 movs r2, #6 return res; abd4: e751 b.n aa7a for (si = 0; lfn[si] == ' '; si++) ; /* Remove leading spaces */ abd6: 2700 movs r7, #0 if (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN; /* Is there any leading space or dot? */ abd8: 2b2e cmp r3, #46 ; 0x2e abda: d1ae bne.n ab3a abdc: e7aa b.n ab34 if (wc == ' ' || (wc == '.' && si != di)) { /* Remove embedded spaces and dots */ abde: 45a0 cmp r8, r4 abe0: d10c bne.n abfc if (ni == 11) { /* Name extension overflow? */ abe2: f1bb 0f0b cmp.w fp, #11 abe6: d062 beq.n acae si = di; i = 8; ni = 11; b <<= 2; /* Enter name extension */ abe8: ea4f 0a8a mov.w sl, sl, lsl #2 abec: fa5f fa8a uxtb.w sl, sl abf0: 4627 mov r7, r4 abf2: f04f 0b0b mov.w fp, #11 abf6: 2308 movs r3, #8 abf8: 9301 str r3, [sp, #4] abfa: e7b4 b.n ab66 cf |= NS_LOSS | NS_LFN; abfc: f045 0503 orr.w r5, r5, #3 ac00: b2ed uxtb r5, r5 wc = lfn[si++]; /* Get an LFN character */ ac02: 4647 mov r7, r8 ac04: e7af b.n ab66 if (ni == 11) { /* Name extension overflow? */ ac06: f1bb 0f0b cmp.w fp, #11 ac0a: d050 beq.n acae if (si != di) cf |= NS_LOSS | NS_LFN; /* Name body overflow? */ ac0c: 45a0 cmp r8, r4 ac0e: d0eb beq.n abe8 ac10: f045 0503 orr.w r5, r5, #3 ac14: b2ed uxtb r5, r5 if (si > di) break; /* No name extension? */ ac16: d9e7 bls.n abe8 if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ ac18: f899 3020 ldrb.w r3, [r9, #32] ac1c: 2be5 cmp r3, #229 ; 0xe5 ac1e: d04f beq.n acc0 if (ni == 8) b <<= 2; /* Shift capital flags if no extension */ ac20: f1bb 0f08 cmp.w fp, #8 ac24: bf04 itt eq ac26: ea4f 0a8a moveq.w sl, sl, lsl #2 ac2a: fa5f fa8a uxtbeq.w sl, sl if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* LFN entry needs to be created if composite capitals */ ac2e: f00a 030c and.w r3, sl, #12 ac32: 2b0c cmp r3, #12 ac34: d003 beq.n ac3e ac36: f00a 0303 and.w r3, sl, #3 ac3a: 2b03 cmp r3, #3 ac3c: d102 bne.n ac44 ac3e: f045 0502 orr.w r5, r5, #2 ac42: b2ed uxtb r5, r5 if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ ac44: f015 0f02 tst.w r5, #2 ac48: d10b bne.n ac62 if (b & 0x01) cf |= NS_EXT; /* NT flag (Extension has small capital letters only) */ ac4a: f01a 0f01 tst.w sl, #1 ac4e: bf1c itt ne ac50: f045 0510 orrne.w r5, r5, #16 ac54: b2ed uxtbne r5, r5 if (b & 0x04) cf |= NS_BODY; /* NT flag (Body has small capital letters only) */ ac56: f01a 0f04 tst.w sl, #4 ac5a: bf1c itt ne ac5c: f045 0508 orrne.w r5, r5, #8 ac60: b2ed uxtbne r5, r5 dp->fn[NSFLAG] = cf; /* SFN is created into dp->fn[] */ ac62: f889 502b strb.w r5, [r9, #43] ; 0x2b res = dir_find(dp); /* Find an object with the segment name */ ac66: 4648 mov r0, r9 ac68: f7ff f9e0 bl a02c ns = dp->fn[NSFLAG]; ac6c: f899 302b ldrb.w r3, [r9, #43] ; 0x2b if (res != FR_OK) { /* Failed to find the object */ ac70: 4602 mov r2, r0 ac72: 2800 cmp r0, #0 ac74: d161 bne.n ad3a if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ ac76: f013 0f04 tst.w r3, #4 ac7a: f47f aefe bne.w aa7a if (!(dp->obj.attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ ac7e: f899 3006 ldrb.w r3, [r9, #6] ac82: f013 0f10 tst.w r3, #16 ac86: d062 beq.n ad4e dp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs)); /* Open next directory */ ac88: 9803 ldr r0, [sp, #12] ac8a: f100 0134 add.w r1, r0, #52 ; 0x34 ac8e: f8d9 3010 ldr.w r3, [r9, #16] ac92: f3c3 0308 ubfx r3, r3, #0, #9 ac96: 4419 add r1, r3 ac98: f006 fc77 bl 1158a ac9c: f8c9 0008 str.w r0, [r9, #8] p = *path; lfn = dp->obj.fs->lfnbuf; di = 0; aca0: 9b02 ldr r3, [sp, #8] aca2: 9305 str r3, [sp, #20] aca4: f8d9 3000 ldr.w r3, [r9] aca8: 68de ldr r6, [r3, #12] acaa: 2400 movs r4, #0 acac: e6f8 b.n aaa0 cf |= NS_LOSS | NS_LFN; acae: f045 0503 orr.w r5, r5, #3 acb2: b2ed uxtb r5, r5 if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ acb4: f899 3020 ldrb.w r3, [r9, #32] acb8: 2be5 cmp r3, #229 ; 0xe5 acba: d1b8 bne.n ac2e acbc: f04f 0b0b mov.w fp, #11 acc0: 2305 movs r3, #5 acc2: f889 3020 strb.w r3, [r9, #32] acc6: e7ab b.n ac20 cf |= NS_LFN; /* LFN entry needs to be created */ acc8: f045 0702 orr.w r7, r5, #2 accc: b2ff uxtb r7, r7 wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ acce: f240 11b5 movw r1, #437 ; 0x1b5 acd2: f000 ff0b bl baec if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ acd6: f010 0f80 tst.w r0, #128 ; 0x80 acda: d010 beq.n acfe acdc: f000 007f and.w r0, r0, #127 ; 0x7f ace0: 4b1f ldr r3, [pc, #124] ; (ad60 ) ace2: 5c18 ldrb r0, [r3, r0] if (wc == 0 || chk_chr("+,;=[]", wc)) { /* Replace illegal characters for SFN if needed */ ace4: bb08 cbnz r0, ad2a wc = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ ace6: f047 0503 orr.w r5, r7, #3 acea: b2ed uxtb r5, r5 acec: 9b01 ldr r3, [sp, #4] acee: 205f movs r0, #95 ; 0x5f dp->fn[i++] = (BYTE)wc; acf0: 1c5a adds r2, r3, #1 acf2: 9201 str r2, [sp, #4] acf4: 444b add r3, r9 acf6: f883 0020 strb.w r0, [r3, #32] wc = lfn[si++]; /* Get an LFN character */ acfa: 4647 mov r7, r8 acfc: e733 b.n ab66 if (wc >= 0x100) { /* Is this a DBC? */ acfe: 28ff cmp r0, #255 ; 0xff ad00: d9f0 bls.n ace4 if (i >= ni - 1) { /* Field overflow? */ ad02: f10b 33ff add.w r3, fp, #4294967295 ; 0xffffffff ad06: 9a01 ldr r2, [sp, #4] ad08: 429a cmp r2, r3 ad0a: d207 bcs.n ad1c dp->fn[i++] = (BYTE)(wc >> 8); /* Put 1st byte */ ad0c: 9a01 ldr r2, [sp, #4] ad0e: 1c53 adds r3, r2, #1 ad10: 444a add r2, r9 ad12: 0a01 lsrs r1, r0, #8 ad14: f882 1020 strb.w r1, [r2, #32] ad18: 463d mov r5, r7 ad1a: e7e9 b.n acf0 cf |= NS_LOSS | NS_LFN; ad1c: f045 0503 orr.w r5, r5, #3 ad20: b2ed uxtb r5, r5 wc = lfn[si++]; /* Get an LFN character */ ad22: 4647 mov r7, r8 cf |= NS_LOSS | NS_LFN; ad24: f8cd b004 str.w fp, [sp, #4] ad28: e71d b.n ab66 if (wc == 0 || chk_chr("+,;=[]", wc)) { /* Replace illegal characters for SFN if needed */ ad2a: 463d mov r5, r7 ad2c: e72d b.n ab8a while (*str && *str != chr) str++; ad2e: 462f mov r7, r5 ad30: e7d9 b.n ace6 b |= 2; ad32: f04a 0a02 orr.w sl, sl, #2 ad36: 9b01 ldr r3, [sp, #4] ad38: e7da b.n acf0 if (res == FR_NO_FILE) { /* Object is not found */ ad3a: 2804 cmp r0, #4 ad3c: f47f ae9d bne.w aa7a if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ ad40: f003 0304 and.w r3, r3, #4 ad44: 2b00 cmp r3, #0 ad46: bf14 ite ne ad48: 4602 movne r2, r0 ad4a: 2205 moveq r2, #5 ad4c: e695 b.n aa7a res = FR_NO_PATH; break; ad4e: 2205 movs r2, #5 ad50: e693 b.n aa7a ad52: 46b3 mov fp, r6 ad54: e73a b.n abcc ad56: bf00 nop ad58: 000126bd .word 0x000126bd ad5c: 000126c9 .word 0x000126c9 ad60: 000125a8 .word 0x000125a8 0000ad64 : FRESULT f_mount ( FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/ const TCHAR* path, /* Logical drive number to be mounted/unmounted */ BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */ ) { ad64: b510 push {r4, lr} ad66: b084 sub sp, #16 ad68: 9001 str r0, [sp, #4] ad6a: 9100 str r1, [sp, #0] ad6c: 4614 mov r4, r2 FATFS *cfs; int vol; FRESULT res; const TCHAR *rp = path; ad6e: 9103 str r1, [sp, #12] /* Get logical drive number */ vol = get_ldnumber(&rp); ad70: a803 add r0, sp, #12 ad72: f005 ff58 bl 10c26 if (vol < 0) return FR_INVALID_DRIVE; ad76: 2800 cmp r0, #0 ad78: db17 blt.n adaa cfs = FatFs[vol]; /* Pointer to fs object */ ad7a: 4b0d ldr r3, [pc, #52] ; (adb0 ) ad7c: f853 3020 ldr.w r3, [r3, r0, lsl #2] if (cfs) { ad80: b10b cbz r3, ad86 clear_lock(cfs); #endif #if FF_FS_REENTRANT /* Discard sync object of the current volume */ if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; #endif cfs->fs_type = 0; /* Clear old fs object */ ad82: 2200 movs r2, #0 ad84: 701a strb r2, [r3, #0] } if (fs) { ad86: 9b01 ldr r3, [sp, #4] ad88: b10b cbz r3, ad8e fs->fs_type = 0; /* Clear new fs object */ ad8a: 2200 movs r2, #0 ad8c: 701a strb r2, [r3, #0] #if FF_FS_REENTRANT /* Create sync object for the new volume */ if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; #endif } FatFs[vol] = fs; /* Register new fs object */ ad8e: 4b08 ldr r3, [pc, #32] ; (adb0 ) ad90: 9a01 ldr r2, [sp, #4] ad92: f843 2020 str.w r2, [r3, r0, lsl #2] if (opt == 0) return FR_OK; /* Do not mount now, it will be mounted later */ ad96: b914 cbnz r4, ad9e ad98: 4620 mov r0, r4 res = mount_volume(&path, &fs, 0); /* Force mounted the volume */ LEAVE_FF(fs, res); } ad9a: b004 add sp, #16 ad9c: bd10 pop {r4, pc} res = mount_volume(&path, &fs, 0); /* Force mounted the volume */ ad9e: 2200 movs r2, #0 ada0: a901 add r1, sp, #4 ada2: 4668 mov r0, sp ada4: f7ff fc02 bl a5ac LEAVE_FF(fs, res); ada8: e7f7 b.n ad9a if (vol < 0) return FR_INVALID_DRIVE; adaa: 200b movs r0, #11 adac: e7f5 b.n ad9a adae: bf00 nop adb0: 200009a4 .word 0x200009a4 0000adb4 : /*-----------------------------------------------------------------------*/ FRESULT f_setlabel ( const TCHAR* label /* Volume label to set with heading logical drive number */ ) { adb4: b5f0 push {r4, r5, r6, r7, lr} adb6: b097 sub sp, #92 ; 0x5c adb8: 9001 str r0, [sp, #4] #if FF_USE_LFN DWORD dc; #endif /* Get logical drive */ res = mount_volume(&label, &fs, FA_WRITE); adba: 2202 movs r2, #2 adbc: a908 add r1, sp, #32 adbe: a801 add r0, sp, #4 adc0: f7ff fbf4 bl a5ac if (res != FR_OK) LEAVE_FF(fs, res); adc4: 4604 mov r4, r0 adc6: b980 cbnz r0, adea st_word(dirvn + di * 2, (WCHAR)dc); di++; } } else #endif { /* On the FAT/FAT32 volume */ mem_set(dirvn, ' ', 11); adc8: 220b movs r2, #11 adca: 2120 movs r1, #32 adcc: a802 add r0, sp, #8 adce: f005 ff0a bl 10be6 di = 0; while ((UINT)*label >= ' ') { /* Create volume label */ add2: 9b01 ldr r3, [sp, #4] add4: 781b ldrb r3, [r3, #0] add6: 2b1f cmp r3, #31 add8: d93e bls.n ae58 di = 0; adda: 2400 movs r4, #0 #if FF_USE_LFN dc = tchar2uni(&label); wc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0; addc: f240 16b5 movw r6, #437 ; 0x1b5 while (*str && *str != chr) str++; ade0: 4f52 ldr r7, [pc, #328] ; (af2c ) ade2: e087 b.n aef4 #elif FF_CODE_PAGE < 900 if (wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ #endif #endif if (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ LEAVE_FF(fs, FR_INVALID_NAME); ade4: 2406 movs r4, #6 ade6: e000 b.n adea ade8: 2406 movs r4, #6 } } } LEAVE_FF(fs, res); } adea: 4620 mov r0, r4 adec: b017 add sp, #92 ; 0x5c adee: bdf0 pop {r4, r5, r6, r7, pc} dirvn[di++] = (BYTE)wc; adf0: 4625 mov r5, r4 adf2: e038 b.n ae66 mem_cpy(dj.dir, dirvn, 11); /* Change the volume label */ adf4: 220b movs r2, #11 adf6: a902 add r1, sp, #8 adf8: 9810 ldr r0, [sp, #64] ; 0x40 adfa: f005 feea bl 10bd2 adfe: e047 b.n ae90 if (res == FR_NO_FILE) { ae00: 2804 cmp r0, #4 ae02: d001 beq.n ae08 res = DIR_READ_LABEL(&dj); /* Get volume label entry */ ae04: 4604 mov r4, r0 ae06: e7f0 b.n adea if (di != 0) { /* Create a volume label entry */ ae08: 2d00 cmp r5, #0 ae0a: d0ee beq.n adea res = dir_alloc(&dj, 1); /* Allocate an entry */ ae0c: 2101 movs r1, #1 ae0e: a809 add r0, sp, #36 ; 0x24 ae10: f006 fb91 bl 11536 if (res == FR_OK) { ae14: 4604 mov r4, r0 ae16: 2800 cmp r0, #0 ae18: d1e7 bne.n adea mem_set(dj.dir, 0, SZDIRE); /* Clean the entry */ ae1a: 2220 movs r2, #32 ae1c: 2100 movs r1, #0 ae1e: 9810 ldr r0, [sp, #64] ; 0x40 ae20: f005 fee1 bl 10be6 dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ ae24: 9b10 ldr r3, [sp, #64] ; 0x40 ae26: 2208 movs r2, #8 ae28: 72da strb r2, [r3, #11] mem_cpy(dj.dir, dirvn, 11); ae2a: 220b movs r2, #11 ae2c: a902 add r1, sp, #8 ae2e: 9810 ldr r0, [sp, #64] ; 0x40 ae30: f005 fecf bl 10bd2 fs->wflag = 1; ae34: 9b08 ldr r3, [sp, #32] ae36: 2201 movs r2, #1 ae38: 70da strb r2, [r3, #3] res = sync_fs(fs); ae3a: 9808 ldr r0, [sp, #32] ae3c: f005 ffc4 bl 10dc8 ae40: 4604 mov r4, r0 ae42: e7d2 b.n adea LEAVE_FF(fs, FR_INVALID_NAME); ae44: 2406 movs r4, #6 ae46: e7d0 b.n adea ae48: 2406 movs r4, #6 ae4a: e7ce b.n adea if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ ae4c: 2406 movs r4, #6 ae4e: e7cc b.n adea LEAVE_FF(fs, FR_INVALID_NAME); ae50: 2406 movs r4, #6 ae52: e7ca b.n adea ae54: 2406 movs r4, #6 ae56: e7c8 b.n adea if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ ae58: f89d 3008 ldrb.w r3, [sp, #8] ae5c: 2be5 cmp r3, #229 ; 0xe5 ae5e: d101 bne.n ae64 ae60: 2406 movs r4, #6 ae62: e7c2 b.n adea di = 0; ae64: 2500 movs r5, #0 dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ ae66: 9b08 ldr r3, [sp, #32] ae68: 9309 str r3, [sp, #36] ; 0x24 ae6a: 2100 movs r1, #0 ae6c: 910b str r1, [sp, #44] ; 0x2c res = dir_sdi(&dj, 0); ae6e: a809 add r0, sp, #36 ; 0x24 ae70: f006 f9cc bl 1120c if (res == FR_OK) { ae74: 4604 mov r4, r0 ae76: 2800 cmp r0, #0 ae78: d1b7 bne.n adea res = DIR_READ_LABEL(&dj); /* Get volume label entry */ ae7a: 2101 movs r1, #1 ae7c: a809 add r0, sp, #36 ; 0x24 ae7e: f7ff fd43 bl a908 if (res == FR_OK) { ae82: 2800 cmp r0, #0 ae84: d1bc bne.n ae00 if (di != 0) { ae86: 2d00 cmp r5, #0 ae88: d1b4 bne.n adf4 dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ ae8a: 9b10 ldr r3, [sp, #64] ; 0x40 ae8c: 22e5 movs r2, #229 ; 0xe5 ae8e: 701a strb r2, [r3, #0] fs->wflag = 1; ae90: 9b08 ldr r3, [sp, #32] ae92: 2201 movs r2, #1 ae94: 70da strb r2, [r3, #3] res = sync_fs(fs); ae96: 9808 ldr r0, [sp, #32] ae98: f005 ff96 bl 10dc8 ae9c: 4604 mov r4, r0 ae9e: e7a4 b.n adea if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ aea0: f89d 2008 ldrb.w r2, [sp, #8] aea4: 2ae5 cmp r2, #229 ; 0xe5 aea6: d0d1 beq.n ae4c while (di && dirvn[di - 1] == ' ') di--; /* Snip trailing spaces */ aea8: 2b20 cmp r3, #32 aeaa: d1a1 bne.n adf0 aeac: ab16 add r3, sp, #88 ; 0x58 aeae: 442b add r3, r5 aeb0: 3b51 subs r3, #81 ; 0x51 aeb2: 2d00 cmp r5, #0 aeb4: d0d7 beq.n ae66 aeb6: 1e69 subs r1, r5, #1 aeb8: f813 2901 ldrb.w r2, [r3], #-1 aebc: 2a20 cmp r2, #32 aebe: d1d2 bne.n ae66 aec0: 460d mov r5, r1 aec2: e7f6 b.n aeb2 if (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ aec4: 2c09 cmp r4, #9 aec6: d8c3 bhi.n ae50 if (wc >= 0x100) dirvn[di++] = (BYTE)(wc >> 8); aec8: 1c65 adds r5, r4, #1 aeca: aa16 add r2, sp, #88 ; 0x58 aecc: 4414 add r4, r2 aece: 0a1a lsrs r2, r3, #8 aed0: f804 2c50 strb.w r2, [r4, #-80] aed4: e004 b.n aee0 if (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ aed6: 2bff cmp r3, #255 ; 0xff aed8: d8f4 bhi.n aec4 aeda: 2c0a cmp r4, #10 aedc: d8ba bhi.n ae54 aede: 4625 mov r5, r4 dirvn[di++] = (BYTE)wc; aee0: 1c6c adds r4, r5, #1 aee2: b2db uxtb r3, r3 aee4: aa16 add r2, sp, #88 ; 0x58 aee6: 442a add r2, r5 aee8: f802 3c50 strb.w r3, [r2, #-80] while ((UINT)*label >= ' ') { /* Create volume label */ aeec: 9a01 ldr r2, [sp, #4] aeee: 7812 ldrb r2, [r2, #0] aef0: 2a1f cmp r2, #31 aef2: d9d5 bls.n aea0 dc = tchar2uni(&label); aef4: a801 add r0, sp, #4 aef6: f005 ff53 bl 10da0 wc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0; aefa: f5b0 3f80 cmp.w r0, #65536 ; 0x10000 aefe: d2a1 bcs.n ae44 af00: f000 fe2e bl bb60 af04: 4631 mov r1, r6 af06: f000 fdf1 bl baec if (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ af0a: 4603 mov r3, r0 af0c: 2800 cmp r0, #0 af0e: d09b beq.n ae48 while (*str && *str != chr) str++; af10: 282b cmp r0, #43 ; 0x2b af12: f43f af67 beq.w ade4 af16: 222e movs r2, #46 ; 0x2e af18: 1c79 adds r1, r7, #1 af1a: b292 uxth r2, r2 af1c: 4293 cmp r3, r2 af1e: f43f af63 beq.w ade8 af22: f811 2f01 ldrb.w r2, [r1, #1]! af26: 2a00 cmp r2, #0 af28: d1f7 bne.n af1a af2a: e7d4 b.n aed6 af2c: 00012638 .word 0x00012638 0000af30 : const TCHAR* path, /* Logical drive number */ const MKFS_PARM* opt, /* Format options */ void* work, /* Pointer to working buffer (null: use heap memory) */ UINT len /* Size of working buffer [byte] */ ) { af30: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} af34: b097 sub sp, #92 ; 0x5c af36: 900f str r0, [sp, #60] ; 0x3c af38: 460d mov r5, r1 af3a: 9202 str r2, [sp, #8] af3c: 9301 str r3, [sp, #4] DSTATUS ds; FRESULT fr; /* Check mounted drive and clear work area */ vol = get_ldnumber(&path); /* Get target logical drive */ af3e: a80f add r0, sp, #60 ; 0x3c af40: f005 fe71 bl 10c26 if (vol < 0) return FR_INVALID_DRIVE; af44: 2800 cmp r0, #0 af46: f2c0 83e5 blt.w b714 <_image_size+0x5a8> if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear the fs object if mounted */ af4a: 4ba8 ldr r3, [pc, #672] ; (b1ec <_image_size+0x80>) af4c: f853 3020 ldr.w r3, [r3, r0, lsl #2] af50: b10b cbz r3, af56 af52: 2200 movs r2, #0 af54: 701a strb r2, [r3, #0] pdrv = LD2PD(vol); /* Physical drive */ af56: b2c4 uxtb r4, r0 ipart = LD2PT(vol); /* Partition (0:create as new, 1..:get from partition table) */ if (!opt) opt = &defopt; /* Use default parameter if it is not given */ af58: 4ba5 ldr r3, [pc, #660] ; (b1f0 <_image_size+0x84>) af5a: 2d00 cmp r5, #0 af5c: bf08 it eq af5e: 461d moveq r5, r3 /* Get physical drive status (sz_drv, sz_blk, ss) */ ds = disk_initialize(pdrv); af60: 4620 mov r0, r4 af62: f005 fe0f bl 10b84 if (ds & STA_NOINIT) return FR_NOT_READY; af66: f010 0f01 tst.w r0, #1 af6a: f040 83d5 bne.w b718 <_image_size+0x5ac> if (ds & STA_PROTECT) return FR_WRITE_PROTECTED; af6e: f010 0f04 tst.w r0, #4 af72: f040 83d5 bne.w b720 <_image_size+0x5b4> sz_blk = opt->align; af76: 686b ldr r3, [r5, #4] af78: 9315 str r3, [sp, #84] ; 0x54 if (sz_blk == 0 && disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK) sz_blk = 1; af7a: 2b00 cmp r3, #0 af7c: d043 beq.n b006 if (sz_blk == 0 || sz_blk > 0x8000 || (sz_blk & (sz_blk - 1))) sz_blk = 1; af7e: 9a15 ldr r2, [sp, #84] ; 0x54 af80: 1e53 subs r3, r2, #1 af82: f5b3 4f00 cmp.w r3, #32768 ; 0x8000 af86: d348 bcc.n b01a af88: 2301 movs r3, #1 af8a: 9315 str r3, [sp, #84] ; 0x54 #else ss = FF_MAX_SS; #endif /* Options for FAT sub-type and FAT parameters */ fsopt = opt->fmt & (FM_ANY | FM_SFD); n_fat = (opt->n_fat >= 1 && opt->n_fat <= 2) ? opt->n_fat : 1; af8c: f895 8001 ldrb.w r8, [r5, #1] af90: f108 33ff add.w r3, r8, #4294967295 ; 0xffffffff af94: b2db uxtb r3, r3 af96: 2b02 cmp r3, #2 af98: bf28 it cs af9a: f04f 0801 movcs.w r8, #1 n_root = (opt->n_root >= 1 && opt->n_root <= 32768 && (opt->n_root % (ss / SZDIRE)) == 0) ? opt->n_root : 512; af9e: 68af ldr r7, [r5, #8] afa0: 1e7b subs r3, r7, #1 afa2: f5b3 4f00 cmp.w r3, #32768 ; 0x8000 afa6: d23b bcs.n b020 afa8: f007 030f and.w r3, r7, #15 afac: 2b00 cmp r3, #0 afae: bf18 it ne afb0: f44f 7700 movne.w r7, #512 ; 0x200 sz_au = (opt->au_size <= 0x1000000 && (opt->au_size & (opt->au_size - 1)) == 0) ? opt->au_size : 0; afb4: 68ee ldr r6, [r5, #12] afb6: f1b6 7f80 cmp.w r6, #16777216 ; 0x1000000 afba: d834 bhi.n b026 afbc: 1e73 subs r3, r6, #1 afbe: 4033 ands r3, r6 afc0: 2b00 cmp r3, #0 afc2: bf18 it ne afc4: 2600 movne r6, #0 sz_au /= ss; /* Byte --> Sector */ /* Get working buffer */ sz_buf = len / ss; /* Size of working buffer [sector] */ if (sz_buf == 0) return FR_NOT_ENOUGH_CORE; afc6: 9b01 ldr r3, [sp, #4] afc8: f5b3 7f00 cmp.w r3, #512 ; 0x200 afcc: f0c0 83aa bcc.w b724 <_image_size+0x5b8> buf = (BYTE*)work; /* Working buffer */ #if FF_USE_LFN == 3 if (!buf) buf = ff_memalloc(sz_buf * ss); /* Use heap memory for working buffer */ #endif if (!buf) return FR_NOT_ENOUGH_CORE; afd0: 9b02 ldr r3, [sp, #8] afd2: 2b00 cmp r3, #0 afd4: f000 83a8 beq.w b728 <_image_size+0x5bc> fsopt = opt->fmt & (FM_ANY | FM_SFD); afd8: 782d ldrb r5, [r5, #0] /* Determine where the volume to be located (b_vol, sz_vol) */ b_vol = sz_vol = 0; afda: 2300 movs r3, #0 afdc: 9314 str r3, [sp, #80] ; 0x50 if (ipart > 4 || pte[PTE_System] == 0) LEAVE_MKFS(FR_MKFS_ABORTED); /* No partition? */ b_vol = ld_dword(pte + PTE_StLba); /* Get volume start sector */ sz_vol = ld_dword(pte + PTE_SizLba); /* Get volume size */ } } else { /* The volume is associated with a physical drive */ if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); afde: aa14 add r2, sp, #80 ; 0x50 afe0: 2101 movs r1, #1 afe2: 4620 mov r0, r4 afe4: f005 fde3 bl 10bae afe8: 2800 cmp r0, #0 afea: f040 839f bne.w b72c <_image_size+0x5c0> if (!(fsopt & FM_SFD)) { /* To be partitioned? */ afee: f015 0308 ands.w r3, r5, #8 aff2: 930c str r3, [sp, #48] ; 0x30 aff4: d119 bne.n b02a fsopt |= 0x80; /* Partitioning is in GPT */ b_vol = GPT_ALIGN / ss; sz_vol -= b_vol + GPT_ITEMS * SZ_GPTE / ss + 1; /* Estimated partition offset and size */ } else #endif { /* Partitioning is in MBR */ if (sz_vol > N_SEC_TRACK) { aff6: 9b14 ldr r3, [sp, #80] ; 0x50 aff8: 2b3f cmp r3, #63 ; 0x3f affa: d96e bls.n b0da b_vol = N_SEC_TRACK; sz_vol -= b_vol; /* Estimated partition offset and size */ affc: 3b3f subs r3, #63 ; 0x3f affe: 9314 str r3, [sp, #80] ; 0x50 b000: f04f 0b3f mov.w fp, #63 ; 0x3f b004: e013 b.n b02e if (sz_blk == 0 && disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK) sz_blk = 1; b006: aa15 add r2, sp, #84 ; 0x54 b008: 2103 movs r1, #3 b00a: 4620 mov r0, r4 b00c: f005 fdcf bl 10bae b010: 2800 cmp r0, #0 b012: d0b4 beq.n af7e b014: 2301 movs r3, #1 b016: 9315 str r3, [sp, #84] ; 0x54 if (sz_blk == 0 || sz_blk > 0x8000 || (sz_blk & (sz_blk - 1))) sz_blk = 1; b018: e7b8 b.n af8c b01a: 421a tst r2, r3 b01c: d1b4 bne.n af88 b01e: e7b5 b.n af8c n_root = (opt->n_root >= 1 && opt->n_root <= 32768 && (opt->n_root % (ss / SZDIRE)) == 0) ? opt->n_root : 512; b020: f44f 7700 mov.w r7, #512 ; 0x200 b024: e7c6 b.n afb4 sz_au = (opt->au_size <= 0x1000000 && (opt->au_size & (opt->au_size - 1)) == 0) ? opt->au_size : 0; b026: 2600 movs r6, #0 b028: e7cd b.n afc6 b_vol = sz_vol = 0; b02a: f04f 0b00 mov.w fp, #0 } } } } if (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if volume size is >=128s */ b02e: f8dd c050 ldr.w ip, [sp, #80] ; 0x50 b032: f1bc 0f7f cmp.w ip, #127 ; 0x7f b036: f240 837b bls.w b730 <_image_size+0x5c4> } } #if FF_LBA64 if (sz_vol >= 0x100000000) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too large volume for FAT/FAT32 */ #endif if (sz_au > 128) sz_au = 128; /* Invalid AU for FAT/FAT32? */ b03a: f5b6 3f81 cmp.w r6, #66048 ; 0x10200 sz_au /= ss; /* Byte --> Sector */ b03e: bf34 ite cc b040: 0a73 lsrcc r3, r6, #9 if (sz_au > 128) sz_au = 128; /* Invalid AU for FAT/FAT32? */ b042: 2380 movcs r3, #128 ; 0x80 if (fsopt & FM_FAT32) { /* FAT32 possible? */ b044: f015 0202 ands.w r2, r5, #2 b048: 9209 str r2, [sp, #36] ; 0x24 b04a: d049 beq.n b0e0 if (!(fsopt & FM_FAT)) { /* no-FAT? */ b04c: f005 0501 and.w r5, r5, #1 fsty = FS_FAT32; break; } } if (!(fsopt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER); /* no-FAT? */ fsty = FS_FAT16; b050: 2d00 cmp r5, #0 b052: bf0c ite eq b054: f04f 0a03 moveq.w sl, #3 b058: f04f 0a02 movne.w sl, #2 b05c: 46c1 mov r9, r8 sz_rsv = 32; /* Number of reserved sectors */ sz_dir = 0; /* No static directory */ if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED); } else { /* FAT volume */ if (pau == 0) { /* au auto-selection */ n = (DWORD)sz_vol / 0x1000; /* Volume size in unit of 4KS */ b05e: ea4f 3e1c mov.w lr, ip, lsr #12 fsty = FS_FAT12; n = (n_clst * 3 + 1) / 2 + 3; /* FAT size [byte] */ } sz_fat = (n + ss - 1) / ss; /* FAT size [sector] */ sz_rsv = 1; /* Number of reserved sectors */ sz_dir = (DWORD)n_root * SZDIRE / ss; /* Root dir size [sector] */ b062: f3c7 1216 ubfx r2, r7, #4, #23 b066: 9206 str r2, [sp, #24] } b_fat = b_vol + sz_rsv; /* FAT base */ b068: f10b 0101 add.w r1, fp, #1 b06c: 910b str r1, [sp, #44] ; 0x2c b06e: 440a add r2, r1 b070: 9205 str r2, [sp, #20] b_data = b_fat + sz_fat * n_fat + sz_dir; /* Data base */ /* Align data area to erase block boundary (for flash memory media) */ n = (DWORD)(((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data); /* Sectors to next nearest from current data base */ b072: 9a15 ldr r2, [sp, #84] ; 0x54 b074: 1e51 subs r1, r2, #1 b076: 9103 str r1, [sp, #12] b078: 4252 negs r2, r2 b07a: 9204 str r2, [sp, #16] n = (DWORD)sz_vol / 0x20000; /* Volume size in unit of 128KS */ b07c: ea4f 425c mov.w r2, ip, lsr #17 b080: 920d str r2, [sp, #52] ; 0x34 b_fat = b_vol + sz_rsv; /* FAT base */ b082: f10b 0220 add.w r2, fp, #32 b086: 920a str r2, [sp, #40] ; 0x28 b088: f8cd 8038 str.w r8, [sp, #56] ; 0x38 b08c: 9408 str r4, [sp, #32] if (fsty == FS_FAT32) { /* FAT32 volume */ b08e: f1ba 0f03 cmp.w sl, #3 b092: f000 8365 beq.w b760 <_image_size+0x5f4> if (pau == 0) { /* au auto-selection */ b096: 2b00 cmp r3, #0 b098: d041 beq.n b11e b09a: 461d mov r5, r3 n_clst = (DWORD)sz_vol / pau; b09c: fbbc f2f5 udiv r2, ip, r5 if (n_clst > MAX_FAT12) { b0a0: f640 71f5 movw r1, #4085 ; 0xff5 b0a4: 428a cmp r2, r1 b0a6: d94f bls.n b148 n = n_clst * 2 + 4; /* FAT size [byte] */ b0a8: 3202 adds r2, #2 b0aa: 0052 lsls r2, r2, #1 sz_fat = (n + ss - 1) / ss; /* FAT size [sector] */ b0ac: f202 12ff addw r2, r2, #511 ; 0x1ff b0b0: 0a50 lsrs r0, r2, #9 b_data = b_fat + sz_fat * n_fat + sz_dir; /* Data base */ b0b2: 9a05 ldr r2, [sp, #20] b0b4: fb00 2609 mla r6, r0, r9, r2 n = (DWORD)(((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data); /* Sectors to next nearest from current data base */ b0b8: 9a03 ldr r2, [sp, #12] b0ba: 4432 add r2, r6 b0bc: 9904 ldr r1, [sp, #16] b0be: 400a ands r2, r1 b0c0: 1b92 subs r2, r2, r6 if (fsty == FS_FAT32) { /* FAT32: Move FAT */ sz_rsv += n; b_fat += n; } else { /* FAT: Expand FAT */ if (n % n_fat) { /* Adjust fractional error if needed */ b0c2: fbb2 f1f9 udiv r1, r2, r9 b0c6: fb09 2111 mls r1, r9, r1, r2 b0ca: 2900 cmp r1, #0 b0cc: d044 beq.n b158 n--; sz_rsv++; b_fat++; b0ce: 3a01 subs r2, #1 b0d0: f10b 0102 add.w r1, fp, #2 b0d4: 9107 str r1, [sp, #28] b0d6: 2102 movs r1, #2 b0d8: e041 b.n b15e b_vol = sz_vol = 0; b0da: f04f 0b00 mov.w fp, #0 b0de: e7a6 b.n b02e if (!(fsopt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER); /* no-FAT? */ b0e0: f015 0f01 tst.w r5, #1 b0e4: f000 8326 beq.w b734 <_image_size+0x5c8> fsty = FS_FAT16; b0e8: f04f 0a02 mov.w sl, #2 b0ec: e7b6 b.n b05c } } if (fsty == FS_FAT16) { if (n_clst > MAX_FAT16) { /* Too many clusters for FAT16 */ if (sz_au == 0 && (pau * 2) <= 64) { sz_au = pau * 2; continue; /* Adjust cluster size and retry */ b0ee: 462b mov r3, r5 b0f0: e7cd b.n b08e for (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ; /* Get from table */ b0f2: 4a40 ldr r2, [pc, #256] ; (b1f4 <_image_size+0x88>) b0f4: 4594 cmp ip, r2 b0f6: d910 bls.n b11a b0f8: 4a3f ldr r2, [pc, #252] ; (b1f8 <_image_size+0x8c>) b0fa: 1c91 adds r1, r2, #2 b0fc: 2502 movs r5, #2 b0fe: 462a mov r2, r5 b100: 9c08 ldr r4, [sp, #32] b102: 980d ldr r0, [sp, #52] ; 0x34 b104: 4282 cmp r2, r0 b106: d806 bhi.n b116 b108: 006d lsls r5, r5, #1 b10a: f831 2f02 ldrh.w r2, [r1, #2]! b10e: 2a00 cmp r2, #0 b110: d1f8 bne.n b104 b112: 9408 str r4, [sp, #32] b114: e328 b.n b768 <_image_size+0x5fc> b116: 9408 str r4, [sp, #32] b118: e326 b.n b768 <_image_size+0x5fc> b11a: 2501 movs r5, #1 b11c: e324 b.n b768 <_image_size+0x5fc> for (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ; /* Get from table */ b11e: f5bc 5f80 cmp.w ip, #4096 ; 0x1000 b122: d30f bcc.n b144 b124: 4a35 ldr r2, [pc, #212] ; (b1fc <_image_size+0x90>) b126: 1c91 adds r1, r2, #2 b128: 2502 movs r5, #2 b12a: 2204 movs r2, #4 b12c: 9c08 ldr r4, [sp, #32] b12e: 4572 cmp r2, lr b130: d806 bhi.n b140 b132: 006d lsls r5, r5, #1 b134: f831 2f02 ldrh.w r2, [r1, #2]! b138: 2a00 cmp r2, #0 b13a: d1f8 bne.n b12e b13c: 9408 str r4, [sp, #32] b13e: e7ad b.n b09c b140: 9408 str r4, [sp, #32] b142: e7ab b.n b09c b144: 2501 movs r5, #1 b146: e7a9 b.n b09c n = (n_clst * 3 + 1) / 2 + 3; /* FAT size [byte] */ b148: eb02 0242 add.w r2, r2, r2, lsl #1 b14c: 3201 adds r2, #1 b14e: 0852 lsrs r2, r2, #1 b150: 3203 adds r2, #3 fsty = FS_FAT12; b152: f04f 0a01 mov.w sl, #1 b156: e7a9 b.n b0ac b_fat = b_vol + sz_rsv; /* FAT base */ b158: 990b ldr r1, [sp, #44] ; 0x2c b15a: 9107 str r1, [sp, #28] sz_rsv = 1; /* Number of reserved sectors */ b15c: 2101 movs r1, #1 sz_fat += n / n_fat; b15e: fbb2 f2f9 udiv r2, r2, r9 b162: 4402 add r2, r0 sz_dir = (DWORD)n_root * SZDIRE / ss; /* Root dir size [sector] */ b164: 9806 ldr r0, [sp, #24] if (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ b166: eba6 060b sub.w r6, r6, fp b16a: eb06 1605 add.w r6, r6, r5, lsl #4 b16e: 45b4 cmp ip, r6 b170: f0c0 82e4 bcc.w b73c <_image_size+0x5d0> n_clst = ((DWORD)sz_vol - sz_rsv - sz_fat * n_fat - sz_dir) / pau; b174: 180e adds r6, r1, r0 b176: ebac 0606 sub.w r6, ip, r6 b17a: fb09 6612 mls r6, r9, r2, r6 b17e: fbb6 f6f5 udiv r6, r6, r5 if (fsty == FS_FAT32) { b182: f1ba 0f03 cmp.w sl, #3 b186: d014 beq.n b1b2 <_image_size+0x46> if (fsty == FS_FAT16) { b188: f1ba 0f02 cmp.w sl, #2 b18c: d138 bne.n b200 <_image_size+0x94> if (n_clst > MAX_FAT16) { /* Too many clusters for FAT16 */ b18e: f64f 78f5 movw r8, #65525 ; 0xfff5 b192: 4546 cmp r6, r8 b194: d91c bls.n b1d0 <_image_size+0x64> if (sz_au == 0 && (pau * 2) <= 64) { b196: 2b00 cmp r3, #0 b198: f040 82e0 bne.w b75c <_image_size+0x5f0> b19c: 006d lsls r5, r5, #1 b19e: 2d40 cmp r5, #64 ; 0x40 b1a0: d9a5 bls.n b0ee } if ((fsopt & FM_FAT32)) { b1a2: 9a09 ldr r2, [sp, #36] ; 0x24 b1a4: 2a00 cmp r2, #0 b1a6: f040 82db bne.w b760 <_image_size+0x5f4> fsty = FS_FAT32; continue; /* Switch type to FAT32 and retry */ } if (sz_au == 0 && (sz_au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ b1aa: 2d80 cmp r5, #128 ; 0x80 b1ac: d80e bhi.n b1cc <_image_size+0x60> b1ae: 462b mov r3, r5 b1b0: e76d b.n b08e if (n_clst <= MAX_FAT16) { /* Too few clusters for FAT32? */ b1b2: f64f 78f5 movw r8, #65525 ; 0xfff5 b1b6: 4546 cmp r6, r8 b1b8: d822 bhi.n b200 <_image_size+0x94> if (sz_au == 0 && (sz_au = pau / 2) != 0) continue; /* Adjust cluster size and retry */ b1ba: 2b00 cmp r3, #0 b1bc: f040 82c0 bne.w b740 <_image_size+0x5d4> b1c0: 2d01 cmp r5, #1 b1c2: d901 bls.n b1c8 <_image_size+0x5c> b1c4: 086b lsrs r3, r5, #1 b1c6: e762 b.n b08e LEAVE_MKFS(FR_MKFS_ABORTED); b1c8: 200e movs r0, #14 b1ca: e2a6 b.n b71a <_image_size+0x5ae> LEAVE_MKFS(FR_MKFS_ABORTED); b1cc: 200e movs r0, #14 b1ce: e2a4 b.n b71a <_image_size+0x5ae> } if (n_clst <= MAX_FAT12) { /* Too few clusters for FAT16 */ b1d0: f640 74f5 movw r4, #4085 ; 0xff5 b1d4: 42a6 cmp r6, r4 b1d6: f200 80fb bhi.w b3d0 <_image_size+0x264> if (sz_au == 0 && (sz_au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ b1da: 2b00 cmp r3, #0 b1dc: f040 82b2 bne.w b744 <_image_size+0x5d8> b1e0: 006b lsls r3, r5, #1 b1e2: 2b80 cmp r3, #128 ; 0x80 b1e4: f67f af53 bls.w b08e LEAVE_MKFS(FR_MKFS_ABORTED); b1e8: 200e movs r0, #14 b1ea: e296 b.n b71a <_image_size+0x5ae> b1ec: 200009a4 .word 0x200009a4 b1f0: 00012678 .word 0x00012678 b1f4: 0001ffff .word 0x0001ffff b1f8: 00012668 .word 0x00012668 b1fc: 00012658 .word 0x00012658 b200: f8dd 8038 ldr.w r8, [sp, #56] ; 0x38 b204: 9005 str r0, [sp, #20] b206: 9104 str r1, [sp, #16] b208: 9203 str r2, [sp, #12] b20a: 9c08 ldr r4, [sp, #32] } } if (fsty == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters for FAT12 */ b20c: f1ba 0f01 cmp.w sl, #1 b210: f040 80fd bne.w b40e <_image_size+0x2a2> b214: f640 73f5 movw r3, #4085 ; 0xff5 b218: 429e cmp r6, r3 b21a: f200 8295 bhi.w b748 <_image_size+0x5dc> #if FF_USE_TRIM lba[0] = b_vol; lba[1] = b_vol + sz_vol - 1; /* Inform storage device that the volume area may be erased */ disk_ioctl(pdrv, CTRL_TRIM, lba); #endif /* Create FAT VBR */ mem_set(buf, 0, ss); b21e: f44f 7200 mov.w r2, #512 ; 0x200 b222: 2100 movs r1, #0 b224: 9802 ldr r0, [sp, #8] b226: f005 fcde bl 10be6 mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */ b22a: 220b movs r2, #11 b22c: 49af ldr r1, [pc, #700] ; (b4ec <_image_size+0x380>) b22e: 9802 ldr r0, [sp, #8] b230: f005 fccf bl 10bd2 *ptr++ = (BYTE)val; val >>= 8; b234: 2300 movs r3, #0 b236: 9a02 ldr r2, [sp, #8] b238: 72d3 strb r3, [r2, #11] *ptr++ = (BYTE)val; b23a: 2302 movs r3, #2 b23c: 7313 strb r3, [r2, #12] st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */ buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ b23e: 7355 strb r5, [r2, #13] *ptr++ = (BYTE)val; val >>= 8; b240: 9904 ldr r1, [sp, #16] b242: 7391 strb r1, [r2, #14] b244: f3c1 2307 ubfx r3, r1, #8, #8 *ptr++ = (BYTE)val; b248: 73d3 strb r3, [r2, #15] st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */ buf[BPB_NumFATs] = (BYTE)n_fat; /* Number of FATs */ b24a: f882 8010 strb.w r8, [r2, #16] *ptr++ = (BYTE)val; val >>= 8; b24e: 9a02 ldr r2, [sp, #8] b250: 7457 strb r7, [r2, #17] b252: f3c7 2707 ubfx r7, r7, #8, #8 *ptr++ = (BYTE)val; b256: 7497 strb r7, [r2, #18] st_word(buf + BPB_RootEntCnt, (WORD)((fsty == FS_FAT32) ? 0 : n_root)); /* Number of root directory entries */ if (sz_vol < 0x10000) { b258: 9b14 ldr r3, [sp, #80] ; 0x50 b25a: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 b25e: f080 80f3 bcs.w b448 <_image_size+0x2dc> *ptr++ = (BYTE)val; val >>= 8; b262: 74d3 strb r3, [r2, #19] b264: f3c3 2307 ubfx r3, r3, #8, #8 *ptr++ = (BYTE)val; b268: 7513 strb r3, [r2, #20] sz_buf = len / ss; /* Size of working buffer [sector] */ b26a: 9b01 ldr r3, [sp, #4] b26c: ea4f 2853 mov.w r8, r3, lsr #9 st_word(buf + BPB_TotSec16, (WORD)sz_vol); /* Volume size in 16-bit LBA */ } else { st_dword(buf + BPB_TotSec32, (DWORD)sz_vol); /* Volume size in 32-bit LBA */ } buf[BPB_Media] = 0xF8; /* Media descriptor byte */ b270: 23f8 movs r3, #248 ; 0xf8 b272: 9902 ldr r1, [sp, #8] b274: 754b strb r3, [r1, #21] *ptr++ = (BYTE)val; val >>= 8; b276: 233f movs r3, #63 ; 0x3f b278: 760b strb r3, [r1, #24] *ptr++ = (BYTE)val; b27a: 2300 movs r3, #0 b27c: 764b strb r3, [r1, #25] *ptr++ = (BYTE)val; val >>= 8; b27e: 22ff movs r2, #255 ; 0xff b280: 768a strb r2, [r1, #26] *ptr++ = (BYTE)val; b282: 76cb strb r3, [r1, #27] *ptr++ = (BYTE)val; val >>= 8; b284: f881 b01c strb.w fp, [r1, #28] *ptr++ = (BYTE)val; val >>= 8; b288: 774b strb r3, [r1, #29] *ptr++ = (BYTE)val; val >>= 8; b28a: 778b strb r3, [r1, #30] *ptr++ = (BYTE)val; b28c: 77cb strb r3, [r1, #31] st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */ st_word(buf + BPB_NumHeads, 255); /* Number of heads (for int13) */ st_dword(buf + BPB_HiddSec, (DWORD)b_vol); /* Volume offset in the physical drive [sector] */ if (fsty == FS_FAT32) { b28e: f1ba 0f03 cmp.w sl, #3 b292: f000 80e6 beq.w b462 <_image_size+0x2f6> *ptr++ = (BYTE)val; val >>= 8; b296: 2300 movs r3, #0 b298: 9a02 ldr r2, [sp, #8] b29a: f882 3027 strb.w r3, [r2, #39] ; 0x27 *ptr++ = (BYTE)val; val >>= 8; b29e: f882 3028 strb.w r3, [r2, #40] ; 0x28 *ptr++ = (BYTE)val; val >>= 8; b2a2: 2384 movs r3, #132 ; 0x84 b2a4: f882 3029 strb.w r3, [r2, #41] ; 0x29 *ptr++ = (BYTE)val; b2a8: 2350 movs r3, #80 ; 0x50 b2aa: f882 302a strb.w r3, [r2, #42] ; 0x2a *ptr++ = (BYTE)val; val >>= 8; b2ae: 9903 ldr r1, [sp, #12] b2b0: 7591 strb r1, [r2, #22] b2b2: f3c1 2307 ubfx r3, r1, #8, #8 *ptr++ = (BYTE)val; b2b6: 4616 mov r6, r2 b2b8: 75d3 strb r3, [r2, #23] buf[BS_BootSig32] = 0x29; /* Extended boot signature */ mem_cpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ } else { st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */ st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */ buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ b2ba: 2380 movs r3, #128 ; 0x80 b2bc: f882 3024 strb.w r3, [r2, #36] ; 0x24 buf[BS_BootSig] = 0x29; /* Extended boot signature */ b2c0: 2329 movs r3, #41 ; 0x29 b2c2: f882 3026 strb.w r3, [r2, #38] ; 0x26 mem_cpy(buf + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ b2c6: 2213 movs r2, #19 b2c8: 4989 ldr r1, [pc, #548] ; (b4f0 <_image_size+0x384>) b2ca: f106 002b add.w r0, r6, #43 ; 0x2b b2ce: f005 fc80 bl 10bd2 *ptr++ = (BYTE)val; val >>= 8; b2d2: 2355 movs r3, #85 ; 0x55 b2d4: 4631 mov r1, r6 b2d6: f886 31fe strb.w r3, [r6, #510] ; 0x1fe *ptr++ = (BYTE)val; b2da: 23aa movs r3, #170 ; 0xaa b2dc: f886 31ff strb.w r3, [r6, #511] ; 0x1ff } st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */ if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */ b2e0: 2301 movs r3, #1 b2e2: 465a mov r2, fp b2e4: 4620 mov r0, r4 b2e6: f005 fc5b bl 10ba0 b2ea: 2800 cmp r0, #0 b2ec: f040 822e bne.w b74c <_image_size+0x5e0> disk_write(pdrv, buf, b_vol + 7, 1); /* Write backup FSINFO (VBR + 7) */ disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */ } /* Initialize FAT area */ mem_set(buf, 0, sz_buf * ss); b2f0: 9b01 ldr r3, [sp, #4] b2f2: f423 72ff bic.w r2, r3, #510 ; 0x1fe b2f6: f022 0201 bic.w r2, r2, #1 b2fa: 2100 movs r1, #0 b2fc: 9802 ldr r0, [sp, #8] b2fe: f005 fc72 bl 10be6 sect = b_fat; /* FAT start sector */ for (i = 0; i < n_fat; i++) { /* Initialize FATs each */ b302: f1b9 0f00 cmp.w r9, #0 b306: f000 824f beq.w b7a8 <_image_size+0x63c> *ptr++ = (BYTE)val; val >>= 8; b30a: f1ba 0f01 cmp.w sl, #1 *ptr++ = (BYTE)val; b30e: bf14 ite ne b310: 23ff movne r3, #255 ; 0xff b312: 2300 moveq r3, #0 b314: 9304 str r3, [sp, #16] for (i = 0; i < n_fat; i++) { /* Initialize FATs each */ b316: 2300 movs r3, #0 b318: 9301 str r3, [sp, #4] *ptr++ = (BYTE)val; val >>= 8; b31a: f04f 0bff mov.w fp, #255 ; 0xff *ptr++ = (BYTE)val; b31e: 9e07 ldr r6, [sp, #28] b320: 9508 str r5, [sp, #32] b322: f8cd 9018 str.w r9, [sp, #24] b326: 46a1 mov r9, r4 b328: 9f02 ldr r7, [sp, #8] if (fsty == FS_FAT32) { b32a: f1ba 0f03 cmp.w sl, #3 b32e: f000 8138 beq.w b5a2 <_image_size+0x436> *ptr++ = (BYTE)val; val >>= 8; b332: f06f 0307 mvn.w r3, #7 b336: 703b strb r3, [r7, #0] *ptr++ = (BYTE)val; val >>= 8; b338: f887 b001 strb.w fp, [r7, #1] *ptr++ = (BYTE)val; val >>= 8; b33c: f887 b002 strb.w fp, [r7, #2] *ptr++ = (BYTE)val; b340: 9b04 ldr r3, [sp, #16] b342: 70fb strb r3, [r7, #3] for (i = 0; i < n_fat; i++) { /* Initialize FATs each */ b344: 9d03 ldr r5, [sp, #12] } else { st_dword(buf + 0, (fsty == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8); /* FAT[0] and FAT[1] */ } nsect = sz_fat; /* Number of FAT sectors */ do { /* Fill FAT sectors */ n = (nsect > sz_buf) ? sz_buf : nsect; b346: 462c mov r4, r5 b348: 4545 cmp r5, r8 b34a: bf28 it cs b34c: 4644 movcs r4, r8 if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); b34e: 4623 mov r3, r4 b350: 4632 mov r2, r6 b352: 4639 mov r1, r7 b354: 4648 mov r0, r9 b356: f005 fc23 bl 10ba0 b35a: 2800 cmp r0, #0 b35c: f040 81f8 bne.w b750 <_image_size+0x5e4> mem_set(buf, 0, ss); /* Rest of FAT all are cleared */ b360: f44f 7200 mov.w r2, #512 ; 0x200 b364: 2100 movs r1, #0 b366: 4638 mov r0, r7 b368: f005 fc3d bl 10be6 sect += n; nsect -= n; b36c: 4426 add r6, r4 } while (nsect); b36e: 1b2d subs r5, r5, r4 b370: d1e9 bne.n b346 <_image_size+0x1da> for (i = 0; i < n_fat; i++) { /* Initialize FATs each */ b372: 9b01 ldr r3, [sp, #4] b374: 3301 adds r3, #1 b376: 9301 str r3, [sp, #4] b378: 9a06 ldr r2, [sp, #24] b37a: 429a cmp r2, r3 b37c: d8d5 bhi.n b32a <_image_size+0x1be> b37e: 9607 str r6, [sp, #28] b380: 9d08 ldr r5, [sp, #32] b382: 464c mov r4, r9 } /* Initialize root directory (fill with zero) */ nsect = (fsty == FS_FAT32) ? pau : sz_dir; /* Number of root directory sectors */ b384: 9b05 ldr r3, [sp, #20] b386: f1ba 0f03 cmp.w sl, #3 b38a: bf08 it eq b38c: 462b moveq r3, r5 b38e: 461e mov r6, r3 b390: 9f07 ldr r7, [sp, #28] do { n = (nsect > sz_buf) ? sz_buf : nsect; b392: 4635 mov r5, r6 b394: 4546 cmp r6, r8 b396: bf28 it cs b398: 4645 movcs r5, r8 if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); b39a: 462b mov r3, r5 b39c: 463a mov r2, r7 b39e: 9902 ldr r1, [sp, #8] b3a0: 4620 mov r0, r4 b3a2: f005 fbfd bl 10ba0 b3a6: 2800 cmp r0, #0 b3a8: f040 81d4 bne.w b754 <_image_size+0x5e8> sect += n; nsect -= n; b3ac: 442f add r7, r5 } while (nsect); b3ae: 1b76 subs r6, r6, r5 b3b0: d1ef bne.n b392 <_image_size+0x226> /* Determine system ID in the MBR partition table */ if (FF_FS_EXFAT && fsty == FS_EXFAT) { sys = 0x07; /* exFAT */ } else { if (fsty == FS_FAT32) { b3b2: f1ba 0f03 cmp.w sl, #3 b3b6: f000 810f beq.w b5d8 <_image_size+0x46c> sys = 0x0C; /* FAT32X */ } else { if (sz_vol >= 0x10000) { b3ba: 9b14 ldr r3, [sp, #80] ; 0x50 b3bc: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 b3c0: f080 813e bcs.w b640 <_image_size+0x4d4> sys = 0x06; /* FAT12/16 (large) */ } else { sys = (fsty == FS_FAT16) ? 0x04 : 0x01; /* FAT16 : FAT12 */ b3c4: f1ba 0f02 cmp.w sl, #2 b3c8: bf0c ite eq b3ca: 2604 moveq r6, #4 b3cc: 2601 movne r6, #1 b3ce: e104 b.n b5da <_image_size+0x46e> b3d0: f8dd 8038 ldr.w r8, [sp, #56] ; 0x38 b3d4: 9005 str r0, [sp, #20] b3d6: 9104 str r1, [sp, #16] b3d8: 9203 str r2, [sp, #12] b3da: 9c08 ldr r4, [sp, #32] mem_set(buf, 0, ss); b3dc: f44f 7200 mov.w r2, #512 ; 0x200 b3e0: 2100 movs r1, #0 b3e2: 9802 ldr r0, [sp, #8] b3e4: f005 fbff bl 10be6 mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */ b3e8: 220b movs r2, #11 b3ea: 4940 ldr r1, [pc, #256] ; (b4ec <_image_size+0x380>) b3ec: 9802 ldr r0, [sp, #8] b3ee: f005 fbf0 bl 10bd2 *ptr++ = (BYTE)val; val >>= 8; b3f2: 2300 movs r3, #0 b3f4: 9a02 ldr r2, [sp, #8] b3f6: 72d3 strb r3, [r2, #11] *ptr++ = (BYTE)val; b3f8: 2302 movs r3, #2 b3fa: 7313 strb r3, [r2, #12] buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ b3fc: 7355 strb r5, [r2, #13] *ptr++ = (BYTE)val; val >>= 8; b3fe: 9904 ldr r1, [sp, #16] b400: 7391 strb r1, [r2, #14] b402: f3c1 2307 ubfx r3, r1, #8, #8 *ptr++ = (BYTE)val; b406: 73d3 strb r3, [r2, #15] buf[BPB_NumFATs] = (BYTE)n_fat; /* Number of FATs */ b408: f882 8010 strb.w r8, [r2, #16] st_word(buf + BPB_RootEntCnt, (WORD)((fsty == FS_FAT32) ? 0 : n_root)); /* Number of root directory entries */ b40c: e71f b.n b24e <_image_size+0xe2> mem_set(buf, 0, ss); b40e: f44f 7200 mov.w r2, #512 ; 0x200 b412: 2100 movs r1, #0 b414: 9802 ldr r0, [sp, #8] b416: f005 fbe6 bl 10be6 mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */ b41a: 220b movs r2, #11 b41c: 4933 ldr r1, [pc, #204] ; (b4ec <_image_size+0x380>) b41e: 9802 ldr r0, [sp, #8] b420: f005 fbd7 bl 10bd2 *ptr++ = (BYTE)val; val >>= 8; b424: 2300 movs r3, #0 b426: 9a02 ldr r2, [sp, #8] b428: 72d3 strb r3, [r2, #11] *ptr++ = (BYTE)val; b42a: 2302 movs r3, #2 b42c: 7313 strb r3, [r2, #12] buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ b42e: 7355 strb r5, [r2, #13] *ptr++ = (BYTE)val; val >>= 8; b430: 9904 ldr r1, [sp, #16] b432: 7391 strb r1, [r2, #14] b434: f3c1 2307 ubfx r3, r1, #8, #8 *ptr++ = (BYTE)val; b438: 73d3 strb r3, [r2, #15] buf[BPB_NumFATs] = (BYTE)n_fat; /* Number of FATs */ b43a: f882 8010 strb.w r8, [r2, #16] st_word(buf + BPB_RootEntCnt, (WORD)((fsty == FS_FAT32) ? 0 : n_root)); /* Number of root directory entries */ b43e: f1ba 0f03 cmp.w sl, #3 b442: bf08 it eq b444: 2700 moveq r7, #0 b446: e702 b.n b24e <_image_size+0xe2> *ptr++ = (BYTE)val; val >>= 8; b448: 9902 ldr r1, [sp, #8] b44a: f881 3020 strb.w r3, [r1, #32] b44e: 0a1a lsrs r2, r3, #8 *ptr++ = (BYTE)val; val >>= 8; b450: f881 2021 strb.w r2, [r1, #33] ; 0x21 b454: 0c1a lsrs r2, r3, #16 *ptr++ = (BYTE)val; val >>= 8; b456: f881 2022 strb.w r2, [r1, #34] ; 0x22 b45a: 0e1b lsrs r3, r3, #24 *ptr++ = (BYTE)val; b45c: f881 3023 strb.w r3, [r1, #35] ; 0x23 b460: e703 b.n b26a <_image_size+0xfe> *ptr++ = (BYTE)val; val >>= 8; b462: f881 3043 strb.w r3, [r1, #67] ; 0x43 *ptr++ = (BYTE)val; val >>= 8; b466: f881 3044 strb.w r3, [r1, #68] ; 0x44 *ptr++ = (BYTE)val; val >>= 8; b46a: 2284 movs r2, #132 ; 0x84 b46c: f881 2045 strb.w r2, [r1, #69] ; 0x45 *ptr++ = (BYTE)val; b470: 2250 movs r2, #80 ; 0x50 b472: f881 2046 strb.w r2, [r1, #70] ; 0x46 *ptr++ = (BYTE)val; val >>= 8; b476: 9f03 ldr r7, [sp, #12] b478: f881 7024 strb.w r7, [r1, #36] ; 0x24 b47c: 0a3a lsrs r2, r7, #8 *ptr++ = (BYTE)val; val >>= 8; b47e: 4608 mov r0, r1 b480: f881 2025 strb.w r2, [r1, #37] ; 0x25 b484: 0c3a lsrs r2, r7, #16 *ptr++ = (BYTE)val; val >>= 8; b486: f881 2026 strb.w r2, [r1, #38] ; 0x26 b48a: 0e3a lsrs r2, r7, #24 *ptr++ = (BYTE)val; b48c: f881 2027 strb.w r2, [r1, #39] ; 0x27 *ptr++ = (BYTE)val; val >>= 8; b490: 2202 movs r2, #2 b492: f881 202c strb.w r2, [r1, #44] ; 0x2c *ptr++ = (BYTE)val; val >>= 8; b496: f881 302d strb.w r3, [r1, #45] ; 0x2d *ptr++ = (BYTE)val; val >>= 8; b49a: f881 302e strb.w r3, [r1, #46] ; 0x2e *ptr++ = (BYTE)val; b49e: f881 302f strb.w r3, [r1, #47] ; 0x2f *ptr++ = (BYTE)val; val >>= 8; b4a2: 2701 movs r7, #1 b4a4: f881 7030 strb.w r7, [r1, #48] ; 0x30 *ptr++ = (BYTE)val; b4a8: f881 3031 strb.w r3, [r1, #49] ; 0x31 *ptr++ = (BYTE)val; val >>= 8; b4ac: 2206 movs r2, #6 b4ae: f881 2032 strb.w r2, [r1, #50] ; 0x32 *ptr++ = (BYTE)val; b4b2: f881 3033 strb.w r3, [r1, #51] ; 0x33 buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */ b4b6: 2380 movs r3, #128 ; 0x80 b4b8: f881 3040 strb.w r3, [r1, #64] ; 0x40 buf[BS_BootSig32] = 0x29; /* Extended boot signature */ b4bc: 2329 movs r3, #41 ; 0x29 b4be: f881 3042 strb.w r3, [r1, #66] ; 0x42 mem_cpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ b4c2: 2213 movs r2, #19 b4c4: 490b ldr r1, [pc, #44] ; (b4f4 <_image_size+0x388>) b4c6: 3047 adds r0, #71 ; 0x47 b4c8: f005 fb83 bl 10bd2 *ptr++ = (BYTE)val; val >>= 8; b4cc: 2355 movs r3, #85 ; 0x55 b4ce: 9a02 ldr r2, [sp, #8] b4d0: 4611 mov r1, r2 b4d2: f882 31fe strb.w r3, [r2, #510] ; 0x1fe *ptr++ = (BYTE)val; b4d6: 23aa movs r3, #170 ; 0xaa b4d8: f882 31ff strb.w r3, [r2, #511] ; 0x1ff if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */ b4dc: 463b mov r3, r7 b4de: 465a mov r2, fp b4e0: 4620 mov r0, r4 b4e2: f005 fb5d bl 10ba0 b4e6: b138 cbz r0, b4f8 <_image_size+0x38c> b4e8: 2001 movs r0, #1 b4ea: e116 b.n b71a <_image_size+0x5ae> b4ec: 00012688 .word 0x00012688 b4f0: 000126a8 .word 0x000126a8 b4f4: 00012694 .word 0x00012694 disk_write(pdrv, buf, b_vol + 6, 1); /* Write backup VBR (VBR + 6) */ b4f8: 2301 movs r3, #1 b4fa: f10b 0206 add.w r2, fp, #6 b4fe: 9f02 ldr r7, [sp, #8] b500: 4639 mov r1, r7 b502: 4620 mov r0, r4 b504: f005 fb4c bl 10ba0 mem_set(buf, 0, ss); b508: f44f 7200 mov.w r2, #512 ; 0x200 b50c: 2100 movs r1, #0 b50e: 4638 mov r0, r7 b510: f005 fb69 bl 10be6 *ptr++ = (BYTE)val; val >>= 8; b514: 2352 movs r3, #82 ; 0x52 b516: 703b strb r3, [r7, #0] *ptr++ = (BYTE)val; val >>= 8; b518: 707b strb r3, [r7, #1] *ptr++ = (BYTE)val; val >>= 8; b51a: 2361 movs r3, #97 ; 0x61 b51c: 70bb strb r3, [r7, #2] *ptr++ = (BYTE)val; b51e: 2241 movs r2, #65 ; 0x41 b520: 70fa strb r2, [r7, #3] *ptr++ = (BYTE)val; val >>= 8; b522: 2172 movs r1, #114 ; 0x72 b524: f887 11e4 strb.w r1, [r7, #484] ; 0x1e4 *ptr++ = (BYTE)val; val >>= 8; b528: f887 11e5 strb.w r1, [r7, #485] ; 0x1e5 *ptr++ = (BYTE)val; val >>= 8; b52c: f887 21e6 strb.w r2, [r7, #486] ; 0x1e6 *ptr++ = (BYTE)val; b530: 4639 mov r1, r7 b532: f887 31e7 strb.w r3, [r7, #487] ; 0x1e7 st_dword(buf + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ b536: 3e01 subs r6, #1 *ptr++ = (BYTE)val; val >>= 8; b538: f887 61e8 strb.w r6, [r7, #488] ; 0x1e8 b53c: 0a33 lsrs r3, r6, #8 *ptr++ = (BYTE)val; val >>= 8; b53e: f887 31e9 strb.w r3, [r7, #489] ; 0x1e9 b542: 0c33 lsrs r3, r6, #16 *ptr++ = (BYTE)val; val >>= 8; b544: f887 31ea strb.w r3, [r7, #490] ; 0x1ea b548: 0e36 lsrs r6, r6, #24 *ptr++ = (BYTE)val; b54a: f887 61eb strb.w r6, [r7, #491] ; 0x1eb *ptr++ = (BYTE)val; val >>= 8; b54e: 2302 movs r3, #2 b550: f887 31ec strb.w r3, [r7, #492] ; 0x1ec *ptr++ = (BYTE)val; val >>= 8; b554: 2600 movs r6, #0 b556: f887 61ed strb.w r6, [r7, #493] ; 0x1ed *ptr++ = (BYTE)val; val >>= 8; b55a: f887 61ee strb.w r6, [r7, #494] ; 0x1ee *ptr++ = (BYTE)val; b55e: f887 61ef strb.w r6, [r7, #495] ; 0x1ef *ptr++ = (BYTE)val; val >>= 8; b562: 2355 movs r3, #85 ; 0x55 b564: f887 31fe strb.w r3, [r7, #510] ; 0x1fe *ptr++ = (BYTE)val; b568: 23aa movs r3, #170 ; 0xaa b56a: f887 31ff strb.w r3, [r7, #511] ; 0x1ff disk_write(pdrv, buf, b_vol + 7, 1); /* Write backup FSINFO (VBR + 7) */ b56e: 2301 movs r3, #1 b570: f10b 0207 add.w r2, fp, #7 b574: 4620 mov r0, r4 b576: f005 fb13 bl 10ba0 disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */ b57a: 2301 movs r3, #1 b57c: 9a0b ldr r2, [sp, #44] ; 0x2c b57e: 4639 mov r1, r7 b580: 4620 mov r0, r4 b582: f005 fb0d bl 10ba0 mem_set(buf, 0, sz_buf * ss); b586: 9b01 ldr r3, [sp, #4] b588: f423 72ff bic.w r2, r3, #510 ; 0x1fe b58c: f022 0201 bic.w r2, r2, #1 b590: 4631 mov r1, r6 b592: 4638 mov r0, r7 b594: f005 fb27 bl 10be6 for (i = 0; i < n_fat; i++) { /* Initialize FATs each */ b598: f1b9 0f00 cmp.w r9, #0 b59c: f47f aeb5 bne.w b30a <_image_size+0x19e> b5a0: e6f0 b.n b384 <_image_size+0x218> *ptr++ = (BYTE)val; val >>= 8; b5a2: f06f 0307 mvn.w r3, #7 b5a6: 703b strb r3, [r7, #0] *ptr++ = (BYTE)val; val >>= 8; b5a8: f887 b001 strb.w fp, [r7, #1] *ptr++ = (BYTE)val; val >>= 8; b5ac: f887 b002 strb.w fp, [r7, #2] *ptr++ = (BYTE)val; b5b0: f887 b003 strb.w fp, [r7, #3] *ptr++ = (BYTE)val; val >>= 8; b5b4: f887 b004 strb.w fp, [r7, #4] *ptr++ = (BYTE)val; val >>= 8; b5b8: f887 b005 strb.w fp, [r7, #5] *ptr++ = (BYTE)val; val >>= 8; b5bc: f887 b006 strb.w fp, [r7, #6] *ptr++ = (BYTE)val; b5c0: f887 b007 strb.w fp, [r7, #7] *ptr++ = (BYTE)val; val >>= 8; b5c4: f887 b008 strb.w fp, [r7, #8] *ptr++ = (BYTE)val; val >>= 8; b5c8: f887 b009 strb.w fp, [r7, #9] *ptr++ = (BYTE)val; val >>= 8; b5cc: f887 b00a strb.w fp, [r7, #10] *ptr++ = (BYTE)val; b5d0: f04f 030f mov.w r3, #15 b5d4: 72fb strb r3, [r7, #11] b5d6: e6b5 b.n b344 <_image_size+0x1d8> sys = 0x0C; /* FAT32X */ b5d8: 260c movs r6, #12 if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Read the MBR */ buf[MBR_Table + (ipart - 1) * SZ_PTE + PTE_System] = sys; /* Set system ID */ if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it back to the MBR */ } } else { /* Volume as a new single partition */ if (!(fsopt & FM_SFD)) { /* Create partition table if not in SFD */ b5da: 9b0c ldr r3, [sp, #48] ; 0x30 b5dc: 2b00 cmp r3, #0 b5de: f040 8090 bne.w b702 <_image_size+0x596> lba[0] = sz_vol, lba[1] = 0; b5e2: 9b14 ldr r3, [sp, #80] ; 0x50 b5e4: 9312 str r3, [sp, #72] ; 0x48 b5e6: 2300 movs r3, #0 b5e8: 9313 str r3, [sp, #76] ; 0x4c if (disk_ioctl(drv, GET_SECTOR_COUNT, &sz_drv) != RES_OK) return FR_DISK_ERR; b5ea: aa11 add r2, sp, #68 ; 0x44 b5ec: 2101 movs r1, #1 b5ee: 4620 mov r0, r4 b5f0: f005 fadd bl 10bae b5f4: 2800 cmp r0, #0 b5f6: f040 80d5 bne.w b7a4 <_image_size+0x638> sz_drv32 = (DWORD)sz_drv; b5fa: 9f11 ldr r7, [sp, #68] ; 0x44 for (n_hd = 8; n_hd != 0 && sz_drv32 / n_hd / n_sc > 1024; n_hd *= 2) ; b5fc: 2508 movs r5, #8 b5fe: f64f 433e movw r3, #64574 ; 0xfc3e b602: fbb7 f2f5 udiv r2, r7, r5 b606: 429a cmp r2, r3 b608: d904 bls.n b614 <_image_size+0x4a8> b60a: 006d lsls r5, r5, #1 b60c: f015 05ff ands.w r5, r5, #255 ; 0xff b610: d1f7 bne.n b602 <_image_size+0x496> if (n_hd == 0) n_hd = 255; /* Number of heads needs to be <256 */ b612: 25ff movs r5, #255 ; 0xff mem_set(buf, 0, FF_MAX_SS); /* Clear MBR */ b614: f44f 7200 mov.w r2, #512 ; 0x200 b618: 2100 movs r1, #0 b61a: f8dd 8008 ldr.w r8, [sp, #8] b61e: 4640 mov r0, r8 b620: f005 fae1 bl 10be6 pte = buf + MBR_Table; /* Partition table in the MBR */ b624: 4642 mov r2, r8 b626: f508 73df add.w r3, r8, #446 ; 0x1be if (n_lba32 <= 100) n_lba32 = (n_lba32 == 100) ? sz_drv32 : sz_drv32 / 100 * n_lba32; /* Size in percentage? */ b62a: f04f 0c64 mov.w ip, #100 ; 0x64 b62e: fbb7 fcfc udiv ip, r7, ip b632: f10d 0848 add.w r8, sp, #72 ; 0x48 b636: f502 7bff add.w fp, r2, #510 ; 0x1fe for (i = 0, s_lba32 = n_sc; i < 4 && s_lba32 != 0 && s_lba32 < sz_drv32; i++, s_lba32 += n_lba32) { b63a: 223f movs r2, #63 ; 0x3f cy = (UINT)(s_lba32 / n_sc / n_hd); /* Start cylinder */ b63c: 4696 mov lr, r2 b63e: e041 b.n b6c4 <_image_size+0x558> sys = 0x06; /* FAT12/16 (large) */ b640: 2606 movs r6, #6 b642: e7ca b.n b5da <_image_size+0x46e> if (s_lba32 + n_lba32 > sz_drv32 || s_lba32 + n_lba32 < s_lba32) n_lba32 = sz_drv32 - s_lba32; /* Clip at drive size */ b644: 1ab9 subs r1, r7, r2 *ptr++ = (BYTE)val; val >>= 8; b646: 721a strb r2, [r3, #8] b648: 0a10 lsrs r0, r2, #8 *ptr++ = (BYTE)val; val >>= 8; b64a: 7258 strb r0, [r3, #9] b64c: 0c10 lsrs r0, r2, #16 *ptr++ = (BYTE)val; val >>= 8; b64e: 7298 strb r0, [r3, #10] b650: 0e10 lsrs r0, r2, #24 *ptr++ = (BYTE)val; b652: 72d8 strb r0, [r3, #11] *ptr++ = (BYTE)val; val >>= 8; b654: 7319 strb r1, [r3, #12] b656: 0a08 lsrs r0, r1, #8 *ptr++ = (BYTE)val; val >>= 8; b658: 7358 strb r0, [r3, #13] b65a: 0c08 lsrs r0, r1, #16 *ptr++ = (BYTE)val; val >>= 8; b65c: 7398 strb r0, [r3, #14] b65e: 0e08 lsrs r0, r1, #24 *ptr++ = (BYTE)val; b660: 73d8 strb r0, [r3, #15] pte[PTE_System] = (BYTE)sys; /* System type */ b662: 711e strb r6, [r3, #4] cy = (UINT)(s_lba32 / n_sc / n_hd); /* Start cylinder */ b664: fbb2 f0fe udiv r0, r2, lr b668: fbb0 f9f5 udiv r9, r0, r5 hd = (BYTE)(s_lba32 / n_sc % n_hd); /* Start head */ b66c: fb05 0a19 mls sl, r5, r9, r0 b670: f883 a001 strb.w sl, [r3, #1] sc = (BYTE)(s_lba32 % n_sc + 1); /* Start sector */ b674: ebc0 1080 rsb r0, r0, r0, lsl #6 b678: 1a10 subs r0, r2, r0 b67a: 3001 adds r0, #1 pte[PTE_StSec] = (BYTE)((cy >> 2 & 0xC0) | sc); b67c: ea4f 0a99 mov.w sl, r9, lsr #2 b680: f02a 0a3f bic.w sl, sl, #63 ; 0x3f b684: ea40 000a orr.w r0, r0, sl b688: 7098 strb r0, [r3, #2] pte[PTE_StCyl] = (BYTE)cy; b68a: f883 9003 strb.w r9, [r3, #3] cy = (UINT)((s_lba32 + n_lba32 - 1) / n_sc / n_hd); /* End cylinder */ b68e: 440a add r2, r1 b690: 1e51 subs r1, r2, #1 b692: fbb1 f9fe udiv r9, r1, lr b696: fbb9 f0f5 udiv r0, r9, r5 hd = (BYTE)((s_lba32 + n_lba32 - 1) / n_sc % n_hd); /* End head */ b69a: fb05 9a10 mls sl, r5, r0, r9 b69e: f883 a005 strb.w sl, [r3, #5] sc = (BYTE)((s_lba32 + n_lba32 - 1) % n_sc + 1); /* End sector */ b6a2: ebc9 1989 rsb r9, r9, r9, lsl #6 b6a6: eba1 0109 sub.w r1, r1, r9 b6aa: 3101 adds r1, #1 pte[PTE_EdSec] = (BYTE)((cy >> 2 & 0xC0) | sc); b6ac: ea4f 0990 mov.w r9, r0, lsr #2 b6b0: f029 093f bic.w r9, r9, #63 ; 0x3f b6b4: ea41 0109 orr.w r1, r1, r9 b6b8: 7199 strb r1, [r3, #6] pte[PTE_EdCyl] = (BYTE)cy; b6ba: 71d8 strb r0, [r3, #7] pte += SZ_PTE; /* Next entry */ b6bc: 3310 adds r3, #16 for (i = 0, s_lba32 = n_sc; i < 4 && s_lba32 != 0 && s_lba32 < sz_drv32; i++, s_lba32 += n_lba32) { b6be: 459b cmp fp, r3 b6c0: d011 beq.n b6e6 <_image_size+0x57a> b6c2: b182 cbz r2, b6e6 <_image_size+0x57a> b6c4: 42ba cmp r2, r7 b6c6: d20e bcs.n b6e6 <_image_size+0x57a> n_lba32 = (DWORD)plst[i]; /* Get partition size */ b6c8: f858 1b04 ldr.w r1, [r8], #4 if (n_lba32 <= 100) n_lba32 = (n_lba32 == 100) ? sz_drv32 : sz_drv32 / 100 * n_lba32; /* Size in percentage? */ b6cc: 2964 cmp r1, #100 ; 0x64 b6ce: d803 bhi.n b6d8 <_image_size+0x56c> b6d0: bf14 ite ne b6d2: fb0c f101 mulne.w r1, ip, r1 b6d6: 4639 moveq r1, r7 if (s_lba32 + n_lba32 > sz_drv32 || s_lba32 + n_lba32 < s_lba32) n_lba32 = sz_drv32 - s_lba32; /* Clip at drive size */ b6d8: 1850 adds r0, r2, r1 b6da: 4287 cmp r7, r0 b6dc: d3b2 bcc.n b644 <_image_size+0x4d8> b6de: 4282 cmp r2, r0 b6e0: d8b0 bhi.n b644 <_image_size+0x4d8> if (n_lba32 == 0) break; /* End of table or no sector to allocate? */ b6e2: 2900 cmp r1, #0 b6e4: d1af bne.n b646 <_image_size+0x4da> *ptr++ = (BYTE)val; val >>= 8; b6e6: 2355 movs r3, #85 ; 0x55 b6e8: 9a02 ldr r2, [sp, #8] b6ea: 4611 mov r1, r2 b6ec: f882 31fe strb.w r3, [r2, #510] ; 0x1fe *ptr++ = (BYTE)val; b6f0: 23aa movs r3, #170 ; 0xaa b6f2: f882 31ff strb.w r3, [r2, #511] ; 0x1ff if (disk_write(drv, buf, 0, 1) != RES_OK) return FR_DISK_ERR; /* Write it to the MBR */ b6f6: 2301 movs r3, #1 b6f8: 2200 movs r2, #0 b6fa: 4620 mov r0, r4 b6fc: f005 fa50 bl 10ba0 fr = create_partition(pdrv, lba, sys, buf); if (fr != FR_OK) LEAVE_MKFS(fr); b700: bb50 cbnz r0, b758 <_image_size+0x5ec> } } if (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); b702: 2200 movs r2, #0 b704: 4611 mov r1, r2 b706: 4620 mov r0, r4 b708: f005 fa51 bl 10bae if (vol < 0) return FR_INVALID_DRIVE; b70c: 3000 adds r0, #0 b70e: bf18 it ne b710: 2001 movne r0, #1 b712: e002 b.n b71a <_image_size+0x5ae> b714: 200b movs r0, #11 b716: e000 b.n b71a <_image_size+0x5ae> if (ds & STA_NOINIT) return FR_NOT_READY; b718: 2003 movs r0, #3 LEAVE_MKFS(FR_OK); } b71a: b017 add sp, #92 ; 0x5c b71c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} if (ds & STA_PROTECT) return FR_WRITE_PROTECTED; b720: 200a movs r0, #10 b722: e7fa b.n b71a <_image_size+0x5ae> if (sz_buf == 0) return FR_NOT_ENOUGH_CORE; b724: 2011 movs r0, #17 b726: e7f8 b.n b71a <_image_size+0x5ae> if (!buf) return FR_NOT_ENOUGH_CORE; b728: 2011 movs r0, #17 b72a: e7f6 b.n b71a <_image_size+0x5ae> if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); b72c: 2001 movs r0, #1 b72e: e7f4 b.n b71a <_image_size+0x5ae> if (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if volume size is >=128s */ b730: 200e movs r0, #14 b732: e7f2 b.n b71a <_image_size+0x5ae> if (!(fsopt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER); /* no-FAT? */ b734: 2013 movs r0, #19 b736: e7f0 b.n b71a <_image_size+0x5ae> if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED); b738: 200e movs r0, #14 b73a: e7ee b.n b71a <_image_size+0x5ae> if (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ b73c: 200e movs r0, #14 b73e: e7ec b.n b71a <_image_size+0x5ae> LEAVE_MKFS(FR_MKFS_ABORTED); b740: 200e movs r0, #14 b742: e7ea b.n b71a <_image_size+0x5ae> LEAVE_MKFS(FR_MKFS_ABORTED); b744: 200e movs r0, #14 b746: e7e8 b.n b71a <_image_size+0x5ae> if (fsty == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters for FAT12 */ b748: 200e movs r0, #14 b74a: e7e6 b.n b71a <_image_size+0x5ae> if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */ b74c: 2001 movs r0, #1 b74e: e7e4 b.n b71a <_image_size+0x5ae> if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); b750: 2001 movs r0, #1 b752: e7e2 b.n b71a <_image_size+0x5ae> if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); b754: 2001 movs r0, #1 b756: e7e0 b.n b71a <_image_size+0x5ae> if (fr != FR_OK) LEAVE_MKFS(fr); b758: 2001 movs r0, #1 b75a: e7de b.n b71a <_image_size+0x5ae> if ((fsopt & FM_FAT32)) { b75c: 9a09 ldr r2, [sp, #36] ; 0x24 b75e: b1fa cbz r2, b7a0 <_image_size+0x634> if (pau == 0) { /* AU auto-selection */ b760: 2b00 cmp r3, #0 b762: f43f acc6 beq.w b0f2 b766: 461d mov r5, r3 n_clst = (DWORD)sz_vol / pau; /* Number of clusters */ b768: fbbc f1f5 udiv r1, ip, r5 sz_fat = (n_clst * 4 + 8 + ss - 1) / ss; /* FAT size [sector] */ b76c: 008a lsls r2, r1, #2 b76e: f202 2207 addw r2, r2, #519 ; 0x207 b772: 0a52 lsrs r2, r2, #9 if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED); b774: f5a1 417f sub.w r1, r1, #65280 ; 0xff00 b778: 39f6 subs r1, #246 ; 0xf6 b77a: 480d ldr r0, [pc, #52] ; (b7b0 <_image_size+0x644>) b77c: 4281 cmp r1, r0 b77e: d8db bhi.n b738 <_image_size+0x5cc> b_data = b_fat + sz_fat * n_fat + sz_dir; /* Data base */ b780: 9c0a ldr r4, [sp, #40] ; 0x28 b782: fb02 4609 mla r6, r2, r9, r4 n = (DWORD)(((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data); /* Sectors to next nearest from current data base */ b786: 9803 ldr r0, [sp, #12] b788: 4430 add r0, r6 b78a: 9904 ldr r1, [sp, #16] b78c: 4008 ands r0, r1 b78e: 1b80 subs r0, r0, r6 sz_rsv += n; b_fat += n; b790: f100 0120 add.w r1, r0, #32 b794: 4420 add r0, r4 b796: 9007 str r0, [sp, #28] sz_dir = 0; /* No static directory */ b798: 2000 movs r0, #0 b79a: f04f 0a03 mov.w sl, #3 b79e: e4e2 b.n b166 LEAVE_MKFS(FR_MKFS_ABORTED); b7a0: 200e movs r0, #14 b7a2: e7ba b.n b71a <_image_size+0x5ae> if (fr != FR_OK) LEAVE_MKFS(fr); b7a4: 2001 movs r0, #1 b7a6: e7b8 b.n b71a <_image_size+0x5ae> b7a8: 9e05 ldr r6, [sp, #20] b7aa: 9f07 ldr r7, [sp, #28] b7ac: e5f1 b.n b392 <_image_size+0x226> b7ae: bf00 nop b7b0: 0ffeffff .word 0x0ffeffff 0000b7b4 : int f_printf ( FIL* fp, /* Pointer to the file object */ const TCHAR* fmt, /* Pointer to the format string */ ... /* Optional arguments... */ ) { b7b4: b40e push {r1, r2, r3} b7b6: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} b7ba: b09c sub sp, #112 ; 0x70 b7bc: 4606 mov r6, r0 b7be: ac25 add r4, sp, #148 ; 0x94 b7c0: f854 5b04 ldr.w r5, [r4], #4 mem_set(pb, 0, sizeof (putbuff)); b7c4: 224c movs r2, #76 ; 0x4c b7c6: 2100 movs r1, #0 b7c8: a808 add r0, sp, #32 b7ca: f005 fa0c bl 10be6 pb->fp = fp; b7ce: 9608 str r6, [sp, #32] TCHAR c, d, str[32], *p; putc_init(&pb, fp); va_start(arp, fmt); b7d0: 941b str r4, [sp, #108] ; 0x6c case 'C' : /* Character */ putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; case 'B' : /* Unsigned binary */ r = 2; break; b7d2: f04f 0802 mov.w r8, #2 b7d6: e0e6 b.n b9a6 c = *fmt++; b7d8: 3501 adds r5, #1 putc_bfd(&pb, c); b7da: a808 add r0, sp, #32 b7dc: f006 f8c9 bl 11972 continue; b7e0: e0e1 b.n b9a6 f = 1; c = *fmt++; b7e2: 78a9 ldrb r1, [r5, #2] b7e4: 3503 adds r5, #3 b7e6: f04f 0a01 mov.w sl, #1 b7ea: e0ed b.n b9c8 f = 2; c = *fmt++; b7ec: 78a9 ldrb r1, [r5, #2] b7ee: 3503 adds r5, #3 b7f0: 46c2 mov sl, r8 b7f2: e0e9 b.n b9c8 while (IsDigit(c)) { /* Minimum width */ b7f4: f1a1 0330 sub.w r3, r1, #48 ; 0x30 b7f8: b2db uxtb r3, r3 b7fa: 2b09 cmp r3, #9 w = f = 0; b7fc: bf88 it hi b7fe: 2600 movhi r6, #0 while (IsDigit(c)) { /* Minimum width */ b800: f200 80eb bhi.w b9da w = f = 0; b804: 2600 movs r6, #0 w = w * 10 + c - '0'; b806: eb06 0686 add.w r6, r6, r6, lsl #2 b80a: eb01 0646 add.w r6, r1, r6, lsl #1 b80e: 3e30 subs r6, #48 ; 0x30 c = *fmt++; b810: f815 1b01 ldrb.w r1, [r5], #1 while (IsDigit(c)) { /* Minimum width */ b814: f1a1 0330 sub.w r3, r1, #48 ; 0x30 b818: b2db uxtb r3, r3 b81a: 2b09 cmp r3, #9 b81c: d9f3 bls.n b806 b81e: e0dc b.n b9da p = va_arg(arp, TCHAR*); b820: 9b1b ldr r3, [sp, #108] ; 0x6c b822: 1d1a adds r2, r3, #4 b824: 921b str r2, [sp, #108] ; 0x6c b826: 681c ldr r4, [r3, #0] for (j = 0; p[j]; j++) ; b828: 7821 ldrb r1, [r4, #0] b82a: 2900 cmp r1, #0 b82c: f000 8128 beq.w ba80 b830: 4623 mov r3, r4 b832: f1c4 0001 rsb r0, r4, #1 b836: 18c7 adds r7, r0, r3 b838: f813 2f01 ldrb.w r2, [r3, #1]! b83c: 2a00 cmp r2, #0 b83e: d1fa bne.n b836 if (!(f & 2)) { /* Right padded */ b840: f01a 0f02 tst.w sl, #2 b844: f000 813a beq.w babc while (*p) putc_bfd(&pb, *p++) ; /* String body */ b848: a808 add r0, sp, #32 b84a: f006 f892 bl 11972 b84e: f814 1f01 ldrb.w r1, [r4, #1]! b852: 2900 cmp r1, #0 b854: d1f8 bne.n b848 while (j++ < w) putc_bfd(&pb, ' ') ; /* Left padded */ b856: 1c7c adds r4, r7, #1 b858: 42be cmp r6, r7 b85a: f240 80a4 bls.w b9a6 b85e: 2720 movs r7, #32 b860: e010 b.n b884 while (j++ < w) putc_bfd(&pb, ' ') ; b862: 4699 mov r9, r3 b864: 4659 mov r1, fp b866: a808 add r0, sp, #32 b868: f006 f883 bl 11972 b86c: f109 0301 add.w r3, r9, #1 b870: 454e cmp r6, r9 b872: d1f6 bne.n b862 b874: ebaa 0707 sub.w r7, sl, r7 b878: 4437 add r7, r6 while (*p) putc_bfd(&pb, *p++) ; /* String body */ b87a: 7821 ldrb r1, [r4, #0] b87c: 2900 cmp r1, #0 b87e: d1e3 bne.n b848 b880: e7e9 b.n b856 while (j++ < w) putc_bfd(&pb, ' ') ; /* Left padded */ b882: 461c mov r4, r3 b884: 4639 mov r1, r7 b886: a808 add r0, sp, #32 b888: f006 f873 bl 11972 b88c: 1c63 adds r3, r4, #1 b88e: 42a6 cmp r6, r4 b890: d1f7 bne.n b882 b892: e088 b.n b9a6 putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; b894: 9b1b ldr r3, [sp, #108] ; 0x6c b896: 1d1a adds r2, r3, #4 b898: 921b str r2, [sp, #108] ; 0x6c b89a: 7819 ldrb r1, [r3, #0] b89c: a808 add r0, sp, #32 b89e: f006 f868 bl 11972 b8a2: e080 b.n b9a6 case 'X' : /* Unsigned hexdecimal */ r = 16; break; default: /* Unknown type (pass-through) */ putc_bfd(&pb, c); continue; b8a4: a808 add r0, sp, #32 b8a6: f006 f864 bl 11972 b8aa: e07c b.n b9a6 } /* Get an argument and put it in numeral */ v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); b8ac: f01a 0f04 tst.w sl, #4 b8b0: d009 beq.n b8c6 r = 10; break; b8b2: 200a movs r0, #10 v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); b8b4: 9a1b ldr r2, [sp, #108] ; 0x6c b8b6: 1d14 adds r4, r2, #4 b8b8: 941b str r4, [sp, #108] ; 0x6c b8ba: 6812 ldr r2, [r2, #0] if (d == 'D' && (v & 0x80000000)) { b8bc: 2b44 cmp r3, #68 ; 0x44 b8be: d00a beq.n b8d6 b8c0: e00e b.n b8e0 r = 16; break; b8c2: 2010 movs r0, #16 b8c4: e7f6 b.n b8b4 r = 10; break; b8c6: 200a movs r0, #10 v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); b8c8: 2b44 cmp r3, #68 ; 0x44 b8ca: f040 80d4 bne.w ba76 b8ce: 9b1b ldr r3, [sp, #108] ; 0x6c b8d0: 1d1a adds r2, r3, #4 b8d2: 921b str r2, [sp, #108] ; 0x6c b8d4: 681a ldr r2, [r3, #0] if (d == 'D' && (v & 0x80000000)) { b8d6: 2a00 cmp r2, #0 v = 0 - v; b8d8: bfbc itt lt b8da: 4252 neglt r2, r2 f |= 8; b8dc: f04a 0a08 orrlt.w sl, sl, #8 } i = 0; b8e0: 2978 cmp r1, #120 ; 0x78 b8e2: bf0c ite eq b8e4: f04f 0b27 moveq.w fp, #39 ; 0x27 b8e8: f04f 0b07 movne.w fp, #7 b8ec: 466f mov r7, sp r = 2; break; b8ee: 46bc mov ip, r7 i = 0; b8f0: f04f 0e00 mov.w lr, #0 do { d = (TCHAR)(v % r); v /= r; b8f4: 4681 mov r9, r0 b8f6: e000 b.n b8fa if (d > 9) d += (c == 'x') ? 0x27 : 0x07; str[i++] = d + '0'; b8f8: 46a6 mov lr, r4 d = (TCHAR)(v % r); v /= r; b8fa: fbb2 f1f0 udiv r1, r2, r0 b8fe: fb00 2311 mls r3, r0, r1, r2 b902: b2db uxtb r3, r3 if (d > 9) d += (c == 'x') ? 0x27 : 0x07; b904: 2b09 cmp r3, #9 b906: bf84 itt hi b908: 445b addhi r3, fp b90a: b2db uxtbhi r3, r3 str[i++] = d + '0'; b90c: f10e 0401 add.w r4, lr, #1 b910: 3330 adds r3, #48 ; 0x30 b912: f80c 3b01 strb.w r3, [ip], #1 } while (v && i < sizeof str / sizeof *str); b916: 4591 cmp r9, r2 b918: d804 bhi.n b924 d = (TCHAR)(v % r); v /= r; b91a: 460a mov r2, r1 } while (v && i < sizeof str / sizeof *str); b91c: 2c20 cmp r4, #32 b91e: d1eb bne.n b8f8 b920: f04f 0e1f mov.w lr, #31 if (f & 8) str[i++] = '-'; b924: f01a 0f08 tst.w sl, #8 b928: d006 beq.n b938 b92a: ab1c add r3, sp, #112 ; 0x70 b92c: 441c add r4, r3 b92e: 232d movs r3, #45 ; 0x2d b930: f804 3c70 strb.w r3, [r4, #-112] b934: f10e 0402 add.w r4, lr, #2 j = i; d = (f & 1) ? '0' : ' '; b938: f00a 0301 and.w r3, sl, #1 b93c: 2b00 cmp r3, #0 b93e: bf14 ite ne b940: f04f 0930 movne.w r9, #48 ; 0x30 b944: f04f 0920 moveq.w r9, #32 if (!(f & 2)) { b948: f01a 0f02 tst.w sl, #2 b94c: d004 beq.n b958 j = i; d = (f & 1) ? '0' : ' '; b94e: 46a2 mov sl, r4 b950: ab1c add r3, sp, #112 ; 0x70 b952: 441c add r4, r3 b954: 3c71 subs r4, #113 ; 0x71 b956: e011 b.n b97c while (j++ < w) putc_bfd(&pb, d); /* Right pad */ b958: f104 0a01 add.w sl, r4, #1 b95c: 42b4 cmp r4, r6 b95e: d301 bcc.n b964 b960: e7f6 b.n b950 b962: 469a mov sl, r3 b964: 4649 mov r1, r9 b966: a808 add r0, sp, #32 b968: f006 f803 bl 11972 b96c: f10a 0301 add.w r3, sl, #1 b970: 4556 cmp r6, sl b972: d1f6 bne.n b962 b974: f106 0a01 add.w sl, r6, #1 b978: e7ea b.n b950 b97a: 465c mov r4, fp } do { putc_bfd(&pb, str[--i]); /* Number body */ b97c: 46a3 mov fp, r4 b97e: f81b 1901 ldrb.w r1, [fp], #-1 b982: a808 add r0, sp, #32 b984: f005 fff5 bl 11972 } while (i); b988: 42bc cmp r4, r7 b98a: d1f6 bne.n b97a while (j++ < w) putc_bfd(&pb, d); /* Left pad */ b98c: f10a 0401 add.w r4, sl, #1 b990: 4556 cmp r6, sl b992: d801 bhi.n b998 b994: e007 b.n b9a6 b996: 461c mov r4, r3 b998: 4649 mov r1, r9 b99a: a808 add r0, sp, #32 b99c: f005 ffe9 bl 11972 b9a0: 1c63 adds r3, r4, #1 b9a2: 42a6 cmp r6, r4 b9a4: d1f7 bne.n b996 c = *fmt++; b9a6: 7829 ldrb r1, [r5, #0] if (c == 0) break; /* End of string */ b9a8: 2900 cmp r1, #0 b9aa: f000 8097 beq.w badc if (c != '%') { /* Non escape character */ b9ae: 2925 cmp r1, #37 ; 0x25 b9b0: f47f af12 bne.w b7d8 c = *fmt++; b9b4: 7869 ldrb r1, [r5, #1] if (c == '0') { /* Flag: '0' padding */ b9b6: 2930 cmp r1, #48 ; 0x30 b9b8: f43f af13 beq.w b7e2 if (c == '-') { /* Flag: left justified */ b9bc: 292d cmp r1, #45 ; 0x2d b9be: f43f af15 beq.w b7ec c = *fmt++; b9c2: 3502 adds r5, #2 w = f = 0; b9c4: f04f 0a00 mov.w sl, #0 if (c == '*') { /* Minimum width by argument */ b9c8: 292a cmp r1, #42 ; 0x2a b9ca: f47f af13 bne.w b7f4 w = va_arg(arp, int); b9ce: 9b1b ldr r3, [sp, #108] ; 0x6c b9d0: 1d1a adds r2, r3, #4 b9d2: 921b str r2, [sp, #108] ; 0x6c b9d4: 681e ldr r6, [r3, #0] c = *fmt++; b9d6: f815 1b01 ldrb.w r1, [r5], #1 if (c == 'l' || c == 'L') { /* Type prefix: Size is long int */ b9da: f001 03df and.w r3, r1, #223 ; 0xdf b9de: 2b4c cmp r3, #76 ; 0x4c f |= 4; c = *fmt++; b9e0: bf04 itt eq b9e2: f04a 0a04 orreq.w sl, sl, #4 b9e6: f815 1b01 ldrbeq.w r1, [r5], #1 if (c == 0) break; b9ea: 2900 cmp r1, #0 b9ec: d076 beq.n badc if (IsLower(d)) d -= 0x20; b9ee: f1a1 0361 sub.w r3, r1, #97 ; 0x61 b9f2: b2db uxtb r3, r3 b9f4: 2b19 cmp r3, #25 b9f6: bf9a itte ls b9f8: f1a1 0320 subls.w r3, r1, #32 b9fc: b2db uxtbls r3, r3 d = c; b9fe: 460b movhi r3, r1 switch (d) { /* Atgument type is... */ ba00: f1a3 0242 sub.w r2, r3, #66 ; 0x42 ba04: 2a16 cmp r2, #22 ba06: f63f af4d bhi.w b8a4 ba0a: a001 add r0, pc, #4 ; (adr r0, ba10 ) ba0c: f850 f022 ldr.w pc, [r0, r2, lsl #2] ba10: 0000ba97 .word 0x0000ba97 ba14: 0000b895 .word 0x0000b895 ba18: 0000b8ad .word 0x0000b8ad ba1c: 0000b8a5 .word 0x0000b8a5 ba20: 0000b8a5 .word 0x0000b8a5 ba24: 0000b8a5 .word 0x0000b8a5 ba28: 0000b8a5 .word 0x0000b8a5 ba2c: 0000b8a5 .word 0x0000b8a5 ba30: 0000b8a5 .word 0x0000b8a5 ba34: 0000b8a5 .word 0x0000b8a5 ba38: 0000b8a5 .word 0x0000b8a5 ba3c: 0000b8a5 .word 0x0000b8a5 ba40: 0000b8a5 .word 0x0000b8a5 ba44: 0000baad .word 0x0000baad ba48: 0000b8a5 .word 0x0000b8a5 ba4c: 0000b8a5 .word 0x0000b8a5 ba50: 0000b8a5 .word 0x0000b8a5 ba54: 0000b821 .word 0x0000b821 ba58: 0000b8a5 .word 0x0000b8a5 ba5c: 0000b8ad .word 0x0000b8ad ba60: 0000b8a5 .word 0x0000b8a5 ba64: 0000b8a5 .word 0x0000b8a5 ba68: 0000ba6d .word 0x0000ba6d v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); ba6c: f01a 0f04 tst.w sl, #4 ba70: f47f af27 bne.w b8c2 r = 16; break; ba74: 2010 movs r0, #16 v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); ba76: 9b1b ldr r3, [sp, #108] ; 0x6c ba78: 1d1a adds r2, r3, #4 ba7a: 921b str r2, [sp, #108] ; 0x6c ba7c: 681a ldr r2, [r3, #0] if (d == 'D' && (v & 0x80000000)) { ba7e: e72f b.n b8e0 if (!(f & 2)) { /* Right padded */ ba80: f01a 0f02 tst.w sl, #2 ba84: d022 beq.n bacc for (j = 0; p[j]; j++) ; ba86: 2700 movs r7, #0 ba88: e6e5 b.n b856 v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); ba8a: 9b1b ldr r3, [sp, #108] ; 0x6c ba8c: 1d1a adds r2, r3, #4 ba8e: 921b str r2, [sp, #108] ; 0x6c ba90: 681a ldr r2, [r3, #0] r = 2; break; ba92: 4640 mov r0, r8 ba94: e724 b.n b8e0 v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); ba96: f01a 0f04 tst.w sl, #4 ba9a: d1f6 bne.n ba8a r = 2; break; ba9c: 4640 mov r0, r8 ba9e: e713 b.n b8c8 v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); baa0: 9b1b ldr r3, [sp, #108] ; 0x6c baa2: 1d1a adds r2, r3, #4 baa4: 921b str r2, [sp, #108] ; 0x6c baa6: 681a ldr r2, [r3, #0] r = 8; break; baa8: 2008 movs r0, #8 baaa: e719 b.n b8e0 v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); baac: f01a 0f04 tst.w sl, #4 bab0: d1f6 bne.n baa0 r = 8; break; bab2: 2008 movs r0, #8 bab4: e7df b.n ba76 while (*p) putc_bfd(&pb, *p++) ; /* String body */ bab6: 7821 ldrb r1, [r4, #0] while (j++ < w) putc_bfd(&pb, ' ') ; bab8: 4657 mov r7, sl baba: e6c5 b.n b848 babc: f107 0a01 add.w sl, r7, #1 bac0: 42be cmp r6, r7 bac2: d9f8 bls.n bab6 bac4: 46d1 mov r9, sl bac6: f04f 0b20 mov.w fp, #32 baca: e6cb b.n b864 bacc: 2701 movs r7, #1 bace: 2e00 cmp r6, #0 bad0: f43f aec1 beq.w b856 for (j = 0; p[j]; j++) ; bad4: 2700 movs r7, #0 while (j++ < w) putc_bfd(&pb, ' ') ; bad6: f04f 0a01 mov.w sl, #1 bada: e7f3 b.n bac4 } va_end(arp); return putc_flush(&pb); badc: a808 add r0, sp, #32 bade: f005 ff67 bl 119b0 } bae2: b01c add sp, #112 ; 0x70 bae4: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bae8: b003 add sp, #12 baea: 4770 bx lr 0000baec : { WCHAR c = 0; const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); if (uni < 0x80) { /* ASCII? */ baec: 287f cmp r0, #127 ; 0x7f baee: d801 bhi.n baf4 c = (WCHAR)uni; baf0: b280 uxth r0, r0 baf2: 4770 bx lr } else { /* Non-ASCII */ if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */ baf4: f5b0 3f80 cmp.w r0, #65536 ; 0x10000 baf8: d217 bcs.n bb2a bafa: f240 13b5 movw r3, #437 ; 0x1b5 bafe: 4299 cmp r1, r3 bb00: d001 beq.n bb06 WCHAR c = 0; bb02: 2000 movs r0, #0 c = (c + 0x80) & 0xFF; } } return c; } bb04: 4770 bx lr for (c = 0; c < 0x80 && uni != p[c]; c++) ; bb06: 28c7 cmp r0, #199 ; 0xc7 bb08: d00d beq.n bb26 bb0a: 4a09 ldr r2, [pc, #36] ; (bb30 ) bb0c: 2301 movs r3, #1 bb0e: f832 1f02 ldrh.w r1, [r2, #2]! bb12: 4281 cmp r1, r0 bb14: d003 beq.n bb1e bb16: 3301 adds r3, #1 bb18: b29b uxth r3, r3 bb1a: 2b80 cmp r3, #128 ; 0x80 bb1c: d1f7 bne.n bb0e c = (c + 0x80) & 0xFF; bb1e: f103 0080 add.w r0, r3, #128 ; 0x80 bb22: b2c0 uxtb r0, r0 bb24: 4770 bx lr for (c = 0; c < 0x80 && uni != p[c]; c++) ; bb26: 2300 movs r3, #0 bb28: e7f9 b.n bb1e WCHAR c = 0; bb2a: 2000 movs r0, #0 bb2c: 4770 bx lr bb2e: bf00 nop bb30: 00012980 .word 0x00012980 0000bb34 : { WCHAR c = 0; const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); if (oem < 0x80) { /* ASCII? */ bb34: 287f cmp r0, #127 ; 0x7f bb36: d90f bls.n bb58 c = oem; } else { /* Extended char */ if (cp == FF_CODE_PAGE) { /* Is it a valid code page? */ bb38: f240 13b5 movw r3, #437 ; 0x1b5 bb3c: 4299 cmp r1, r3 bb3e: d001 beq.n bb44 WCHAR c = 0; bb40: 2000 movs r0, #0 bb42: 4770 bx lr if (oem < 0x100) c = p[oem - 0x80]; bb44: 28ff cmp r0, #255 ; 0xff bb46: d806 bhi.n bb56 bb48: f100 4000 add.w r0, r0, #2147483648 ; 0x80000000 bb4c: 3880 subs r0, #128 ; 0x80 bb4e: 4b03 ldr r3, [pc, #12] ; (bb5c ) bb50: f833 0010 ldrh.w r0, [r3, r0, lsl #1] bb54: 4770 bx lr WCHAR c = 0; bb56: 2000 movs r0, #0 } } return c; } bb58: 4770 bx lr bb5a: bf00 nop bb5c: 00012980 .word 0x00012980 0000bb60 : 0x0000 /* EOT */ }; if (uni < 0x10000) { /* Is it in BMP? */ bb60: f5b0 3f80 cmp.w r0, #65536 ; 0x10000 bb64: d251 bcs.n bc0a { bb66: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} uc = (WORD)uni; bb6a: b287 uxth r7, r0 p = uc < 0x1000 ? cvt1 : cvt2; bb6c: 4927 ldr r1, [pc, #156] ; (bc0c ) bb6e: 4a28 ldr r2, [pc, #160] ; (bc10 ) bb70: f5b7 5f80 cmp.w r7, #4096 ; 0x1000 bb74: bf28 it cs bb76: 4611 movcs r1, r2 for (;;) { bc = *p++; /* Get the block base */ if (bc == 0 || uc < bc) break; /* Not matched? */ nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ if (uc < bc + nc) { /* In the block? */ bb78: 4638 mov r0, r7 bb7a: 46bc mov ip, r7 bb7c: 3104 adds r1, #4 bc = *p++; /* Get the block base */ bb7e: 460c mov r4, r1 bb80: f831 3c04 ldrh.w r3, [r1, #-4] if (bc == 0 || uc < bc) break; /* Not matched? */ bb84: b1e3 cbz r3, bbc0 bb86: 429f cmp r7, r3 bb88: d31a bcc.n bbc0 nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ bb8a: f831 2c02 ldrh.w r2, [r1, #-2] bb8e: 0a15 lsrs r5, r2, #8 bb90: b2d2 uxtb r2, r2 if (uc < bc + nc) { /* In the block? */ bb92: 46e6 mov lr, ip bb94: 18d6 adds r6, r2, r3 bb96: 42b0 cmp r0, r6 bb98: db05 blt.n bba6 case 7: uc -= 80; break; /* Shift -80 */ case 8: uc -= 0x1C60; break; /* Shift -0x1C60 */ } break; } if (cmd == 0) p += nc; /* Skip table if needed */ bb9a: 3104 adds r1, #4 bb9c: 2d00 cmp r5, #0 bb9e: d1ee bne.n bb7e bba0: eb04 0142 add.w r1, r4, r2, lsl #1 bba4: e7ea b.n bb7c switch (cmd) { bba6: 2d08 cmp r5, #8 bba8: d80a bhi.n bbc0 bbaa: e8df f005 tbb [pc, r5] bbae: 0c05 .short 0x0c05 bbb0: 1e1a1612 .word 0x1e1a1612 bbb4: 2622 .short 0x2622 bbb6: 2a .byte 0x2a bbb7: 00 .byte 0x00 case 0: uc = p[uc - bc]; break; /* Table conversion */ bbb8: ebac 0e03 sub.w lr, ip, r3 bbbc: f831 701e ldrh.w r7, [r1, lr, lsl #1] } uni = uc; bbc0: 4638 mov r0, r7 } return uni; } bbc2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} case 1: uc -= (uc - bc) & 1; break; /* Case pairs */ bbc6: 1afb subs r3, r7, r3 bbc8: f003 0301 and.w r3, r3, #1 bbcc: 1afb subs r3, r7, r3 bbce: b29f uxth r7, r3 bbd0: e7f6 b.n bbc0 case 2: uc -= 16; break; /* Shift -16 */ bbd2: f1a7 0310 sub.w r3, r7, #16 bbd6: b29f uxth r7, r3 bbd8: e7f2 b.n bbc0 case 3: uc -= 32; break; /* Shift -32 */ bbda: f1a7 0320 sub.w r3, r7, #32 bbde: b29f uxth r7, r3 bbe0: e7ee b.n bbc0 case 4: uc -= 48; break; /* Shift -48 */ bbe2: f1a7 0330 sub.w r3, r7, #48 ; 0x30 bbe6: b29f uxth r7, r3 bbe8: e7ea b.n bbc0 case 5: uc -= 26; break; /* Shift -26 */ bbea: f1a7 031a sub.w r3, r7, #26 bbee: b29f uxth r7, r3 bbf0: e7e6 b.n bbc0 case 6: uc += 8; break; /* Shift +8 */ bbf2: f107 0308 add.w r3, r7, #8 bbf6: b29f uxth r7, r3 bbf8: e7e2 b.n bbc0 case 7: uc -= 80; break; /* Shift -80 */ bbfa: f1a7 0350 sub.w r3, r7, #80 ; 0x50 bbfe: b29f uxth r7, r3 bc00: e7de b.n bbc0 case 8: uc -= 0x1C60; break; /* Shift -0x1C60 */ bc02: f5a7 53e3 sub.w r3, r7, #7264 ; 0x1c60 bc06: b29f uxth r7, r3 bc08: e7da b.n bbc0 } bc0a: 4770 bx lr bc0c: 000126d0 .word 0x000126d0 bc10: 000128c4 .word 0x000128c4 0000bc14 : /*------------------------------------------------------------------*/ void do_MonitorKeypad(void) { longword portbits; portbits = GPIOB->PDIR; /*(11/23/20) Get bits 0-3 and 16-19 of PORTB */ bc14: 4b2c ldr r3, [pc, #176] ; (bcc8 ) bc16: 691b ldr r3, [r3, #16] portbits ^= 0x0F000F; /* Invert bits so set=pressed */ bc18: f083 130f eor.w r3, r3, #983055 ; 0xf000f calcs.KEYPADraw = 0; /* Map the keys to standard positions */ bc1c: 2000 movs r0, #0 bc1e: 4a2b ldr r2, [pc, #172] ; (bccc ) bc20: f882 0032 strb.w r0, [r2, #50] ; 0x32 KEYPADextrabutton = 0; bc24: 4a2a ldr r2, [pc, #168] ; (bcd0 ) bc26: 7811 ldrb r1, [r2, #0] bc28: f360 11c7 bfi r1, r0, #7, #1 bc2c: 7011 strb r1, [r2, #0] if (portbits&0x080000) bc2e: f413 2f00 tst.w r3, #524288 ; 0x80000 bc32: d003 beq.n bc3c { calcs.KEYPADraw |= KEYPADenter; bc34: 4a25 ldr r2, [pc, #148] ; (bccc ) bc36: 2101 movs r1, #1 bc38: f882 1032 strb.w r1, [r2, #50] ; 0x32 } if (portbits&0x040000) bc3c: f413 2f80 tst.w r3, #262144 ; 0x40000 bc40: d006 beq.n bc50 { calcs.KEYPADraw |= KEYPADright; bc42: 4922 ldr r1, [pc, #136] ; (bccc ) bc44: f891 2032 ldrb.w r2, [r1, #50] ; 0x32 bc48: f042 0202 orr.w r2, r2, #2 bc4c: f881 2032 strb.w r2, [r1, #50] ; 0x32 } if (portbits&0x020000) bc50: f413 3f00 tst.w r3, #131072 ; 0x20000 bc54: d006 beq.n bc64 { calcs.KEYPADraw |= KEYPADup; bc56: 491d ldr r1, [pc, #116] ; (bccc ) bc58: f891 2032 ldrb.w r2, [r1, #50] ; 0x32 bc5c: f042 0208 orr.w r2, r2, #8 bc60: f881 2032 strb.w r2, [r1, #50] ; 0x32 } if (portbits&0x010000) bc64: f413 3f80 tst.w r3, #65536 ; 0x10000 bc68: d006 beq.n bc78 { calcs.KEYPADraw |= KEYPADdown; bc6a: 4918 ldr r1, [pc, #96] ; (bccc ) bc6c: f891 2032 ldrb.w r2, [r1, #50] ; 0x32 bc70: f042 0204 orr.w r2, r2, #4 bc74: f881 2032 strb.w r2, [r1, #50] ; 0x32 } if (portbits&0x000008) bc78: f013 0f08 tst.w r3, #8 bc7c: d006 beq.n bc8c { calcs.KEYPADraw |= KEYPADleft; bc7e: 4913 ldr r1, [pc, #76] ; (bccc ) bc80: f891 2032 ldrb.w r2, [r1, #50] ; 0x32 bc84: f042 0210 orr.w r2, r2, #16 bc88: f881 2032 strb.w r2, [r1, #50] ; 0x32 } if (portbits&0x000004) bc8c: f013 0f04 tst.w r3, #4 bc90: d006 beq.n bca0 { calcs.KEYPADraw |= KEYPADesc; bc92: 490e ldr r1, [pc, #56] ; (bccc ) bc94: f891 2032 ldrb.w r2, [r1, #50] ; 0x32 bc98: f042 0220 orr.w r2, r2, #32 bc9c: f881 2032 strb.w r2, [r1, #50] ; 0x32 } if (portbits&0x000002) bca0: f013 0f02 tst.w r3, #2 bca4: d006 beq.n bcb4 { calcs.KEYPADraw |= KEYPADquery; bca6: 4909 ldr r1, [pc, #36] ; (bccc ) bca8: f891 2032 ldrb.w r2, [r1, #50] ; 0x32 bcac: f042 0240 orr.w r2, r2, #64 ; 0x40 bcb0: f881 2032 strb.w r2, [r1, #50] ; 0x32 } if (portbits&0x000001) bcb4: f013 0f01 tst.w r3, #1 bcb8: d004 beq.n bcc4 { KEYPADextrabutton = 1; /*(extra input isn't really a button!)*/ bcba: 4a05 ldr r2, [pc, #20] ; (bcd0 ) bcbc: 7813 ldrb r3, [r2, #0] bcbe: f043 0380 orr.w r3, r3, #128 ; 0x80 bcc2: 7013 strb r3, [r2, #0] } } bcc4: 4770 bx lr bcc6: bf00 nop bcc8: 400ff040 .word 0x400ff040 bccc: 20000934 .word 0x20000934 bcd0: 2000096c .word 0x2000096c 0000bcd4 : /******************************************************************** * Function: resetKeypad *******************************************************************/ void resetKeypad(void) { KeyRepeatBallistic = KEYREPEATINITIAL; /*(12/20/12) Reset key repeat */ bcd4: 233c movs r3, #60 ; 0x3c bcd6: 4a05 ldr r2, [pc, #20] ; (bcec ) bcd8: 7013 strb r3, [r2, #0] t10ms.KeyRepeatDelay = KEYREPEATINITIAL; bcda: 4a05 ldr r2, [pc, #20] ; (bcf0 ) bcdc: 7153 strb r3, [r2, #5] KEYPADinit = 0; bcde: 4b05 ldr r3, [pc, #20] ; (bcf4 ) bce0: 781a ldrb r2, [r3, #0] bce2: f36f 1286 bfc r2, #6, #1 bce6: 701a strb r2, [r3, #0] } bce8: 4770 bx lr bcea: bf00 nop bcec: 200012f6 .word 0x200012f6 bcf0: 20000980 .word 0x20000980 bcf4: 2000096c .word 0x2000096c 0000bcf8 : /*------------------------------------------------------------------*/ /* STARTUP FATFS routine - make sure disk is ready to use */ /*------------------------------------------------------------------*/ static void do_FATFSstartupMount(void) { bcf8: b500 push {lr} bcfa: f5ad 7d01 sub.w sp, sp, #516 ; 0x204 FRESULT result; BYTE work[FF_MAX_SS]; FATFSISMOUNTED = 0; bcfe: 4b1c ldr r3, [pc, #112] ; (bd70 ) bd00: 785a ldrb r2, [r3, #1] bd02: f36f 0200 bfc r2, #0, #1 bd06: 705a strb r2, [r3, #1] result = f_mount(&g_fileSystem, DRIVEROOT, 1U);/*(11/23/20) Mount SPIFLASH drive right now! */ bd08: 2201 movs r2, #1 bd0a: 491a ldr r1, [pc, #104] ; (bd74 ) bd0c: 481a ldr r0, [pc, #104] ; (bd78 ) bd0e: f7ff f829 bl ad64 if (result==0) bd12: b148 cbz r0, bd28 bd14: 4601 mov r1, r0 { FATFSISMOUNTED = 1; /* Successful */ return; } if (result==FR_NO_FILESYSTEM) /* Did we fail because there's no drive? Maybe it's never been initialized! */ bd16: 280d cmp r0, #13 bd18: d00c beq.n bd34 } } } } PRINTF("Some sort of startup failure, code=%lu.\r\n", result); bd1a: 4818 ldr r0, [pc, #96] ; (bd7c ) bd1c: f002 fe38 bl e990 <_printf> } bd20: f50d 7d01 add.w sp, sp, #516 ; 0x204 bd24: f85d fb04 ldr.w pc, [sp], #4 FATFSISMOUNTED = 1; /* Successful */ bd28: 4a11 ldr r2, [pc, #68] ; (bd70 ) bd2a: 7853 ldrb r3, [r2, #1] bd2c: f043 0301 orr.w r3, r3, #1 bd30: 7053 strb r3, [r2, #1] return; bd32: e7f5 b.n bd20 result = f_mkfs(DRIVEROOT, 0, work, sizeof work);/* Make a drive now! */ bd34: f44f 7300 mov.w r3, #512 ; 0x200 bd38: 466a mov r2, sp bd3a: 2100 movs r1, #0 bd3c: 480d ldr r0, [pc, #52] ; (bd74 ) bd3e: f7ff f8f7 bl af30 if (result==0) bd42: 4601 mov r1, r0 bd44: 2800 cmp r0, #0 bd46: d1e8 bne.n bd1a result = f_mount(&g_fileSystem, DRIVEROOT, 1U);/* Now we've made a drive, we should be able to mount it! */ bd48: 2201 movs r2, #1 bd4a: 490a ldr r1, [pc, #40] ; (bd74 ) bd4c: 480a ldr r0, [pc, #40] ; (bd78 ) bd4e: f7ff f809 bl ad64 if (result==0) bd52: 4601 mov r1, r0 bd54: 2800 cmp r0, #0 bd56: d1e0 bne.n bd1a result = f_setlabel("EZCALPRO2");/* Name the new drive */ bd58: 4809 ldr r0, [pc, #36] ; (bd80 ) bd5a: f7ff f82b bl adb4 if (result==0) bd5e: 4601 mov r1, r0 bd60: 2800 cmp r0, #0 bd62: d1da bne.n bd1a FATFSISMOUNTED = 1; /* Successful, now! */ bd64: 4a02 ldr r2, [pc, #8] ; (bd70 ) bd66: 7853 ldrb r3, [r2, #1] bd68: f043 0301 orr.w r3, r3, #1 bd6c: 7053 strb r3, [r2, #1] bd6e: e7d4 b.n bd1a bd70: 2000096c .word 0x2000096c bd74: 00012a80 .word 0x00012a80 bd78: 20000ba8 .word 0x20000ba8 bd7c: 00012afc .word 0x00012afc bd80: 00012af0 .word 0x00012af0 0000bd84 : /*------------------------------------------------------------------*/ /* STARTUP FATFS routine - how full is the disk? */ /*------------------------------------------------------------------*/ static void do_FATFSstartupFirstRead(void) { bd84: b530 push {r4, r5, lr} bd86: b0d7 sub sp, #348 ; 0x15c FATFS *fs; DIR directory; /* Directory object - filled in by "f_opendir" */ FILINFO fileInformation; DWORD free_clusters, free_sectors, total_sectors; result = f_getfree(DRIVEROOT, &free_clusters, &fs);/* Read drive size information */ bd88: aa55 add r2, sp, #340 ; 0x154 bd8a: a901 add r1, sp, #4 bd8c: 4821 ldr r0, [pc, #132] ; (be14 ) bd8e: f005 fef0 bl 11b72 if (result==0) bd92: b108 cbz r0, bd98 PRINTF("%s / %s (%i bytes)\r\n", fileInformation.fname, fileInformation.altname, fileInformation.fsize); } } } } } bd94: b057 add sp, #348 ; 0x15c bd96: bd30 pop {r4, r5, pc} total_sectors = (fs->n_fatent-2)*(fs->csize)*512; bd98: 9b55 ldr r3, [sp, #340] ; 0x154 bd9a: 8959 ldrh r1, [r3, #10] free_sectors = free_clusters*(fs->csize)*512; bd9c: 9a01 ldr r2, [sp, #4] bd9e: fb02 f201 mul.w r2, r2, r1 total_sectors = (fs->n_fatent-2)*(fs->csize)*512; bda2: 6998 ldr r0, [r3, #24] bda4: 4b1c ldr r3, [pc, #112] ; (be18 ) bda6: 4403 add r3, r0 bda8: fb01 f103 mul.w r1, r1, r3 PRINTF("DRIVE DETAILS: SIZE=%lu, AVAILABLE=%lu\r\n", total_sectors, free_sectors); bdac: 0252 lsls r2, r2, #9 bdae: 0249 lsls r1, r1, #9 bdb0: 481a ldr r0, [pc, #104] ; (be1c ) bdb2: f002 fded bl e990 <_printf> result = f_opendir(&directory, ""); bdb6: 491a ldr r1, [pc, #104] ; (be20 ) bdb8: a848 add r0, sp, #288 ; 0x120 bdba: f005 fe79 bl 11ab0 bdbe: 4604 mov r4, r0 PRINTF("DIRECTORY:\r\n"); bdc0: 4818 ldr r0, [pc, #96] ; (be24 ) bdc2: f002 fde5 bl e990 <_printf> if (result==0) bdc6: 2c00 cmp r4, #0 bdc8: d1e4 bne.n bd94 PRINTF("%s / %s (%i bytes)\r\n", fileInformation.fname, fileInformation.altname, fileInformation.fsize); bdca: 4d17 ldr r5, [pc, #92] ; (be28 ) PRINTF("%s / %s (directory!)\r\n", fileInformation.fname, fileInformation.altname); bdcc: 4c17 ldr r4, [pc, #92] ; (be2c ) bdce: e007 b.n bde0 PRINTF("%s / %s (%i bytes)\r\n", fileInformation.fname, fileInformation.altname, fileInformation.fsize); bdd0: 9b02 ldr r3, [sp, #8] bdd2: f10d 0211 add.w r2, sp, #17 bdd6: f10d 011e add.w r1, sp, #30 bdda: 4628 mov r0, r5 bddc: f002 fdd8 bl e990 <_printf> result = f_readdir(&directory, &fileInformation); bde0: a902 add r1, sp, #8 bde2: a848 add r0, sp, #288 ; 0x120 bde4: f005 fe9e bl 11b24 if ((result!= FR_OK)||(fileInformation.fname[0U]==0U)) bde8: 2800 cmp r0, #0 bdea: d1d3 bne.n bd94 bdec: f89d 301e ldrb.w r3, [sp, #30] bdf0: 2b00 cmp r3, #0 bdf2: d0cf beq.n bd94 if (fileInformation.fname[0]=='.') bdf4: 2b2e cmp r3, #46 ; 0x2e bdf6: d0f3 beq.n bde0 if (fileInformation.fattrib&AM_DIR) bdf8: f89d 3010 ldrb.w r3, [sp, #16] bdfc: f013 0f10 tst.w r3, #16 be00: d0e6 beq.n bdd0 PRINTF("%s / %s (directory!)\r\n", fileInformation.fname, fileInformation.altname); be02: f10d 0211 add.w r2, sp, #17 be06: f10d 011e add.w r1, sp, #30 be0a: 4620 mov r0, r4 be0c: f002 fdc0 bl e990 <_printf> be10: e7e6 b.n bde0 be12: bf00 nop be14: 00012a80 .word 0x00012a80 be18: 007ffffe .word 0x007ffffe be1c: 00012a84 .word 0x00012a84 be20: 00012aec .word 0x00012aec be24: 00012ab0 .word 0x00012ab0 be28: 00012ad8 .word 0x00012ad8 be2c: 00012ac0 .word 0x00012ac0 0000be30
: { be30: b508 push {r3, lr} SCB->VTOR = (uint32_t)__vectors_start__; /*(09/04/20) Set the interrupt vector table position for OPERATIONAL code IMPORTANT: MUST BE ON 0x0200 BOUNDARY! */ be32: 4a49 ldr r2, [pc, #292] ; (bf58 ) be34: 4b49 ldr r3, [pc, #292] ; (bf5c ) be36: 609a str r2, [r3, #8] __ASM volatile ("dsb 0xF":::"memory"); be38: f3bf 8f4f dsb sy __ASM volatile ("isb 0xF":::"memory"); be3c: f3bf 8f6f isb sy BOARD_BootClockRUN(); /* Configure processor clock */ be40: f7fe f8be bl 9fc0 BOARD_InitPins(); /* Configure I/O */ be44: f7fe f85c bl 9f00 /* Enable the SYSMPU globally. */ base->CESR |= SYSMPU_CESR_VLD_MASK; } else { /* Disable the SYSMPU globally. */ base->CESR &= ~SYSMPU_CESR_VLD_MASK; be48: 4a45 ldr r2, [pc, #276] ; (bf60 ) be4a: 6813 ldr r3, [r2, #0] be4c: f023 0301 bic.w r3, r3, #1 be50: 6013 str r3, [r2, #0] PIT0init(); /* Set up interrupt timer */ be52: f000 fceb bl c82c spiflash_disk_initialize(0); /* Set up SPI to access external flash memory */ be56: 2000 movs r0, #0 be58: f000 f9aa bl c1b0 ADC_Init(); /* Set up ADC to measure analogs */ be5c: f7fe f812 bl 9e84 initialize_LCD(); /* Prepare LCD control */ be60: f7fd fd86 bl 9970 resetKeypad(); /* Prepare keypad */ be64: f7ff ff36 bl bcd4 Initialize_UART0(); /* Initialize RS232 ports */ be68: f7fd fdf8 bl 9a5c Initialize_UART1(); be6c: f7fd fe92 bl 9b94 calcs.CANBUSstatus = 0; /* Make sure CANbus initializes properly */ be70: 2200 movs r2, #0 be72: 4b3c ldr r3, [pc, #240] ; (bf64 ) be74: 709a strb r2, [r3, #2] CANBUSACTIVITYFOUND = 0; be76: 4c3c ldr r4, [pc, #240] ; (bf68 ) be78: 7863 ldrb r3, [r4, #1] be7a: f362 0341 bfi r3, r2, #1, #1 be7e: 7063 strb r3, [r4, #1] do_FATFSstartupMount(); /* Make sure SPIFLASH is working */ be80: f7ff ff3a bl bcf8 if (FATFSISMOUNTED) be84: 7863 ldrb r3, [r4, #1] be86: f013 0f01 tst.w r3, #1 be8a: d103 bne.n be94 if (analogs.SupplyUSB>USBPRESENTVOLTAGE) be8c: 4e37 ldr r6, [pc, #220] ; (bf6c ) if (USBCONNECTED==1) be8e: 4c36 ldr r4, [pc, #216] ; (bf68 ) if (t10ms.USBconnectdelay==0) be90: 4d37 ldr r5, [pc, #220] ; (bf70 ) be92: e01b b.n becc do_FATFSstartupFirstRead(); /* !!!! Read some disk info !!!! */ be94: f7ff ff76 bl bd84 be98: e7f8 b.n be8c USB_DeviceApplicationInit(); /* USB is connected, set it up! */ be9a: f000 fea7 bl cbec USBFIRSTCONNECTED = 1; be9e: 7823 ldrb r3, [r4, #0] bea0: f043 0320 orr.w r3, r3, #32 bea4: 7023 strb r3, [r4, #0] bea6: e026 b.n bef6 debug_LCD(1);/*!!!!*/ bea8: 2001 movs r0, #1 beaa: f7fd fd8b bl 99c4 USBCONNECTED = 1; beae: 7823 ldrb r3, [r4, #0] beb0: f043 0310 orr.w r3, r3, #16 beb4: 7023 strb r3, [r4, #0] t10ms.USBconnectdelay = t10msHalfSec; /* (fine in USB mode - don't reset) */ beb6: 2332 movs r3, #50 ; 0x32 beb8: 71ab strb r3, [r5, #6] if (t10ms.IndicateWrite==0) beba: 78ab ldrb r3, [r5, #2] bebc: 2b00 cmp r3, #0 bebe: d035 beq.n bf2c if (t10ms.IndicateWrite&0x08) bec0: 78ab ldrb r3, [r5, #2] bec2: f013 0f08 tst.w r3, #8 bec6: d044 beq.n bf52 BOARD_LCDbacklightOn(); bec8: f004 fe53 bl 10b72 do_PIT0timer(); /* Run the timers */ becc: f000 fc7c bl c7c8 ADC_MainLoop(); /* Regularly update analog measurements */ bed0: f7fd ff00 bl 9cd4 do_MonitorKeypad(); /* Maintain "KEYPADraw" */ bed4: f7ff fe9e bl bc14 do_MAINRS232(); /* Run main RS232 communications */ bed8: f004 fe4a bl 10b70 do_DEBUGRS232(); /* Run debug RS232 communications */ bedc: f7fd fd92 bl 9a04 do_CAN(); /* Run CANbus monitoring */ bee0: f7fd f96a bl 91b8 drive_LCD(); /* Maintain LCD */ bee4: f7fd fc3a bl 975c if (analogs.SupplyUSB>USBPRESENTVOLTAGE) bee8: 8873 ldrh r3, [r6, #2] beea: 2b2d cmp r3, #45 ; 0x2d beec: d908 bls.n bf00 if (USBFIRSTCONNECTED==0) beee: 7823 ldrb r3, [r4, #0] bef0: f013 0f20 tst.w r3, #32 bef4: d0d1 beq.n be9a if (USBCONNECTED==0) bef6: 7823 ldrb r3, [r4, #0] bef8: f013 0f10 tst.w r3, #16 befc: d1d7 bne.n beae befe: e7d3 b.n bea8 if (USBCONNECTED==1) bf00: 7823 ldrb r3, [r4, #0] bf02: f013 0f10 tst.w r3, #16 bf06: d0d8 beq.n beba if (t10ms.USBconnectdelay==0) bf08: 79ab ldrb r3, [r5, #6] bf0a: 2b00 cmp r3, #0 bf0c: d1d5 bne.n beba SPIFLASH_WriteBack(); /* USB was connected but isn't any more - write any changed data back to SPIFLASH */ bf0e: f000 fb0b bl c528 __ASM volatile ("dsb 0xF":::"memory"); bf12: f3bf 8f4f dsb sy __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | bf16: 4911 ldr r1, [pc, #68] ; (bf5c ) bf18: 68ca ldr r2, [r1, #12] bf1a: f402 62e0 and.w r2, r2, #1792 ; 0x700 bf1e: 4b15 ldr r3, [pc, #84] ; (bf74 ) bf20: 4313 orrs r3, r2 SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | bf22: 60cb str r3, [r1, #12] bf24: f3bf 8f4f dsb sy SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ for(;;) /* wait until reset */ { __NOP(); bf28: bf00 nop bf2a: e7fd b.n bf28 SPIFLASH_WriteBack(); /* Write changed data back to SPIFLASH, maybe */ bf2c: f000 fafc bl c528 if (MSDEJECTEDEVENT) bf30: 7823 ldrb r3, [r4, #0] bf32: f013 0f02 tst.w r3, #2 bf36: d107 bne.n bf48 if ((calcs.SPIFLASHwritestate)||(t10ms.IndicateWrite)) bf38: 4b0a ldr r3, [pc, #40] ; (bf64 ) bf3a: 7a1a ldrb r2, [r3, #8] bf3c: 78ab ldrb r3, [r5, #2] bf3e: 4313 orrs r3, r2 bf40: d1be bne.n bec0 BOARD_LCDbacklightOn(); bf42: f004 fe16 bl 10b72 bf46: e7c1 b.n becc USB_DeviceStop(g_msc.deviceHandle);/*!!!!*/ bf48: 4b0b ldr r3, [pc, #44] ; (bf78 ) bf4a: 6818 ldr r0, [r3, #0] bf4c: f003 f97f bl f24e bf50: e7f2 b.n bf38 BOARD_LCDbacklightOff(); bf52: f004 fe0f bl 10b74 bf56: e7b9 b.n becc bf58: 00008200 .word 0x00008200 bf5c: e000ed00 .word 0xe000ed00 bf60: 4000d000 .word 0x4000d000 bf64: 20000934 .word 0x20000934 bf68: 2000096c .word 0x2000096c bf6c: 20000928 .word 0x20000928 bf70: 20000980 .word 0x20000980 bf74: 05fa0004 .word 0x05fa0004 bf78: 20000df0 .word 0x20000df0 0000bf7c : /******************************************************************************* * REDIRECT STATUS ROUTINE (THIS IS STATUS OF CODE, NOT OF THE SPIFLASH CHIP!) ******************************************************************************/ DSTATUS spiflash_disk_status(BYTE pdrv) { if (longwords.SPIFLASHSIZE==0) bf7c: 4b02 ldr r3, [pc, #8] ; (bf88 ) bf7e: 6818 ldr r0, [r3, #0] { return STA_NOINIT; } return 0; } bf80: fab0 f080 clz r0, r0 bf84: 0940 lsrs r0, r0, #5 bf86: 4770 bx lr bf88: 20000974 .word 0x20000974 0000bf8c : * GLOBAL BLOCK PROTECTION UNLOCK ROUTINE * Microchip SPIFLASH defaults to locked at power on, so needs to be unlocked! ******************************************************************************/ void spiflash_disk_globalUNLOCK(void) { FLUSH_SPI_FIFO_AND_FLAGS(); bf8c: 4b13 ldr r3, [pc, #76] ; (bfdc ) bf8e: 681a ldr r2, [r3, #0] bf90: f442 6280 orr.w r2, r2, #1024 ; 0x400 bf94: 601a str r2, [r3, #0] bf96: 4a12 ldr r2, [pc, #72] ; (bfe0 ) bf98: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0_LAST(WINBOND_WRITEENABLE);/* We must enable write before doing erase */ bf9a: 4a12 ldr r2, [pc, #72] ; (bfe4 ) bf9c: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); bf9e: 461a mov r2, r3 bfa0: 6ad3 ldr r3, [r2, #44] ; 0x2c bfa2: f413 3f00 tst.w r3, #131072 ; 0x20000 bfa6: d0fb beq.n bfa0 (void)READ_SPI_FLASH_DATA(); bfa8: 4b0c ldr r3, [pc, #48] ; (bfdc ) bfaa: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); bfac: 6ada ldr r2, [r3, #44] ; 0x2c bfae: f442 3200 orr.w r2, r2, #131072 ; 0x20000 bfb2: 62da str r2, [r3, #44] ; 0x2c FLUSH_SPI_FIFO_AND_FLAGS(); bfb4: 681a ldr r2, [r3, #0] bfb6: f442 6280 orr.w r2, r2, #1024 ; 0x400 bfba: 601a str r2, [r3, #0] bfbc: 4a08 ldr r2, [pc, #32] ; (bfe0 ) bfbe: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0_LAST(MICROCHIP_UNLOCK); /* Send global unlock */ bfc0: 4a09 ldr r2, [pc, #36] ; (bfe8 ) bfc2: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); bfc4: 461a mov r2, r3 bfc6: 6ad3 ldr r3, [r2, #44] ; 0x2c bfc8: f413 3f00 tst.w r3, #131072 ; 0x20000 bfcc: d0fb beq.n bfc6 (void)READ_SPI_FLASH_DATA(); /* Ignore the "reply" */ bfce: 4b03 ldr r3, [pc, #12] ; (bfdc ) bfd0: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); bfd2: 6ada ldr r2, [r3, #44] ; 0x2c bfd4: f442 3200 orr.w r2, r2, #131072 ; 0x20000 bfd8: 62da str r2, [r3, #44] ; 0x2c } bfda: 4770 bx lr bfdc: 4002c000 .word 0x4002c000 bfe0: 1a0a0000 .word 0x1a0a0000 bfe4: 08010006 .word 0x08010006 bfe8: 08010098 .word 0x08010098 0000bfec : /******************************************************************************* * SPIFLASH WAIT ROUTINE * Read SPIFLASH status repeatedly until it's not busy ******************************************************************************/ void SPI_wait_for_finish() { bfec: b410 push {r4} UINT status1 = 0; DWORD debugcount = 0; FLUSH_SPI_FIFO_AND_FLAGS(); bfee: 4b1c ldr r3, [pc, #112] ; (c060 ) bff0: 681a ldr r2, [r3, #0] bff2: f442 6280 orr.w r2, r2, #1024 ; 0x400 bff6: 601a str r2, [r3, #0] bff8: 4a1a ldr r2, [pc, #104] ; (c064 ) bffa: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0(WINBOND_READSTATUS1); /* Set up to read STATUS1 from the chip */ bffc: 4a1a ldr r2, [pc, #104] ; (c068 ) bffe: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c000: 461a mov r2, r3 c002: 6ad3 ldr r3, [r2, #44] ; 0x2c c004: f413 3f00 tst.w r3, #131072 ; 0x20000 c008: d0fb beq.n c002 (void)READ_SPI_FLASH_DATA(); /* Ignore the "reply" to the command */ c00a: 4b15 ldr r3, [pc, #84] ; (c060 ) c00c: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c00e: 6ada ldr r2, [r3, #44] ; 0x2c c010: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c014: 62da str r2, [r3, #44] ; 0x2c DWORD debugcount = 0; c016: 2100 movs r1, #0 do { WRITE_SPI_CMD0(0xff); /* We have to send dummy out to get reply in! */ c018: 461a mov r2, r3 c01a: 4c14 ldr r4, [pc, #80] ; (c06c ) c01c: 6354 str r4, [r2, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c01e: 6ad3 ldr r3, [r2, #44] ; 0x2c c020: f413 3f00 tst.w r3, #131072 ; 0x20000 c024: d0fb beq.n c01e status1 = READ_SPI_FLASH_DATA(); c026: 6b90 ldr r0, [r2, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c028: 6ad3 ldr r3, [r2, #44] ; 0x2c c02a: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c02e: 62d3 str r3, [r2, #44] ; 0x2c debugcount++; c030: 3101 adds r1, #1 } while (status1&0x01); c032: f010 0f01 tst.w r0, #1 c036: d1f1 bne.n c01c words.debug1 = debugcount;/*!!!!*/ c038: 4b0d ldr r3, [pc, #52] ; (c070 ) c03a: 8019 strh r1, [r3, #0] WRITE_SPI_CMD0_LAST(0xff); /* The last dummy out is flagged to end communications! */ c03c: 4b08 ldr r3, [pc, #32] ; (c060 ) c03e: 4a0d ldr r2, [pc, #52] ; (c074 ) c040: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c042: 461a mov r2, r3 c044: 6ad3 ldr r3, [r2, #44] ; 0x2c c046: f413 3f00 tst.w r3, #131072 ; 0x20000 c04a: d0fb beq.n c044 (void)READ_SPI_FLASH_DATA(); c04c: 4b04 ldr r3, [pc, #16] ; (c060 ) c04e: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c050: 6ada ldr r2, [r3, #44] ; 0x2c c052: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c056: 62da str r2, [r3, #44] ; 0x2c } c058: f85d 4b04 ldr.w r4, [sp], #4 c05c: 4770 bx lr c05e: bf00 nop c060: 4002c000 .word 0x4002c000 c064: 1a0a0000 .word 0x1a0a0000 c068: 80010005 .word 0x80010005 c06c: 800100ff .word 0x800100ff c070: 20000998 .word 0x20000998 c074: 080100ff .word 0x080100ff 0000c078 : { c078: b510 push {r4, lr} SPI_wait_for_finish(); /* Make sure the chip isn't busy */ c07a: f7ff ffb7 bl bfec FLUSH_SPI_FIFO_AND_FLAGS(); c07e: 4b45 ldr r3, [pc, #276] ; (c194 ) c080: 681a ldr r2, [r3, #0] c082: f442 6280 orr.w r2, r2, #1024 ; 0x400 c086: 601a str r2, [r3, #0] c088: 4a43 ldr r2, [pc, #268] ; (c198 ) c08a: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0(WINBOND_GETJEDEC); /* Fetch the JEDEC codes */ c08c: 4a43 ldr r2, [pc, #268] ; (c19c ) c08e: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c090: 461a mov r2, r3 c092: 6ad3 ldr r3, [r2, #44] ; 0x2c c094: f413 3f00 tst.w r3, #131072 ; 0x20000 c098: d0fb beq.n c092 (void)READ_SPI_FLASH_DATA(); /* Ignore the "reply" to the command */ c09a: 4b3e ldr r3, [pc, #248] ; (c194 ) c09c: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c09e: 6ada ldr r2, [r3, #44] ; 0x2c c0a0: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c0a4: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0(0xff); /* We have to send dummy out to get reply in! */ c0a6: 4a3e ldr r2, [pc, #248] ; (c1a0 ) c0a8: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c0aa: 461a mov r2, r3 c0ac: 6ad3 ldr r3, [r2, #44] ; 0x2c c0ae: f413 3f00 tst.w r3, #131072 ; 0x20000 c0b2: d0fb beq.n c0ac calcs.SPIJEDEC[0] = READ_SPI_FLASH_DATA(); c0b4: 4b37 ldr r3, [pc, #220] ; (c194 ) c0b6: 6b99 ldr r1, [r3, #56] ; 0x38 c0b8: b2c9 uxtb r1, r1 c0ba: 4a3a ldr r2, [pc, #232] ; (c1a4 ) c0bc: 7151 strb r1, [r2, #5] CLEAR_RECEPTION_FLAG(); c0be: 6ada ldr r2, [r3, #44] ; 0x2c c0c0: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c0c4: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0(0xff); c0c6: 4a36 ldr r2, [pc, #216] ; (c1a0 ) c0c8: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c0ca: 461a mov r2, r3 c0cc: 6ad3 ldr r3, [r2, #44] ; 0x2c c0ce: f413 3f00 tst.w r3, #131072 ; 0x20000 c0d2: d0fb beq.n c0cc calcs.SPIJEDEC[1] = READ_SPI_FLASH_DATA(); c0d4: 4b2f ldr r3, [pc, #188] ; (c194 ) c0d6: 6b98 ldr r0, [r3, #56] ; 0x38 c0d8: b2c0 uxtb r0, r0 c0da: 4a32 ldr r2, [pc, #200] ; (c1a4 ) c0dc: 7190 strb r0, [r2, #6] CLEAR_RECEPTION_FLAG(); c0de: 6ada ldr r2, [r3, #44] ; 0x2c c0e0: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c0e4: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0_LAST(0xff); /* The last dummy out is flagged to end communications! */ c0e6: 4a30 ldr r2, [pc, #192] ; (c1a8 ) c0e8: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c0ea: 461a mov r2, r3 c0ec: 6ad3 ldr r3, [r2, #44] ; 0x2c c0ee: f413 3f00 tst.w r3, #131072 ; 0x20000 c0f2: d0fb beq.n c0ec calcs.SPIJEDEC[2] = READ_SPI_FLASH_DATA(); c0f4: 4a27 ldr r2, [pc, #156] ; (c194 ) c0f6: 6b93 ldr r3, [r2, #56] ; 0x38 c0f8: b2db uxtb r3, r3 c0fa: 4c2a ldr r4, [pc, #168] ; (c1a4 ) c0fc: 71e3 strb r3, [r4, #7] CLEAR_RECEPTION_FLAG(); c0fe: 6ad4 ldr r4, [r2, #44] ; 0x2c c100: f444 3400 orr.w r4, r4, #131072 ; 0x20000 c104: 62d4 str r4, [r2, #44] ; 0x2c longwords.SPIFLASHSIZE = 0; /* Find out how much memory is available in the external flash chip */ c106: 4a29 ldr r2, [pc, #164] ; (c1ac ) c108: 2400 movs r4, #0 c10a: 6014 str r4, [r2, #0] if (calcs.SPIJEDEC[0]==0xEF) /* Is this a Winbond part? */ c10c: 29ef cmp r1, #239 ; 0xef c10e: d004 beq.n c11a if (calcs.SPIJEDEC[0]==0xBF) /* Is this a Microchip part? */ c110: 29bf cmp r1, #191 ; 0xbf c112: d101 bne.n c118 if (calcs.SPIJEDEC[1]==0x26) c114: 2826 cmp r0, #38 ; 0x26 c116: d02e beq.n c176 } c118: bd10 pop {r4, pc} if (calcs.SPIJEDEC[1]==0x40) /* IQ part (fixed quad mode) */ c11a: 2840 cmp r0, #64 ; 0x40 c11c: d00a beq.n c134 if (calcs.SPIJEDEC[1]==0x70) /* IM part (selectable quad mode)? */ c11e: 2870 cmp r0, #112 ; 0x70 c120: d1fa bne.n c118 if (calcs.SPIJEDEC[2]==0x16) c122: 2b16 cmp r3, #22 c124: d01b beq.n c15e if (calcs.SPIJEDEC[2]==0x17) c126: 2b17 cmp r3, #23 c128: d11e bne.n c168 longwords.SPIFLASHSIZE = 32768*256;/* This is W25Q64 */ c12a: 4b20 ldr r3, [pc, #128] ; (c1ac ) c12c: f44f 0200 mov.w r2, #8388608 ; 0x800000 c130: 601a str r2, [r3, #0] if (calcs.SPIJEDEC[2]==0x18) c132: e7f1 b.n c118 if (calcs.SPIJEDEC[2]==0x16) c134: 2b16 cmp r3, #22 c136: d006 beq.n c146 if (calcs.SPIJEDEC[2]==0x17) c138: 2b17 cmp r3, #23 c13a: d109 bne.n c150 longwords.SPIFLASHSIZE = 32768*256;/* This is W25Q64 */ c13c: 4b1b ldr r3, [pc, #108] ; (c1ac ) c13e: f44f 0200 mov.w r2, #8388608 ; 0x800000 c142: 601a str r2, [r3, #0] if (calcs.SPIJEDEC[2]==0x18) c144: e7e8 b.n c118 longwords.SPIFLASHSIZE = 16384*256;/* This is W25Q32 */ c146: 4613 mov r3, r2 c148: f44f 0280 mov.w r2, #4194304 ; 0x400000 c14c: 601a str r2, [r3, #0] if (calcs.SPIJEDEC[2]==0x18) c14e: e7e3 b.n c118 c150: 2b18 cmp r3, #24 c152: d1e1 bne.n c118 longwords.SPIFLASHSIZE = 65536*256;/* This is W25Q128 */ c154: 4b15 ldr r3, [pc, #84] ; (c1ac ) c156: f04f 7280 mov.w r2, #16777216 ; 0x1000000 c15a: 601a str r2, [r3, #0] c15c: e7dc b.n c118 longwords.SPIFLASHSIZE = 16384*256;/* This is W25Q32 */ c15e: 4b13 ldr r3, [pc, #76] ; (c1ac ) c160: f44f 0280 mov.w r2, #4194304 ; 0x400000 c164: 601a str r2, [r3, #0] if (calcs.SPIJEDEC[2]==0x18) c166: e7d7 b.n c118 c168: 2b18 cmp r3, #24 c16a: d1d5 bne.n c118 longwords.SPIFLASHSIZE = 65536*256;/* This is W25Q128 */ c16c: 4b0f ldr r3, [pc, #60] ; (c1ac ) c16e: f04f 7280 mov.w r2, #16777216 ; 0x1000000 c172: 601a str r2, [r3, #0] c174: e7d0 b.n c118 if (calcs.SPIJEDEC[2]==0x42) c176: 2b42 cmp r3, #66 ; 0x42 c178: d006 beq.n c188 if (calcs.SPIJEDEC[2]==0x43) c17a: 2b43 cmp r3, #67 ; 0x43 c17c: d1cc bne.n c118 longwords.SPIFLASHSIZE = 32768*256;/* This is SST26VF064 */ c17e: 4b0b ldr r3, [pc, #44] ; (c1ac ) c180: f44f 0200 mov.w r2, #8388608 ; 0x800000 c184: 601a str r2, [r3, #0] } c186: e7c7 b.n c118 longwords.SPIFLASHSIZE = 16384*256;/* This is SST26VF032 */ c188: 4b08 ldr r3, [pc, #32] ; (c1ac ) c18a: f44f 0280 mov.w r2, #4194304 ; 0x400000 c18e: 601a str r2, [r3, #0] if (calcs.SPIJEDEC[2]==0x43) c190: e7c2 b.n c118 c192: bf00 nop c194: 4002c000 .word 0x4002c000 c198: 1a0a0000 .word 0x1a0a0000 c19c: 8001009f .word 0x8001009f c1a0: 800100ff .word 0x800100ff c1a4: 20000934 .word 0x20000934 c1a8: 080100ff .word 0x080100ff c1ac: 20000974 .word 0x20000974 0000c1b0 : { c1b0: b500 push {lr} c1b2: b08b sub sp, #44 ; 0x2c dspi_master_config_t masterConfig = {0}; c1b4: 2224 movs r2, #36 ; 0x24 c1b6: 2100 movs r1, #0 c1b8: a801 add r0, sp, #4 c1ba: f005 fe28 bl 11e0e debugrecentreadblock = 99999999;/*!!!!*/ c1be: 4b28 ldr r3, [pc, #160] ; (c260 ) c1c0: 4a28 ldr r2, [pc, #160] ; (c264 ) c1c2: 6013 str r3, [r2, #0] debugrecentwriteblock = 99999999;/*!!!!*/ c1c4: 4a28 ldr r2, [pc, #160] ; (c268 ) c1c6: 6013 str r3, [r2, #0] if (SPIFLASHINITIALIZED==0) c1c8: 4b28 ldr r3, [pc, #160] ; (c26c ) c1ca: 781b ldrb r3, [r3, #0] c1cc: f013 0f08 tst.w r3, #8 c1d0: d008 beq.n c1e4 if (longwords.SPIFLASHSIZE==0) c1d2: 4b27 ldr r3, [pc, #156] ; (c270 ) c1d4: 681b ldr r3, [r3, #0] return STA_NODISK; /* The external chip is missing or not recognized! */ c1d6: 2b00 cmp r3, #0 } c1d8: bf14 ite ne c1da: 2000 movne r0, #0 c1dc: 2002 moveq r0, #2 c1de: b00b add sp, #44 ; 0x2c c1e0: f85d fb04 ldr.w pc, [sp], #4 SPIFLASHINITIALIZED = 1; /* We only need to do this once (hopefully!) */ c1e4: 4a21 ldr r2, [pc, #132] ; (c26c ) c1e6: f043 0308 orr.w r3, r3, #8 c1ea: 7013 strb r3, [r2, #0] DSPI_MasterGetDefaultConfig(&masterConfig); c1ec: a801 add r0, sp, #4 c1ee: f001 f93b bl d468 masterConfig.whichCtar = kDSPI_Ctar0; c1f2: 2300 movs r3, #0 c1f4: f88d 3004 strb.w r3, [sp, #4] masterConfig.ctarConfig.baudRate = TRANSFER_BAUDRATE; c1f8: 4a1e ldr r2, [pc, #120] ; (c274 ) c1fa: 9202 str r2, [sp, #8] masterConfig.ctarConfig.bitsPerFrame = 8U; c1fc: 2208 movs r2, #8 c1fe: 9203 str r2, [sp, #12] masterConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh; c200: f88d 3010 strb.w r3, [sp, #16] masterConfig.ctarConfig.cpha = kDSPI_ClockPhaseFirstEdge; c204: f88d 3011 strb.w r3, [sp, #17] masterConfig.ctarConfig.direction = kDSPI_MsbFirst; c208: f88d 3012 strb.w r3, [sp, #18] masterConfig.ctarConfig.pcsToSckDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE; c20c: 2229 movs r2, #41 ; 0x29 c20e: 9205 str r2, [sp, #20] masterConfig.ctarConfig.lastSckToPcsDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE; c210: 9206 str r2, [sp, #24] masterConfig.ctarConfig.betweenTransferDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE; c212: 9207 str r2, [sp, #28] masterConfig.whichPcs = kDSPI_Pcs0; c214: 2201 movs r2, #1 c216: f88d 2020 strb.w r2, [sp, #32] masterConfig.pcsActiveHighOrLow = kDSPI_PcsActiveLow; c21a: f88d 2021 strb.w r2, [sp, #33] ; 0x21 masterConfig.enableContinuousSCK = false; c21e: f88d 3022 strb.w r3, [sp, #34] ; 0x22 masterConfig.enableRxFifoOverWrite = false; c222: f88d 3023 strb.w r3, [sp, #35] ; 0x23 masterConfig.enableModifiedTimingFormat = false; c226: f88d 3024 strb.w r3, [sp, #36] ; 0x24 masterConfig.samplePoint = kDSPI_SckToSin0Clock; c22a: f88d 3025 strb.w r3, [sp, #37] ; 0x25 srcClock_Hz = CLOCK_GetFreq(DSPI0_CLK_SRC); c22e: 2002 movs r0, #2 c230: f000 ff82 bl d138 DSPI_MasterInit(SPI0, &masterConfig, srcClock_Hz);/*(10/13/20) Disable FIFOs */ c234: 4602 mov r2, r0 c236: a901 add r1, sp, #4 c238: 480f ldr r0, [pc, #60] ; (c278 ) c23a: f001 fa05 bl d648 spiflash_disk_readJEDECcodes(); c23e: f7ff ff1b bl c078 if (longwords.SPIFLASHSIZE) c242: 4b0b ldr r3, [pc, #44] ; (c270 ) c244: 681b ldr r3, [r3, #0] c246: b93b cbnz r3, c258 SPIFLASHcurrentblock = INVALIDSECTOR; /* We don't yet have a current block of data */ c248: 4b0c ldr r3, [pc, #48] ; (c27c ) c24a: 4a0d ldr r2, [pc, #52] ; (c280 ) c24c: 601a str r2, [r3, #0] calcs.SPIFLASHerasestate = 0; c24e: 4b0d ldr r3, [pc, #52] ; (c284 ) c250: 2200 movs r2, #0 c252: 725a strb r2, [r3, #9] calcs.SPIFLASHwritestate = 0; c254: 721a strb r2, [r3, #8] c256: e7bc b.n c1d2 spiflash_disk_globalUNLOCK(); /*(11/23/20) Microchip SST defaults to locked at power on! */ c258: f7ff fe98 bl bf8c c25c: e7f4 b.n c248 c25e: bf00 nop c260: 05f5e0ff .word 0x05f5e0ff c264: 20000de0 .word 0x20000de0 c268: 20000de4 .word 0x20000de4 c26c: 2000096c .word 0x2000096c c270: 20000974 .word 0x20000974 c274: 016e3600 .word 0x016e3600 c278: 4002c000 .word 0x4002c000 c27c: 20000ddc .word 0x20000ddc c280: 000f423f .word 0x000f423f c284: 20000934 .word 0x20000934 0000c288 : /* ********************************************************************************************************************* * Function Name : SPIFLASH_EraseBlock * Description : Erase a block of disk memory * ********************************************************************************************************************/ void SPIFLASH_EraseBlock(longword SPIFLASHeraseblock) { c288: b510 push {r4, lr} c28a: 4604 mov r4, r0 longword eraseaddress; PRINTF("ERASEBLOCK %i\r\n",SPIFLASHeraseblock);/*!!!!*/ c28c: 4601 mov r1, r0 c28e: 4830 ldr r0, [pc, #192] ; (c350 ) c290: f002 fb7e bl e990 <_printf> longwords.SPIFLASHERASECOUNT++;/*!!!!*/ c294: 4a2f ldr r2, [pc, #188] ; (c354 ) c296: 7913 ldrb r3, [r2, #4] c298: 3301 adds r3, #1 c29a: 7113 strb r3, [r2, #4] eraseaddress = SPIFLASHeraseblock*SPIFLASHERASESIZE;/* Calculate address to erase */ c29c: 0320 lsls r0, r4, #12 FLUSH_SPI_FIFO_AND_FLAGS(); c29e: 4b2e ldr r3, [pc, #184] ; (c358 ) c2a0: 681a ldr r2, [r3, #0] c2a2: f442 6280 orr.w r2, r2, #1024 ; 0x400 c2a6: 601a str r2, [r3, #0] c2a8: 4a2c ldr r2, [pc, #176] ; (c35c ) c2aa: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0_LAST(WINBOND_WRITEENABLE);/* We must enable write before doing erase */ c2ac: 4a2c ldr r2, [pc, #176] ; (c360 ) c2ae: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c2b0: 461a mov r2, r3 c2b2: 6ad3 ldr r3, [r2, #44] ; 0x2c c2b4: f413 3f00 tst.w r3, #131072 ; 0x20000 c2b8: d0fb beq.n c2b2 (void)READ_SPI_FLASH_DATA(); c2ba: 4b27 ldr r3, [pc, #156] ; (c358 ) c2bc: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c2be: 6ada ldr r2, [r3, #44] ; 0x2c c2c0: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c2c4: 62da str r2, [r3, #44] ; 0x2c FLUSH_SPI_FIFO_AND_FLAGS(); c2c6: 681a ldr r2, [r3, #0] c2c8: f442 6280 orr.w r2, r2, #1024 ; 0x400 c2cc: 601a str r2, [r3, #0] c2ce: 4a23 ldr r2, [pc, #140] ; (c35c ) c2d0: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0(WINBOND_ERASESECTOR); /* Set up to erase a sector at a particular address */ c2d2: 4a24 ldr r2, [pc, #144] ; (c364 ) c2d4: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c2d6: 461a mov r2, r3 c2d8: 6ad3 ldr r3, [r2, #44] ; 0x2c c2da: f413 3f00 tst.w r3, #131072 ; 0x20000 c2de: d0fb beq.n c2d8 (void)READ_SPI_FLASH_DATA(); /* Ignore the "reply" */ c2e0: 4a1d ldr r2, [pc, #116] ; (c358 ) c2e2: 6b93 ldr r3, [r2, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c2e4: 6ad3 ldr r3, [r2, #44] ; 0x2c c2e6: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c2ea: 62d3 str r3, [r2, #44] ; 0x2c WRITE_SPI_CMD0((byte)(eraseaddress>>16));/* Send the 24bit address to start reading from */ c2ec: f3c0 4307 ubfx r3, r0, #16, #8 c2f0: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000 c2f4: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c2f8: 6353 str r3, [r2, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c2fa: 6ad3 ldr r3, [r2, #44] ; 0x2c c2fc: f413 3f00 tst.w r3, #131072 ; 0x20000 c300: d0fb beq.n c2fa (void)READ_SPI_FLASH_DATA(); c302: 4a15 ldr r2, [pc, #84] ; (c358 ) c304: 6b93 ldr r3, [r2, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c306: 6ad3 ldr r3, [r2, #44] ; 0x2c c308: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c30c: 62d3 str r3, [r2, #44] ; 0x2c WRITE_SPI_CMD0((byte)(eraseaddress>>8)); c30e: 0a03 lsrs r3, r0, #8 c310: b2db uxtb r3, r3 c312: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000 c316: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c31a: 6353 str r3, [r2, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c31c: 6ad3 ldr r3, [r2, #44] ; 0x2c c31e: f413 3f00 tst.w r3, #131072 ; 0x20000 c322: d0fb beq.n c31c (void)READ_SPI_FLASH_DATA(); c324: 4b0c ldr r3, [pc, #48] ; (c358 ) c326: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c328: 6ada ldr r2, [r3, #44] ; 0x2c c32a: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c32e: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0_LAST((byte)(eraseaddress)); /* End command with the last byte of address */ c330: 4a0d ldr r2, [pc, #52] ; (c368 ) c332: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c334: 461a mov r2, r3 c336: 6ad3 ldr r3, [r2, #44] ; 0x2c c338: f413 3f00 tst.w r3, #131072 ; 0x20000 c33c: d0fb beq.n c336 (void)READ_SPI_FLASH_DATA(); c33e: 4b06 ldr r3, [pc, #24] ; (c358 ) c340: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c342: 6ada ldr r2, [r3, #44] ; 0x2c c344: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c348: 62da str r2, [r3, #44] ; 0x2c SPI_wait_for_finish(); /* Now wait ... */ c34a: f7ff fe4f bl bfec } c34e: bd10 pop {r4, pc} c350: 00012b28 .word 0x00012b28 c354: 20000974 .word 0x20000974 c358: 4002c000 .word 0x4002c000 c35c: 1a0a0000 .word 0x1a0a0000 c360: 08010006 .word 0x08010006 c364: 80010020 .word 0x80010020 c368: 08010000 .word 0x08010000 0000c36c : { c36c: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} if (SPIFLASHwriteblock==INVALIDSECTOR) c370: 4b4b ldr r3, [pc, #300] ; (c4a0 ) c372: 4298 cmp r0, r3 c374: f000 808f beq.w c496 if (calcs.SPIFLASHwritestate==0) c378: 4b4a ldr r3, [pc, #296] ; (c4a4 ) c37a: 7a1b ldrb r3, [r3, #8] c37c: 2b00 cmp r3, #0 c37e: f000 808a beq.w c496 c382: 4607 mov r7, r0 if (calcs.SPIFLASHerasestate==0) /* If the block wasn't already erased then we have to erase it before write */ c384: 4b47 ldr r3, [pc, #284] ; (c4a4 ) c386: 7a5b ldrb r3, [r3, #9] c388: 2b00 cmp r3, #0 c38a: f000 8086 beq.w c49a PRINTF("WRITEBLOCK %i\r\n",SPIFLASHwriteblock);/*!!!!*/ c38e: 4639 mov r1, r7 c390: 4845 ldr r0, [pc, #276] ; (c4a8 ) c392: f002 fafd bl e990 <_printf> pageaddr = SPIFLASHwriteblock*SPIFLASHERASESIZE;/* Calculate address to write to */ c396: 033f lsls r7, r7, #12 bufferindex = 0; /* We want to write a complete block to the erased page ... */ c398: 2500 movs r5, #0 FLUSH_SPI_FIFO_AND_FLAGS(); c39a: 4c44 ldr r4, [pc, #272] ; (c4ac ) c39c: f8df 8118 ldr.w r8, [pc, #280] ; c4b8 c3a0: 46c3 mov fp, r8 WRITE_SPI_CMD0_LAST(WINBOND_WRITEENABLE);/* We must enable write before doing erase */ c3a2: f8df a118 ldr.w sl, [pc, #280] ; c4bc WRITE_SPI_CMD0(WINBOND_WRITEPAGE); /* Set up to write a page to the chip */ c3a6: f8df 9118 ldr.w r9, [pc, #280] ; c4c0 WRITE_SPI_CMD0(SPIFLASHbuffer[bufferindex++]);/* Send the new data out */ c3aa: 4e41 ldr r6, [pc, #260] ; (c4b0 ) FLUSH_SPI_FIFO_AND_FLAGS(); c3ac: 6823 ldr r3, [r4, #0] c3ae: f443 6380 orr.w r3, r3, #1024 ; 0x400 c3b2: 6023 str r3, [r4, #0] c3b4: f8c4 b02c str.w fp, [r4, #44] ; 0x2c WRITE_SPI_CMD0_LAST(WINBOND_WRITEENABLE);/* We must enable write before doing erase */ c3b8: f8c4 a034 str.w sl, [r4, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c3bc: 6ae3 ldr r3, [r4, #44] ; 0x2c c3be: f413 3f00 tst.w r3, #131072 ; 0x20000 c3c2: d0fb beq.n c3bc (void)READ_SPI_FLASH_DATA(); c3c4: 6ba3 ldr r3, [r4, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c3c6: 6ae3 ldr r3, [r4, #44] ; 0x2c c3c8: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c3cc: 62e3 str r3, [r4, #44] ; 0x2c FLUSH_SPI_FIFO_AND_FLAGS(); c3ce: 6823 ldr r3, [r4, #0] c3d0: f443 6380 orr.w r3, r3, #1024 ; 0x400 c3d4: 6023 str r3, [r4, #0] c3d6: f8c4 802c str.w r8, [r4, #44] ; 0x2c WRITE_SPI_CMD0(WINBOND_WRITEPAGE); /* Set up to write a page to the chip */ c3da: f8c4 9034 str.w r9, [r4, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c3de: 6ae3 ldr r3, [r4, #44] ; 0x2c c3e0: f413 3f00 tst.w r3, #131072 ; 0x20000 c3e4: d0fb beq.n c3de (void)READ_SPI_FLASH_DATA(); /* Ignore the "reply" */ c3e6: 6ba3 ldr r3, [r4, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c3e8: 6ae3 ldr r3, [r4, #44] ; 0x2c c3ea: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c3ee: 62e3 str r3, [r4, #44] ; 0x2c WRITE_SPI_CMD0((byte)(pageaddr>>16)); /* Send the 24bit address to start writing to */ c3f0: f3c7 4307 ubfx r3, r7, #16, #8 c3f4: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000 c3f8: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c3fc: 6363 str r3, [r4, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c3fe: 6ae3 ldr r3, [r4, #44] ; 0x2c c400: f413 3f00 tst.w r3, #131072 ; 0x20000 c404: d0fb beq.n c3fe (void)READ_SPI_FLASH_DATA(); c406: 6ba3 ldr r3, [r4, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c408: 6ae3 ldr r3, [r4, #44] ; 0x2c c40a: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c40e: 62e3 str r3, [r4, #44] ; 0x2c WRITE_SPI_CMD0((byte)(pageaddr>>8)); c410: f3c7 2307 ubfx r3, r7, #8, #8 c414: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000 c418: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c41c: 6363 str r3, [r4, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c41e: 6ae3 ldr r3, [r4, #44] ; 0x2c c420: f413 3f00 tst.w r3, #131072 ; 0x20000 c424: d0fb beq.n c41e (void)READ_SPI_FLASH_DATA(); c426: 6ba3 ldr r3, [r4, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c428: 6ae3 ldr r3, [r4, #44] ; 0x2c c42a: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c42e: 62e3 str r3, [r4, #44] ; 0x2c WRITE_SPI_CMD0((byte)(pageaddr)); c430: 4b20 ldr r3, [pc, #128] ; (c4b4 ) c432: 6363 str r3, [r4, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c434: 6ae3 ldr r3, [r4, #44] ; 0x2c c436: f413 3f00 tst.w r3, #131072 ; 0x20000 c43a: d0fb beq.n c434 (void)READ_SPI_FLASH_DATA(); c43c: 6ba3 ldr r3, [r4, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c43e: 6ae3 ldr r3, [r4, #44] ; 0x2c c440: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c444: 62e3 str r3, [r4, #44] ; 0x2c c446: 2200 movs r2, #0 c448: b291 uxth r1, r2 c44a: 194b adds r3, r1, r5 c44c: b29b uxth r3, r3 if (x==(PAGE_SIZE-1)) c44e: 29ff cmp r1, #255 ; 0xff WRITE_SPI_CMD0_LAST(SPIFLASHbuffer[bufferindex++]);/* The last dummy out is flagged to end communications! */ c450: 5cf3 ldrb r3, [r6, r3] c452: bf0c ite eq c454: f043 6300 orreq.w r3, r3, #134217728 ; 0x8000000 WRITE_SPI_CMD0(SPIFLASHbuffer[bufferindex++]);/* Send the new data out */ c458: f043 4300 orrne.w r3, r3, #2147483648 ; 0x80000000 c45c: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c460: 6363 str r3, [r4, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c462: 6ae3 ldr r3, [r4, #44] ; 0x2c c464: f413 3f00 tst.w r3, #131072 ; 0x20000 c468: d0fb beq.n c462 (void)READ_SPI_FLASH_DATA(); c46a: 6ba3 ldr r3, [r4, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c46c: 6ae3 ldr r3, [r4, #44] ; 0x2c c46e: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c472: 62e3 str r3, [r4, #44] ; 0x2c c474: 3201 adds r2, #1 for (x=0; x c47c: f505 7580 add.w r5, r5, #256 ; 0x100 c480: b2ad uxth r5, r5 SPI_wait_for_finish(); /* Wait for that page to be written */ c482: f7ff fdb3 bl bfec calcs.SPIFLASHwritestate = 0; /* No need to write again */ c486: 4b07 ldr r3, [pc, #28] ; (c4a4 ) c488: 2200 movs r2, #0 c48a: 721a strb r2, [r3, #8] c48c: f507 7780 add.w r7, r7, #256 ; 0x100 for (page=0; page } c496: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} SPIFLASH_EraseBlock(SPIFLASHwriteblock); c49a: f7ff fef5 bl c288 c49e: e776 b.n c38e c4a0: 000f423f .word 0x000f423f c4a4: 20000934 .word 0x20000934 c4a8: 00012c20 .word 0x00012c20 c4ac: 4002c000 .word 0x4002c000 c4b0: 1fff07d0 .word 0x1fff07d0 c4b4: 80010000 .word 0x80010000 c4b8: 1a0a0000 .word 0x1a0a0000 c4bc: 08010006 .word 0x08010006 c4c0: 80010002 .word 0x80010002 0000c4c4 : switch (cmd) c4c4: 2903 cmp r1, #3 c4c6: d821 bhi.n c50c c4c8: e8df f001 tbb [pc, r1] c4cc: 0f090214 .word 0x0f090214 if (buff) c4d0: b1f2 cbz r2, c510 *(uint32_t *)buff = longwords.SPIFLASHSIZE/FATFSSECTORSIZE; c4d2: 4b12 ldr r3, [pc, #72] ; (c51c ) c4d4: 681b ldr r3, [r3, #0] c4d6: 0a5b lsrs r3, r3, #9 c4d8: 6013 str r3, [r2, #0] DRESULT result = RES_OK; c4da: 2000 movs r0, #0 c4dc: 4770 bx lr if (buff) c4de: b1ca cbz r2, c514 *(uint32_t *)buff = FATFSSECTORSIZE; c4e0: f44f 7300 mov.w r3, #512 ; 0x200 c4e4: 6013 str r3, [r2, #0] DRESULT result = RES_OK; c4e6: 2000 movs r0, #0 c4e8: 4770 bx lr if (buff) c4ea: b1aa cbz r2, c518 *(uint32_t *)buff = SPIFLASHERASESIZE/FATFSSECTORSIZE; c4ec: 2308 movs r3, #8 c4ee: 6013 str r3, [r2, #0] DRESULT result = RES_OK; c4f0: 2000 movs r0, #0 c4f2: 4770 bx lr if (calcs.SPIFLASHwritestate) c4f4: 4b0a ldr r3, [pc, #40] ; (c520 ) c4f6: 7a18 ldrb r0, [r3, #8] c4f8: b900 cbnz r0, c4fc } c4fa: 4770 bx lr { c4fc: b510 push {r4, lr} c4fe: 460c mov r4, r1 SPIFLASH_WriteBuffer(SPIFLASHcurrentblock);/* FATFS requires us to ensure all writes are completed! */ c500: 4b08 ldr r3, [pc, #32] ; (c524 ) c502: 6818 ldr r0, [r3, #0] c504: f7ff ff32 bl c36c result = RES_OK; c508: 4620 mov r0, r4 } c50a: bd10 pop {r4, pc} result = RES_PARERR; c50c: 2004 movs r0, #4 c50e: 4770 bx lr result = RES_PARERR; c510: 2004 movs r0, #4 c512: 4770 bx lr result = RES_PARERR; c514: 2004 movs r0, #4 c516: 4770 bx lr result = RES_PARERR; c518: 2004 movs r0, #4 c51a: 4770 bx lr c51c: 20000974 .word 0x20000974 c520: 20000934 .word 0x20000934 c524: 20000ddc .word 0x20000ddc 0000c528 : { c528: b508 push {r3, lr} if (calcs.SPIFLASHwritestate) c52a: 4b04 ldr r3, [pc, #16] ; (c53c ) c52c: 7a1b ldrb r3, [r3, #8] c52e: b903 cbnz r3, c532 } c530: bd08 pop {r3, pc} SPIFLASH_WriteBuffer(SPIFLASHcurrentblock);/* This data needs to be written back! */ c532: 4b03 ldr r3, [pc, #12] ; (c540 ) c534: 6818 ldr r0, [r3, #0] c536: f7ff ff19 bl c36c } c53a: e7f9 b.n c530 c53c: 20000934 .word 0x20000934 c540: 20000ddc .word 0x20000ddc 0000c544 : /* ********************************************************************************************************************* * Function Name : SPIFLASH_ReadBuffer * Description : Fill buffer with data from disk memory (and track if it was erased) * ********************************************************************************************************************/ void SPIFLASH_ReadBuffer(longword SPIFLASHnewblock) { c544: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} c548: 4680 mov r8, r0 longword pageaddr; word bufferindex, countnoterased; byte data; PRINTF("READBLOCK %i\r\n",SPIFLASHnewblock);/*!!!!*/ c54a: 4601 mov r1, r0 c54c: 483b ldr r0, [pc, #236] ; (c63c ) c54e: f002 fa1f bl e990 <_printf> pageaddr = SPIFLASHnewblock*SPIFLASHERASESIZE;/* Calculate address to read from */ c552: ea4f 3208 mov.w r2, r8, lsl #12 bufferindex = 0; countnoterased = 0; FLUSH_SPI_FIFO_AND_FLAGS(); c556: 4b3a ldr r3, [pc, #232] ; (c640 ) c558: 6819 ldr r1, [r3, #0] c55a: f441 6180 orr.w r1, r1, #1024 ; 0x400 c55e: 6019 str r1, [r3, #0] c560: 4938 ldr r1, [pc, #224] ; (c644 ) c562: 62d9 str r1, [r3, #44] ; 0x2c WRITE_SPI_CMD0(WINBOND_READBYTES); /* Set up to read bytes from the chip */ c564: 4938 ldr r1, [pc, #224] ; (c648 ) c566: 6359 str r1, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c568: 4619 mov r1, r3 c56a: 6acb ldr r3, [r1, #44] ; 0x2c c56c: f413 3f00 tst.w r3, #131072 ; 0x20000 c570: d0fb beq.n c56a (void)READ_SPI_FLASH_DATA(); /* Ignore the "reply" */ c572: 4933 ldr r1, [pc, #204] ; (c640 ) c574: 6b8b ldr r3, [r1, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c576: 6acb ldr r3, [r1, #44] ; 0x2c c578: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c57c: 62cb str r3, [r1, #44] ; 0x2c WRITE_SPI_CMD0((byte)(pageaddr>>16)); /* Send the 24bit address to start reading from */ c57e: f3c2 4307 ubfx r3, r2, #16, #8 c582: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000 c586: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c58a: 634b str r3, [r1, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c58c: 6acb ldr r3, [r1, #44] ; 0x2c c58e: f413 3f00 tst.w r3, #131072 ; 0x20000 c592: d0fb beq.n c58c (void)READ_SPI_FLASH_DATA(); c594: 492a ldr r1, [pc, #168] ; (c640 ) c596: 6b8b ldr r3, [r1, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c598: 6acb ldr r3, [r1, #44] ; 0x2c c59a: f443 3300 orr.w r3, r3, #131072 ; 0x20000 c59e: 62cb str r3, [r1, #44] ; 0x2c WRITE_SPI_CMD0((byte)(pageaddr>>8)); c5a0: 0a13 lsrs r3, r2, #8 c5a2: b2db uxtb r3, r3 c5a4: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000 c5a8: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c5ac: 634b str r3, [r1, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c5ae: 460a mov r2, r1 c5b0: 6ad3 ldr r3, [r2, #44] ; 0x2c c5b2: f413 3f00 tst.w r3, #131072 ; 0x20000 c5b6: d0fb beq.n c5b0 (void)READ_SPI_FLASH_DATA(); c5b8: 4b21 ldr r3, [pc, #132] ; (c640 ) c5ba: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c5bc: 6ada ldr r2, [r3, #44] ; 0x2c c5be: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c5c2: 62da str r2, [r3, #44] ; 0x2c WRITE_SPI_CMD0((byte)(pageaddr)); c5c4: 4a21 ldr r2, [pc, #132] ; (c64c ) c5c6: 635a str r2, [r3, #52] ; 0x34 WAIT_SPI_RECEPTION_END(); c5c8: 461a mov r2, r3 c5ca: 6ad3 ldr r3, [r2, #44] ; 0x2c c5cc: f413 3f00 tst.w r3, #131072 ; 0x20000 c5d0: d0fb beq.n c5ca (void)READ_SPI_FLASH_DATA(); c5d2: 4b1b ldr r3, [pc, #108] ; (c640 ) c5d4: 6b9a ldr r2, [r3, #56] ; 0x38 CLEAR_RECEPTION_FLAG(); c5d6: 6ada ldr r2, [r3, #44] ; 0x2c c5d8: f442 3200 orr.w r2, r2, #131072 ; 0x20000 c5dc: 62da str r2, [r3, #44] ; 0x2c while (bufferindex) CLEAR_RECEPTION_FLAG(); c5e0: 2100 movs r1, #0 countnoterased = 0; c5e2: 460d mov r5, r1 { if (bufferindex==(SPIFLASHERASESIZE-1)) c5e4: f640 77ff movw r7, #4095 ; 0xfff { WRITE_SPI_CMD0_LAST(0xff); /* The last dummy out is flagged to end communications! */ } else { WRITE_SPI_CMD0(0xff); /* We have to send dummy out to get reply in! */ c5e8: 461a mov r2, r3 c5ea: f8df c074 ldr.w ip, [pc, #116] ; c660 WRITE_SPI_CMD0_LAST(0xff); /* The last dummy out is flagged to end communications! */ c5ee: 4c19 ldr r4, [pc, #100] ; (c654 ) if (bufferindex==(SPIFLASHERASESIZE-1)) c5f0: b28b uxth r3, r1 c5f2: 42bb cmp r3, r7 WRITE_SPI_CMD0_LAST(0xff); /* The last dummy out is flagged to end communications! */ c5f4: bf0c ite eq c5f6: 6354 streq r4, [r2, #52] ; 0x34 WRITE_SPI_CMD0(0xff); /* We have to send dummy out to get reply in! */ c5f8: f8c2 c034 strne.w ip, [r2, #52] ; 0x34 } WAIT_SPI_RECEPTION_END(); c5fc: 6ad3 ldr r3, [r2, #44] ; 0x2c c5fe: f413 3f00 tst.w r3, #131072 ; 0x20000 c602: d0fb beq.n c5fc data = READ_SPI_FLASH_DATA(); /* Store data in the buffer */ c604: 6b93 ldr r3, [r2, #56] ; 0x38 c606: b2db uxtb r3, r3 CLEAR_RECEPTION_FLAG(); c608: 6ad0 ldr r0, [r2, #44] ; 0x2c c60a: f440 3000 orr.w r0, r0, #131072 ; 0x20000 c60e: 62d0 str r0, [r2, #44] ; 0x2c SPIFLASHbuffer[bufferindex++] = data; c610: f806 3f01 strb.w r3, [r6, #1]! if (data!=0xFF) c614: 2bff cmp r3, #255 ; 0xff { countnoterased++; c616: bf1c itt ne c618: 3501 addne r5, #1 c61a: b2ad uxthne r5, r5 c61c: 3101 adds r1, #1 while (bufferindex } } SPIFLASHcurrentblock = SPIFLASHnewblock; /* Remember which block we now have in the buffer */ c624: 4b0c ldr r3, [pc, #48] ; (c658 ) c626: f8c3 8000 str.w r8, [r3] if (countnoterased==0) c62a: 4b0c ldr r3, [pc, #48] ; (c65c ) c62c: fab5 f585 clz r5, r5 c630: 096d lsrs r5, r5, #5 c632: 725d strb r5, [r3, #9] } else { calcs.SPIFLASHerasestate = 0; } calcs.SPIFLASHwritestate = 0; /* Nothing has changed in the buffer, yet */ c634: 2200 movs r2, #0 c636: 721a strb r2, [r3, #8] } c638: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} c63c: 00012ba4 .word 0x00012ba4 c640: 4002c000 .word 0x4002c000 c644: 1a0a0000 .word 0x1a0a0000 c648: 80010003 .word 0x80010003 c64c: 80010000 .word 0x80010000 c650: 1fff07cf .word 0x1fff07cf c654: 080100ff .word 0x080100ff c658: 20000ddc .word 0x20000ddc c65c: 20000934 .word 0x20000934 c660: 800100ff .word 0x800100ff 0000c664 : { c664: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} startaddress = startBlock*FATFSSECTORSIZE; /* Convert to byte addresses */ c668: 024d lsls r5, r1, #9 blocknumber = startaddress/SPIFLASHERASESIZE;/* Which 4K block is being accessed? */ c66a: ea4f 3915 mov.w r9, r5, lsr #12 tmp = startaddress+blockcount-1; /* Make sure final address is in same block! */ c66e: 1e53 subs r3, r2, #1 c670: 442b add r3, r5 assert (tmp==blocknumber);/*!!!!*/ c672: ebb9 3f13 cmp.w r9, r3, lsr #12 c676: d11b bne.n c6b0 c678: 4607 mov r7, r0 c67a: 460c mov r4, r1 c67c: 4690 mov r8, r2 c67e: 0256 lsls r6, r2, #9 if (blocknumber!=SPIFLASHcurrentblock) /* If we want to write to a different block than current ... */ c680: 4b22 ldr r3, [pc, #136] ; (c70c ) c682: 6818 ldr r0, [r3, #0] c684: 4548 cmp r0, r9 c686: d116 bne.n c6b6 if (debugrecentwriteblock!=startBlock)/*!!!!*/ c688: 4b21 ldr r3, [pc, #132] ; (c710 ) c68a: 681b ldr r3, [r3, #0] c68c: 42a3 cmp r3, r4 c68e: d118 bne.n c6c2 tmp = startaddress-(blocknumber*SPIFLASHERASESIZE);/* Get index into this block */ c690: f3c5 050b ubfx r5, r5, #0, #12 for (x=0; x c696: 4c1f ldr r4, [pc, #124] ; (c714 ) c698: 442c add r4, r5 c69a: 1e7a subs r2, r7, #1 c69c: 4638 mov r0, r7 c69e: 4416 add r6, r2 calcs.SPIFLASHwritestate = 1; /* Flag that data has been changed */ c6a0: f8df 8080 ldr.w r8, [pc, #128] ; c724 c6a4: f04f 0e01 mov.w lr, #1 t10ms.IndicateWrite = t10msOneSec;/*!!!!*/ c6a8: f8df c07c ldr.w ip, [pc, #124] ; c728 c6ac: 2764 movs r7, #100 ; 0x64 c6ae: e022 b.n c6f6 assert (tmp==blocknumber);/*!!!!*/ c6b0: 4819 ldr r0, [pc, #100] ; (c718 ) c6b2: f001 f993 bl d9dc <__assertion_failed> SPIFLASH_WriteBuffer(SPIFLASHcurrentblock);/* Maybe write back the old block */ c6b6: f7ff fe59 bl c36c SPIFLASH_ReadBuffer(blocknumber); /* Fetch the new block */ c6ba: 4648 mov r0, r9 c6bc: f7ff ff42 bl c544 c6c0: e7e2 b.n c688 debugrecentwriteblock = startBlock; c6c2: 4b13 ldr r3, [pc, #76] ; (c710 ) c6c4: 601c str r4, [r3, #0] PRINTF("FATFSWRITE %i/%i\r\n",startBlock,blockcount);/*!!!!*/ c6c6: 4642 mov r2, r8 c6c8: 4621 mov r1, r4 c6ca: 4814 ldr r0, [pc, #80] ; (c71c ) c6cc: f002 f960 bl e990 <_printf> c6d0: e7de b.n c690 assert (tmp) c6d4: f001 f982 bl d9dc <__assertion_failed> calcs.SPIFLASHwritestate = 1; /* Flag that data has been changed */ c6d8: f888 e008 strb.w lr, [r8, #8] t10ms.IndicateWrite = t10msOneSec;/*!!!!*/ c6dc: f88c 7002 strb.w r7, [ip, #2] SPIFLASHbuffer[tmp] = buffer[x]; /* Copy the new data into the block */ c6e0: 7853 ldrb r3, [r2, #1] c6e2: 7023 strb r3, [r4, #0] for (x=0; x assert (tmp if (SPIFLASHbuffer[tmp]==buffer[x]) c6f6: 1c51 adds r1, r2, #1 c6f8: f814 9f01 ldrb.w r9, [r4, #1]! c6fc: 7853 ldrb r3, [r2, #1] c6fe: 4599 cmp r9, r3 c700: d1ea bne.n c6d8 c702: e7ef b.n c6e4 } c704: 2000 movs r0, #0 c706: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} c70a: bf00 nop c70c: 20000ddc .word 0x20000ddc c710: 20000de4 .word 0x20000de4 c714: 1fff07cf .word 0x1fff07cf c718: 00012bb4 .word 0x00012bb4 c71c: 00012bdc .word 0x00012bdc c720: 00012bf0 .word 0x00012bf0 c724: 20000934 .word 0x20000934 c728: 20000980 .word 0x20000980 0000c72c : { c72c: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} startaddress = startBlock*FATFSSECTORSIZE; /* Convert to byte addresses */ c730: 024d lsls r5, r1, #9 blocknumber = startaddress/SPIFLASHERASESIZE;/* Which 4K block is being accessed? */ c732: ea4f 3915 mov.w r9, r5, lsr #12 tmp = startaddress+blockcount-1; /* Make sure final address is in same block! */ c736: 1e53 subs r3, r2, #1 c738: 442b add r3, r5 assert (tmp==blocknumber);/*!!!!*/ c73a: ebb9 3f13 cmp.w r9, r3, lsr #12 c73e: d123 bne.n c788 c740: 4604 mov r4, r0 c742: 460f mov r7, r1 c744: 4690 mov r8, r2 c746: 0256 lsls r6, r2, #9 if (blocknumber!=SPIFLASHcurrentblock) /* If we want to write to a different block than current ... */ c748: 4b19 ldr r3, [pc, #100] ; (c7b0 ) c74a: 6818 ldr r0, [r3, #0] c74c: 4548 cmp r0, r9 c74e: d11e bne.n c78e if (debugrecentreadblock!=startBlock)/*!!!!*/ c750: 4b18 ldr r3, [pc, #96] ; (c7b4 ) c752: 681b ldr r3, [r3, #0] c754: 42bb cmp r3, r7 c756: d120 bne.n c79a tmp = startaddress-(blocknumber*SPIFLASHERASESIZE);/* Get index into this block */ c758: f3c5 050b ubfx r5, r5, #0, #12 for (x=0; x c75e: 4916 ldr r1, [pc, #88] ; (c7b8 ) c760: 4429 add r1, r5 c762: 1e63 subs r3, r4, #1 c764: 4620 mov r0, r4 c766: 441e add r6, r3 buffer[x] = SPIFLASHbuffer[tmp]; /* Copy the read data */ c768: f811 4f01 ldrb.w r4, [r1, #1]! c76c: 1c5a adds r2, r3, #1 c76e: 705c strb r4, [r3, #1] for (x=0; x assert (tmp c782: 480e ldr r0, [pc, #56] ; (c7bc ) c784: f001 f92a bl d9dc <__assertion_failed> assert (tmp==blocknumber);/*!!!!*/ c788: 480d ldr r0, [pc, #52] ; (c7c0 ) c78a: f001 f927 bl d9dc <__assertion_failed> SPIFLASH_WriteBuffer(SPIFLASHcurrentblock);/* Maybe write back the old block */ c78e: f7ff fded bl c36c SPIFLASH_ReadBuffer(blocknumber); /* Fetch the new block */ c792: 4648 mov r0, r9 c794: f7ff fed6 bl c544 c798: e7da b.n c750 debugrecentreadblock = startBlock; c79a: 4b06 ldr r3, [pc, #24] ; (c7b4 ) c79c: 601f str r7, [r3, #0] PRINTF("FATFSREAD %i/%i\r\n",startBlock,blockcount);/*!!!!*/ c79e: 4642 mov r2, r8 c7a0: 4639 mov r1, r7 c7a2: 4808 ldr r0, [pc, #32] ; (c7c4 ) c7a4: f002 f8f4 bl e990 <_printf> c7a8: e7d6 b.n c758 } c7aa: 2000 movs r0, #0 c7ac: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} c7b0: 20000ddc .word 0x20000ddc c7b4: 20000de0 .word 0x20000de0 c7b8: 1fff07cf .word 0x1fff07cf c7bc: 00012b74 .word 0x00012b74 c7c0: 00012b38 .word 0x00012b38 c7c4: 00012b60 .word 0x00012b60 0000c7c8 : void do_PIT0timer(void) { byte* ptr; byte cnt; ONESECONDEVENT = 0; /* This flag is set for one loop every second, start with clear! */ c7c8: 4b14 ldr r3, [pc, #80] ; (c81c ) c7ca: 781a ldrb r2, [r3, #0] c7cc: f36f 0200 bfc r2, #0, #1 c7d0: 701a strb r2, [r3, #0] if (T10msOccurred) c7d2: 4b13 ldr r3, [pc, #76] ; (c820 ) c7d4: 781b ldrb r3, [r3, #0] c7d6: b1fb cbz r3, c818 { T10msOccurred = 0; /* Clear the 10ms interrupt flag */ c7d8: 4b11 ldr r3, [pc, #68] ; (c820 ) c7da: 2200 movs r2, #0 c7dc: 701a strb r2, [r3, #0] ptr = (byte*)&t10ms; /* Set up to point to all 10ms countdown values */ cnt = sizeof(t10ms); while (cnt--) /* Decrement all non-zero (byte) counts */ c7de: 4b11 ldr r3, [pc, #68] ; (c824 ) c7e0: f103 010d add.w r1, r3, #13 c7e4: e001 b.n c7ea c7e6: 428b cmp r3, r1 c7e8: d007 beq.n c7fa { if (*ptr) c7ea: f813 2b01 ldrb.w r2, [r3], #1 c7ee: 2a00 cmp r2, #0 c7f0: d0f9 beq.n c7e6 { --*ptr; c7f2: 3a01 subs r2, #1 c7f4: f803 2c01 strb.w r2, [r3, #-1] c7f8: e7f5 b.n c7e6 } ptr++; } t10msBitToggles++; /* Increment every 10ms - gives 10ms/20ms/40ms... toggle bits */ c7fa: 4a0b ldr r2, [pc, #44] ; (c828 ) c7fc: 7813 ldrb r3, [r2, #0] c7fe: 3301 adds r3, #1 c800: 7013 strb r3, [r2, #0] if (t10ms.OneSecond==0) /* Has one second passed? */ c802: 4b08 ldr r3, [pc, #32] ; (c824 ) c804: 785b ldrb r3, [r3, #1] c806: b93b cbnz r3, c818 { t10ms.OneSecond = t10msOneSec; c808: 4b06 ldr r3, [pc, #24] ; (c824 ) c80a: 2264 movs r2, #100 ; 0x64 c80c: 705a strb r2, [r3, #1] ONESECONDEVENT = 1; c80e: 4a03 ldr r2, [pc, #12] ; (c81c ) c810: 7813 ldrb r3, [r2, #0] c812: f043 0301 orr.w r3, r3, #1 c816: 7013 strb r3, [r2, #0] // PoweredTime++; // } } } } c818: 4770 bx lr c81a: bf00 nop c81c: 2000096c .word 0x2000096c c820: 200012f0 .word 0x200012f0 c824: 20000980 .word 0x20000980 c828: 200012f1 .word 0x200012f1 0000c82c : /* ********************************************************************************************************************* * Function Name : PIT0init * Description : Configure PIT0 to generate 100us interrupts. * ********************************************************************************************************************/ void PIT0init(void) { c82c: b570 push {r4, r5, r6, lr} c82e: b082 sub sp, #8 static inline void PIT_GetDefaultConfig(pit_config_t *config) { assert(config); /* Timers are stopped in Debug mode */ config->enableRunInDebug = false; c830: 2300 movs r3, #0 c832: f88d 3004 strb.w r3, [sp, #4] pit_config_t pitConfig; uint32_t clockfrequency; /* Initialize PIT0 module */ PIT_GetDefaultConfig(&pitConfig); PIT_Init(PIT, &pitConfig); c836: 4e1a ldr r6, [pc, #104] ; (c8a0 ) c838: a901 add r1, sp, #4 c83a: 4630 mov r0, r6 c83c: f000 ffd0 bl d7e0 /* Set timer period to give 1ms interrupts */ clockfrequency = CLOCK_GetFreq(kCLOCK_BusClk); c840: 2002 movs r0, #2 c842: f000 fc79 bl d138 PIT_SetTimerPeriod(PIT, PITNUMBER, USEC_TO_COUNT(100U, clockfrequency)); c846: 4604 mov r4, r0 c848: 2500 movs r5, #0 c84a: 1800 adds r0, r0, r0 c84c: eb45 0105 adc.w r1, r5, r5 c850: 1900 adds r0, r0, r4 c852: eb45 0101 adc.w r1, r5, r1 c856: 014b lsls r3, r1, #5 c858: ea43 63d0 orr.w r3, r3, r0, lsr #27 c85c: 0142 lsls r2, r0, #5 c85e: 1880 adds r0, r0, r2 c860: eb43 0101 adc.w r1, r3, r1 c864: 4a0f ldr r2, [pc, #60] ; (c8a4 ) c866: 2300 movs r3, #0 c868: 1900 adds r0, r0, r4 c86a: eb45 0101 adc.w r1, r5, r1 c86e: f005 fc99 bl 121a4 <__aeabi_uldivmod> * @param channel Timer channel number * @param count Timer period in units of ticks */ static inline void PIT_SetTimerPeriod(PIT_Type *base, pit_chnl_t channel, uint32_t count) { base->CHANNEL[channel].LDVAL = count; c872: f8c6 0100 str.w r0, [r6, #256] ; 0x100 base->CHANNEL[channel].TCTRL |= mask; c876: f8d6 3108 ldr.w r3, [r6, #264] ; 0x108 c87a: f043 0302 orr.w r3, r3, #2 c87e: f8c6 3108 str.w r3, [r6, #264] ; 0x108 NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); c882: 4b09 ldr r3, [pc, #36] ; (c8a8 ) c884: 2210 movs r2, #16 c886: f883 2330 strb.w r2, [r3, #816] ; 0x330 NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); c88a: f44f 3280 mov.w r2, #65536 ; 0x10000 c88e: 605a str r2, [r3, #4] * @param base PIT peripheral base address * @param channel Timer channel number. */ static inline void PIT_StartTimer(PIT_Type *base, pit_chnl_t channel) { base->CHANNEL[channel].TCTRL |= PIT_TCTRL_TEN_MASK; c890: f8d6 3108 ldr.w r3, [r6, #264] ; 0x108 c894: f043 0301 orr.w r3, r3, #1 c898: f8c6 3108 str.w r3, [r6, #264] ; 0x108 PIT_EnableInterrupts(PIT, PITNUMBER, kPIT_TimerInterruptEnable); NVIC_SetPriority(PIT0_IRQn, 1);/*(09/15/20)*/ EnableIRQ(PIT0_IRQn); PIT_StartTimer(PIT, PITNUMBER); } c89c: b002 add sp, #8 c89e: bd70 pop {r4, r5, r6, pc} c8a0: 40037000 .word 0x40037000 c8a4: 000f4240 .word 0x000f4240 c8a8: e000e100 .word 0xe000e100 0000c8ac : base->CHANNEL[channel].TFLG = mask; c8ac: 4b20 ldr r3, [pc, #128] ; (c930 ) c8ae: 2201 movs r2, #1 c8b0: f8c3 210c str.w r2, [r3, #268] ; 0x10c byte* ptr; byte cnt; PIT_ClearStatusFlags(PIT, PITNUMBER, kPIT_TimerFlag);/* Clear the interrupt */ if (Int100usLCDdelay) /* Count down LCD delays at 100us resolution */ c8b4: 4b1f ldr r3, [pc, #124] ; (c934 ) c8b6: 881b ldrh r3, [r3, #0] c8b8: b113 cbz r3, c8c0 { Int100usLCDdelay--; c8ba: 3b01 subs r3, #1 c8bc: 4a1d ldr r2, [pc, #116] ; (c934 ) c8be: 8013 strh r3, [r2, #0] } if (++Int100usCount>9) /* Counted 10*100us? */ c8c0: 4b1d ldr r3, [pc, #116] ; (c938 ) c8c2: 781b ldrb r3, [r3, #0] c8c4: 3301 adds r3, #1 c8c6: b2db uxtb r3, r3 c8c8: 2b09 cmp r3, #9 c8ca: d804 bhi.n c8d6 c8cc: 4a1a ldr r2, [pc, #104] ; (c938 ) c8ce: 7013 strb r3, [r2, #0] c8d0: f3bf 8f4f dsb sy ESCpressedCounter10ms++; } } __DSB(); } c8d4: 4770 bx lr Int100usCount = 0; /* Yes, 1ms has passed */ c8d6: 4b18 ldr r3, [pc, #96] ; (c938 ) c8d8: 2200 movs r2, #0 c8da: 701a strb r2, [r3, #0] debugCounter1ms++; /* Count logged times here */ c8dc: 4a17 ldr r2, [pc, #92] ; (c93c ) c8de: 6813 ldr r3, [r2, #0] c8e0: 3301 adds r3, #1 c8e2: 6013 str r3, [r2, #0] quicklogCounter1ms++; c8e4: 4a16 ldr r2, [pc, #88] ; (c940 ) c8e6: 6813 ldr r3, [r2, #0] c8e8: 3301 adds r3, #1 c8ea: 6013 str r3, [r2, #0] while (cnt--) /* Decrement all non-zero (byte) counts */ c8ec: 4b15 ldr r3, [pc, #84] ; (c944 ) c8ee: 1d59 adds r1, r3, #5 c8f0: e001 b.n c8f6 c8f2: 428b cmp r3, r1 c8f4: d007 beq.n c906 if (*ptr) c8f6: f813 2b01 ldrb.w r2, [r3], #1 c8fa: 2a00 cmp r2, #0 c8fc: d0f9 beq.n c8f2 --*ptr; c8fe: 3a01 subs r2, #1 c900: f803 2c01 strb.w r2, [r3, #-1] c904: e7f5 b.n c8f2 if (t1ms.Count10ms==0) /* Count 10*1ms interrupts, then do 10ms stuff */ c906: 4b0f ldr r3, [pc, #60] ; (c944 ) c908: 781b ldrb r3, [r3, #0] c90a: 2b00 cmp r3, #0 c90c: d1e0 bne.n c8d0 t1ms.Count10ms = 10; /* Reset for another 10ms */ c90e: 4b0d ldr r3, [pc, #52] ; (c944 ) c910: 220a movs r2, #10 c912: 701a strb r2, [r3, #0] T10msOccurred = 1; /* And flag that 10ms occurred */ c914: 4b0c ldr r3, [pc, #48] ; (c948 ) c916: 2201 movs r2, #1 c918: 701a strb r2, [r3, #0] if (t10msQuickLogDelay) c91a: 4b0c ldr r3, [pc, #48] ; (c94c ) c91c: 881b ldrh r3, [r3, #0] c91e: b113 cbz r3, c926 t10msQuickLogDelay--; /* Count down QuickLog delay here, to ensure it is accurate */ c920: 3b01 subs r3, #1 c922: 4a0a ldr r2, [pc, #40] ; (c94c ) c924: 8013 strh r3, [r2, #0] ESCpressedCounter10ms++; c926: 4a0a ldr r2, [pc, #40] ; (c950 ) c928: 8813 ldrh r3, [r2, #0] c92a: 3301 adds r3, #1 c92c: 8013 strh r3, [r2, #0] c92e: e7cf b.n c8d0 c930: 40037000 .word 0x40037000 c934: 200012e2 .word 0x200012e2 c938: 200012ed .word 0x200012ed c93c: 20000968 .word 0x20000968 c940: 2000097c .word 0x2000097c c944: 20000990 .word 0x20000990 c948: 200012f0 .word 0x200012f0 c94c: 200012e4 .word 0x200012e4 c950: 200012e0 .word 0x200012e0 0000c954 : ******************************************************************************/ /* Get device descriptor request */ usb_status_t USB_DeviceGetDeviceDescriptor(usb_device_handle handle, usb_device_get_device_descriptor_struct_t *deviceDescriptor) { deviceDescriptor->buffer = g_UsbDeviceDescriptor; c954: 4b02 ldr r3, [pc, #8] ; (c960 ) c956: 600b str r3, [r1, #0] deviceDescriptor->length = USB_DESCRIPTOR_LENGTH_DEVICE; c958: 2312 movs r3, #18 c95a: 604b str r3, [r1, #4] return kStatus_USB_Success; } c95c: 2000 movs r0, #0 c95e: 4770 bx lr c960: 20000020 .word 0x20000020 0000c964 : #endif /* Get device configuration descriptor request */ usb_status_t USB_DeviceGetConfigurationDescriptor( usb_device_handle handle, usb_device_get_configuration_descriptor_struct_t *configurationDescriptor) { if (USB_MSC_CONFIGURE_INDEX > configurationDescriptor->configuration) c964: 7a08 ldrb r0, [r1, #8] c966: b108 cbz r0, c96c { configurationDescriptor->buffer = g_UsbDeviceConfigurationDescriptor; configurationDescriptor->length = USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL; return kStatus_USB_Success; } return kStatus_USB_InvalidRequest; c968: 2005 movs r0, #5 } c96a: 4770 bx lr configurationDescriptor->buffer = g_UsbDeviceConfigurationDescriptor; c96c: 4b02 ldr r3, [pc, #8] ; (c978 ) c96e: 600b str r3, [r1, #0] configurationDescriptor->length = USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL; c970: 2320 movs r3, #32 c972: 604b str r3, [r1, #4] return kStatus_USB_Success; c974: 4770 bx lr c976: bf00 nop c978: 20000000 .word 0x20000000 0000c97c : /* Get device string descriptor request */ usb_status_t USB_DeviceGetStringDescriptor(usb_device_handle handle, usb_device_get_string_descriptor_struct_t *stringDescriptor) { if (stringDescriptor->stringIndex == 0U) c97c: 7a88 ldrb r0, [r1, #10] c97e: b150 cbz r0, c996 { c980: b410 push {r4} uint8_t languageId = 0U; uint8_t languageIndex = USB_DEVICE_STRING_COUNT; for (; languageId < USB_DEVICE_LANGUAGE_COUNT; languageId++) { if (stringDescriptor->languageId == g_UsbDeviceLanguageList.languageList[languageId].languageId) c982: 4b10 ldr r3, [pc, #64] ; (c9c4 ) c984: 689b ldr r3, [r3, #8] c986: 890c ldrh r4, [r1, #8] c988: 891a ldrh r2, [r3, #8] c98a: 4294 cmp r4, r2 c98c: d009 beq.n c9a2 } } if (USB_DEVICE_STRING_COUNT == languageIndex) { return kStatus_USB_InvalidRequest; c98e: 2005 movs r0, #5 } stringDescriptor->buffer = (uint8_t *)g_UsbDeviceLanguageList.languageList[languageId].string[languageIndex]; stringDescriptor->length = g_UsbDeviceLanguageList.languageList[languageId].length[languageIndex]; } return kStatus_USB_Success; } c990: f85d 4b04 ldr.w r4, [sp], #4 c994: 4770 bx lr stringDescriptor->buffer = (uint8_t *)g_UsbDeviceLanguageList.languageString; c996: 4b0b ldr r3, [pc, #44] ; (c9c4 ) c998: 681a ldr r2, [r3, #0] c99a: 600a str r2, [r1, #0] stringDescriptor->length = g_UsbDeviceLanguageList.stringLength; c99c: 685b ldr r3, [r3, #4] c99e: 604b str r3, [r1, #4] } c9a0: 4770 bx lr if (stringDescriptor->stringIndex < USB_DEVICE_STRING_COUNT) c9a2: 2802 cmp r0, #2 c9a4: d80b bhi.n c9be stringDescriptor->buffer = (uint8_t *)g_UsbDeviceLanguageList.languageList[languageId].string[languageIndex]; c9a6: 681b ldr r3, [r3, #0] c9a8: f853 3020 ldr.w r3, [r3, r0, lsl #2] c9ac: 600b str r3, [r1, #0] stringDescriptor->length = g_UsbDeviceLanguageList.languageList[languageId].length[languageIndex]; c9ae: 4b05 ldr r3, [pc, #20] ; (c9c4 ) c9b0: 689b ldr r3, [r3, #8] c9b2: 685b ldr r3, [r3, #4] c9b4: f853 3020 ldr.w r3, [r3, r0, lsl #2] c9b8: 604b str r3, [r1, #4] return kStatus_USB_Success; c9ba: 2000 movs r0, #0 c9bc: e7e8 b.n c990 return kStatus_USB_InvalidRequest; c9be: 2005 movs r0, #5 c9c0: e7e6 b.n c990 c9c2: bf00 nop c9c4: 20000034 .word 0x20000034 0000c9c8 : * @param event The USB device event type. * @param param The parameter of the class specific event. * @return kStatus_USB_Success or error. */ usb_status_t USB_DeviceMscCallback(class_handle_t handle, uint32_t event, void *param) { c9c8: b508 push {r3, lr} c9ca: 4613 mov r3, r2 usb_device_lba_information_struct_t *lbaInformationStructure; usb_device_lba_app_struct_t *lbaData; usb_device_ufi_app_struct_t *ufi; usb_device_capacity_information_struct_t *capacityInformation; switch (event) c9cc: 3902 subs r1, #2 c9ce: 290f cmp r1, #15 c9d0: d851 bhi.n ca76 c9d2: e8df f001 tbb [pc, r1] c9d6: 2608 .short 0x2608 c9d8: 5050452f .word 0x5050452f c9dc: 50505752 .word 0x50505752 c9e0: 50505050 .word 0x50505050 c9e4: 645c .short 0x645c case kUSB_DeviceMscEventReadResponse: lbaData = (usb_device_lba_app_struct_t *)param; break; case kUSB_DeviceMscEventWriteResponse: lbaData = (usb_device_lba_app_struct_t *)param; if (lbaData->size) c9e6: 685a ldr r2, [r3, #4] c9e8: 2a00 cmp r2, #0 c9ea: d044 beq.n ca76 { assert (lbaData->size<=MAXIMUMREQUESTSIZE);/*!!!!*/ c9ec: f5b2 7f00 cmp.w r2, #512 ; 0x200 c9f0: d811 bhi.n ca16 assert (lbaData->buffer==(uint8_t *)&g_mscWriteRequestBuffer[0]);/*!!!!*/ c9f2: 6898 ldr r0, [r3, #8] c9f4: 492e ldr r1, [pc, #184] ; (cab0 ) c9f6: 4288 cmp r0, r1 c9f8: d110 bne.n ca1c errorCode = SPIFLASH_WriteBlocks(lbaData->buffer, lbaData->offset, lbaData->size/LENGTH_OF_EACH_LBA); c9fa: 0a52 lsrs r2, r2, #9 c9fc: 6819 ldr r1, [r3, #0] c9fe: 482c ldr r0, [pc, #176] ; (cab0 ) ca00: f7ff fe30 bl c664 if (errorCode!=kStatus_Success) ca04: 2800 cmp r0, #0 ca06: d036 beq.n ca76 { g_msc.read_write_error = 1; ca08: 2101 movs r1, #1 ca0a: 4b2a ldr r3, [pc, #168] ; (cab4 ) ca0c: 7259 strb r1, [r3, #9] usb_echo("Write error = 0xx%x; check write request buffer size\r\n",error); ca0e: 482a ldr r0, [pc, #168] ; (cab8 ) ca10: f001 ffbe bl e990 <_printf> error = kStatus_USB_Error; ca14: e02f b.n ca76 assert (lbaData->size<=MAXIMUMREQUESTSIZE);/*!!!!*/ ca16: 4829 ldr r0, [pc, #164] ; (cabc ) ca18: f000 ffe0 bl d9dc <__assertion_failed> assert (lbaData->buffer==(uint8_t *)&g_mscWriteRequestBuffer[0]);/*!!!!*/ ca1c: 4828 ldr r0, [pc, #160] ; (cac0 ) ca1e: f000 ffdd bl d9dc <__assertion_failed> } } break; case kUSB_DeviceMscEventWriteRequest: lbaData = (usb_device_lba_app_struct_t *)param; lbaData->buffer = (uint8_t *)&g_mscWriteRequestBuffer[0];/* get a buffer to store the data from host */ ca22: 4a23 ldr r2, [pc, #140] ; (cab0 ) ca24: 609a str r2, [r3, #8] assert (lbaData->size<=MAXIMUMREQUESTSIZE);/*!!!!*/ ca26: 685b ldr r3, [r3, #4] ca28: f5b3 7f00 cmp.w r3, #512 ; 0x200 ca2c: d923 bls.n ca76 ca2e: 4825 ldr r0, [pc, #148] ; (cac4 ) ca30: f000 ffd4 bl d9dc <__assertion_failed> break; case kUSB_DeviceMscEventReadRequest: lbaData = (usb_device_lba_app_struct_t *)param; lbaData->buffer = (uint8_t *)&g_mscReadRequestBuffer[0]; ca34: 4a24 ldr r2, [pc, #144] ; (cac8 ) ca36: 609a str r2, [r3, #8] assert (lbaData->size<=MAXIMUMREQUESTSIZE);/*!!!!*/ ca38: 685a ldr r2, [r3, #4] ca3a: f5b2 7f00 cmp.w r2, #512 ; 0x200 ca3e: d80c bhi.n ca5a errorCode = SPIFLASH_ReadBlocks(lbaData->buffer, lbaData->offset, lbaData->size/LENGTH_OF_EACH_LBA); ca40: 0a52 lsrs r2, r2, #9 ca42: 6819 ldr r1, [r3, #0] ca44: 4820 ldr r0, [pc, #128] ; (cac8 ) ca46: f7ff fe71 bl c72c if (errorCode!=kStatus_Success) ca4a: b1a0 cbz r0, ca76 { g_msc.read_write_error = 1; ca4c: 2101 movs r1, #1 ca4e: 4b19 ldr r3, [pc, #100] ; (cab4 ) ca50: 7259 strb r1, [r3, #9] usb_echo("Read error = 0xx%x; check read request buffer size\r\n",error); ca52: 481e ldr r0, [pc, #120] ; (cacc ) ca54: f001 ff9c bl e990 <_printf> error = kStatus_USB_Error; ca58: e00d b.n ca76 assert (lbaData->size<=MAXIMUMREQUESTSIZE);/*!!!!*/ ca5a: 481d ldr r0, [pc, #116] ; (cad0 ) ca5c: f000 ffbe bl d9dc <__assertion_failed> } break; case kUSB_DeviceMscEventGetLbaInformation: lbaInformationStructure = (usb_device_lba_information_struct_t *)param; lbaInformationStructure->logicalUnitNumberSupported = LOGICAL_UNIT_SUPPORTED; ca60: 2201 movs r2, #1 ca62: 601a str r2, [r3, #0] lbaInformationStructure->logicalUnitInformations[0].lengthOfEachLba = LENGTH_OF_EACH_LBA;/*(08/26/20) Return details of the external SPIFLASH chip */ ca64: f44f 7200 mov.w r2, #512 ; 0x200 ca68: 609a str r2, [r3, #8] lbaInformationStructure->logicalUnitInformations[0].totalLbaNumberSupports = longwords.SPIFLASHSIZE/LENGTH_OF_EACH_LBA; ca6a: 491a ldr r1, [pc, #104] ; (cad4 ) ca6c: 6809 ldr r1, [r1, #0] ca6e: 0a49 lsrs r1, r1, #9 ca70: 6059 str r1, [r3, #4] lbaInformationStructure->logicalUnitInformations[0].bulkInBufferSize = MAXIMUMREQUESTSIZE; ca72: 60da str r2, [r3, #12] lbaInformationStructure->logicalUnitInformations[0].bulkOutBufferSize = MAXIMUMREQUESTSIZE; ca74: 611a str r2, [r3, #16] break; default: break; } return error; } ca76: 2001 movs r0, #1 ca78: bd08 pop {r3, pc} ufi->size = sizeof(usb_device_inquiry_data_fromat_struct_t); ca7a: 2224 movs r2, #36 ; 0x24 ca7c: 605a str r2, [r3, #4] ufi->buffer = (uint8_t *)&g_InquiryInfo; ca7e: 4a16 ldr r2, [pc, #88] ; (cad8 ) ca80: 609a str r2, [r3, #8] break; ca82: e7f8 b.n ca76 ufi->size = sizeof(usb_device_mode_parameters_header_struct_t); ca84: 2208 movs r2, #8 ca86: 605a str r2, [r3, #4] ufi->buffer = (uint8_t *)&g_ModeParametersHeader; ca88: 4a14 ldr r2, [pc, #80] ; (cadc ) ca8a: 609a str r2, [r3, #8] break; ca8c: e7f3 b.n ca76 capacityInformation->lengthOfEachLba = LENGTH_OF_EACH_LBA; ca8e: f44f 7200 mov.w r2, #512 ; 0x200 ca92: 605a str r2, [r3, #4] capacityInformation->totalLbaNumberSupports = longwords.SPIFLASHSIZE/LENGTH_OF_EACH_LBA; ca94: 4a0f ldr r2, [pc, #60] ; (cad4 ) ca96: 6812 ldr r2, [r2, #0] ca98: 0a52 lsrs r2, r2, #9 ca9a: 601a str r2, [r3, #0] break; ca9c: e7eb b.n ca76 capacityInformation->lengthOfEachLba = LENGTH_OF_EACH_LBA; ca9e: f44f 7200 mov.w r2, #512 ; 0x200 caa2: 605a str r2, [r3, #4] capacityInformation->totalLbaNumberSupports = longwords.SPIFLASHSIZE/LENGTH_OF_EACH_LBA; caa4: 4a0b ldr r2, [pc, #44] ; (cad4 ) caa6: 6812 ldr r2, [r2, #0] caa8: 0a52 lsrs r2, r2, #9 caaa: 601a str r2, [r3, #0] break; caac: e7e3 b.n ca76 caae: bf00 nop cab0: 20001000 .word 0x20001000 cab4: 20000df0 .word 0x20000df0 cab8: 00012cf0 .word 0x00012cf0 cabc: 00012c6c .word 0x00012c6c cac0: 00012ca4 .word 0x00012ca4 cac4: 00012d28 .word 0x00012d28 cac8: 20000e00 .word 0x20000e00 cacc: 00012d98 .word 0x00012d98 cad0: 00012d60 .word 0x00012d60 cad4: 20000974 .word 0x20000974 cad8: 20000108 .word 0x20000108 cadc: 20000de8 .word 0x20000de8 0000cae0 : * @param event The USB device event type. * @param param The parameter of the device specific request. * @return kStatus_USB_Success or error. */ usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param) { cae0: b508 push {r3, lr} usb_status_t error = kStatus_USB_Error; uint16_t *temp16 = (uint16_t *)param; uint8_t *temp8 = (uint8_t *)param; switch (event) cae2: 3901 subs r1, #1 cae4: 2915 cmp r1, #21 cae6: d84d bhi.n cb84 cae8: e8df f001 tbb [pc, r1] caec: 4c4c4c0b .word 0x4c4c4c0b caf0: 4c4c4c4c .word 0x4c4c4c4c caf4: 423d2210 .word 0x423d2210 caf8: 4c4c4c47 .word 0x4c4c4c47 cafc: 4c4c4c4c .word 0x4c4c4c4c cb00: 322c .short 0x322c { case kUSB_DeviceEventBusReset: { g_msc.attach = 0; cb02: 4b29 ldr r3, [pc, #164] ; (cba8 ) cb04: 2000 movs r0, #0 cb06: 7358 strb r0, [r3, #13] g_msc.currentConfiguration = 0U; cb08: 7298 strb r0, [r3, #10] break; default: break; } return error; } cb0a: bd08 pop {r3, pc} if (0U == (*temp8)) cb0c: 7810 ldrb r0, [r2, #0] cb0e: b928 cbnz r0, cb1c g_msc.attach = 0; cb10: 4b25 ldr r3, [pc, #148] ; (cba8 ) cb12: 2200 movs r2, #0 cb14: 735a strb r2, [r3, #13] g_msc.currentConfiguration = 0U; cb16: 729a strb r2, [r3, #10] usb_status_t error = kStatus_USB_Error; cb18: 2001 movs r0, #1 cb1a: e7f6 b.n cb0a else if (USB_MSC_CONFIGURE_INDEX == (*temp8)) cb1c: 2801 cmp r0, #1 cb1e: d001 beq.n cb24 error = kStatus_USB_InvalidRequest; cb20: 2005 movs r0, #5 cb22: e7f2 b.n cb0a g_msc.attach = 1; cb24: 4b20 ldr r3, [pc, #128] ; (cba8 ) cb26: 2101 movs r1, #1 cb28: 7359 strb r1, [r3, #13] g_msc.currentConfiguration = *temp8; cb2a: 7812 ldrb r2, [r2, #0] cb2c: 729a strb r2, [r3, #10] cb2e: e7ec b.n cb0a if (g_msc.attach) cb30: 4b1d ldr r3, [pc, #116] ; (cba8 ) cb32: 7b5b ldrb r3, [r3, #13] cb34: b343 cbz r3, cb88 uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); cb36: 8813 ldrh r3, [r2, #0] if (interface < USB_MSC_INTERFACE_COUNT) cb38: 0a1a lsrs r2, r3, #8 cb3a: d127 bne.n cb8c g_msc.currentInterfaceAlternateSetting[interface] = alternateSetting; cb3c: 4a1a ldr r2, [pc, #104] ; (cba8 ) uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU); cb3e: 72d3 strb r3, [r2, #11] usb_status_t error = kStatus_USB_Error; cb40: 2001 movs r0, #1 cb42: e7e2 b.n cb0a if (param) cb44: b322 cbz r2, cb90 *temp8 = g_msc.currentConfiguration; cb46: 4b18 ldr r3, [pc, #96] ; (cba8 ) cb48: 7a9b ldrb r3, [r3, #10] cb4a: 7013 strb r3, [r2, #0] error = kStatus_USB_Success; cb4c: 2000 movs r0, #0 cb4e: e7dc b.n cb0a if (param) cb50: b302 cbz r2, cb94 uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); cb52: 8813 ldrh r3, [r2, #0] if (interface < USB_INTERFACE_COUNT) cb54: 0a18 lsrs r0, r3, #8 cb56: d11f bne.n cb98 *temp16 = (*temp16 & 0xFF00U) | g_msc.currentInterfaceAlternateSetting[interface]; cb58: f023 03ff bic.w r3, r3, #255 ; 0xff cb5c: 4912 ldr r1, [pc, #72] ; (cba8 ) cb5e: 7ac9 ldrb r1, [r1, #11] cb60: 430b orrs r3, r1 cb62: 8013 strh r3, [r2, #0] error = kStatus_USB_Success; cb64: e7d1 b.n cb0a if (param) cb66: b1ca cbz r2, cb9c error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); cb68: 4611 mov r1, r2 cb6a: f7ff fef3 bl c954 cb6e: e7cc b.n cb0a if (param) cb70: b1b2 cbz r2, cba0 error = USB_DeviceGetConfigurationDescriptor(handle, cb72: 4611 mov r1, r2 cb74: f7ff fef6 bl c964 cb78: e7c7 b.n cb0a if (param) cb7a: b19a cbz r2, cba4 error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); cb7c: 4611 mov r1, r2 cb7e: f7ff fefd bl c97c cb82: e7c2 b.n cb0a usb_status_t error = kStatus_USB_Error; cb84: 2001 movs r0, #1 cb86: e7c0 b.n cb0a cb88: 2001 movs r0, #1 cb8a: e7be b.n cb0a cb8c: 2001 movs r0, #1 cb8e: e7bc b.n cb0a cb90: 2001 movs r0, #1 cb92: e7ba b.n cb0a cb94: 2001 movs r0, #1 cb96: e7b8 b.n cb0a error = kStatus_USB_InvalidRequest; cb98: 2005 movs r0, #5 cb9a: e7b6 b.n cb0a usb_status_t error = kStatus_USB_Error; cb9c: 2001 movs r0, #1 cb9e: e7b4 b.n cb0a cba0: 2001 movs r0, #1 cba2: e7b2 b.n cb0a cba4: 2001 movs r0, #1 cba6: e7b0 b.n cb0a cba8: 20000df0 .word 0x20000df0 0000cbac : { cbac: b508 push {r3, lr} USB_DeviceKhciIsrFunction(g_msc.deviceHandle); cbae: 4b03 ldr r3, [pc, #12] ; (cbbc ) cbb0: 6818 ldr r0, [r3, #0] cbb2: f002 ff43 bl fa3c cbb6: f3bf 8f4f dsb sy } cbba: bd08 pop {r3, pc} cbbc: 20000df0 .word 0x20000df0 0000cbc0 : { cbc0: b508 push {r3, lr} SystemCoreClockUpdate(); cbc2: f000 fe45 bl d850 CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcPll0, 48000000U);/*(10/23/20)*/ cbc6: 4903 ldr r1, [pc, #12] ; (cbd4 ) cbc8: f44f 20a0 mov.w r0, #327680 ; 0x50000 cbcc: f000 f9ac bl cf28 } cbd0: bd08 pop {r3, pc} cbd2: bf00 nop cbd4: 02dc6c00 .word 0x02dc6c00 0000cbd8 : NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); cbd8: 4b03 ldr r3, [pc, #12] ; (cbe8 ) cbda: 2230 movs r2, #48 ; 0x30 cbdc: f883 2335 strb.w r2, [r3, #821] ; 0x335 NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); cbe0: f44f 1200 mov.w r2, #2097152 ; 0x200000 cbe4: 605a str r2, [r3, #4] } cbe6: 4770 bx lr cbe8: e000e100 .word 0xe000e100 0000cbec : * This function init the usb stack and sdhc driver. * * @return None. */ void USB_DeviceApplicationInit(void) { cbec: b508 push {r3, lr} USB_DeviceClockInit(); cbee: f7ff ffe7 bl cbc0 cbf2: 4a11 ldr r2, [pc, #68] ; (cc38 ) cbf4: 6813 ldr r3, [r2, #0] cbf6: f023 0301 bic.w r3, r3, #1 cbfa: 6013 str r3, [r2, #0] #if (defined(FSL_FEATURE_SOC_SYSMPU_COUNT) && (FSL_FEATURE_SOC_SYSMPU_COUNT > 0U)) SYSMPU_Enable(SYSMPU, 0); #endif /* FSL_FEATURE_SOC_SYSMPU_COUNT */ g_msc.speed = USB_SPEED_FULL; cbfc: 4a0f ldr r2, [pc, #60] ; (cc3c ) cbfe: 2000 movs r0, #0 cc00: 7310 strb r0, [r2, #12] g_msc.attach = 0; cc02: 7350 strb r0, [r2, #13] g_msc.mscHandle = (class_handle_t)NULL; cc04: 6050 str r0, [r2, #4] g_msc.deviceHandle = NULL; cc06: 6010 str r0, [r2, #0] if (kStatus_USB_Success != USB_DeviceClassInit(CONTROLLER_ID, &msc_config_list, &g_msc.deviceHandle)) cc08: 490d ldr r1, [pc, #52] ; (cc40 ) cc0a: f7fb fdd9 bl 87c0 cc0e: b148 cbz r0, cc24 { usb_echo("USB device init failed\r\n"); cc10: 480c ldr r0, [pc, #48] ; (cc44 ) cc12: f001 febd bl e990 <_printf> { usb_echo("USB device mass storage demo\r\n"); g_msc.mscHandle = msc_config_list.config->classHandle; } USB_DeviceIsrEnable(); cc16: f7ff ffdf bl cbd8 /*(11/02/20) SDK_DelayAtLeastUs(5000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY) removed! */ USB_DeviceRun(g_msc.deviceHandle); cc1a: 4b08 ldr r3, [pc, #32] ; (cc3c ) cc1c: 6818 ldr r0, [r3, #0] cc1e: f002 fb10 bl f242 } cc22: bd08 pop {r3, pc} usb_echo("USB device mass storage demo\r\n"); cc24: 4808 ldr r0, [pc, #32] ; (cc48 ) cc26: f001 feb3 bl e990 <_printf> g_msc.mscHandle = msc_config_list.config->classHandle; cc2a: 4b05 ldr r3, [pc, #20] ; (cc40 ) cc2c: 681b ldr r3, [r3, #0] cc2e: 685a ldr r2, [r3, #4] cc30: 4b02 ldr r3, [pc, #8] ; (cc3c ) cc32: 605a str r2, [r3, #4] cc34: e7ef b.n cc16 cc36: bf00 nop cc38: 4000d000 .word 0x4000d000 cc3c: 20000df0 .word 0x20000df0 cc40: 20000138 .word 0x20000138 cc44: 00012c30 .word 0x00012c30 cc48: 00012c4c .word 0x00012c4c 0000cc4c : /******************************************************************************* * Code ******************************************************************************/ static uint32_t ADC16_GetInstance(ADC_Type *base) { cc4c: b508 push {r3, lr} uint32_t instance; /* Find the instance index from base address mappings. */ for (instance = 0; instance < ARRAY_SIZE(s_adc16Bases); instance++) { if (s_adc16Bases[instance] == base) cc4e: 4b07 ldr r3, [pc, #28] ; (cc6c ) cc50: 4298 cmp r0, r3 cc52: d008 beq.n cc66 cc54: f503 2300 add.w r3, r3, #524288 ; 0x80000 cc58: 4298 cmp r0, r3 cc5a: bf08 it eq cc5c: 2001 moveq r0, #1 cc5e: d003 beq.n cc68 { break; } } assert(instance < ARRAY_SIZE(s_adc16Bases)); cc60: 4803 ldr r0, [pc, #12] ; (cc70 ) cc62: f000 febb bl d9dc <__assertion_failed> for (instance = 0; instance < ARRAY_SIZE(s_adc16Bases); instance++) cc66: 2000 movs r0, #0 return instance; } cc68: bd08 pop {r3, pc} cc6a: bf00 nop cc6c: 4003b000 .word 0x4003b000 cc70: 00012e24 .word 0x00012e24 0000cc74 : void ADC16_Init(ADC_Type *base, const adc16_config_t *config) { cc74: b538 push {r3, r4, r5, lr} assert(NULL != config); cc76: 2900 cmp r1, #0 cc78: d047 beq.n cd0a cc7a: 4605 mov r5, r0 cc7c: 460c mov r4, r1 uint32_t tmp32; #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) /* Enable the clock. */ CLOCK_EnableClock(s_adc16Clocks[ADC16_GetInstance(base)]); cc7e: f7ff ffe5 bl cc4c cc82: 4b26 ldr r3, [pc, #152] ; (cd1c ) cc84: f853 1020 ldr.w r1, [r3, r0, lsl #2] * * @param name Which clock to enable, see \ref clock_ip_name_t. */ static inline void CLOCK_EnableClock(clock_ip_name_t name) { uint32_t regAddr = SIM_BASE + CLK_GATE_ABSTRACT_REG_OFFSET((uint32_t)name); cc88: 0c0b lsrs r3, r1, #16 cc8a: f103 4380 add.w r3, r3, #1073741824 ; 0x40000000 cc8e: f503 238e add.w r3, r3, #290816 ; 0x47000 (*(volatile uint32_t *)regAddr) |= (1U << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name)); cc92: 6818 ldr r0, [r3, #0] cc94: b289 uxth r1, r1 cc96: 2201 movs r2, #1 cc98: 408a lsls r2, r1 cc9a: 4302 orrs r2, r0 cc9c: 601a str r2, [r3, #0] #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ /* ADCx_CFG1. */ tmp32 = ADC_CFG1_ADICLK(config->clockSource) | ADC_CFG1_MODE(config->resolution); cc9e: 7923 ldrb r3, [r4, #4] cca0: 009b lsls r3, r3, #2 cca2: f003 030c and.w r3, r3, #12 cca6: 7862 ldrb r2, [r4, #1] cca8: f002 0203 and.w r2, r2, #3 ccac: 4313 orrs r3, r2 if (kADC16_LongSampleDisabled != config->longSampleMode) ccae: 7962 ldrb r2, [r4, #5] ccb0: 2a04 cmp r2, #4 { tmp32 |= ADC_CFG1_ADLSMP_MASK; ccb2: bf18 it ne ccb4: f043 0310 orrne.w r3, r3, #16 } tmp32 |= ADC_CFG1_ADIV(config->clockDivider); ccb8: 78e2 ldrb r2, [r4, #3] ccba: 0152 lsls r2, r2, #5 ccbc: f002 0260 and.w r2, r2, #96 ; 0x60 ccc0: 4313 orrs r3, r2 if (config->enableLowPower) ccc2: 79e2 ldrb r2, [r4, #7] ccc4: b10a cbz r2, ccca { tmp32 |= ADC_CFG1_ADLPC_MASK; ccc6: f043 0380 orr.w r3, r3, #128 ; 0x80 } base->CFG1 = tmp32; ccca: 60ab str r3, [r5, #8] /* ADCx_CFG2. */ tmp32 = base->CFG2 & ~(ADC_CFG2_ADACKEN_MASK | ADC_CFG2_ADHSC_MASK | ADC_CFG2_ADLSTS_MASK); cccc: 68ea ldr r2, [r5, #12] ccce: f022 020f bic.w r2, r2, #15 if (kADC16_LongSampleDisabled != config->longSampleMode) { tmp32 |= ADC_CFG2_ADLSTS(config->longSampleMode); ccd2: 7963 ldrb r3, [r4, #5] ccd4: f003 0303 and.w r3, r3, #3 ccd8: 4313 orrs r3, r2 } if (config->enableHighSpeed) ccda: 79a2 ldrb r2, [r4, #6] ccdc: b10a cbz r2, cce2 { tmp32 |= ADC_CFG2_ADHSC_MASK; ccde: f043 0304 orr.w r3, r3, #4 } if (config->enableAsynchronousClock) cce2: 78a2 ldrb r2, [r4, #2] cce4: b10a cbz r2, ccea { tmp32 |= ADC_CFG2_ADACKEN_MASK; cce6: f043 0308 orr.w r3, r3, #8 } base->CFG2 = tmp32; ccea: 60eb str r3, [r5, #12] /* ADCx_SC2. */ tmp32 = base->SC2 & ~(ADC_SC2_REFSEL_MASK); ccec: 6a2a ldr r2, [r5, #32] ccee: f022 0203 bic.w r2, r2, #3 tmp32 |= ADC_SC2_REFSEL(config->referenceVoltageSource); ccf2: 7823 ldrb r3, [r4, #0] ccf4: f003 0303 and.w r3, r3, #3 ccf8: 4313 orrs r3, r2 base->SC2 = tmp32; ccfa: 622b str r3, [r5, #32] /* ADCx_SC3. */ if (config->enableContinuousConversion) ccfc: 7a23 ldrb r3, [r4, #8] ccfe: b13b cbz r3, cd10 { base->SC3 |= ADC_SC3_ADCO_MASK; cd00: 6a6b ldr r3, [r5, #36] ; 0x24 cd02: f043 0308 orr.w r3, r3, #8 cd06: 626b str r3, [r5, #36] ; 0x24 } else { base->SC3 &= ~ADC_SC3_ADCO_MASK; } } cd08: bd38 pop {r3, r4, r5, pc} assert(NULL != config); cd0a: 4805 ldr r0, [pc, #20] ; (cd20 ) cd0c: f000 fe66 bl d9dc <__assertion_failed> base->SC3 &= ~ADC_SC3_ADCO_MASK; cd10: 6a6b ldr r3, [r5, #36] ; 0x24 cd12: f023 0308 bic.w r3, r3, #8 cd16: 626b str r3, [r5, #36] ; 0x24 } cd18: e7f6 b.n cd08 cd1a: bf00 nop cd1c: 00012ed4 .word 0x00012ed4 cd20: 00012e5c .word 0x00012e5c 0000cd24 : CLOCK_DisableClock(s_adc16Clocks[ADC16_GetInstance(base)]); #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ } void ADC16_GetDefaultConfig(adc16_config_t *config) { cd24: b508 push {r3, lr} assert(NULL != config); cd26: b170 cbz r0, cd46 cd28: 4603 mov r3, r0 config->referenceVoltageSource = kADC16_ReferenceVoltageSourceVref; cd2a: 2200 movs r2, #0 cd2c: 7002 strb r2, [r0, #0] config->clockSource = kADC16_ClockSourceAsynchronousClock; cd2e: 2003 movs r0, #3 cd30: 7058 strb r0, [r3, #1] config->enableAsynchronousClock = true; cd32: 2101 movs r1, #1 cd34: 7099 strb r1, [r3, #2] config->clockDivider = kADC16_ClockDivider8; cd36: 70d8 strb r0, [r3, #3] config->resolution = kADC16_ResolutionSE12Bit; cd38: 7119 strb r1, [r3, #4] config->longSampleMode = kADC16_LongSampleDisabled; cd3a: 2104 movs r1, #4 cd3c: 7159 strb r1, [r3, #5] config->enableHighSpeed = false; cd3e: 719a strb r2, [r3, #6] config->enableLowPower = false; cd40: 71da strb r2, [r3, #7] config->enableContinuousConversion = false; cd42: 721a strb r2, [r3, #8] } cd44: bd08 pop {r3, pc} assert(NULL != config); cd46: 4801 ldr r0, [pc, #4] ; (cd4c ) cd48: f000 fe48 bl d9dc <__assertion_failed> cd4c: 00012e00 .word 0x00012e00 0000cd50 : } #endif /* FSL_FEATURE_ADC16_HAS_CALIBRATION */ } void ADC16_SetChannelConfig(ADC_Type *base, uint32_t channelGroup, const adc16_channel_config_t *config) { cd50: b510 push {r4, lr} assert(channelGroup < ADC_SC1_COUNT); cd52: 2901 cmp r1, #1 cd54: d80e bhi.n cd74 assert(NULL != config); cd56: b182 cbz r2, cd7a uint32_t sc1 = ADC_SC1_ADCH(config->channelNumber); /* Set the channel number. */ cd58: 6813 ldr r3, [r2, #0] cd5a: f003 031f and.w r3, r3, #31 #if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE /* Enable the differential conversion. */ if (config->enableDifferentialConversion) cd5e: 7954 ldrb r4, [r2, #5] cd60: b10c cbz r4, cd66 { sc1 |= ADC_SC1_DIFF_MASK; cd62: f043 0320 orr.w r3, r3, #32 } #endif /* FSL_FEATURE_ADC16_HAS_DIFF_MODE */ /* Enable the interrupt when the conversion is done. */ if (config->enableInterruptOnConversionCompleted) cd66: 7912 ldrb r2, [r2, #4] cd68: b10a cbz r2, cd6e { sc1 |= ADC_SC1_AIEN_MASK; cd6a: f043 0340 orr.w r3, r3, #64 ; 0x40 } base->SC1[channelGroup] = sc1; cd6e: f840 3021 str.w r3, [r0, r1, lsl #2] } cd72: bd10 pop {r4, pc} assert(channelGroup < ADC_SC1_COUNT); cd74: 4802 ldr r0, [pc, #8] ; (cd80 ) cd76: f000 fe31 bl d9dc <__assertion_failed> assert(NULL != config); cd7a: 4802 ldr r0, [pc, #8] ; (cd84 ) cd7c: f000 fe2e bl d9dc <__assertion_failed> cd80: 00012e80 .word 0x00012e80 cd84: 00012eb0 .word 0x00012eb0 0000cd88 : uint32_t ADC16_GetChannelStatusFlags(ADC_Type *base, uint32_t channelGroup) { assert(channelGroup < ADC_SC1_COUNT); cd88: 2901 cmp r1, #1 cd8a: d804 bhi.n cd96 uint32_t ret = 0U; if (0U != (base->SC1[channelGroup] & ADC_SC1_COCO_MASK)) cd8c: f850 0021 ldr.w r0, [r0, r1, lsl #2] cd90: f000 0080 and.w r0, r0, #128 ; 0x80 { ret |= kADC16_ChannelConversionDoneFlag; } return ret; } cd94: 4770 bx lr { cd96: b508 push {r3, lr} assert(channelGroup < ADC_SC1_COUNT); cd98: 4801 ldr r0, [pc, #4] ; (cda0 ) cd9a: f000 fe1f bl d9dc <__assertion_failed> cd9e: bf00 nop cda0: 00012dd0 .word 0x00012dd0 0000cda4 : return freq; } static uint32_t CLOCK_GetInternalRefClkSelectFreq(void) { if (kMCG_IrcSlow == MCG_S_IRCST_VAL) cda4: 4b07 ldr r3, [pc, #28] ; (cdc4 ) cda6: 799b ldrb r3, [r3, #6] cda8: f013 0f01 tst.w r3, #1 cdac: d102 bne.n cdb4 { /* Slow internal reference clock selected*/ return s_slowIrcFreq; cdae: 4b06 ldr r3, [pc, #24] ; (cdc8 ) cdb0: 6818 ldr r0, [r3, #0] cdb2: 4770 bx lr } else { /* Fast internal reference clock selected*/ return s_fastIrcFreq >> MCG_SC_FCRDIV_VAL; cdb4: 4b03 ldr r3, [pc, #12] ; (cdc4 ) cdb6: 7a18 ldrb r0, [r3, #8] cdb8: f3c0 0342 ubfx r3, r0, #1, #3 cdbc: 4a03 ldr r2, [pc, #12] ; (cdcc ) cdbe: 6810 ldr r0, [r2, #0] cdc0: 40d8 lsrs r0, r3 } } cdc2: 4770 bx lr cdc4: 40064000 .word 0x40064000 cdc8: 20000148 .word 0x20000148 cdcc: 20000144 .word 0x20000144 0000cdd0 : { cdd0: b508 push {r3, lr} switch (MCG_C7_OSCSEL_VAL) cdd2: 4b0b ldr r3, [pc, #44] ; (ce00 ) cdd4: 7b1b ldrb r3, [r3, #12] cdd6: f013 0301 ands.w r3, r3, #1 cdda: d002 beq.n cde2 cddc: b943 cbnz r3, cdf0 freq = 0U; cdde: 2000 movs r0, #0 } cde0: bd08 pop {r3, pc} assert(g_xtal0Freq); cde2: 4b08 ldr r3, [pc, #32] ; (ce04 ) cde4: 6818 ldr r0, [r3, #0] cde6: 2800 cmp r0, #0 cde8: d1fa bne.n cde0 cdea: 4807 ldr r0, [pc, #28] ; (ce08 ) cdec: f000 fdf6 bl d9dc <__assertion_failed> assert(g_xtal32Freq); cdf0: 4b06 ldr r3, [pc, #24] ; (ce0c ) cdf2: 6818 ldr r0, [r3, #0] cdf4: 2800 cmp r0, #0 cdf6: d1f3 bne.n cde0 cdf8: 4805 ldr r0, [pc, #20] ; (ce10 ) cdfa: f000 fdef bl d9dc <__assertion_failed> cdfe: bf00 nop ce00: 40064000 .word 0x40064000 ce04: 20001200 .word 0x20001200 ce08: 00012f34 .word 0x00012f34 ce0c: 20001204 .word 0x20001204 ce10: 00012f54 .word 0x00012f54 0000ce14 : { ce14: b508 push {r3, lr} uint32_t freq = CLOCK_GetMcgExtClkFreq(); ce16: f7ff ffdb bl cdd0 if (!freq) ce1a: 4603 mov r3, r0 ce1c: b1b0 cbz r0, ce4c frdiv = MCG_C1_FRDIV_VAL; ce1e: 4912 ldr r1, [pc, #72] ; (ce68 ) ce20: 780a ldrb r2, [r1, #0] ce22: f3c2 02c2 ubfx r2, r2, #3, #3 freq >>= frdiv; ce26: 40d3 lsrs r3, r2 range = MCG_C2_RANGE_VAL; ce28: 7848 ldrb r0, [r1, #1] oscsel = MCG_C7_OSCSEL_VAL; ce2a: 7b09 ldrb r1, [r1, #12] ce2c: b2c9 uxtb r1, r1 if (((0U != range) && (kMCG_OscselOsc == oscsel))) ce2e: f010 0f30 tst.w r0, #48 ; 0x30 ce32: d00b beq.n ce4c ce34: f011 0f01 tst.w r1, #1 ce38: d108 bne.n ce4c switch (frdiv) ce3a: 2a07 cmp r2, #7 ce3c: d812 bhi.n ce64 ce3e: e8df f002 tbb [pc, r2] ce42: 0404 .short 0x0404 ce44: 04040404 .word 0x04040404 ce48: 0c07 .short 0x0c07 freq >>= 5u; ce4a: 095b lsrs r3, r3, #5 } ce4c: 4618 mov r0, r3 ce4e: bd08 pop {r3, pc} freq /= 20u; ce50: 4a06 ldr r2, [pc, #24] ; (ce6c ) ce52: fba2 2303 umull r2, r3, r2, r3 ce56: 091b lsrs r3, r3, #4 break; ce58: e7f8 b.n ce4c freq /= 12u; ce5a: 4a05 ldr r2, [pc, #20] ; (ce70 ) ce5c: fba2 2303 umull r2, r3, r2, r3 ce60: 08db lsrs r3, r3, #3 break; ce62: e7f3 b.n ce4c freq = 0u; ce64: 2300 movs r3, #0 ce66: e7f1 b.n ce4c ce68: 40064000 .word 0x40064000 ce6c: cccccccd .word 0xcccccccd ce70: aaaaaaab .word 0xaaaaaaab 0000ce74 : return range; } uint32_t CLOCK_GetOsc0ErClkFreq(void) { ce74: b508 push {r3, lr} if (OSC0->CR & OSC_CR_ERCLKEN_MASK) ce76: 4b07 ldr r3, [pc, #28] ; (ce94 ) ce78: 781b ldrb r3, [r3, #0] ce7a: f013 0f80 tst.w r3, #128 ; 0x80 ce7e: d006 beq.n ce8e { /* Please call CLOCK_SetXtal0Freq base on board setting before using OSC0 clock. */ assert(g_xtal0Freq); ce80: 4b05 ldr r3, [pc, #20] ; (ce98 ) ce82: 6818 ldr r0, [r3, #0] ce84: b100 cbz r0, ce88 } else { return 0U; } } ce86: bd08 pop {r3, pc} assert(g_xtal0Freq); ce88: 4804 ldr r0, [pc, #16] ; (ce9c ) ce8a: f000 fda7 bl d9dc <__assertion_failed> return 0U; ce8e: 2000 movs r0, #0 ce90: e7f9 b.n ce86 ce92: bf00 nop ce94: 40065000 .word 0x40065000 ce98: 20001200 .word 0x20001200 ce9c: 00012f74 .word 0x00012f74 0000cea0 : uint32_t CLOCK_GetEr32kClkFreq(void) { cea0: b510 push {r4, lr} uint32_t freq; switch (SIM_SOPT1_OSC32KSEL_VAL) cea2: 4b0e ldr r3, [pc, #56] ; (cedc ) cea4: 681c ldr r4, [r3, #0] cea6: f3c4 4481 ubfx r4, r4, #18, #2 ceaa: 2c02 cmp r4, #2 ceac: d00c beq.n cec8 ceae: 2c03 cmp r4, #3 ceb0: d011 beq.n ced6 ceb2: b114 cbz r4, ceba break; case 3U: /* LPO clock */ freq = LPO_CLK_FREQ; break; default: freq = 0U; ceb4: 2400 movs r4, #0 break; } return freq; } ceb6: 4620 mov r0, r4 ceb8: bd10 pop {r4, pc} freq = (CLOCK_GetOsc0ErClkFreq() == 32768U) ? 32768U : 0U; ceba: f7ff ffdb bl ce74 cebe: f5b0 4f00 cmp.w r0, #32768 ; 0x8000 cec2: bf08 it eq cec4: 4604 moveq r4, r0 cec6: e7f6 b.n ceb6 assert(g_xtal32Freq); cec8: 4b05 ldr r3, [pc, #20] ; (cee0 ) ceca: 681c ldr r4, [r3, #0] cecc: 2c00 cmp r4, #0 cece: d1f2 bne.n ceb6 ced0: 4804 ldr r0, [pc, #16] ; (cee4 ) ced2: f000 fd83 bl d9dc <__assertion_failed> freq = LPO_CLK_FREQ; ced6: f44f 747a mov.w r4, #1000 ; 0x3e8 ceda: e7ec b.n ceb6 cedc: 40047000 .word 0x40047000 cee0: 20001204 .word 0x20001204 cee4: 00012f14 .word 0x00012f14 0000cee8 : return freq; } void CLOCK_SetSimConfig(sim_clock_config_t const *config) { cee8: b410 push {r4} SIM->CLKDIV1 = config->clkdiv1; ceea: 6841 ldr r1, [r0, #4] ceec: 4a0d ldr r2, [pc, #52] ; (cf24 ) ceee: f241 0344 movw r3, #4164 ; 0x1044 cef2: 50d1 str r1, [r2, r3] * * @param src The value to set PLLFLLSEL clock source. */ static inline void CLOCK_SetPllFllSelClock(uint32_t src) { SIM->SOPT2 = ((SIM->SOPT2 & ~SIM_SOPT2_PLLFLLSEL_MASK) | SIM_SOPT2_PLLFLLSEL(src)); cef4: f241 0404 movw r4, #4100 ; 0x1004 cef8: 5911 ldr r1, [r2, r4] CLOCK_SetPllFllSelClock(config->pllFllSel); cefa: 7803 ldrb r3, [r0, #0] cefc: 041b lsls r3, r3, #16 cefe: f403 3380 and.w r3, r3, #65536 ; 0x10000 cf02: f421 3180 bic.w r1, r1, #65536 ; 0x10000 cf06: 430b orrs r3, r1 cf08: 5113 str r3, [r2, r4] SIM->SOPT1 = ((SIM->SOPT1 & ~SIM_SOPT1_OSC32KSEL_MASK) | SIM_SOPT1_OSC32KSEL(src)); cf0a: 6811 ldr r1, [r2, #0] CLOCK_SetEr32kClock(config->er32kSrc); cf0c: 7843 ldrb r3, [r0, #1] cf0e: 049b lsls r3, r3, #18 cf10: f403 2340 and.w r3, r3, #786432 ; 0xc0000 cf14: f421 2140 bic.w r1, r1, #786432 ; 0xc0000 cf18: 430b orrs r3, r1 cf1a: 6013 str r3, [r2, #0] } cf1c: f85d 4b04 ldr.w r4, [sp], #4 cf20: 4770 bx lr cf22: bf00 nop cf24: 40047000 .word 0x40047000 0000cf28 : (*(volatile uint32_t *)regAddr) &= ~(1U << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name)); cf28: 4a2a ldr r2, [pc, #168] ; (cfd4 ) cf2a: 6813 ldr r3, [r2, #0] cf2c: f423 2380 bic.w r3, r3, #262144 ; 0x40000 cf30: 6013 str r3, [r2, #0] { bool ret = true; CLOCK_DisableClock(kCLOCK_Usbfs0); if (kCLOCK_UsbSrcExt == src) cf32: b968 cbnz r0, cf50 { SIM->SOPT2 &= ~SIM_SOPT2_USBSRC_MASK; cf34: 4928 ldr r1, [pc, #160] ; (cfd8 ) cf36: f241 0204 movw r2, #4100 ; 0x1004 cf3a: 588b ldr r3, [r1, r2] cf3c: f423 2380 bic.w r3, r3, #262144 ; 0x40000 cf40: 508b str r3, [r1, r2] bool ret = true; cf42: 2001 movs r0, #1 (*(volatile uint32_t *)regAddr) |= (1U << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name)); cf44: 4a23 ldr r2, [pc, #140] ; (cfd4 ) cf46: 6813 ldr r3, [r2, #0] cf48: f443 2380 orr.w r3, r3, #262144 ; 0x40000 cf4c: 6013 str r3, [r2, #0] } CLOCK_EnableClock(kCLOCK_Usbfs0); return ret; } cf4e: 4770 bx lr { cf50: b410 push {r4} cf52: 4604 mov r4, r0 switch (freq) cf54: 4b21 ldr r3, [pc, #132] ; (cfdc ) cf56: 4299 cmp r1, r3 cf58: d032 beq.n cfc0 cf5a: d90f bls.n cf7c cf5c: 4b20 ldr r3, [pc, #128] ; (cfe0 ) cf5e: 4299 cmp r1, r3 cf60: d027 beq.n cfb2 cf62: f103 73b7 add.w r3, r3, #23986176 ; 0x16e0000 cf66: f503 5358 add.w r3, r3, #13824 ; 0x3600 cf6a: 4299 cmp r1, r3 cf6c: d12f bne.n cfce SIM->CLKDIV2 = SIM_CLKDIV2_USBDIV(4) | SIM_CLKDIV2_USBFRAC(1); cf6e: 4a1a ldr r2, [pc, #104] ; (cfd8 ) cf70: f241 0348 movw r3, #4168 ; 0x1048 cf74: 2109 movs r1, #9 cf76: 50d1 str r1, [r2, r3] bool ret = true; cf78: 2001 movs r0, #1 break; cf7a: e00a b.n cf92 switch (freq) cf7c: 4b19 ldr r3, [pc, #100] ; (cfe4 ) cf7e: 4299 cmp r1, r3 cf80: d106 bne.n cf90 SIM->CLKDIV2 = SIM_CLKDIV2_USBDIV(0) | SIM_CLKDIV2_USBFRAC(0); cf82: 4a15 ldr r2, [pc, #84] ; (cfd8 ) cf84: f241 0348 movw r3, #4168 ; 0x1048 cf88: 2100 movs r1, #0 cf8a: 50d1 str r1, [r2, r3] bool ret = true; cf8c: 2001 movs r0, #1 break; cf8e: e000 b.n cf92 ret = false; cf90: 2000 movs r0, #0 SIM->SOPT2 = ((SIM->SOPT2 & ~(SIM_SOPT2_PLLFLLSEL_MASK | SIM_SOPT2_USBSRC_MASK)) | (uint32_t)src); cf92: 4911 ldr r1, [pc, #68] ; (cfd8 ) cf94: f241 0204 movw r2, #4100 ; 0x1004 cf98: 588b ldr r3, [r1, r2] cf9a: f423 23a0 bic.w r3, r3, #327680 ; 0x50000 cf9e: 4323 orrs r3, r4 cfa0: 508b str r3, [r1, r2] cfa2: 4a0c ldr r2, [pc, #48] ; (cfd4 ) cfa4: 6813 ldr r3, [r2, #0] cfa6: f443 2380 orr.w r3, r3, #262144 ; 0x40000 cfaa: 6013 str r3, [r2, #0] } cfac: f85d 4b04 ldr.w r4, [sp], #4 cfb0: 4770 bx lr SIM->CLKDIV2 = SIM_CLKDIV2_USBDIV(1) | SIM_CLKDIV2_USBFRAC(0); cfb2: 4a09 ldr r2, [pc, #36] ; (cfd8 ) cfb4: f241 0348 movw r3, #4168 ; 0x1048 cfb8: 2102 movs r1, #2 cfba: 50d1 str r1, [r2, r3] bool ret = true; cfbc: 2001 movs r0, #1 break; cfbe: e7e8 b.n cf92 SIM->CLKDIV2 = SIM_CLKDIV2_USBDIV(2) | SIM_CLKDIV2_USBFRAC(1); cfc0: 4a05 ldr r2, [pc, #20] ; (cfd8 ) cfc2: f241 0348 movw r3, #4168 ; 0x1048 cfc6: 2105 movs r1, #5 cfc8: 50d1 str r1, [r2, r3] bool ret = true; cfca: 2001 movs r0, #1 break; cfcc: e7e1 b.n cf92 ret = false; cfce: 2000 movs r0, #0 cfd0: e7df b.n cf92 cfd2: bf00 nop cfd4: 40048034 .word 0x40048034 cfd8: 40047000 .word 0x40047000 cfdc: 044aa200 .word 0x044aa200 cfe0: 05b8d800 .word 0x05b8d800 cfe4: 02dc6c00 .word 0x02dc6c00 0000cfe8 : } return mcgoutclk; } uint32_t CLOCK_GetFllFreq(void) { cfe8: b508 push {r3, lr} uint8_t drs, dmx32; uint32_t freq; /* If FLL is not enabled currently, then return 0U. */ if ((MCG->C2 & MCG_C2_LP_MASK) || (MCG->S & MCG_S_PLLST_MASK)) cfea: 4b13 ldr r3, [pc, #76] ; (d038 ) cfec: 785b ldrb r3, [r3, #1] cfee: f013 0f02 tst.w r3, #2 cff2: d11f bne.n d034 cff4: 4b10 ldr r3, [pc, #64] ; (d038 ) cff6: 799b ldrb r3, [r3, #6] cff8: f013 0f20 tst.w r3, #32 cffc: d001 beq.n d002 { return 0U; cffe: 2000 movs r0, #0 d000: e019 b.n d036 if (kMCG_FllSrcExternal == MCG_S_IREFST_VAL) d002: 4b0d ldr r3, [pc, #52] ; (d038 ) d004: 799b ldrb r3, [r3, #6] d006: f013 0f10 tst.w r3, #16 d00a: d010 beq.n d02e return s_slowIrcFreq; d00c: 4b0b ldr r3, [pc, #44] ; (d03c ) d00e: 6818 ldr r0, [r3, #0] } /* Get FLL reference clock frequency. */ freq = CLOCK_GetFllRefClkFreq(); if (!freq) d010: b188 cbz r0, d036 { return freq; } drs = MCG_C4_DRST_DRS_VAL; d012: 4a09 ldr r2, [pc, #36] ; (d038 ) d014: 78d3 ldrb r3, [r2, #3] dmx32 = MCG_C4_DMX32_VAL; d016: 78d2 ldrb r2, [r2, #3] return freq * fllFactorTable[drs][dmx32]; d018: f3c3 1341 ubfx r3, r3, #5, #2 d01c: 005b lsls r3, r3, #1 d01e: eb03 13d2 add.w r3, r3, r2, lsr #7 d022: 4a07 ldr r2, [pc, #28] ; (d040 ) d024: f832 3013 ldrh.w r3, [r2, r3, lsl #1] d028: fb03 f000 mul.w r0, r3, r0 d02c: e003 b.n d036 return CLOCK_GetFllExtRefClkFreq(); d02e: f7ff fef1 bl ce14 d032: e7ed b.n d010 return 0U; d034: 2000 movs r0, #0 } d036: bd08 pop {r3, pc} d038: 40064000 .word 0x40064000 d03c: 20000148 .word 0x20000148 d040: 00012fd0 .word 0x00012fd0 0000d044 : uint32_t CLOCK_GetInternalRefClkFreq(void) { d044: b508 push {r3, lr} /* If MCGIRCLK is gated. */ if (!(MCG->C1 & MCG_C1_IRCLKEN_MASK)) d046: 4b05 ldr r3, [pc, #20] ; (d05c ) d048: 781b ldrb r3, [r3, #0] d04a: f013 0f02 tst.w r3, #2 d04e: d101 bne.n d054 { return 0U; d050: 2000 movs r0, #0 } return CLOCK_GetInternalRefClkSelectFreq(); } d052: bd08 pop {r3, pc} return CLOCK_GetInternalRefClkSelectFreq(); d054: f7ff fea6 bl cda4 d058: e7fb b.n d052 d05a: bf00 nop d05c: 40064000 .word 0x40064000 0000d060 : return 0U; } } uint32_t CLOCK_GetPll0Freq(void) { d060: b508 push {r3, lr} uint32_t mcgpll0clk; /* If PLL0 is not enabled, return 0. */ if (!(MCG->S & MCG_S_LOCK0_MASK)) d062: 4b0e ldr r3, [pc, #56] ; (d09c ) d064: 799b ldrb r3, [r3, #6] d066: f013 0f40 tst.w r3, #64 ; 0x40 d06a: d101 bne.n d070 { return 0U; d06c: 2000 movs r0, #0 mcgpll0clk /= (FSL_FEATURE_MCG_PLL_PRDIV_BASE + MCG_C5_PRDIV0_VAL); mcgpll0clk *= (FSL_FEATURE_MCG_PLL_VDIV_BASE + MCG_C6_VDIV0_VAL); return mcgpll0clk; } d06e: bd08 pop {r3, pc} return CLOCK_GetMcgExtClkFreq(); d070: f7ff feae bl cdd0 assert(mcgpll0clk); d074: 4603 mov r3, r0 d076: b168 cbz r0, d094 mcgpll0clk /= (FSL_FEATURE_MCG_PLL_PRDIV_BASE + MCG_C5_PRDIV0_VAL); d078: 4a08 ldr r2, [pc, #32] ; (d09c ) d07a: 7910 ldrb r0, [r2, #4] d07c: f000 001f and.w r0, r0, #31 d080: 3001 adds r0, #1 d082: fbb3 f3f0 udiv r3, r3, r0 mcgpll0clk *= (FSL_FEATURE_MCG_PLL_VDIV_BASE + MCG_C6_VDIV0_VAL); d086: 7950 ldrb r0, [r2, #5] d088: f000 001f and.w r0, r0, #31 d08c: 3018 adds r0, #24 d08e: fb03 f000 mul.w r0, r3, r0 return mcgpll0clk; d092: e7ec b.n d06e assert(mcgpll0clk); d094: 4802 ldr r0, [pc, #8] ; (d0a0 ) d096: f000 fca1 bl d9dc <__assertion_failed> d09a: bf00 nop d09c: 40064000 .word 0x40064000 d0a0: 00012f94 .word 0x00012f94 0000d0a4 : { d0a4: b508 push {r3, lr} switch (SIM_SOPT2_PLLFLLSEL_VAL) d0a6: 4a08 ldr r2, [pc, #32] ; (d0c8 ) d0a8: f241 0304 movw r3, #4100 ; 0x1004 d0ac: 58d3 ldr r3, [r2, r3] d0ae: f3c3 4300 ubfx r3, r3, #16, #1 d0b2: b113 cbz r3, d0ba d0b4: b923 cbnz r3, d0c0 freq = 0U; d0b6: 2000 movs r0, #0 } d0b8: bd08 pop {r3, pc} freq = CLOCK_GetFllFreq(); d0ba: f7ff ff95 bl cfe8 break; d0be: e7fb b.n d0b8 freq = CLOCK_GetPll0Freq(); d0c0: f7ff ffce bl d060 return freq; d0c4: e7f8 b.n d0b8 d0c6: bf00 nop d0c8: 40047000 .word 0x40047000 0000d0cc : { d0cc: b508 push {r3, lr} uint32_t clkst = MCG_S_CLKST_VAL; d0ce: 4b0c ldr r3, [pc, #48] ; (d100 ) d0d0: 799b ldrb r3, [r3, #6] d0d2: f3c3 0381 ubfx r3, r3, #2, #2 switch (clkst) d0d6: 2b03 cmp r3, #3 d0d8: d80f bhi.n d0fa d0da: e8df f003 tbb [pc, r3] d0de: 0805 .short 0x0805 d0e0: 020b .short 0x020b mcgoutclk = CLOCK_GetPll0Freq(); d0e2: f7ff ffbd bl d060 } d0e6: bd08 pop {r3, pc} mcgoutclk = CLOCK_GetFllFreq(); d0e8: f7ff ff7e bl cfe8 break; d0ec: e7fb b.n d0e6 mcgoutclk = CLOCK_GetInternalRefClkSelectFreq(); d0ee: f7ff fe59 bl cda4 break; d0f2: e7f8 b.n d0e6 mcgoutclk = CLOCK_GetMcgExtClkFreq(); d0f4: f7ff fe6c bl cdd0 break; d0f8: e7f5 b.n d0e6 mcgoutclk = 0U; d0fa: 2000 movs r0, #0 return mcgoutclk; d0fc: e7f3 b.n d0e6 d0fe: bf00 nop d100: 40064000 .word 0x40064000 0000d104 : { d104: b510 push {r4, lr} if (kMCG_FllSrcExternal == MCG_S_IREFST_VAL) d106: 4b0a ldr r3, [pc, #40] ; (d130 ) d108: 799b ldrb r3, [r3, #6] d10a: f013 0f10 tst.w r3, #16 d10e: d004 beq.n d11a return s_slowIrcFreq; d110: 4b08 ldr r3, [pc, #32] ; (d134 ) d112: 681c ldr r4, [r3, #0] if ((freq) && (freq <= (CLOCK_GetOutClkFreq() / 8U))) d114: b92c cbnz r4, d122 } d116: 4620 mov r0, r4 d118: bd10 pop {r4, pc} return CLOCK_GetFllExtRefClkFreq(); d11a: f7ff fe7b bl ce14 d11e: 4604 mov r4, r0 d120: e7f8 b.n d114 if ((freq) && (freq <= (CLOCK_GetOutClkFreq() / 8U))) d122: f7ff ffd3 bl d0cc d126: 08c0 lsrs r0, r0, #3 return 0U; d128: 42a0 cmp r0, r4 d12a: bf38 it cc d12c: 2400 movcc r4, #0 d12e: e7f2 b.n d116 d130: 40064000 .word 0x40064000 d134: 20000148 .word 0x20000148 0000d138 : { d138: b508 push {r3, lr} switch (clockName) d13a: 2813 cmp r0, #19 d13c: d80b bhi.n d156 d13e: e8df f000 tbb [pc, r0] d142: 0c0c .short 0x0c0c d144: 0a2f2317 .word 0x0a2f2317 d148: 0a413e3b .word 0x0a413e3b d14c: 4a47440a .word 0x4a47440a d150: 0a0a0a4d .word 0x0a0a0a4d d154: 500a .short 0x500a freq = 0U; d156: 2000 movs r0, #0 d158: e045 b.n d1e6 freq = CLOCK_GetOutClkFreq() / (SIM_CLKDIV1_OUTDIV1_VAL + 1); d15a: f7ff ffb7 bl d0cc d15e: 4a22 ldr r2, [pc, #136] ; (d1e8 ) d160: f241 0344 movw r3, #4164 ; 0x1044 d164: 58d3 ldr r3, [r2, r3] d166: 0f1b lsrs r3, r3, #28 d168: 3301 adds r3, #1 d16a: fbb0 f0f3 udiv r0, r0, r3 break; d16e: e03a b.n d1e6 freq = CLOCK_GetOutClkFreq() / (SIM_CLKDIV1_OUTDIV2_VAL + 1); d170: f7ff ffac bl d0cc d174: 4a1c ldr r2, [pc, #112] ; (d1e8 ) d176: f241 0344 movw r3, #4164 ; 0x1044 d17a: 58d3 ldr r3, [r2, r3] d17c: f3c3 6303 ubfx r3, r3, #24, #4 d180: 3301 adds r3, #1 d182: fbb0 f0f3 udiv r0, r0, r3 break; d186: e02e b.n d1e6 freq = CLOCK_GetOutClkFreq() / (SIM_CLKDIV1_OUTDIV3_VAL + 1); d188: f7ff ffa0 bl d0cc d18c: 4a16 ldr r2, [pc, #88] ; (d1e8 ) d18e: f241 0344 movw r3, #4164 ; 0x1044 d192: 58d3 ldr r3, [r2, r3] d194: f3c3 5303 ubfx r3, r3, #20, #4 d198: 3301 adds r3, #1 d19a: fbb0 f0f3 udiv r0, r0, r3 break; d19e: e022 b.n d1e6 freq = CLOCK_GetOutClkFreq() / (SIM_CLKDIV1_OUTDIV4_VAL + 1); d1a0: f7ff ff94 bl d0cc d1a4: 4a10 ldr r2, [pc, #64] ; (d1e8 ) d1a6: f241 0344 movw r3, #4164 ; 0x1044 d1aa: 58d3 ldr r3, [r2, r3] d1ac: f3c3 4303 ubfx r3, r3, #16, #4 d1b0: 3301 adds r3, #1 d1b2: fbb0 f0f3 udiv r0, r0, r3 break; d1b6: e016 b.n d1e6 freq = CLOCK_GetPllFllSelClkFreq(); d1b8: f7ff ff74 bl d0a4 break; d1bc: e013 b.n d1e6 freq = CLOCK_GetEr32kClkFreq(); d1be: f7ff fe6f bl cea0 break; d1c2: e010 b.n d1e6 freq = CLOCK_GetOsc0ErClkFreq(); d1c4: f7ff fe56 bl ce74 break; d1c8: e00d b.n d1e6 freq = CLOCK_GetFixedFreqClkFreq(); d1ca: f7ff ff9b bl d104 break; d1ce: e00a b.n d1e6 freq = CLOCK_GetInternalRefClkFreq(); d1d0: f7ff ff38 bl d044 break; d1d4: e007 b.n d1e6 freq = CLOCK_GetFllFreq(); d1d6: f7ff ff07 bl cfe8 break; d1da: e004 b.n d1e6 freq = CLOCK_GetPll0Freq(); d1dc: f7ff ff40 bl d060 break; d1e0: e001 b.n d1e6 freq = LPO_CLK_FREQ; d1e2: f44f 707a mov.w r0, #1000 ; 0x3e8 } d1e6: bd08 pop {r3, pc} d1e8: 40047000 .word 0x40047000 0000d1ec : status_t CLOCK_SetExternalRefClkConfig(mcg_oscsel_t oscsel) { d1ec: b410 push {r4} { return kStatus_MCG_SourceUsed; } #endif /* MCG_CONFIG_CHECK_PARAM */ if (MCG_C7_OSCSEL_VAL != oscsel) d1ee: 490b ldr r1, [pc, #44] ; (d21c ) d1f0: 7b0a ldrb r2, [r1, #12] else { needDelay = false; } MCG->C7 = (MCG->C7 & ~MCG_C7_OSCSEL_MASK) | MCG_C7_OSCSEL(oscsel); d1f2: 7b0b ldrb r3, [r1, #12] d1f4: f003 03fe and.w r3, r3, #254 ; 0xfe d1f8: f000 0401 and.w r4, r0, #1 d1fc: 4323 orrs r3, r4 d1fe: 730b strb r3, [r1, #12] if (needDelay) d200: f002 0301 and.w r3, r2, #1 d204: 4283 cmp r3, r0 d206: d004 beq.n d212 d208: f240 53dc movw r3, #1500 ; 0x5dc { /* ERR009878 Delay at least 50 micro-seconds for external clock change valid. */ i = 1500U; while (i--) { __NOP(); d20c: bf00 nop while (i--) d20e: 3b01 subs r3, #1 d210: d1fc bne.n d20c } } return kStatus_Success; } d212: 2000 movs r0, #0 d214: f85d 4b04 ldr.w r4, [sp], #4 d218: 4770 bx lr d21a: bf00 nop d21c: 40064000 .word 0x40064000 0000d220 : status_t CLOCK_SetInternalRefClkConfig(uint8_t enableMode, mcg_irc_mode_t ircs, uint8_t fcrdiv) { d220: b430 push {r4, r5} uint32_t mcgOutClkState = MCG_S_CLKST_VAL; d222: 4b21 ldr r3, [pc, #132] ; (d2a8 ) d224: 799c ldrb r4, [r3, #6] d226: f3c4 0481 ubfx r4, r4, #2, #2 mcg_irc_mode_t curIrcs = (mcg_irc_mode_t)MCG_S_IRCST_VAL; d22a: 799d ldrb r5, [r3, #6] uint8_t curFcrdiv = MCG_SC_FCRDIV_VAL; d22c: 7a1b ldrb r3, [r3, #8] } } #endif /* If need to update the FCRDIV. */ if (fcrdiv != curFcrdiv) d22e: f3c3 0342 ubfx r3, r3, #1, #3 d232: 4293 cmp r3, r2 d234: d01c beq.n d270 d236: b2ed uxtb r5, r5 { /* If fast IRC is in use currently, change to slow IRC. */ if ((kMCG_IrcFast == curIrcs) && ((mcgOutClkState == kMCG_ClkOutStatInt) || (MCG->C1 & MCG_C1_IRCLKEN_MASK))) d238: f015 0f01 tst.w r5, #1 d23c: d00f beq.n d25e d23e: 2c01 cmp r4, #1 d240: d004 beq.n d24c d242: 4b19 ldr r3, [pc, #100] ; (d2a8 ) d244: 781b ldrb r3, [r3, #0] d246: f013 0f02 tst.w r3, #2 d24a: d008 beq.n d25e { MCG->C2 = ((MCG->C2 & ~MCG_C2_IRCS_MASK) | (MCG_C2_IRCS(kMCG_IrcSlow))); d24c: 4d16 ldr r5, [pc, #88] ; (d2a8 ) d24e: 786b ldrb r3, [r5, #1] d250: f003 03fe and.w r3, r3, #254 ; 0xfe d254: 706b strb r3, [r5, #1] while (MCG_S_IRCST_VAL != kMCG_IrcSlow) d256: 79ab ldrb r3, [r5, #6] d258: f013 0f01 tst.w r3, #1 d25c: d1fb bne.n d256 { } } /* Update FCRDIV. */ MCG->SC = (MCG->SC & ~(MCG_SC_FCRDIV_MASK | MCG_SC_ATMF_MASK | MCG_SC_LOCS0_MASK)) | MCG_SC_FCRDIV(fcrdiv); d25e: 4d12 ldr r5, [pc, #72] ; (d2a8 ) d260: 7a2b ldrb r3, [r5, #8] d262: 0052 lsls r2, r2, #1 d264: f002 020e and.w r2, r2, #14 d268: f003 03d0 and.w r3, r3, #208 ; 0xd0 d26c: 431a orrs r2, r3 d26e: 722a strb r2, [r5, #8] } /* Set internal reference clock selection. */ MCG->C2 = (MCG->C2 & ~MCG_C2_IRCS_MASK) | (MCG_C2_IRCS(ircs)); d270: 4a0d ldr r2, [pc, #52] ; (d2a8 ) d272: 7853 ldrb r3, [r2, #1] d274: f003 03fe and.w r3, r3, #254 ; 0xfe d278: f001 0501 and.w r5, r1, #1 d27c: 432b orrs r3, r5 d27e: 7053 strb r3, [r2, #1] MCG->C1 = (MCG->C1 & ~(MCG_C1_IRCLKEN_MASK | MCG_C1_IREFSTEN_MASK)) | (uint8_t)enableMode; d280: 7813 ldrb r3, [r2, #0] d282: f003 03fc and.w r3, r3, #252 ; 0xfc d286: 4303 orrs r3, r0 d288: 7013 strb r3, [r2, #0] /* If MCGIRCLK is used, need to wait for MCG_S_IRCST. */ if ((mcgOutClkState == kMCG_ClkOutStatInt) || (enableMode & kMCG_IrclkEnable)) d28a: 2c01 cmp r4, #1 d28c: d002 beq.n d294 d28e: f010 0f02 tst.w r0, #2 d292: d005 beq.n d2a0 { while (MCG_S_IRCST_VAL != ircs) d294: 4a04 ldr r2, [pc, #16] ; (d2a8 ) d296: 7993 ldrb r3, [r2, #6] d298: f003 0301 and.w r3, r3, #1 d29c: 428b cmp r3, r1 d29e: d1fa bne.n d296 { } } return kStatus_Success; } d2a0: 2000 movs r0, #0 d2a2: bc30 pop {r4, r5} d2a4: 4770 bx lr d2a6: bf00 nop d2a8: 40064000 .word 0x40064000 0000d2ac : return 0U; } } void CLOCK_EnablePll0(mcg_pll_config_t const *config) { d2ac: b508 push {r3, lr} assert(config); d2ae: b1c8 cbz r0, d2e4 d2b0: 4601 mov r1, r0 uint8_t mcg_c5 = 0U; mcg_c5 |= MCG_C5_PRDIV0(config->prdiv); d2b2: 7842 ldrb r2, [r0, #1] d2b4: f002 021f and.w r2, r2, #31 MCG->C5 = mcg_c5; /* Disable the PLL first. */ d2b8: 4b0c ldr r3, [pc, #48] ; (d2ec ) d2ba: 711a strb r2, [r3, #4] MCG->C6 = (MCG->C6 & ~MCG_C6_VDIV0_MASK) | MCG_C6_VDIV0(config->vdiv); d2bc: 7958 ldrb r0, [r3, #5] d2be: 788a ldrb r2, [r1, #2] d2c0: f002 021f and.w r2, r2, #31 d2c4: f000 00e0 and.w r0, r0, #224 ; 0xe0 d2c8: 4302 orrs r2, r0 d2ca: 715a strb r2, [r3, #5] /* Set enable mode. */ MCG->C5 |= ((uint32_t)kMCG_PllEnableIndependent | (uint32_t)config->enableMode); d2cc: 791a ldrb r2, [r3, #4] d2ce: 7809 ldrb r1, [r1, #0] d2d0: 430a orrs r2, r1 d2d2: f042 0240 orr.w r2, r2, #64 ; 0x40 d2d6: 711a strb r2, [r3, #4] /* Wait for PLL lock. */ while (!(MCG->S & MCG_S_LOCK0_MASK)) d2d8: 461a mov r2, r3 d2da: 7993 ldrb r3, [r2, #6] d2dc: f013 0f40 tst.w r3, #64 ; 0x40 d2e0: d0fb beq.n d2da { } } d2e2: bd08 pop {r3, pc} assert(config); d2e4: 4802 ldr r0, [pc, #8] ; (d2f0 ) d2e6: f000 fb79 bl d9dc <__assertion_failed> d2ea: bf00 nop d2ec: 40064000 .word 0x40064000 d2f0: 00012ef8 .word 0x00012ef8 0000d2f4 : MCG->S = MCG_S_LOLS0_MASK; } } void CLOCK_InitOsc0(osc_config_t const *config) { d2f4: b410 push {r4} uint8_t range = CLOCK_GetOscRangeFromFreq(config->freq); d2f6: 6803 ldr r3, [r0, #0] if (freq <= 39063U) d2f8: f649 0297 movw r2, #39063 ; 0x9897 d2fc: 4293 cmp r3, r2 d2fe: d924 bls.n d34a range = 2U; d300: 4c15 ldr r4, [pc, #84] ; (d358 ) d302: 42a3 cmp r3, r4 d304: bf94 ite ls d306: 2401 movls r4, #1 d308: 2402 movhi r4, #2 OSC_SetCapLoad(OSC, kOSC_Cap2P | kOSC_Cap8P); @endcode */ static inline void OSC_SetCapLoad(OSC_Type *base, uint8_t capLoad) { uint8_t reg = base->CR; d30a: 4914 ldr r1, [pc, #80] ; (d35c ) d30c: 780a ldrb r2, [r1, #0] reg &= ~(OSC_CR_SC2P_MASK | OSC_CR_SC4P_MASK | OSC_CR_SC8P_MASK | OSC_CR_SC16P_MASK); d30e: f002 02f0 and.w r2, r2, #240 ; 0xf0 reg |= capLoad; d312: 7903 ldrb r3, [r0, #4] d314: 431a orrs r2, r3 base->CR = reg; d316: 700a strb r2, [r1, #0] uint8_t reg = base->CR; d318: 780a ldrb r2, [r1, #0] reg &= ~(OSC_CR_ERCLKEN_MASK | OSC_CR_EREFSTEN_MASK); d31a: f002 025f and.w r2, r2, #95 ; 0x5f reg |= config->enableMode; d31e: 7983 ldrb r3, [r0, #6] d320: 431a orrs r2, r3 base->CR = reg; d322: 700a strb r2, [r1, #0] OSC_SetCapLoad(OSC0, config->capLoad); OSC_SetExtRefClkConfig(OSC0, &config->oscerConfig); MCG->C2 = ((MCG->C2 & ~OSC_MODE_MASK) | MCG_C2_RANGE(range) | (uint8_t)config->workMode); d324: 4a0e ldr r2, [pc, #56] ; (d360 ) d326: 7853 ldrb r3, [r2, #1] d328: f003 03c3 and.w r3, r3, #195 ; 0xc3 d32c: 7941 ldrb r1, [r0, #5] d32e: 430b orrs r3, r1 d330: ea43 1304 orr.w r3, r3, r4, lsl #4 d334: 7053 strb r3, [r2, #1] if ((kOSC_ModeExt != config->workMode) && (OSC0->CR & OSC_CR_ERCLKEN_MASK)) d336: 7943 ldrb r3, [r0, #5] d338: b123 cbz r3, d344 d33a: 4b08 ldr r3, [pc, #32] ; (d35c ) d33c: 781b ldrb r3, [r3, #0] d33e: f013 0f80 tst.w r3, #128 ; 0x80 d342: d104 bne.n d34e /* Wait for stable. */ while (!(MCG->S & MCG_S_OSCINIT0_MASK)) { } } } d344: f85d 4b04 ldr.w r4, [sp], #4 d348: 4770 bx lr range = 0U; d34a: 2400 movs r4, #0 d34c: e7dd b.n d30a while (!(MCG->S & MCG_S_OSCINIT0_MASK)) d34e: 7993 ldrb r3, [r2, #6] d350: f013 0f02 tst.w r3, #2 d354: d0fb beq.n d34e d356: e7f5 b.n d344 d358: 007a1200 .word 0x007a1200 d35c: 40065000 .word 0x40065000 d360: 40064000 .word 0x40064000 0000d364 : return kStatus_Success; } status_t CLOCK_SetPbeMode(mcg_pll_clk_select_t pllcs, mcg_pll_config_t const *config) { d364: b508 push {r3, lr} assert(config); d366: b331 cbz r1, d3b6 d368: 4608 mov r0, r1 /* This function is designed to change MCG to PBE mode from PEE/BLPE/FBE, but with this workflow, the source mode could be all modes except PEI/PBI. */ MCG->C2 &= ~MCG_C2_LP_MASK; /* Disable lowpower. */ d36a: 4a14 ldr r2, [pc, #80] ; (d3bc ) d36c: 7853 ldrb r3, [r2, #1] d36e: f003 03fd and.w r3, r3, #253 ; 0xfd d372: 7053 strb r3, [r2, #1] /* Change to use external clock first. */ MCG->C1 = ((MCG->C1 & ~(MCG_C1_CLKS_MASK | MCG_C1_IREFS_MASK)) | MCG_C1_CLKS(kMCG_ClkOutSrcExternal)); d374: 7813 ldrb r3, [r2, #0] d376: f003 033b and.w r3, r3, #59 ; 0x3b d37a: f043 0380 orr.w r3, r3, #128 ; 0x80 d37e: 7013 strb r3, [r2, #0] /* Wait for CLKST clock status bits to show clock source is ext ref clk */ while ((MCG->S & (MCG_S_IREFST_MASK | MCG_S_CLKST_MASK)) != d380: 7993 ldrb r3, [r2, #6] d382: f003 031c and.w r3, r3, #28 d386: 2b08 cmp r3, #8 d388: d1fa bne.n d380 (MCG_S_IREFST(kMCG_FllSrcExternal) | MCG_S_CLKST(kMCG_ClkOutStatExt))) { } /* Disable PLL first, then configure PLL. */ MCG->C6 &= ~MCG_C6_PLLS_MASK; d38a: 4a0c ldr r2, [pc, #48] ; (d3bc ) d38c: 7953 ldrb r3, [r2, #5] d38e: f003 03bf and.w r3, r3, #191 ; 0xbf d392: 7153 strb r3, [r2, #5] while (MCG->S & MCG_S_PLLST_MASK) d394: 7993 ldrb r3, [r2, #6] d396: f013 0f20 tst.w r3, #32 d39a: d1fb bne.n d394 { } /* Configure the PLL. */ { CLOCK_EnablePll0(config); d39c: f7ff ff86 bl d2ac } /* Change to PLL mode. */ MCG->C6 |= MCG_C6_PLLS_MASK; d3a0: 4a06 ldr r2, [pc, #24] ; (d3bc ) d3a2: 7953 ldrb r3, [r2, #5] d3a4: f043 0340 orr.w r3, r3, #64 ; 0x40 d3a8: 7153 strb r3, [r2, #5] /* Wait for PLL mode changed. */ while (!(MCG->S & MCG_S_PLLST_MASK)) d3aa: 7993 ldrb r3, [r2, #6] d3ac: f013 0f20 tst.w r3, #32 d3b0: d0fb beq.n d3aa { } return kStatus_Success; } d3b2: 2000 movs r0, #0 d3b4: bd08 pop {r3, pc} assert(config); d3b6: 4802 ldr r0, [pc, #8] ; (d3c0 ) d3b8: f000 fb10 bl d9dc <__assertion_failed> d3bc: 40064000 .word 0x40064000 d3c0: 00012fb4 .word 0x00012fb4 0000d3c4 : return kStatus_Success; } status_t CLOCK_BootToPeeMode(mcg_oscsel_t oscsel, mcg_pll_clk_select_t pllcs, mcg_pll_config_t const *config) { d3c4: b538 push {r3, r4, r5, lr} assert(config); d3c6: b19a cbz r2, d3f0 d3c8: 460c mov r4, r1 d3ca: 4615 mov r5, r2 CLOCK_SetExternalRefClkConfig(oscsel); d3cc: f7ff ff0e bl d1ec CLOCK_SetPbeMode(pllcs, config); d3d0: 4629 mov r1, r5 d3d2: 4620 mov r0, r4 d3d4: f7ff ffc6 bl d364 /* Change to use PLL output clock. */ MCG->C1 = (MCG->C1 & ~MCG_C1_CLKS_MASK) | MCG_C1_CLKS(kMCG_ClkOutSrcOut); d3d8: 4a07 ldr r2, [pc, #28] ; (d3f8 ) d3da: 7813 ldrb r3, [r2, #0] d3dc: f003 033f and.w r3, r3, #63 ; 0x3f d3e0: 7013 strb r3, [r2, #0] while (MCG_S_CLKST_VAL != kMCG_ClkOutStatPll) d3e2: 7993 ldrb r3, [r2, #6] d3e4: f3c3 0381 ubfx r3, r3, #2, #2 d3e8: 2b03 cmp r3, #3 d3ea: d1fa bne.n d3e2 { } return kStatus_Success; } d3ec: 2000 movs r0, #0 d3ee: bd38 pop {r3, r4, r5, pc} assert(config); d3f0: 4802 ldr r0, [pc, #8] ; (d3fc ) d3f2: f000 faf3 bl d9dc <__assertion_failed> d3f6: bf00 nop d3f8: 40064000 .word 0x40064000 d3fc: 00012edc .word 0x00012edc 0000d400 : handle->errorCount++; } } static void DSPI_CommonIRQHandler(SPI_Type *base, void *param) { d400: b508 push {r3, lr} * @param base DSPI peripheral address. * @return Returns true if the module is in master mode or false if the module is in slave mode. */ static inline bool DSPI_IsMaster(SPI_Type *base) { return (bool)((base->MCR) & SPI_MCR_MSTR_MASK); d402: 6803 ldr r3, [r0, #0] if (DSPI_IsMaster(base)) d404: 2b00 cmp r3, #0 { s_dspiMasterIsr(base, (dspi_master_handle_t *)param); d406: bfb4 ite lt d408: 4b03 ldrlt r3, [pc, #12] ; (d418 ) } else { s_dspiSlaveIsr(base, (dspi_slave_handle_t *)param); d40a: 4b04 ldrge r3, [pc, #16] ; (d41c ) d40c: 681b ldr r3, [r3, #0] d40e: 4798 blx r3 d410: f3bf 8f4f dsb sy /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt */ #if defined __CORTEX_M && (__CORTEX_M == 4U) __DSB(); #endif } d414: bd08 pop {r3, pc} d416: bf00 nop d418: 20001214 .word 0x20001214 d41c: 20001218 .word 0x20001218 0000d420 : { d420: b508 push {r3, lr} if (s_dspiBases[instance] == base) d422: 4b0a ldr r3, [pc, #40] ; (d44c ) d424: 4298 cmp r0, r3 d426: d00e beq.n d446 d428: f503 5380 add.w r3, r3, #4096 ; 0x1000 d42c: 4298 cmp r0, r3 d42e: d008 beq.n d442 d430: f503 23fe add.w r3, r3, #520192 ; 0x7f000 d434: 4298 cmp r0, r3 for (instance = 0; instance < ARRAY_SIZE(s_dspiBases); instance++) d436: bf08 it eq d438: 2002 moveq r0, #2 if (s_dspiBases[instance] == base) d43a: d005 beq.n d448 assert(instance < ARRAY_SIZE(s_dspiBases)); d43c: 4804 ldr r0, [pc, #16] ; (d450 ) d43e: f000 facd bl d9dc <__assertion_failed> for (instance = 0; instance < ARRAY_SIZE(s_dspiBases); instance++) d442: 2001 movs r0, #1 d444: e000 b.n d448 d446: 2000 movs r0, #0 } d448: bd08 pop {r3, pc} d44a: bf00 nop d44c: 4002c000 .word 0x4002c000 d450: 00012fe0 .word 0x00012fe0 0000d454 : { d454: b510 push {r4, lr} d456: 460c mov r4, r1 uint32_t instance = DSPI_GetInstance(base); d458: f7ff ffe2 bl d420 s_dummyData[instance] = dummyData; d45c: 4b01 ldr r3, [pc, #4] ; (d464 ) d45e: 541c strb r4, [r3, r0] } d460: bd10 pop {r4, pc} d462: bf00 nop d464: 2000121c .word 0x2000121c 0000d468 : { d468: b508 push {r3, lr} assert(masterConfig); d46a: b1b8 cbz r0, d49c masterConfig->whichCtar = kDSPI_Ctar0; d46c: 2200 movs r2, #0 d46e: 7002 strb r2, [r0, #0] masterConfig->ctarConfig.baudRate = 500000; d470: 490c ldr r1, [pc, #48] ; (d4a4 ) d472: 6041 str r1, [r0, #4] masterConfig->ctarConfig.bitsPerFrame = 8; d474: 2108 movs r1, #8 d476: 6081 str r1, [r0, #8] masterConfig->ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh; d478: 7302 strb r2, [r0, #12] masterConfig->ctarConfig.cpha = kDSPI_ClockPhaseFirstEdge; d47a: 7342 strb r2, [r0, #13] masterConfig->ctarConfig.direction = kDSPI_MsbFirst; d47c: 7382 strb r2, [r0, #14] masterConfig->ctarConfig.pcsToSckDelayInNanoSec = 1000; d47e: f44f 717a mov.w r1, #1000 ; 0x3e8 d482: 6101 str r1, [r0, #16] masterConfig->ctarConfig.lastSckToPcsDelayInNanoSec = 1000; d484: 6141 str r1, [r0, #20] masterConfig->ctarConfig.betweenTransferDelayInNanoSec = 1000; d486: 6181 str r1, [r0, #24] masterConfig->whichPcs = kDSPI_Pcs0; d488: 2101 movs r1, #1 d48a: 7701 strb r1, [r0, #28] masterConfig->pcsActiveHighOrLow = kDSPI_PcsActiveLow; d48c: 7741 strb r1, [r0, #29] masterConfig->enableContinuousSCK = false; d48e: 7782 strb r2, [r0, #30] masterConfig->enableRxFifoOverWrite = false; d490: 77c2 strb r2, [r0, #31] masterConfig->enableModifiedTimingFormat = false; d492: f880 2020 strb.w r2, [r0, #32] masterConfig->samplePoint = kDSPI_SckToSin0Clock; d496: f880 2021 strb.w r2, [r0, #33] ; 0x21 } d49a: bd08 pop {r3, pc} assert(masterConfig); d49c: 4802 ldr r0, [pc, #8] ; (d4a8 ) d49e: f000 fa9d bl d9dc <__assertion_failed> d4a2: bf00 nop d4a4: 0007a120 .word 0x0007a120 d4a8: 00013018 .word 0x00013018 0000d4ac : { d4ac: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} d4b0: b085 sub sp, #20 d4b2: 9103 str r1, [sp, #12] d4b4: 6801 ldr r1, [r0, #0] if (!DSPI_IsMaster(base)) d4b6: 2900 cmp r1, #0 d4b8: da4c bge.n d554 realBaudrate = ((srcClock_Hz * dbr) / (s_baudratePrescaler[prescaler] * (s_baudrateScaler[scaler]))); d4ba: ea4f 0843 mov.w r8, r3, lsl #1 for (prescaler = 0; (prescaler < 4) && min_diff; prescaler++) d4be: 2700 movs r7, #0 min_diff = 0xFFFFFFFFU; d4c0: f04f 35ff mov.w r5, #4294967295 ; 0xffffffff bestBaudrate = 0; /* required to avoid compilation warning */ d4c4: 9701 str r7, [sp, #4] bestDbr = 1; d4c6: f04f 0901 mov.w r9, #1 bestScaler = 0; d4ca: 9702 str r7, [sp, #8] for (scaler = 0; (scaler < 16) && min_diff; scaler++) d4cc: 463c mov r4, r7 bestPrescaler = 0; d4ce: 46ba mov sl, r7 realBaudrate = ((srcClock_Hz * dbr) / (s_baudratePrescaler[prescaler] * (s_baudrateScaler[scaler]))); d4d0: f8df e0ac ldr.w lr, [pc, #172] ; d580 d4d4: f8df c0ac ldr.w ip, [pc, #172] ; d584 d4d8: e010 b.n d4fc d4da: fbb8 f1f1 udiv r1, r8, r1 if (baudrate >= realBaudrate) d4de: 428a cmp r2, r1 d4e0: d308 bcc.n d4f4 diff = baudrate - realBaudrate; d4e2: 1a56 subs r6, r2, r1 if (min_diff > diff) d4e4: 42ae cmp r6, r5 d4e6: d205 bcs.n d4f4 diff = baudrate - realBaudrate; d4e8: 4635 mov r5, r6 realBaudrate = ((srcClock_Hz * dbr) / (s_baudratePrescaler[prescaler] * (s_baudrateScaler[scaler]))); d4ea: 9101 str r1, [sp, #4] if (min_diff > diff) d4ec: 9402 str r4, [sp, #8] d4ee: 46ba mov sl, r7 for (dbr = 1; (dbr < 3) && min_diff; dbr++) d4f0: f04f 0902 mov.w r9, #2 for (scaler = 0; (scaler < 16) && min_diff; scaler++) d4f4: 3401 adds r4, #1 d4f6: 2c0f cmp r4, #15 d4f8: d838 bhi.n d56c d4fa: b1c5 cbz r5, d52e for (dbr = 1; (dbr < 3) && min_diff; dbr++) d4fc: b395 cbz r5, d564 realBaudrate = ((srcClock_Hz * dbr) / (s_baudratePrescaler[prescaler] * (s_baudrateScaler[scaler]))); d4fe: f85e 6027 ldr.w r6, [lr, r7, lsl #2] d502: f85c 1024 ldr.w r1, [ip, r4, lsl #2] d506: fb01 f106 mul.w r1, r1, r6 d50a: fbb3 f6f1 udiv r6, r3, r1 if (baudrate >= realBaudrate) d50e: 4296 cmp r6, r2 d510: d8e3 bhi.n d4da diff = baudrate - realBaudrate; d512: eba2 0b06 sub.w fp, r2, r6 if (min_diff > diff) d516: 45ab cmp fp, r5 d518: d2df bcs.n d4da for (dbr = 1; (dbr < 3) && min_diff; dbr++) d51a: f1bb 0f00 cmp.w fp, #0 d51e: d01c beq.n d55a d520: 9402 str r4, [sp, #8] realBaudrate = ((srcClock_Hz * dbr) / (s_baudratePrescaler[prescaler] * (s_baudrateScaler[scaler]))); d522: 9601 str r6, [sp, #4] diff = baudrate - realBaudrate; d524: 465d mov r5, fp for (dbr = 1; (dbr < 3) && min_diff; dbr++) d526: 46ba mov sl, r7 d528: f04f 0901 mov.w r9, #1 d52c: e7d5 b.n d4da temp = base->CTAR[whichCtar] & ~(SPI_CTAR_DBR_MASK | SPI_CTAR_PBR_MASK | SPI_CTAR_BR_MASK); d52e: 9b03 ldr r3, [sp, #12] d530: eb00 0083 add.w r0, r0, r3, lsl #2 d534: 68c2 ldr r2, [r0, #12] d536: 4b11 ldr r3, [pc, #68] ; (d57c ) d538: 4013 ands r3, r2 base->CTAR[whichCtar] = temp | ((bestDbr - 1) << SPI_CTAR_DBR_SHIFT) | (bestPrescaler << SPI_CTAR_PBR_SHIFT) | d53a: 9a02 ldr r2, [sp, #8] d53c: 4313 orrs r3, r2 d53e: ea43 430a orr.w r3, r3, sl, lsl #16 d542: f109 39ff add.w r9, r9, #4294967295 ; 0xffffffff d546: ea43 73c9 orr.w r3, r3, r9, lsl #31 d54a: 60c3 str r3, [r0, #12] } d54c: 9801 ldr r0, [sp, #4] d54e: b005 add sp, #20 d550: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} return 0; d554: 2300 movs r3, #0 d556: 9301 str r3, [sp, #4] d558: e7f8 b.n d54c realBaudrate = ((srcClock_Hz * dbr) / (s_baudratePrescaler[prescaler] * (s_baudrateScaler[scaler]))); d55a: 9601 str r6, [sp, #4] for (dbr = 1; (dbr < 3) && min_diff; dbr++) d55c: 9402 str r4, [sp, #8] d55e: 46ba mov sl, r7 d560: f04f 0901 mov.w r9, #1 for (scaler = 0; (scaler < 16) && min_diff; scaler++) d564: 3401 adds r4, #1 d566: 2c0f cmp r4, #15 d568: d9e1 bls.n d52e d56a: 2500 movs r5, #0 for (prescaler = 0; (prescaler < 4) && min_diff; prescaler++) d56c: 3701 adds r7, #1 d56e: 2f03 cmp r7, #3 d570: d8dd bhi.n d52e d572: 2d00 cmp r5, #0 d574: d0db beq.n d52e for (scaler = 0; (scaler < 16) && min_diff; scaler++) d576: 2400 movs r4, #0 d578: e7c0 b.n d4fc d57a: bf00 nop d57c: 7ffcfff0 .word 0x7ffcfff0 d580: 000130b8 .word 0x000130b8 d584: 000130c8 .word 0x000130c8 0000d588 : { d588: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} d58c: b085 sub sp, #20 d58e: 9f0e ldr r7, [sp, #56] ; 0x38 d590: 6804 ldr r4, [r0, #0] if (!DSPI_IsMaster(base)) d592: 2c00 cmp r4, #0 d594: da4c bge.n d630 d596: 4693 mov fp, r2 d598: 9003 str r0, [sp, #12] bestDelay = (((1000000000U * 4) / srcClock_Hz) * s_delayPrescaler[bestPrescaler] * s_delayScaler[bestScaler]) / 4; d59a: 4a27 ldr r2, [pc, #156] ; (d638 ) d59c: fbb2 fef3 udiv lr, r2, r3 d5a0: ebce 08ce rsb r8, lr, lr, lsl #3 d5a4: ea4f 4808 mov.w r8, r8, lsl #16 d5a8: ea4f 0898 mov.w r8, r8, lsr #2 initialDelayNanoSec = 1000000000U / srcClock_Hz * 2; d5ac: 4c23 ldr r4, [pc, #140] ; (d63c ) d5ae: fbb4 f4f3 udiv r4, r4, r3 d5b2: 0064 lsls r4, r4, #1 if (initialDelayNanoSec >= delayTimeInNanoSec) d5b4: 42bc cmp r4, r7 d5b6: d20b bcs.n d5d0 for (prescaler = 0; (prescaler < 4) && min_diff; prescaler++) d5b8: f04f 0c00 mov.w ip, #0 min_diff = 0xFFFFFFFFU; d5bc: f04f 36ff mov.w r6, #4294967295 ; 0xffffffff bestScaler = 0xF; d5c0: 230f movs r3, #15 for (scaler = 0; (scaler < 16) && min_diff; scaler++) d5c2: 4664 mov r4, ip bestPrescaler = 0x3; d5c4: 2203 movs r2, #3 realDelay = ((4000000000U / srcClock_Hz) * s_delayPrescaler[prescaler] * s_delayScaler[scaler]) / 4; d5c6: f8df a078 ldr.w sl, [pc, #120] ; d640 d5ca: f8df 9078 ldr.w r9, [pc, #120] ; d644 d5ce: e00b b.n d5e8 DSPI_MasterSetDelayScaler(base, whichCtar, 0, 0, whichDelay); d5d0: f8cd b000 str.w fp, [sp] d5d4: 2300 movs r3, #0 d5d6: 461a mov r2, r3 d5d8: f004 fbd1 bl 11d7e return initialDelayNanoSec; d5dc: 46a0 mov r8, r4 d5de: e023 b.n d628 for (scaler = 0; (scaler < 16) && min_diff; scaler++) d5e0: 3401 adds r4, #1 d5e2: 2c0f cmp r4, #15 d5e4: d813 bhi.n d60e d5e6: b1d6 cbz r6, d61e realDelay = ((4000000000U / srcClock_Hz) * s_delayPrescaler[prescaler] * s_delayScaler[scaler]) / 4; d5e8: f85a 502c ldr.w r5, [sl, ip, lsl #2] d5ec: f859 0024 ldr.w r0, [r9, r4, lsl #2] d5f0: fb00 f005 mul.w r0, r0, r5 d5f4: fb0e f000 mul.w r0, lr, r0 d5f8: 0880 lsrs r0, r0, #2 if (realDelay >= delayTimeInNanoSec) d5fa: 4287 cmp r7, r0 d5fc: d8f0 bhi.n d5e0 diff = realDelay - delayTimeInNanoSec; d5fe: 1bc5 subs r5, r0, r7 if (min_diff > diff) d600: 42b5 cmp r5, r6 d602: d2ed bcs.n d5e0 min_diff = diff; d604: 462e mov r6, r5 bestDelay = realDelay; d606: 4680 mov r8, r0 if (min_diff > diff) d608: 4623 mov r3, r4 d60a: 4662 mov r2, ip d60c: e7e8 b.n d5e0 for (prescaler = 0; (prescaler < 4) && min_diff; prescaler++) d60e: f10c 0c01 add.w ip, ip, #1 d612: f1bc 0f03 cmp.w ip, #3 d616: d802 bhi.n d61e d618: b10e cbz r6, d61e for (scaler = 0; (scaler < 16) && min_diff; scaler++) d61a: 2400 movs r4, #0 d61c: e7e4 b.n d5e8 DSPI_MasterSetDelayScaler(base, whichCtar, bestPrescaler, bestScaler, whichDelay); d61e: f8cd b000 str.w fp, [sp] d622: 9803 ldr r0, [sp, #12] d624: f004 fbab bl 11d7e } d628: 4640 mov r0, r8 d62a: b005 add sp, #20 d62c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} return 0; d630: f04f 0800 mov.w r8, #0 d634: e7f8 b.n d628 d636: bf00 nop d638: ee6b2800 .word 0xee6b2800 d63c: 3b9aca00 .word 0x3b9aca00 d640: 00013108 .word 0x00013108 d644: 00013118 .word 0x00013118 0000d648 : { d648: b570 push {r4, r5, r6, lr} d64a: b082 sub sp, #8 assert(masterConfig); d64c: 2900 cmp r1, #0 d64e: f000 8089 beq.w d764 d652: 4604 mov r4, r0 d654: 4616 mov r6, r2 d656: 460d mov r5, r1 CLOCK_EnableClock(s_dspiClock[DSPI_GetInstance(base)]); d658: f7ff fee2 bl d420 d65c: 4b44 ldr r3, [pc, #272] ; (d770 ) d65e: f853 1020 ldr.w r1, [r3, r0, lsl #2] uint32_t regAddr = SIM_BASE + CLK_GATE_ABSTRACT_REG_OFFSET((uint32_t)name); d662: 0c0b lsrs r3, r1, #16 d664: f103 4380 add.w r3, r3, #1073741824 ; 0x40000000 d668: f503 238e add.w r3, r3, #290816 ; 0x47000 (*(volatile uint32_t *)regAddr) |= (1U << CLK_GATE_ABSTRACT_BITS_SHIFT((uint32_t)name)); d66c: 6818 ldr r0, [r3, #0] d66e: b289 uxth r1, r1 d670: 2201 movs r2, #1 d672: 408a lsls r2, r1 d674: 4302 orrs r2, r0 d676: 601a str r2, [r3, #0] base->MCR &= ~SPI_MCR_MDIS_MASK; d678: 6823 ldr r3, [r4, #0] d67a: f423 4380 bic.w r3, r3, #16384 ; 0x4000 d67e: 6023 str r3, [r4, #0] * * @param base DSPI peripheral address. */ static inline void DSPI_StopTransfer(SPI_Type *base) { base->MCR |= SPI_MCR_HALT_MASK; d680: 6823 ldr r3, [r4, #0] d682: f043 0301 orr.w r3, r3, #1 d686: 6023 str r3, [r4, #0] base->MCR = (base->MCR & (~SPI_MCR_MSTR_MASK)) | SPI_MCR_MSTR(mode); d688: 6823 ldr r3, [r4, #0] d68a: f043 4300 orr.w r3, r3, #2147483648 ; 0x80000000 d68e: 6023 str r3, [r4, #0] temp = base->MCR & (~(SPI_MCR_CONT_SCKE_MASK | SPI_MCR_MTFE_MASK | SPI_MCR_ROOE_MASK | SPI_MCR_SMPL_PT_MASK | d690: 6822 ldr r2, [r4, #0] base->MCR = temp | SPI_MCR_CONT_SCKE(masterConfig->enableContinuousSCK) | d692: 7fa9 ldrb r1, [r5, #30] SPI_MCR_MTFE(masterConfig->enableModifiedTimingFormat) | d694: f895 3020 ldrb.w r3, [r5, #32] d698: 069b lsls r3, r3, #26 base->MCR = temp | SPI_MCR_CONT_SCKE(masterConfig->enableContinuousSCK) | d69a: ea43 7381 orr.w r3, r3, r1, lsl #30 temp = base->MCR & (~(SPI_MCR_CONT_SCKE_MASK | SPI_MCR_MTFE_MASK | SPI_MCR_ROOE_MASK | SPI_MCR_SMPL_PT_MASK | d69e: f022 428a bic.w r2, r2, #1157627904 ; 0x45000000 d6a2: f422 524c bic.w r2, r2, #13056 ; 0x3300 base->MCR = temp | SPI_MCR_CONT_SCKE(masterConfig->enableContinuousSCK) | d6a6: 4313 orrs r3, r2 SPI_MCR_ROOE(masterConfig->enableRxFifoOverWrite) | SPI_MCR_SMPL_PT(masterConfig->samplePoint) | d6a8: 7fea ldrb r2, [r5, #31] SPI_MCR_MTFE(masterConfig->enableModifiedTimingFormat) | d6aa: ea43 6302 orr.w r3, r3, r2, lsl #24 SPI_MCR_ROOE(masterConfig->enableRxFifoOverWrite) | SPI_MCR_SMPL_PT(masterConfig->samplePoint) | d6ae: f895 2021 ldrb.w r2, [r5, #33] ; 0x21 d6b2: 0212 lsls r2, r2, #8 d6b4: f402 7240 and.w r2, r2, #768 ; 0x300 SPI_MCR_DIS_TXF(false) | SPI_MCR_DIS_RXF(false); d6b8: 4313 orrs r3, r2 base->MCR = temp | SPI_MCR_CONT_SCKE(masterConfig->enableContinuousSCK) | d6ba: 6023 str r3, [r4, #0] DSPI_SetOnePcsPolarity(base, masterConfig->whichPcs, masterConfig->pcsActiveHighOrLow); d6bc: 7f2b ldrb r3, [r5, #28] temp = base->MCR; d6be: 6821 ldr r1, [r4, #0] if (activeLowOrHigh == kDSPI_PcsActiveLow) d6c0: 7f6a ldrb r2, [r5, #29] d6c2: 2a01 cmp r2, #1 temp |= SPI_MCR_PCSIS(pcs); d6c4: ea4f 4303 mov.w r3, r3, lsl #16 d6c8: bf07 ittee eq d6ca: f403 127c andeq.w r2, r3, #4128768 ; 0x3f0000 d6ce: 4311 orreq r1, r2 temp &= ~SPI_MCR_PCSIS(pcs); d6d0: f403 137c andne.w r3, r3, #4128768 ; 0x3f0000 d6d4: 4399 bicne r1, r3 base->MCR = temp; d6d6: 6021 str r1, [r4, #0] if (0 == DSPI_MasterSetBaudRate(base, masterConfig->whichCtar, masterConfig->ctarConfig.baudRate, srcClock_Hz)) d6d8: 4633 mov r3, r6 d6da: 686a ldr r2, [r5, #4] d6dc: 7829 ldrb r1, [r5, #0] d6de: 4620 mov r0, r4 d6e0: f7ff fee4 bl d4ac d6e4: 2800 cmp r0, #0 d6e6: d040 beq.n d76a temp = base->CTAR[masterConfig->whichCtar] & d6e8: 7829 ldrb r1, [r5, #0] d6ea: eb04 0181 add.w r1, r4, r1, lsl #2 d6ee: 68ca ldr r2, [r1, #12] temp | SPI_CTAR_FMSZ(masterConfig->ctarConfig.bitsPerFrame - 1) | SPI_CTAR_CPOL(masterConfig->ctarConfig.cpol) | d6f0: 68ab ldr r3, [r5, #8] d6f2: 3b01 subs r3, #1 d6f4: 06db lsls r3, r3, #27 d6f6: f003 43f0 and.w r3, r3, #2013265920 ; 0x78000000 temp = base->CTAR[masterConfig->whichCtar] & d6fa: f022 42fe bic.w r2, r2, #2130706432 ; 0x7f000000 temp | SPI_CTAR_FMSZ(masterConfig->ctarConfig.bitsPerFrame - 1) | SPI_CTAR_CPOL(masterConfig->ctarConfig.cpol) | d6fe: 4313 orrs r3, r2 d700: 7b2a ldrb r2, [r5, #12] d702: 0692 lsls r2, r2, #26 d704: f002 6280 and.w r2, r2, #67108864 ; 0x4000000 d708: 4313 orrs r3, r2 SPI_CTAR_CPHA(masterConfig->ctarConfig.cpha) | SPI_CTAR_LSBFE(masterConfig->ctarConfig.direction); d70a: 7b6a ldrb r2, [r5, #13] d70c: 0652 lsls r2, r2, #25 d70e: f002 7200 and.w r2, r2, #33554432 ; 0x2000000 temp | SPI_CTAR_FMSZ(masterConfig->ctarConfig.bitsPerFrame - 1) | SPI_CTAR_CPOL(masterConfig->ctarConfig.cpol) | d712: 4313 orrs r3, r2 SPI_CTAR_CPHA(masterConfig->ctarConfig.cpha) | SPI_CTAR_LSBFE(masterConfig->ctarConfig.direction); d714: 7baa ldrb r2, [r5, #14] d716: 0612 lsls r2, r2, #24 d718: f002 7280 and.w r2, r2, #16777216 ; 0x1000000 d71c: 4313 orrs r3, r2 base->CTAR[masterConfig->whichCtar] = d71e: 60cb str r3, [r1, #12] DSPI_MasterSetDelayTimes(base, masterConfig->whichCtar, kDSPI_PcsToSck, srcClock_Hz, d720: 692b ldr r3, [r5, #16] d722: 9300 str r3, [sp, #0] d724: 4633 mov r3, r6 d726: 2201 movs r2, #1 d728: 7829 ldrb r1, [r5, #0] d72a: 4620 mov r0, r4 d72c: f7ff ff2c bl d588 DSPI_MasterSetDelayTimes(base, masterConfig->whichCtar, kDSPI_LastSckToPcs, srcClock_Hz, d730: 696b ldr r3, [r5, #20] d732: 9300 str r3, [sp, #0] d734: 4633 mov r3, r6 d736: 2202 movs r2, #2 d738: 7829 ldrb r1, [r5, #0] d73a: 4620 mov r0, r4 d73c: f7ff ff24 bl d588 DSPI_MasterSetDelayTimes(base, masterConfig->whichCtar, kDSPI_BetweenTransfer, srcClock_Hz, d740: 69ab ldr r3, [r5, #24] d742: 9300 str r3, [sp, #0] d744: 4633 mov r3, r6 d746: 2203 movs r2, #3 d748: 7829 ldrb r1, [r5, #0] d74a: 4620 mov r0, r4 d74c: f7ff ff1c bl d588 DSPI_SetDummyData(base, DSPI_DUMMY_DATA); d750: 2100 movs r1, #0 d752: 4620 mov r0, r4 d754: f7ff fe7e bl d454 base->MCR &= ~SPI_MCR_HALT_MASK; d758: 6823 ldr r3, [r4, #0] d75a: f023 0301 bic.w r3, r3, #1 d75e: 6023 str r3, [r4, #0] } d760: b002 add sp, #8 d762: bd70 pop {r4, r5, r6, pc} assert(masterConfig); d764: 4803 ldr r0, [pc, #12] ; (d774 ) d766: f000 f939 bl d9dc <__assertion_failed> assert(false); d76a: 4803 ldr r0, [pc, #12] ; (d778 ) d76c: f000 f936 bl d9dc <__assertion_failed> d770: 00013158 .word 0x00013158 d774: 00013038 .word 0x00013038 d778: 00013058 .word 0x00013058 0000d77c : #if defined(SPI0) void SPI0_DriverIRQHandler(void) { d77c: b508 push {r3, lr} assert(g_dspiHandle[0]); d77e: 4b05 ldr r3, [pc, #20] ; (d794 ) d780: 6819 ldr r1, [r3, #0] d782: b119 cbz r1, d78c DSPI_CommonIRQHandler(SPI0, g_dspiHandle[0]); d784: 4804 ldr r0, [pc, #16] ; (d798 ) d786: f7ff fe3b bl d400 } d78a: bd08 pop {r3, pc} assert(g_dspiHandle[0]); d78c: 4803 ldr r0, [pc, #12] ; (d79c ) d78e: f000 f925 bl d9dc <__assertion_failed> d792: bf00 nop d794: 20001208 .word 0x20001208 d798: 4002c000 .word 0x4002c000 d79c: 00013070 .word 0x00013070 0000d7a0 : #endif #if defined(SPI1) void SPI1_DriverIRQHandler(void) { d7a0: b508 push {r3, lr} assert(g_dspiHandle[1]); d7a2: 4b05 ldr r3, [pc, #20] ; (d7b8 ) d7a4: 6859 ldr r1, [r3, #4] d7a6: b119 cbz r1, d7b0 DSPI_CommonIRQHandler(SPI1, g_dspiHandle[1]); d7a8: 4804 ldr r0, [pc, #16] ; (d7bc ) d7aa: f7ff fe29 bl d400 } d7ae: bd08 pop {r3, pc} assert(g_dspiHandle[1]); d7b0: 4803 ldr r0, [pc, #12] ; (d7c0 ) d7b2: f000 f913 bl d9dc <__assertion_failed> d7b6: bf00 nop d7b8: 20001208 .word 0x20001208 d7bc: 4002d000 .word 0x4002d000 d7c0: 00013094 .word 0x00013094 0000d7c4 : /******************************************************************************* * Code ******************************************************************************/ static uint32_t PIT_GetInstance(PIT_Type *base) { d7c4: b508 push {r3, lr} uint32_t instance; /* Find the instance index from base address mappings. */ for (instance = 0; instance < ARRAY_SIZE(s_pitBases); instance++) { if (s_pitBases[instance] == base) d7c6: 4b04 ldr r3, [pc, #16] ; (d7d8 ) d7c8: 4298 cmp r0, r3 d7ca: d002 beq.n d7d2 { break; } } assert(instance < ARRAY_SIZE(s_pitBases)); d7cc: 4803 ldr r0, [pc, #12] ; (d7dc ) d7ce: f000 f905 bl d9dc <__assertion_failed> return instance; } d7d2: 2000 movs r0, #0 d7d4: bd08 pop {r3, pc} d7d6: bf00 nop d7d8: 40037000 .word 0x40037000 d7dc: 00013164 .word 0x00013164 0000d7e0 : void PIT_Init(PIT_Type *base, const pit_config_t *config) { d7e0: b538 push {r3, r4, r5, lr} assert(config); d7e2: b199 cbz r1, d80c d7e4: 4604 mov r4, r0 d7e6: 460d mov r5, r1 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) /* Ungate the PIT clock*/ CLOCK_EnableClock(s_pitClocks[PIT_GetInstance(base)]); d7e8: f7ff ffec bl d7c4 d7ec: 4a0b ldr r2, [pc, #44] ; (d81c ) d7ee: 6813 ldr r3, [r2, #0] d7f0: f443 0300 orr.w r3, r3, #8388608 ; 0x800000 d7f4: 6013 str r3, [r2, #0] #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ #if defined(FSL_FEATURE_PIT_HAS_MDIS) && FSL_FEATURE_PIT_HAS_MDIS /* Enable PIT timers */ base->MCR &= ~PIT_MCR_MDIS_MASK; d7f6: 6823 ldr r3, [r4, #0] d7f8: f023 0302 bic.w r3, r3, #2 d7fc: 6023 str r3, [r4, #0] #endif /* Config timer operation when in debug mode */ if (config->enableRunInDebug) d7fe: 782b ldrb r3, [r5, #0] d800: b13b cbz r3, d812 { base->MCR &= ~PIT_MCR_FRZ_MASK; d802: 6823 ldr r3, [r4, #0] d804: f023 0301 bic.w r3, r3, #1 d808: 6023 str r3, [r4, #0] } else { base->MCR |= PIT_MCR_FRZ_MASK; } } d80a: bd38 pop {r3, r4, r5, pc} assert(config); d80c: 4804 ldr r0, [pc, #16] ; (d820 ) d80e: f000 f8e5 bl d9dc <__assertion_failed> base->MCR |= PIT_MCR_FRZ_MASK; d812: 6823 ldr r3, [r4, #0] d814: f043 0301 orr.w r3, r3, #1 d818: 6023 str r3, [r4, #0] } d81a: e7f6 b.n d80a d81c: 4004803c .word 0x4004803c d820: 00013198 .word 0x00013198 0000d824 : -- SystemInit() ---------------------------------------------------------------------------- */ void SystemInit (void) { #if ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access */ d824: 4a08 ldr r2, [pc, #32] ; (d848 ) d826: f8d2 3088 ldr.w r3, [r2, #136] ; 0x88 d82a: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 d82e: f8c2 3088 str.w r3, [r2, #136] ; 0x88 #endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */ #if (DISABLE_WDOG) /* WDOG->UNLOCK: WDOGUNLOCK=0xC520 */ WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xC520); /* Key 1 */ d832: 4b06 ldr r3, [pc, #24] ; (d84c ) d834: f24c 5220 movw r2, #50464 ; 0xc520 d838: 81da strh r2, [r3, #14] /* WDOG->UNLOCK: WDOGUNLOCK=0xD928 */ WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xD928); /* Key 2 */ d83a: f64d 1228 movw r2, #55592 ; 0xd928 d83e: 81da strh r2, [r3, #14] /* WDOG->STCTRLH: ?=0,DISTESTWDOG=0,BYTESEL=0,TESTSEL=0,TESTWDOG=0,?=0,?=1,WAITEN=1,STOPEN=1,DBGEN=0,ALLOWUPDATE=1,WINEN=0,IRQRSTEN=0,CLKSRC=1,WDOGEN=0 */ WDOG->STCTRLH = WDOG_STCTRLH_BYTESEL(0x00) | d840: f44f 72e9 mov.w r2, #466 ; 0x1d2 d844: 801a strh r2, [r3, #0] WDOG_STCTRLH_ALLOWUPDATE_MASK | WDOG_STCTRLH_CLKSRC_MASK | 0x0100U; #endif /* (DISABLE_WDOG) */ } d846: 4770 bx lr d848: e000ed00 .word 0xe000ed00 d84c: 40052000 .word 0x40052000 0000d850 : void SystemCoreClockUpdate (void) { uint32_t MCGOUTClock; /* Variable to store output clock frequency of the MCG module */ uint16_t Divider; if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x00U) { d850: 4b5d ldr r3, [pc, #372] ; (d9c8 ) d852: 781b ldrb r3, [r3, #0] d854: f013 0fc0 tst.w r3, #192 ; 0xc0 d858: f040 8091 bne.w d97e /* Output of FLL or PLL is selected */ if ((MCG->C6 & MCG_C6_PLLS_MASK) == 0x00U) { d85c: 4b5a ldr r3, [pc, #360] ; (d9c8 ) d85e: 795b ldrb r3, [r3, #5] d860: f013 0f40 tst.w r3, #64 ; 0x40 d864: d172 bne.n d94c /* FLL is selected */ if ((MCG->C1 & MCG_C1_IREFS_MASK) == 0x00U) { d866: 4b58 ldr r3, [pc, #352] ; (d9c8 ) d868: 781b ldrb r3, [r3, #0] d86a: f013 0f04 tst.w r3, #4 d86e: d132 bne.n d8d6 /* External reference clock is selected */ if((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x00U) { d870: 4b55 ldr r3, [pc, #340] ; (d9c8 ) d872: 7b1b ldrb r3, [r3, #12] d874: f003 0301 and.w r3, r3, #1 MCGOUTClock = CPU_XTAL_CLK_HZ; /* System oscillator drives MCG clock */ } else { MCGOUTClock = CPU_XTAL32k_CLK_HZ; /* RTC 32 kHz oscillator drives MCG clock */ d878: 2b00 cmp r3, #0 d87a: 4b54 ldr r3, [pc, #336] ; (d9cc ) d87c: bf18 it ne d87e: f44f 4300 movne.w r3, #32768 ; 0x8000 } if (((MCG->C2 & MCG_C2_RANGE_MASK) != 0x00U) && ((MCG->C7 & MCG_C7_OSCSEL_MASK) != 0x01U)) { d882: 4a51 ldr r2, [pc, #324] ; (d9c8 ) d884: 7852 ldrb r2, [r2, #1] d886: f012 0f30 tst.w r2, #48 ; 0x30 d88a: d014 beq.n d8b6 d88c: 4a4e ldr r2, [pc, #312] ; (d9c8 ) d88e: 7b12 ldrb r2, [r2, #12] d890: f012 0f01 tst.w r2, #1 d894: d10f bne.n d8b6 switch (MCG->C1 & MCG_C1_FRDIV_MASK) { d896: 4a4c ldr r2, [pc, #304] ; (d9c8 ) d898: 7812 ldrb r2, [r2, #0] d89a: f002 0238 and.w r2, r2, #56 ; 0x38 d89e: 2a30 cmp r2, #48 ; 0x30 d8a0: d013 beq.n d8ca d8a2: 2a38 cmp r2, #56 ; 0x38 d8a4: d014 beq.n d8d0 break; case 0x30U: Divider = 1280U; break; default: Divider = (uint16_t)(32LU << ((MCG->C1 & MCG_C1_FRDIV_MASK) >> MCG_C1_FRDIV_SHIFT)); d8a6: 4a48 ldr r2, [pc, #288] ; (d9c8 ) d8a8: 7812 ldrb r2, [r2, #0] d8aa: f3c2 01c2 ubfx r1, r2, #3, #3 d8ae: 2220 movs r2, #32 d8b0: 408a lsls r2, r1 d8b2: b292 uxth r2, r2 break; d8b4: e006 b.n d8c4 } } else {/* ((MCG->C2 & MCG_C2_RANGE_MASK) != 0x00U) */ Divider = (uint16_t)(1LU << ((MCG->C1 & MCG_C1_FRDIV_MASK) >> MCG_C1_FRDIV_SHIFT)); d8b6: 4a44 ldr r2, [pc, #272] ; (d9c8 ) d8b8: 7812 ldrb r2, [r2, #0] d8ba: f3c2 01c2 ubfx r1, r2, #3, #3 d8be: 2201 movs r2, #1 d8c0: 408a lsls r2, r1 d8c2: b292 uxth r2, r2 } MCGOUTClock = (MCGOUTClock / Divider); /* Calculate the divided FLL reference clock */ d8c4: fbb3 f3f2 udiv r3, r3, r2 d8c8: e007 b.n d8da Divider = 1280U; d8ca: f44f 62a0 mov.w r2, #1280 ; 0x500 d8ce: e7f9 b.n d8c4 Divider = 1536U; d8d0: f44f 62c0 mov.w r2, #1536 ; 0x600 d8d4: e7f6 b.n d8c4 } else { /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x00U)) */ MCGOUTClock = CPU_INT_SLOW_CLK_HZ; /* The slow internal reference clock is selected */ d8d6: f44f 4300 mov.w r3, #32768 ; 0x8000 } /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x00U)) */ /* Select correct multiplier to calculate the MCG output clock */ switch (MCG->C4 & (MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS_MASK)) { d8da: 4a3b ldr r2, [pc, #236] ; (d9c8 ) d8dc: 78d2 ldrb r2, [r2, #3] d8de: f002 02e0 and.w r2, r2, #224 ; 0xe0 d8e2: 2a60 cmp r2, #96 ; 0x60 d8e4: d024 beq.n d930 d8e6: d90b bls.n d900 d8e8: 2aa0 cmp r2, #160 ; 0xa0 d8ea: d025 beq.n d938 d8ec: d911 bls.n d912 d8ee: 2ac0 cmp r2, #192 ; 0xc0 d8f0: d027 beq.n d942 d8f2: 2ae0 cmp r2, #224 ; 0xe0 d8f4: d138 bne.n d968 break; case 0xC0U: MCGOUTClock *= 2197U; break; case 0xE0U: MCGOUTClock *= 2929U; d8f6: f640 3271 movw r2, #2929 ; 0xb71 d8fa: fb02 f303 mul.w r3, r2, r3 break; d8fe: e033 b.n d968 switch (MCG->C4 & (MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS_MASK)) { d900: 2a20 cmp r2, #32 d902: d00d beq.n d920 d904: 2a40 cmp r2, #64 ; 0x40 d906: d00f beq.n d928 d908: bb72 cbnz r2, d968 MCGOUTClock *= 640U; d90a: eb03 0383 add.w r3, r3, r3, lsl #2 d90e: 01db lsls r3, r3, #7 break; d910: e02a b.n d968 switch (MCG->C4 & (MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS_MASK)) { d912: 2a80 cmp r2, #128 ; 0x80 d914: d128 bne.n d968 MCGOUTClock *= 732U; d916: f44f 7237 mov.w r2, #732 ; 0x2dc d91a: fb02 f303 mul.w r3, r2, r3 break; d91e: e023 b.n d968 MCGOUTClock *= 1280U; d920: eb03 0383 add.w r3, r3, r3, lsl #2 d924: 021b lsls r3, r3, #8 break; d926: e01f b.n d968 MCGOUTClock *= 1920U; d928: ebc3 1303 rsb r3, r3, r3, lsl #4 d92c: 01db lsls r3, r3, #7 break; d92e: e01b b.n d968 MCGOUTClock *= 2560U; d930: eb03 0383 add.w r3, r3, r3, lsl #2 d934: 025b lsls r3, r3, #9 break; d936: e017 b.n d968 MCGOUTClock *= 1464U; d938: f44f 62b7 mov.w r2, #1464 ; 0x5b8 d93c: fb02 f303 mul.w r3, r2, r3 break; d940: e012 b.n d968 MCGOUTClock *= 2197U; d942: f640 0295 movw r2, #2197 ; 0x895 d946: fb02 f303 mul.w r3, r2, r3 break; d94a: e00d b.n d968 default: break; } } else { /* (!((MCG->C6 & MCG_C6_PLLS_MASK) == 0x00U)) */ /* PLL is selected */ Divider = (((uint16_t)MCG->C5 & MCG_C5_PRDIV0_MASK) + 0x01U); d94c: 491e ldr r1, [pc, #120] ; (d9c8 ) d94e: 790b ldrb r3, [r1, #4] d950: f003 031f and.w r3, r3, #31 MCGOUTClock = (uint32_t)(CPU_XTAL_CLK_HZ / Divider); /* Calculate the PLL reference clock */ d954: 1c5a adds r2, r3, #1 d956: 4b1d ldr r3, [pc, #116] ; (d9cc ) d958: fbb3 f3f2 udiv r3, r3, r2 Divider = (((uint16_t)MCG->C6 & MCG_C6_VDIV0_MASK) + 24U); d95c: 794a ldrb r2, [r1, #5] d95e: f002 021f and.w r2, r2, #31 MCGOUTClock *= Divider; /* Calculate the MCG output clock */ d962: 3218 adds r2, #24 d964: fb03 f302 mul.w r3, r3, r2 } } else { /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80U)) */ /* Reserved value */ return; } /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80U)) */ SystemCoreClock = (MCGOUTClock / (0x01U + ((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV1_MASK) >> SIM_CLKDIV1_OUTDIV1_SHIFT))); d968: 4919 ldr r1, [pc, #100] ; (d9d0 ) d96a: f241 0244 movw r2, #4164 ; 0x1044 d96e: 588a ldr r2, [r1, r2] d970: 0f12 lsrs r2, r2, #28 d972: 3201 adds r2, #1 d974: fbb3 f3f2 udiv r3, r3, r2 d978: 4a16 ldr r2, [pc, #88] ; (d9d4 ) d97a: 6013 str r3, [r2, #0] } d97c: 4770 bx lr } else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x40U) { d97e: 4b12 ldr r3, [pc, #72] ; (d9c8 ) d980: 781b ldrb r3, [r3, #0] d982: f003 03c0 and.w r3, r3, #192 ; 0xc0 d986: 2b40 cmp r3, #64 ; 0x40 d988: d00f beq.n d9aa } else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80U) { d98a: 4b0f ldr r3, [pc, #60] ; (d9c8 ) d98c: 781b ldrb r3, [r3, #0] d98e: f003 03c0 and.w r3, r3, #192 ; 0xc0 d992: 2b80 cmp r3, #128 ; 0x80 d994: d1f2 bne.n d97c if((MCG->C7 & MCG_C7_OSCSEL_MASK) == 0x00U) { d996: 4b0c ldr r3, [pc, #48] ; (d9c8 ) d998: 7b1b ldrb r3, [r3, #12] d99a: f003 0301 and.w r3, r3, #1 MCGOUTClock = CPU_XTAL32k_CLK_HZ; /* RTC 32 kHz oscillator drives MCG clock */ d99e: 2b00 cmp r3, #0 d9a0: 4b0a ldr r3, [pc, #40] ; (d9cc ) d9a2: bf18 it ne d9a4: f44f 4300 movne.w r3, #32768 ; 0x8000 d9a8: e7de b.n d968 if ((MCG->C2 & MCG_C2_IRCS_MASK) == 0x00U) { d9aa: 4b07 ldr r3, [pc, #28] ; (d9c8 ) d9ac: 785b ldrb r3, [r3, #1] d9ae: f013 0f01 tst.w r3, #1 d9b2: d006 beq.n d9c2 Divider = (uint16_t)(0x01LU << ((MCG->SC & MCG_SC_FCRDIV_MASK) >> MCG_SC_FCRDIV_SHIFT)); d9b4: 4b04 ldr r3, [pc, #16] ; (d9c8 ) d9b6: 7a1b ldrb r3, [r3, #8] d9b8: f3c3 0242 ubfx r2, r3, #1, #3 MCGOUTClock = (uint32_t) (CPU_INT_FAST_CLK_HZ / Divider); /* Fast internal reference clock selected */ d9bc: 4b06 ldr r3, [pc, #24] ; (d9d8 ) d9be: 40d3 lsrs r3, r2 d9c0: e7d2 b.n d968 MCGOUTClock = CPU_INT_SLOW_CLK_HZ; /* Slow internal reference clock selected */ d9c2: f44f 4300 mov.w r3, #32768 ; 0x8000 d9c6: e7cf b.n d968 d9c8: 40064000 .word 0x40064000 d9cc: 00f42400 .word 0x00f42400 d9d0: 40047000 .word 0x40047000 d9d4: 2000014c .word 0x2000014c d9d8: 003d0900 .word 0x003d0900 0000d9dc <__assertion_failed>: d9dc: b510 push {r4, lr} d9de: 490f ldr r1, [pc, #60] ; (da1c <__assertion_failed+0x40>) d9e0: 4604 mov r4, r0 d9e2: 480f ldr r0, [pc, #60] ; (da20 <__assertion_failed+0x44>) d9e4: f004 fb16 bl 12014 d9e8: 490c ldr r1, [pc, #48] ; (da1c <__assertion_failed+0x40>) d9ea: 4620 mov r0, r4 d9ec: f004 fb12 bl 12014 d9f0: 490c ldr r1, [pc, #48] ; (da24 <__assertion_failed+0x48>) d9f2: f8d1 3080 ldr.w r3, [r1, #128] ; 0x80 d9f6: 3b01 subs r3, #1 d9f8: 2b00 cmp r3, #0 d9fa: f8c1 3080 str.w r3, [r1, #128] ; 0x80 d9fe: db08 blt.n da12 <__assertion_failed+0x36> da00: 6f8b ldr r3, [r1, #120] ; 0x78 da02: 1c5a adds r2, r3, #1 da04: 678a str r2, [r1, #120] ; 0x78 da06: 220a movs r2, #10 da08: 701a strb r2, [r3, #0] da0a: e8bd 4010 ldmia.w sp!, {r4, lr} da0e: f000 b80b b.w da28 <__exit> da12: 3178 adds r1, #120 ; 0x78 da14: 200a movs r0, #10 da16: f004 fa1c bl 11e52 <__flsbuf> da1a: e7f6 b.n da0a <__assertion_failed+0x2e> da1c: 20001298 .word 0x20001298 da20: 000131b4 .word 0x000131b4 da24: 20001220 .word 0x20001220 0000da28 <__exit>: da28: 2018 movs r0, #24 da2a: 4901 ldr r1, [pc, #4] ; (da30 <__exit+0x8>) da2c: beab bkpt 0x00ab da2e: 4770 bx lr da30: 00020026 .word 0x00020026 0000da34 <_Cwritebuf>: da34: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} da38: 68d5 ldr r5, [r2, #12] da3a: 6957 ldr r7, [r2, #20] da3c: 02eb lsls r3, r5, #11 da3e: 4680 mov r8, r0 da40: 460e mov r6, r1 da42: 4614 mov r4, r2 da44: d505 bpl.n da52 <_Cwritebuf+0x1e> da46: 4638 mov r0, r7 da48: f004 fca0 bl 1238c <__sys_flen> da4c: f045 0510 orr.w r5, r5, #16 da50: 61a0 str r0, [r4, #24] da52: 4b12 ldr r3, [pc, #72] ; (da9c <_Cwritebuf+0x68>) da54: 402b ands r3, r5 da56: b18b cbz r3, da7c <_Cwritebuf+0x48> da58: 69a1 ldr r1, [r4, #24] da5a: 4638 mov r0, r7 da5c: f004 fca8 bl 123b0 <__sys_seek> da60: 2800 cmp r0, #0 da62: da06 bge.n da72 <_Cwritebuf+0x3e> da64: 68e3 ldr r3, [r4, #12] da66: f043 0380 orr.w r3, r3, #128 ; 0x80 da6a: 60e3 str r3, [r4, #12] da6c: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff da70: e011 b.n da96 <_Cwritebuf+0x62> da72: f425 3500 bic.w r5, r5, #131072 ; 0x20000 da76: f025 0510 bic.w r5, r5, #16 da7a: 60e5 str r5, [r4, #12] da7c: 4632 mov r2, r6 da7e: 4641 mov r1, r8 da80: 4638 mov r0, r7 da82: f004 fca1 bl 123c8 <__sys_write> da86: f020 4300 bic.w r3, r0, #2147483648 ; 0x80000000 da8a: 1af6 subs r6, r6, r3 da8c: 69a3 ldr r3, [r4, #24] da8e: 441e add r6, r3 da90: 61a6 str r6, [r4, #24] da92: 2800 cmp r0, #0 da94: d1e6 bne.n da64 <_Cwritebuf+0x30> da96: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} da9a: bf00 nop da9c: 00020010 .word 0x00020010 0000daa0 : daa0: b5f8 push {r3, r4, r5, r6, r7, lr} daa2: 4f30 ldr r7, [pc, #192] ; (db64 ) daa4: 683c ldr r4, [r7, #0] daa6: 2800 cmp r0, #0 daa8: d151 bne.n db4e daaa: 2000 movs r0, #0 daac: bdf8 pop {r3, r4, r5, r6, r7, pc} daae: 6823 ldr r3, [r4, #0] dab0: f1b3 5f80 cmp.w r3, #268435456 ; 0x10000000 dab4: d139 bne.n db2a dab6: e9d4 3201 ldrd r3, r2, [r4, #4] daba: b152 cbz r2, dad2 dabc: 6811 ldr r1, [r2, #0] dabe: f1b1 5f80 cmp.w r1, #268435456 ; 0x10000000 dac2: d106 bne.n dad2 dac4: 6851 ldr r1, [r2, #4] dac6: 3303 adds r3, #3 dac8: 440b add r3, r1 daca: 6063 str r3, [r4, #4] dacc: 6893 ldr r3, [r2, #8] dace: 60a3 str r3, [r4, #8] dad0: e7f1 b.n dab6 dad2: 42ab cmp r3, r5 dad4: db07 blt.n dae6 dad6: 459e cmp lr, r3 dad8: db05 blt.n dae6 dada: 4620 mov r0, r4 dadc: f04f 5300 mov.w r3, #536870912 ; 0x20000000 dae0: f840 3b0c str.w r3, [r0], #12 dae4: e7e2 b.n daac dae6: 4563 cmp r3, ip dae8: d911 bls.n db0e daea: 4620 mov r0, r4 daec: f04f 5100 mov.w r1, #536870912 ; 0x20000000 daf0: 6065 str r5, [r4, #4] daf2: f840 1b0c str.w r1, [r0], #12 daf6: 1b5b subs r3, r3, r5 daf8: eb00 0185 add.w r1, r0, r5, lsl #2 dafc: 60a1 str r1, [r4, #8] dafe: 3b03 subs r3, #3 db00: f04f 5480 mov.w r4, #268435456 ; 0x10000000 db04: f840 4025 str.w r4, [r0, r5, lsl #2] db08: e9c1 3201 strd r3, r2, [r1, #4] db0c: e7ce b.n daac db0e: b962 cbnz r2, db2a db10: eba0 0083 sub.w r0, r0, r3, lsl #2 db14: f000 ff86 bl ea24 <_sbrk> db18: 3001 adds r0, #1 db1a: d0c6 beq.n daaa db1c: f04f 5300 mov.w r3, #536870912 ; 0x20000000 db20: e9c4 3500 strd r3, r5, [r4] db24: f104 000c add.w r0, r4, #12 db28: e7c0 b.n daac db2a: 4626 mov r6, r4 db2c: 68a4 ldr r4, [r4, #8] db2e: 2c00 cmp r4, #0 db30: d1bd bne.n daae db32: 300c adds r0, #12 db34: f000 ff76 bl ea24 <_sbrk> db38: 1c43 adds r3, r0, #1 db3a: d0b6 beq.n daaa db3c: f04f 5300 mov.w r3, #536870912 ; 0x20000000 db40: e9c0 3500 strd r3, r5, [r0] db44: 6084 str r4, [r0, #8] db46: b956 cbnz r6, db5e db48: 6038 str r0, [r7, #0] db4a: 300c adds r0, #12 db4c: e7ae b.n daac db4e: 1cc3 adds r3, r0, #3 db50: 089d lsrs r5, r3, #2 db52: 2600 movs r6, #0 db54: f105 0c0a add.w ip, r5, #10 db58: f105 0e03 add.w lr, r5, #3 db5c: e7e7 b.n db2e db5e: 60b0 str r0, [r6, #8] db60: e7f3 b.n db4a db62: bf00 nop db64: 200012d8 .word 0x200012d8 0000db68 <_Csys_alloc>: db68: b510 push {r4, lr} db6a: f7ff ff99 bl daa0 db6e: 4604 mov r4, r0 db70: b928 cbnz r0, db7e <_Csys_alloc+0x16> db72: 2217 movs r2, #23 db74: 4903 ldr r1, [pc, #12] ; (db84 <_Csys_alloc+0x1c>) db76: f004 fc27 bl 123c8 <__sys_write> db7a: f7ff ff55 bl da28 <__exit> db7e: 4620 mov r0, r4 db80: bd10 pop {r4, pc} db82: bf00 nop db84: 000131c9 .word 0x000131c9 0000db88 : db88: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} db8c: 68c6 ldr r6, [r0, #12] db8e: 4b3d ldr r3, [pc, #244] ; (dc84 ) db90: 4033 ands r3, r6 db92: 4604 mov r4, r0 db94: 460d mov r5, r1 db96: 4690 mov r8, r2 db98: b91b cbnz r3, dba2 db9a: 2702 movs r7, #2 db9c: 4638 mov r0, r7 db9e: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} dba2: f8d0 9014 ldr.w r9, [r0, #20] dba6: 4648 mov r0, r9 dba8: f004 fbf6 bl 12398 <__sys_istty> dbac: 4607 mov r7, r0 dbae: 2800 cmp r0, #0 dbb0: d1f3 bne.n db9a dbb2: f1b8 0f01 cmp.w r8, #1 dbb6: d02c beq.n dc12 dbb8: f1b8 0f02 cmp.w r8, #2 dbbc: d02e beq.n dc1c dbbe: f1b8 0f00 cmp.w r8, #0 dbc2: d1ea bne.n db9a dbc4: 2d00 cmp r5, #0 dbc6: dbe8 blt.n db9a dbc8: 04b0 lsls r0, r6, #18 dbca: d504 bpl.n dbd6 dbcc: 6823 ldr r3, [r4, #0] dbce: 6ae2 ldr r2, [r4, #44] ; 0x2c dbd0: 429a cmp r2, r3 dbd2: bf38 it cc dbd4: 62e3 strcc r3, [r4, #44] ; 0x2c dbd6: 69a1 ldr r1, [r4, #24] dbd8: 42a9 cmp r1, r5 dbda: dc0e bgt.n dbfa dbdc: 6823 ldr r3, [r4, #0] dbde: 6ae2 ldr r2, [r4, #44] ; 0x2c dbe0: 4293 cmp r3, r2 dbe2: bf38 it cc dbe4: 4613 movcc r3, r2 dbe6: 6922 ldr r2, [r4, #16] dbe8: 1858 adds r0, r3, r1 dbea: 1a80 subs r0, r0, r2 dbec: 42a8 cmp r0, r5 dbee: db04 blt.n dbfa dbf0: 6b20 ldr r0, [r4, #48] ; 0x30 dbf2: eb01 0c00 add.w ip, r1, r0 dbf6: 45ac cmp ip, r5 dbf8: dc34 bgt.n dc64 dbfa: 2300 movs r3, #0 dbfc: e9c4 3301 strd r3, r3, [r4, #4] dc00: f046 0620 orr.w r6, r6, #32 dc04: 62a5 str r5, [r4, #40] ; 0x28 dc06: f426 2603 bic.w r6, r6, #536576 ; 0x83000 dc0a: f026 0640 bic.w r6, r6, #64 ; 0x40 dc0e: 60e6 str r6, [r4, #12] dc10: e7c4 b.n db9c dc12: 4620 mov r0, r4 dc14: f000 f838 bl dc88 dc18: 4405 add r5, r0 dc1a: e7d3 b.n dbc4 dc1c: 4648 mov r0, r9 dc1e: f004 fbb5 bl 1238c <__sys_flen> dc22: f1b0 0c00 subs.w ip, r0, #0 dc26: 68e2 ldr r2, [r4, #12] dc28: da04 bge.n dc34 dc2a: f042 0280 orr.w r2, r2, #128 ; 0x80 dc2e: 60e2 str r2, [r4, #12] dc30: 2701 movs r7, #1 dc32: e7b3 b.n db9c dc34: 6ae3 ldr r3, [r4, #44] ; 0x2c dc36: 4618 mov r0, r3 dc38: 69a3 ldr r3, [r4, #24] dc3a: 4619 mov r1, r3 dc3c: 6823 ldr r3, [r4, #0] dc3e: 4283 cmp r3, r0 dc40: bf2c ite cs dc42: 18c9 addcs r1, r1, r3 dc44: 1809 addcc r1, r1, r0 dc46: 460b mov r3, r1 dc48: 6921 ldr r1, [r4, #16] dc4a: 0692 lsls r2, r2, #26 dc4c: eba3 0301 sub.w r3, r3, r1 dc50: d503 bpl.n dc5a dc52: 6aa2 ldr r2, [r4, #40] ; 0x28 dc54: 4293 cmp r3, r2 dc56: bfb8 it lt dc58: 4613 movlt r3, r2 dc5a: 4563 cmp r3, ip dc5c: bfac ite ge dc5e: 18ed addge r5, r5, r3 dc60: 4465 addlt r5, ip dc62: e7af b.n dbc4 dc64: 1a6d subs r5, r5, r1 dc66: 07b1 lsls r1, r6, #30 dc68: bf44 itt mi dc6a: 1a28 submi r0, r5, r0 dc6c: 60a0 strmi r0, [r4, #8] dc6e: 07f1 lsls r1, r6, #31 dc70: bf44 itt mi dc72: 1a9b submi r3, r3, r2 dc74: 1aeb submi r3, r5, r3 dc76: 4415 add r5, r2 dc78: bf48 it mi dc7a: 6063 strmi r3, [r4, #4] dc7c: 6025 str r5, [r4, #0] dc7e: f026 0620 bic.w r6, r6, #32 dc82: e7c0 b.n dc06 dc84: 00100003 .word 0x00100003 0000dc88 : dc88: 68c3 ldr r3, [r0, #12] dc8a: 079a lsls r2, r3, #30 dc8c: d105 bne.n dc9a dc8e: 4b0f ldr r3, [pc, #60] ; (dccc ) dc90: 2221 movs r2, #33 ; 0x21 dc92: 601a str r2, [r3, #0] dc94: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff dc98: 4770 bx lr dc9a: f003 0220 and.w r2, r3, #32 dc9e: 031b lsls r3, r3, #12 dca0: d50a bpl.n dcb8 dca2: b112 cbz r2, dcaa dca4: 6a80 ldr r0, [r0, #40] ; 0x28 dca6: 3801 subs r0, #1 dca8: 4770 bx lr dcaa: 6803 ldr r3, [r0, #0] dcac: 6982 ldr r2, [r0, #24] dcae: 6900 ldr r0, [r0, #16] dcb0: 4413 add r3, r2 dcb2: 1a1b subs r3, r3, r0 dcb4: 1e58 subs r0, r3, #1 dcb6: 4770 bx lr dcb8: b10a cbz r2, dcbe dcba: 6a80 ldr r0, [r0, #40] ; 0x28 dcbc: 4770 bx lr dcbe: 6803 ldr r3, [r0, #0] dcc0: 6982 ldr r2, [r0, #24] dcc2: 6900 ldr r0, [r0, #16] dcc4: 4413 add r3, r2 dcc6: 1a18 subs r0, r3, r0 dcc8: 4770 bx lr dcca: bf00 nop dccc: 200012dc .word 0x200012dc 0000dcd0 <_initio>: dcd0: b510 push {r4, lr} dcd2: 4a17 ldr r2, [pc, #92] ; (dd30 <_initio+0x60>) dcd4: 4917 ldr r1, [pc, #92] ; (dd34 <_initio+0x64>) dcd6: 2000 movs r0, #0 dcd8: f004 f9da bl 12090 <_fdopen> dcdc: f44f 7380 mov.w r3, #256 ; 0x100 dce0: f44f 6280 mov.w r2, #1024 ; 0x400 dce4: 2100 movs r1, #0 dce6: 4812 ldr r0, [pc, #72] ; (dd30 <_initio+0x60>) dce8: f000 fe7c bl e9e4 dcec: 4a12 ldr r2, [pc, #72] ; (dd38 <_initio+0x68>) dcee: 4913 ldr r1, [pc, #76] ; (dd3c <_initio+0x6c>) dcf0: 2001 movs r0, #1 dcf2: f004 f9cd bl 12090 <_fdopen> dcf6: f44f 7380 mov.w r3, #256 ; 0x100 dcfa: f44f 6280 mov.w r2, #1024 ; 0x400 dcfe: 2100 movs r1, #0 dd00: 480d ldr r0, [pc, #52] ; (dd38 <_initio+0x68>) dd02: f000 fe6f bl e9e4 dd06: 4b0e ldr r3, [pc, #56] ; (dd40 <_initio+0x70>) dd08: 681b ldr r3, [r3, #0] dd0a: 2b02 cmp r3, #2 dd0c: dd0e ble.n dd2c <_initio+0x5c> dd0e: 4a0d ldr r2, [pc, #52] ; (dd44 <_initio+0x74>) dd10: 490a ldr r1, [pc, #40] ; (dd3c <_initio+0x6c>) dd12: 2002 movs r0, #2 dd14: f004 f9bc bl 12090 <_fdopen> dd18: f44f 7380 mov.w r3, #256 ; 0x100 dd1c: f44f 6280 mov.w r2, #1024 ; 0x400 dd20: 2100 movs r1, #0 dd22: 4808 ldr r0, [pc, #32] ; (dd44 <_initio+0x74>) dd24: e8bd 4010 ldmia.w sp!, {r4, lr} dd28: f000 be5c b.w e9e4 dd2c: bd10 pop {r4, pc} dd2e: bf00 nop dd30: 20001220 .word 0x20001220 dd34: 000131e1 .word 0x000131e1 dd38: 2000125c .word 0x2000125c dd3c: 000131e3 .word 0x000131e3 dd40: 000131b0 .word 0x000131b0 dd44: 20001298 .word 0x20001298 0000dd48 <__vfprintf>: dd48: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} dd4c: b09f sub sp, #124 ; 0x7c dd4e: e9cd 230a strd r2, r3, [sp, #40] ; 0x28 dd52: f8dd b0a4 ldr.w fp, [sp, #164] ; 0xa4 dd56: 2300 movs r3, #0 dd58: 4605 mov r5, r0 dd5a: 930c str r3, [sp, #48] ; 0x30 dd5c: f8dd 80a0 ldr.w r8, [sp, #160] ; 0xa0 dd60: f818 0b01 ldrb.w r0, [r8], #1 dd64: b918 cbnz r0, dd6e <__vfprintf+0x26> dd66: 980c ldr r0, [sp, #48] ; 0x30 dd68: b01f add sp, #124 ; 0x7c dd6a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} dd6e: 2825 cmp r0, #37 ; 0x25 dd70: d01a beq.n dda8 <__vfprintf+0x60> dd72: 9b0c ldr r3, [sp, #48] ; 0x30 dd74: e9dd 670a ldrd r6, r7, [sp, #40] ; 0x28 dd78: 4619 mov r1, r3 dd7a: 17da asrs r2, r3, #31 dd7c: 1c5c adds r4, r3, #1 dd7e: 42b1 cmp r1, r6 dd80: 4613 mov r3, r2 dd82: 41bb sbcs r3, r7 dd84: da08 bge.n dd98 <__vfprintf+0x50> dd86: 68ab ldr r3, [r5, #8] dd88: 3b01 subs r3, #1 dd8a: 2b00 cmp r3, #0 dd8c: 60ab str r3, [r5, #8] dd8e: db07 blt.n dda0 <__vfprintf+0x58> dd90: 682b ldr r3, [r5, #0] dd92: 1c5a adds r2, r3, #1 dd94: 602a str r2, [r5, #0] dd96: 7018 strb r0, [r3, #0] dd98: 940c str r4, [sp, #48] ; 0x30 dd9a: f8cd 80a0 str.w r8, [sp, #160] ; 0xa0 dd9e: e7dd b.n dd5c <__vfprintf+0x14> dda0: 4629 mov r1, r5 dda2: f004 f856 bl 11e52 <__flsbuf> dda6: e7f7 b.n dd98 <__vfprintf+0x50> dda8: 2400 movs r4, #0 ddaa: e00a b.n ddc2 <__vfprintf+0x7a> ddac: 2f2d cmp r7, #45 ; 0x2d ddae: d004 beq.n ddba <__vfprintf+0x72> ddb0: 2f30 cmp r7, #48 ; 0x30 ddb2: d111 bne.n ddd8 <__vfprintf+0x90> ddb4: f444 7400 orr.w r4, r4, #512 ; 0x200 ddb8: e001 b.n ddbe <__vfprintf+0x76> ddba: f044 0401 orr.w r4, r4, #1 ddbe: f8dd 801c ldr.w r8, [sp, #28] ddc2: 4643 mov r3, r8 ddc4: f813 7b01 ldrb.w r7, [r3], #1 ddc8: 9307 str r3, [sp, #28] ddca: 2f2b cmp r7, #43 ; 0x2b ddcc: d014 beq.n ddf8 <__vfprintf+0xb0> ddce: d8ed bhi.n ddac <__vfprintf+0x64> ddd0: 2f20 cmp r7, #32 ddd2: d014 beq.n ddfe <__vfprintf+0xb6> ddd4: 2f23 cmp r7, #35 ; 0x23 ddd6: d015 beq.n de04 <__vfprintf+0xbc> ddd8: 2f2a cmp r7, #42 ; 0x2a ddda: d016 beq.n de0a <__vfprintf+0xc2> dddc: 2300 movs r3, #0 ddde: 210a movs r1, #10 dde0: f1a7 0230 sub.w r2, r7, #48 ; 0x30 dde4: b2d0 uxtb r0, r2 dde6: 2809 cmp r0, #9 dde8: d81d bhi.n de26 <__vfprintf+0xde> ddea: fb01 2303 mla r3, r1, r3, r2 ddee: 9a07 ldr r2, [sp, #28] ddf0: f812 7b01 ldrb.w r7, [r2], #1 ddf4: 9207 str r2, [sp, #28] ddf6: e7f3 b.n dde0 <__vfprintf+0x98> ddf8: f044 0402 orr.w r4, r4, #2 ddfc: e7df b.n ddbe <__vfprintf+0x76> ddfe: f044 0404 orr.w r4, r4, #4 de02: e7dc b.n ddbe <__vfprintf+0x76> de04: f044 0408 orr.w r4, r4, #8 de08: e7d9 b.n ddbe <__vfprintf+0x76> de0a: 465e mov r6, fp de0c: 9a07 ldr r2, [sp, #28] de0e: f856 3b04 ldr.w r3, [r6], #4 de12: 7817 ldrb r7, [r2, #0] de14: 2b00 cmp r3, #0 de16: f108 0202 add.w r2, r8, #2 de1a: bfbc itt lt de1c: 425b neglt r3, r3 de1e: f084 0401 eorlt.w r4, r4, #1 de22: 46b3 mov fp, r6 de24: 9207 str r2, [sp, #28] de26: 2f2e cmp r7, #46 ; 0x2e de28: ea23 79e3 bic.w r9, r3, r3, asr #31 de2c: d13d bne.n deaa <__vfprintf+0x162> de2e: 9b07 ldr r3, [sp, #28] de30: 781f ldrb r7, [r3, #0] de32: 2f2a cmp r7, #42 ; 0x2a de34: d010 beq.n de58 <__vfprintf+0x110> de36: 3301 adds r3, #1 de38: 9307 str r3, [sp, #28] de3a: f04f 0800 mov.w r8, #0 de3e: 220a movs r2, #10 de40: f1a7 0330 sub.w r3, r7, #48 ; 0x30 de44: b2d9 uxtb r1, r3 de46: 2909 cmp r1, #9 de48: d80e bhi.n de68 <__vfprintf+0x120> de4a: fb02 3808 mla r8, r2, r8, r3 de4e: 9b07 ldr r3, [sp, #28] de50: f813 7b01 ldrb.w r7, [r3], #1 de54: 9307 str r3, [sp, #28] de56: e7f3 b.n de40 <__vfprintf+0xf8> de58: 465e mov r6, fp de5a: 9b07 ldr r3, [sp, #28] de5c: f856 8b04 ldr.w r8, [r6], #4 de60: 785f ldrb r7, [r3, #1] de62: 3302 adds r3, #2 de64: 46b3 mov fp, r6 de66: 9307 str r3, [sp, #28] de68: f1b8 0f00 cmp.w r8, #0 de6c: db1d blt.n deaa <__vfprintf+0x162> de6e: f044 0410 orr.w r4, r4, #16 de72: 2f6c cmp r7, #108 ; 0x6c de74: d10e bne.n de94 <__vfprintf+0x14c> de76: 9b07 ldr r3, [sp, #28] de78: 781f ldrb r7, [r3, #0] de7a: 2f6c cmp r7, #108 ; 0x6c de7c: bf15 itete ne de7e: 9b07 ldrne r3, [sp, #28] de80: 785f ldrbeq r7, [r3, #1] de82: 3301 addne r3, #1 de84: 3302 addeq r3, #2 de86: bf07 ittee eq de88: f044 0460 orreq.w r4, r4, #96 ; 0x60 de8c: 9307 streq r3, [sp, #28] de8e: 9307 strne r3, [sp, #28] de90: f044 0420 orrne.w r4, r4, #32 de94: 2f4c cmp r7, #76 ; 0x4c de96: d001 beq.n de9c <__vfprintf+0x154> de98: 2f71 cmp r7, #113 ; 0x71 de9a: d109 bne.n deb0 <__vfprintf+0x168> de9c: 9b07 ldr r3, [sp, #28] de9e: f813 7b01 ldrb.w r7, [r3], #1 dea2: f044 0460 orr.w r4, r4, #96 ; 0x60 dea6: 9307 str r3, [sp, #28] dea8: e012 b.n ded0 <__vfprintf+0x188> deaa: f04f 0800 mov.w r8, #0 deae: e7e0 b.n de72 <__vfprintf+0x12a> deb0: 2f68 cmp r7, #104 ; 0x68 deb2: d162 bne.n df7a <__vfprintf+0x232> deb4: 9b07 ldr r3, [sp, #28] deb6: 781f ldrb r7, [r3, #0] deb8: 2f68 cmp r7, #104 ; 0x68 deba: d104 bne.n dec6 <__vfprintf+0x17e> debc: 785f ldrb r7, [r3, #1] debe: f444 7480 orr.w r4, r4, #256 ; 0x100 dec2: 3302 adds r3, #2 dec4: e7ef b.n dea6 <__vfprintf+0x15e> dec6: 9b07 ldr r3, [sp, #28] dec8: 3301 adds r3, #1 deca: 9307 str r3, [sp, #28] decc: f044 0480 orr.w r4, r4, #128 ; 0x80 ded0: 2f67 cmp r7, #103 ; 0x67 ded2: f300 80af bgt.w e034 <__vfprintf+0x2ec> ded6: 2f65 cmp r7, #101 ; 0x65 ded8: f280 830d bge.w e4f6 <__vfprintf+0x7ae> dedc: 2f47 cmp r7, #71 ; 0x47 dede: f000 830a beq.w e4f6 <__vfprintf+0x7ae> dee2: dc57 bgt.n df94 <__vfprintf+0x24c> dee4: 2f41 cmp r7, #65 ; 0x41 dee6: f000 8300 beq.w e4ea <__vfprintf+0x7a2> deea: 2f45 cmp r7, #69 ; 0x45 deec: f000 8303 beq.w e4f6 <__vfprintf+0x7ae> def0: 2f00 cmp r7, #0 def2: f000 813f beq.w e174 <__vfprintf+0x42c> def6: f014 0601 ands.w r6, r4, #1 defa: f109 3aff add.w sl, r9, #4294967295 ; 0xffffffff defe: d10f bne.n df20 <__vfprintf+0x1d8> df00: 9b0c ldr r3, [sp, #48] ; 0x30 df02: f414 7f00 tst.w r4, #512 ; 0x200 df06: bf14 ite ne df08: 2430 movne r4, #48 ; 0x30 df0a: 2420 moveq r4, #32 df0c: 4698 mov r8, r3 df0e: ea4f 79e3 mov.w r9, r3, asr #31 df12: 9b0c ldr r3, [sp, #48] ; 0x30 df14: f1ba 0a01 subs.w sl, sl, #1 df18: f103 0301 add.w r3, r3, #1 df1c: f140 80f0 bpl.w e100 <__vfprintf+0x3b8> df20: 9b0c ldr r3, [sp, #48] ; 0x30 df22: 4619 mov r1, r3 df24: 17da asrs r2, r3, #31 df26: 1c5c adds r4, r3, #1 df28: 4613 mov r3, r2 df2a: 460a mov r2, r1 df2c: e9dd 010a ldrd r0, r1, [sp, #40] ; 0x28 df30: 4282 cmp r2, r0 df32: 418b sbcs r3, r1 df34: da09 bge.n df4a <__vfprintf+0x202> df36: 68ab ldr r3, [r5, #8] df38: 3b01 subs r3, #1 df3a: 2b00 cmp r3, #0 df3c: 60ab str r3, [r5, #8] df3e: f2c0 80fb blt.w e138 <__vfprintf+0x3f0> df42: 682b ldr r3, [r5, #0] df44: 1c5a adds r2, r3, #1 df46: 602a str r2, [r5, #0] df48: 701f strb r7, [r3, #0] df4a: 2e00 cmp r6, #0 df4c: f000 84e8 beq.w e920 <__vfprintf+0xbd8> df50: 4626 mov r6, r4 df52: 17e7 asrs r7, r4, #31 df54: 46d0 mov r8, sl df56: f04f 0920 mov.w r9, #32 df5a: f1b8 0801 subs.w r8, r8, #1 df5e: f140 80f0 bpl.w e142 <__vfprintf+0x3fa> df62: 4623 mov r3, r4 df64: f1ba 0f00 cmp.w sl, #0 df68: bfa8 it ge df6a: 4453 addge r3, sl df6c: 930c str r3, [sp, #48] ; 0x30 df6e: 465e mov r6, fp df70: 46b3 mov fp, r6 df72: 9c0c ldr r4, [sp, #48] ; 0x30 df74: f8dd 801c ldr.w r8, [sp, #28] df78: e70e b.n dd98 <__vfprintf+0x50> df7a: 2f6a cmp r7, #106 ; 0x6a df7c: d105 bne.n df8a <__vfprintf+0x242> df7e: f044 0440 orr.w r4, r4, #64 ; 0x40 df82: 9b07 ldr r3, [sp, #28] df84: f813 7b01 ldrb.w r7, [r3], #1 df88: e78d b.n dea6 <__vfprintf+0x15e> df8a: 2f7a cmp r7, #122 ; 0x7a df8c: d0f9 beq.n df82 <__vfprintf+0x23a> df8e: 2f74 cmp r7, #116 ; 0x74 df90: d19e bne.n ded0 <__vfprintf+0x188> df92: e7f6 b.n df82 <__vfprintf+0x23a> df94: 2f61 cmp r7, #97 ; 0x61 df96: f000 82a8 beq.w e4ea <__vfprintf+0x7a2> df9a: dc21 bgt.n dfe0 <__vfprintf+0x298> df9c: 2f58 cmp r7, #88 ; 0x58 df9e: d1aa bne.n def6 <__vfprintf+0x1ae> dfa0: 0661 lsls r1, r4, #25 dfa2: f140 8156 bpl.w e252 <__vfprintf+0x50a> dfa6: f10b 0607 add.w r6, fp, #7 dfaa: f026 0607 bic.w r6, r6, #7 dfae: e8f6 2302 ldrd r2, r3, [r6], #8 dfb2: e9cd 2304 strd r2, r3, [sp, #16] dfb6: f014 0180 ands.w r1, r4, #128 ; 0x80 dfba: f000 8152 beq.w e262 <__vfprintf+0x51a> dfbe: f8bd 1010 ldrh.w r1, [sp, #16] dfc2: 9104 str r1, [sp, #16] dfc4: 2300 movs r3, #0 dfc6: 9305 str r3, [sp, #20] dfc8: 49b9 ldr r1, [pc, #740] ; (e2b0 <__vfprintf+0x568>) dfca: 48ba ldr r0, [pc, #744] ; (e2b4 <__vfprintf+0x56c>) dfcc: f014 0f08 tst.w r4, #8 dfd0: bf08 it eq dfd2: 4608 moveq r0, r1 dfd4: 06e3 lsls r3, r4, #27 dfd6: d501 bpl.n dfdc <__vfprintf+0x294> dfd8: f424 7400 bic.w r4, r4, #512 ; 0x200 dfdc: 49b6 ldr r1, [pc, #728] ; (e2b8 <__vfprintf+0x570>) dfde: e18e b.n e2fe <__vfprintf+0x5b6> dfe0: 2f63 cmp r7, #99 ; 0x63 dfe2: f000 8088 beq.w e0f6 <__vfprintf+0x3ae> dfe6: 2f64 cmp r7, #100 ; 0x64 dfe8: d185 bne.n def6 <__vfprintf+0x1ae> dfea: 0666 lsls r6, r4, #25 dfec: bf55 itete pl dfee: 465e movpl r6, fp dff0: f10b 0607 addmi.w r6, fp, #7 dff4: f856 2b04 ldrpl.w r2, [r6], #4 dff8: f026 0607 bicmi.w r6, r6, #7 dffc: bf4c ite mi dffe: e8f6 2302 ldrdmi r2, r3, [r6], #8 e002: 17d3 asrpl r3, r2, #31 e004: 0620 lsls r0, r4, #24 e006: f140 8261 bpl.w e4cc <__vfprintf+0x784> e00a: b212 sxth r2, r2 e00c: 17d3 asrs r3, r2, #31 e00e: 2a00 cmp r2, #0 e010: f173 0100 sbcs.w r1, r3, #0 e014: f280 825f bge.w e4d6 <__vfprintf+0x78e> e018: 4252 negs r2, r2 e01a: eb63 0343 sbc.w r3, r3, r3, lsl #1 e01e: e9cd 2304 strd r2, r3, [sp, #16] e022: 48a6 ldr r0, [pc, #664] ; (e2bc <__vfprintf+0x574>) e024: f014 0110 ands.w r1, r4, #16 e028: f000 8169 beq.w e2fe <__vfprintf+0x5b6> e02c: f424 7400 bic.w r4, r4, #512 ; 0x200 e030: 2100 movs r1, #0 e032: e164 b.n e2fe <__vfprintf+0x5b6> e034: 2f70 cmp r7, #112 ; 0x70 e036: f000 8159 beq.w e2ec <__vfprintf+0x5a4> e03a: dc06 bgt.n e04a <__vfprintf+0x302> e03c: 2f6e cmp r7, #110 ; 0x6e e03e: f000 809d beq.w e17c <__vfprintf+0x434> e042: f300 81f0 bgt.w e426 <__vfprintf+0x6de> e046: 2f69 cmp r7, #105 ; 0x69 e048: e7ce b.n dfe8 <__vfprintf+0x2a0> e04a: 2f75 cmp r7, #117 ; 0x75 e04c: f000 8214 beq.w e478 <__vfprintf+0x730> e050: 2f78 cmp r7, #120 ; 0x78 e052: f000 810f beq.w e274 <__vfprintf+0x52c> e056: 2f73 cmp r7, #115 ; 0x73 e058: f47f af4d bne.w def6 <__vfprintf+0x1ae> e05c: 465e mov r6, fp e05e: 4b98 ldr r3, [pc, #608] ; (e2c0 <__vfprintf+0x578>) e060: f856 ab04 ldr.w sl, [r6], #4 e064: f1ba 0f00 cmp.w sl, #0 e068: bf08 it eq e06a: 469a moveq sl, r3 e06c: 4650 mov r0, sl e06e: f003 ffe9 bl 12044 e072: 4683 mov fp, r0 e074: 06e0 lsls r0, r4, #27 e076: d502 bpl.n e07e <__vfprintf+0x336> e078: 45c3 cmp fp, r8 e07a: bfa8 it ge e07c: 46c3 movge fp, r8 e07e: f014 0301 ands.w r3, r4, #1 e082: eba9 070b sub.w r7, r9, fp e086: 9304 str r3, [sp, #16] e088: d113 bne.n e0b2 <__vfprintf+0x36a> e08a: 9a0c ldr r2, [sp, #48] ; 0x30 e08c: f414 7f00 tst.w r4, #512 ; 0x200 e090: bf14 ite ne e092: 2330 movne r3, #48 ; 0x30 e094: 2320 moveq r3, #32 e096: 4690 mov r8, r2 e098: ea4f 79e2 mov.w r9, r2, asr #31 e09c: 463c mov r4, r7 e09e: 3c01 subs r4, #1 e0a0: f140 8084 bpl.w e1ac <__vfprintf+0x464> e0a4: 9a0c ldr r2, [sp, #48] ; 0x30 e0a6: ea27 73e7 bic.w r3, r7, r7, asr #31 e0aa: 441a add r2, r3 e0ac: 3f01 subs r7, #1 e0ae: 920c str r2, [sp, #48] ; 0x30 e0b0: 1aff subs r7, r7, r3 e0b2: 9b0c ldr r3, [sp, #48] ; 0x30 e0b4: 2400 movs r4, #0 e0b6: 4698 mov r8, r3 e0b8: ea4f 79e3 mov.w r9, r3, asr #31 e0bc: 455c cmp r4, fp e0be: f2c0 8090 blt.w e1e2 <__vfprintf+0x49a> e0c2: 9b0c ldr r3, [sp, #48] ; 0x30 e0c4: f1bb 0f00 cmp.w fp, #0 e0c8: bfa8 it ge e0ca: 445b addge r3, fp e0cc: 930c str r3, [sp, #48] ; 0x30 e0ce: 9b04 ldr r3, [sp, #16] e0d0: 2b00 cmp r3, #0 e0d2: f43f af4d beq.w df70 <__vfprintf+0x228> e0d6: 9b0c ldr r3, [sp, #48] ; 0x30 e0d8: 463c mov r4, r7 e0da: 4698 mov r8, r3 e0dc: ea4f 79e3 mov.w r9, r3, asr #31 e0e0: f04f 0a20 mov.w sl, #32 e0e4: 3c01 subs r4, #1 e0e6: f140 809a bpl.w e21e <__vfprintf+0x4d6> e0ea: 9b0c ldr r3, [sp, #48] ; 0x30 e0ec: 2f00 cmp r7, #0 e0ee: bfa8 it ge e0f0: 19db addge r3, r3, r7 e0f2: 930c str r3, [sp, #48] ; 0x30 e0f4: e73c b.n df70 <__vfprintf+0x228> e0f6: 465e mov r6, fp e0f8: f856 7b04 ldr.w r7, [r6], #4 e0fc: 46b3 mov fp, r6 e0fe: e6fa b.n def6 <__vfprintf+0x1ae> e100: e9dd 120a ldrd r1, r2, [sp, #40] ; 0x28 e104: 4588 cmp r8, r1 e106: eb79 0202 sbcs.w r2, r9, r2 e10a: da08 bge.n e11e <__vfprintf+0x3d6> e10c: 68aa ldr r2, [r5, #8] e10e: 3a01 subs r2, #1 e110: 2a00 cmp r2, #0 e112: 60aa str r2, [r5, #8] e114: db09 blt.n e12a <__vfprintf+0x3e2> e116: 682a ldr r2, [r5, #0] e118: 1c51 adds r1, r2, #1 e11a: 6029 str r1, [r5, #0] e11c: 7014 strb r4, [r2, #0] e11e: f118 0801 adds.w r8, r8, #1 e122: f149 0900 adc.w r9, r9, #0 e126: 930c str r3, [sp, #48] ; 0x30 e128: e6f3 b.n df12 <__vfprintf+0x1ca> e12a: 4629 mov r1, r5 e12c: 4620 mov r0, r4 e12e: 9304 str r3, [sp, #16] e130: f003 fe8f bl 11e52 <__flsbuf> e134: 9b04 ldr r3, [sp, #16] e136: e7f2 b.n e11e <__vfprintf+0x3d6> e138: 4629 mov r1, r5 e13a: 4638 mov r0, r7 e13c: f003 fe89 bl 11e52 <__flsbuf> e140: e703 b.n df4a <__vfprintf+0x202> e142: e9dd 230a ldrd r2, r3, [sp, #40] ; 0x28 e146: 4296 cmp r6, r2 e148: eb77 0303 sbcs.w r3, r7, r3 e14c: da09 bge.n e162 <__vfprintf+0x41a> e14e: 68ab ldr r3, [r5, #8] e150: 3b01 subs r3, #1 e152: 2b00 cmp r3, #0 e154: 60ab str r3, [r5, #8] e156: db08 blt.n e16a <__vfprintf+0x422> e158: 682b ldr r3, [r5, #0] e15a: 1c5a adds r2, r3, #1 e15c: 602a str r2, [r5, #0] e15e: f883 9000 strb.w r9, [r3] e162: 3601 adds r6, #1 e164: f147 0700 adc.w r7, r7, #0 e168: e6f7 b.n df5a <__vfprintf+0x212> e16a: 4629 mov r1, r5 e16c: 2020 movs r0, #32 e16e: f003 fe70 bl 11e52 <__flsbuf> e172: e7f6 b.n e162 <__vfprintf+0x41a> e174: 9b07 ldr r3, [sp, #28] e176: 3b01 subs r3, #1 e178: 9307 str r3, [sp, #28] e17a: e6f8 b.n df6e <__vfprintf+0x226> e17c: 0660 lsls r0, r4, #25 e17e: f10b 0604 add.w r6, fp, #4 e182: f8db 3000 ldr.w r3, [fp] e186: 9a0c ldr r2, [sp, #48] ; 0x30 e188: d504 bpl.n e194 <__vfprintf+0x44c> e18a: 4610 mov r0, r2 e18c: 17d1 asrs r1, r2, #31 e18e: e9c3 0100 strd r0, r1, [r3] e192: e6ed b.n df70 <__vfprintf+0x228> e194: 06a1 lsls r1, r4, #26 e196: d501 bpl.n e19c <__vfprintf+0x454> e198: 601a str r2, [r3, #0] e19a: e6e9 b.n df70 <__vfprintf+0x228> e19c: 05e7 lsls r7, r4, #23 e19e: d501 bpl.n e1a4 <__vfprintf+0x45c> e1a0: 701a strb r2, [r3, #0] e1a2: e6e5 b.n df70 <__vfprintf+0x228> e1a4: 0624 lsls r4, r4, #24 e1a6: d5f7 bpl.n e198 <__vfprintf+0x450> e1a8: 801a strh r2, [r3, #0] e1aa: e6e1 b.n df70 <__vfprintf+0x228> e1ac: e9dd 120a ldrd r1, r2, [sp, #40] ; 0x28 e1b0: 4588 cmp r8, r1 e1b2: eb79 0202 sbcs.w r2, r9, r2 e1b6: da08 bge.n e1ca <__vfprintf+0x482> e1b8: 68aa ldr r2, [r5, #8] e1ba: 3a01 subs r2, #1 e1bc: 2a00 cmp r2, #0 e1be: 60aa str r2, [r5, #8] e1c0: db08 blt.n e1d4 <__vfprintf+0x48c> e1c2: 682a ldr r2, [r5, #0] e1c4: 1c51 adds r1, r2, #1 e1c6: 6029 str r1, [r5, #0] e1c8: 7013 strb r3, [r2, #0] e1ca: f118 0801 adds.w r8, r8, #1 e1ce: f149 0900 adc.w r9, r9, #0 e1d2: e764 b.n e09e <__vfprintf+0x356> e1d4: 4618 mov r0, r3 e1d6: 4629 mov r1, r5 e1d8: 9308 str r3, [sp, #32] e1da: f003 fe3a bl 11e52 <__flsbuf> e1de: 9b08 ldr r3, [sp, #32] e1e0: e7f3 b.n e1ca <__vfprintf+0x482> e1e2: e9dd 230a ldrd r2, r3, [sp, #40] ; 0x28 e1e6: 4590 cmp r8, r2 e1e8: eb79 0303 sbcs.w r3, r9, r3 e1ec: da0a bge.n e204 <__vfprintf+0x4bc> e1ee: 68ab ldr r3, [r5, #8] e1f0: 3b01 subs r3, #1 e1f2: 2b00 cmp r3, #0 e1f4: 60ab str r3, [r5, #8] e1f6: db0c blt.n e212 <__vfprintf+0x4ca> e1f8: 682b ldr r3, [r5, #0] e1fa: 1c5a adds r2, r3, #1 e1fc: 602a str r2, [r5, #0] e1fe: f81a 2004 ldrb.w r2, [sl, r4] e202: 701a strb r2, [r3, #0] e204: f118 0801 adds.w r8, r8, #1 e208: f104 0401 add.w r4, r4, #1 e20c: f149 0900 adc.w r9, r9, #0 e210: e754 b.n e0bc <__vfprintf+0x374> e212: 4629 mov r1, r5 e214: f81a 0004 ldrb.w r0, [sl, r4] e218: f003 fe1b bl 11e52 <__flsbuf> e21c: e7f2 b.n e204 <__vfprintf+0x4bc> e21e: e9dd 230a ldrd r2, r3, [sp, #40] ; 0x28 e222: 4590 cmp r8, r2 e224: eb79 0303 sbcs.w r3, r9, r3 e228: da09 bge.n e23e <__vfprintf+0x4f6> e22a: 68ab ldr r3, [r5, #8] e22c: 3b01 subs r3, #1 e22e: 2b00 cmp r3, #0 e230: 60ab str r3, [r5, #8] e232: db09 blt.n e248 <__vfprintf+0x500> e234: 682b ldr r3, [r5, #0] e236: 1c5a adds r2, r3, #1 e238: 602a str r2, [r5, #0] e23a: f883 a000 strb.w sl, [r3] e23e: f118 0801 adds.w r8, r8, #1 e242: f149 0900 adc.w r9, r9, #0 e246: e74d b.n e0e4 <__vfprintf+0x39c> e248: 4629 mov r1, r5 e24a: 2020 movs r0, #32 e24c: f003 fe01 bl 11e52 <__flsbuf> e250: e7f5 b.n e23e <__vfprintf+0x4f6> e252: 465e mov r6, fp e254: 2100 movs r1, #0 e256: f856 2b04 ldr.w r2, [r6], #4 e25a: 4610 mov r0, r2 e25c: e9cd 0104 strd r0, r1, [sp, #16] e260: e6a9 b.n dfb6 <__vfprintf+0x26e> e262: 05e2 lsls r2, r4, #23 e264: f57f aeb0 bpl.w dfc8 <__vfprintf+0x280> e268: 9b04 ldr r3, [sp, #16] e26a: f003 00ff and.w r0, r3, #255 ; 0xff e26e: e9cd 0104 strd r0, r1, [sp, #16] e272: e6a9 b.n dfc8 <__vfprintf+0x280> e274: 0661 lsls r1, r4, #25 e276: d529 bpl.n e2cc <__vfprintf+0x584> e278: f10b 0607 add.w r6, fp, #7 e27c: f026 0607 bic.w r6, r6, #7 e280: e8f6 2302 ldrd r2, r3, [r6], #8 e284: e9cd 2304 strd r2, r3, [sp, #16] e288: f014 0180 ands.w r1, r4, #128 ; 0x80 e28c: d026 beq.n e2dc <__vfprintf+0x594> e28e: f8bd 1010 ldrh.w r1, [sp, #16] e292: 9104 str r1, [sp, #16] e294: 2300 movs r3, #0 e296: 9305 str r3, [sp, #20] e298: 4905 ldr r1, [pc, #20] ; (e2b0 <__vfprintf+0x568>) e29a: 480a ldr r0, [pc, #40] ; (e2c4 <__vfprintf+0x57c>) e29c: f014 0f08 tst.w r4, #8 e2a0: bf08 it eq e2a2: 4608 moveq r0, r1 e2a4: 06e3 lsls r3, r4, #27 e2a6: d501 bpl.n e2ac <__vfprintf+0x564> e2a8: f424 7400 bic.w r4, r4, #512 ; 0x200 e2ac: 4906 ldr r1, [pc, #24] ; (e2c8 <__vfprintf+0x580>) e2ae: e026 b.n e2fe <__vfprintf+0x5b6> e2b0: 000131e0 .word 0x000131e0 e2b4: 000131ec .word 0x000131ec e2b8: 000131f8 .word 0x000131f8 e2bc: 000131f4 .word 0x000131f4 e2c0: 000131e5 .word 0x000131e5 e2c4: 000131ef .word 0x000131ef e2c8: 00013209 .word 0x00013209 e2cc: 465e mov r6, fp e2ce: 2100 movs r1, #0 e2d0: f856 2b04 ldr.w r2, [r6], #4 e2d4: 4610 mov r0, r2 e2d6: e9cd 0104 strd r0, r1, [sp, #16] e2da: e7d5 b.n e288 <__vfprintf+0x540> e2dc: 05e2 lsls r2, r4, #23 e2de: d5db bpl.n e298 <__vfprintf+0x550> e2e0: 9b04 ldr r3, [sp, #16] e2e2: f003 00ff and.w r0, r3, #255 ; 0xff e2e6: e9cd 0104 strd r0, r1, [sp, #16] e2ea: e7d5 b.n e298 <__vfprintf+0x550> e2ec: 465e mov r6, fp e2ee: 2100 movs r1, #0 e2f0: f856 2b04 ldr.w r2, [r6], #4 e2f4: 4610 mov r0, r2 e2f6: e9cd 0104 strd r0, r1, [sp, #16] e2fa: 49ae ldr r1, [pc, #696] ; (e5b4 <__vfprintf+0x86c>) e2fc: 48ae ldr r0, [pc, #696] ; (e5b8 <__vfprintf+0x870>) e2fe: 9b0c ldr r3, [sp, #48] ; 0x30 e300: e9dd ab0a ldrd sl, fp, [sp, #40] ; 0x28 e304: ebba 0a03 subs.w sl, sl, r3 e308: eb6b 7be3 sbc.w fp, fp, r3, asr #31 e30c: e9cd ab08 strd sl, fp, [sp, #32] e310: e9cd 8010 strd r8, r0, [sp, #64] ; 0x40 e314: f10d 0c58 add.w ip, sp, #88 ; 0x58 e318: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff e31c: e9cd 0012 strd r0, r0, [sp, #72] ; 0x48 e320: 46e6 mov lr, ip e322: 2000 movs r0, #0 e324: f04f 0855 mov.w r8, #85 ; 0x55 e328: 3001 adds r0, #1 e32a: 2820 cmp r0, #32 e32c: f80e 8b01 strb.w r8, [lr], #1 e330: d1fa bne.n e328 <__vfprintf+0x5e0> e332: f414 6f82 tst.w r4, #1040 ; 0x410 e336: bf04 itt eq e338: 2001 moveq r0, #1 e33a: 9010 streq r0, [sp, #64] ; 0x40 e33c: 2f67 cmp r7, #103 ; 0x67 e33e: f300 8113 bgt.w e568 <__vfprintf+0x820> e342: 2f65 cmp r7, #101 ; 0x65 e344: f280 81aa bge.w e69c <__vfprintf+0x954> e348: 2f47 cmp r7, #71 ; 0x47 e34a: f000 81a7 beq.w e69c <__vfprintf+0x954> e34e: f300 80eb bgt.w e528 <__vfprintf+0x7e0> e352: 2f41 cmp r7, #65 ; 0x41 e354: f000 81a2 beq.w e69c <__vfprintf+0x954> e358: 2f45 cmp r7, #69 ; 0x45 e35a: f000 819f beq.w e69c <__vfprintf+0x954> e35e: 2700 movs r7, #0 e360: f414 6380 ands.w r3, r4, #1024 ; 0x400 e364: 930d str r3, [sp, #52] ; 0x34 e366: f000 81a9 beq.w e6bc <__vfprintf+0x974> e36a: 2300 movs r3, #0 e36c: 9310 str r3, [sp, #64] ; 0x40 e36e: 9b12 ldr r3, [sp, #72] ; 0x48 e370: 2b00 cmp r3, #0 e372: bfc4 itt gt e374: f103 33ff addgt.w r3, r3, #4294967295 ; 0xffffffff e378: 9310 strgt r3, [sp, #64] ; 0x40 e37a: 9b13 ldr r3, [sp, #76] ; 0x4c e37c: 2b00 cmp r3, #0 e37e: dd03 ble.n e388 <__vfprintf+0x640> e380: 9a10 ldr r2, [sp, #64] ; 0x40 e382: 3b01 subs r3, #1 e384: 4413 add r3, r2 e386: 9310 str r3, [sp, #64] ; 0x40 e388: 9b10 ldr r3, [sp, #64] ; 0x40 e38a: 9811 ldr r0, [sp, #68] ; 0x44 e38c: eb07 0a03 add.w sl, r7, r3 e390: f003 fe58 bl 12044 e394: eba9 0a0a sub.w sl, r9, sl e398: ebaa 0300 sub.w r3, sl, r0 e39c: 9304 str r3, [sp, #16] e39e: f004 0301 and.w r3, r4, #1 e3a2: 930e str r3, [sp, #56] ; 0x38 e3a4: f240 2301 movw r3, #513 ; 0x201 e3a8: 421c tst r4, r3 e3aa: f000 81b1 beq.w e710 <__vfprintf+0x9c8> e3ae: f04f 0a00 mov.w sl, #0 e3b2: 46d0 mov r8, sl e3b4: ea4f 79ea mov.w r9, sl, asr #31 e3b8: 9b11 ldr r3, [sp, #68] ; 0x44 e3ba: 1c5a adds r2, r3, #1 e3bc: 9211 str r2, [sp, #68] ; 0x44 e3be: f893 b000 ldrb.w fp, [r3] e3c2: f1bb 0f00 cmp.w fp, #0 e3c6: f040 81ad bne.w e724 <__vfprintf+0x9dc> e3ca: 9b0e ldr r3, [sp, #56] ; 0x38 e3cc: b993 cbnz r3, e3f4 <__vfprintf+0x6ac> e3ce: f414 7f00 tst.w r4, #512 ; 0x200 e3d2: 9c04 ldr r4, [sp, #16] e3d4: bf14 ite ne e3d6: 2330 movne r3, #48 ; 0x30 e3d8: 2320 moveq r3, #32 e3da: 46d0 mov r8, sl e3dc: ea4f 79ea mov.w r9, sl, asr #31 e3e0: 3c01 subs r4, #1 e3e2: f140 81bb bpl.w e75c <__vfprintf+0xa14> e3e6: 9b04 ldr r3, [sp, #16] e3e8: 1e5a subs r2, r3, #1 e3ea: ea23 73e3 bic.w r3, r3, r3, asr #31 e3ee: 1ad2 subs r2, r2, r3 e3f0: 9204 str r2, [sp, #16] e3f2: 449a add sl, r3 e3f4: 9b0d ldr r3, [sp, #52] ; 0x34 e3f6: 2b00 cmp r3, #0 e3f8: f000 81cb beq.w e792 <__vfprintf+0xa4a> e3fc: 2430 movs r4, #48 ; 0x30 e3fe: 455f cmp r7, fp e400: f300 81dd bgt.w e7be <__vfprintf+0xa76> e404: 9b0e ldr r3, [sp, #56] ; 0x38 e406: b15b cbz r3, e420 <__vfprintf+0x6d8> e408: 9c04 ldr r4, [sp, #16] e40a: 46d0 mov r8, sl e40c: ea4f 79ea mov.w r9, sl, asr #31 e410: 2720 movs r7, #32 e412: 3c01 subs r4, #1 e414: f140 826b bpl.w e8ee <__vfprintf+0xba6> e418: 9b04 ldr r3, [sp, #16] e41a: 2b00 cmp r3, #0 e41c: bfa8 it ge e41e: 449a addge sl, r3 e420: 9b0c ldr r3, [sp, #48] ; 0x30 e422: 4453 add r3, sl e424: e665 b.n e0f2 <__vfprintf+0x3aa> e426: 0666 lsls r6, r4, #25 e428: d516 bpl.n e458 <__vfprintf+0x710> e42a: f10b 0607 add.w r6, fp, #7 e42e: f026 0607 bic.w r6, r6, #7 e432: e8f6 2302 ldrd r2, r3, [r6], #8 e436: e9cd 2304 strd r2, r3, [sp, #16] e43a: f014 0180 ands.w r1, r4, #128 ; 0x80 e43e: d013 beq.n e468 <__vfprintf+0x720> e440: f8bd 1010 ldrh.w r1, [sp, #16] e444: 9104 str r1, [sp, #16] e446: 2300 movs r3, #0 e448: 9305 str r3, [sp, #20] e44a: 485c ldr r0, [pc, #368] ; (e5bc <__vfprintf+0x874>) e44c: f014 0f08 tst.w r4, #8 e450: 495b ldr r1, [pc, #364] ; (e5c0 <__vfprintf+0x878>) e452: bf08 it eq e454: 4608 moveq r0, r1 e456: e5e5 b.n e024 <__vfprintf+0x2dc> e458: 465e mov r6, fp e45a: 2100 movs r1, #0 e45c: f856 2b04 ldr.w r2, [r6], #4 e460: 4610 mov r0, r2 e462: e9cd 0104 strd r0, r1, [sp, #16] e466: e7e8 b.n e43a <__vfprintf+0x6f2> e468: 05e0 lsls r0, r4, #23 e46a: d5ee bpl.n e44a <__vfprintf+0x702> e46c: 9b04 ldr r3, [sp, #16] e46e: f003 00ff and.w r0, r3, #255 ; 0xff e472: e9cd 0104 strd r0, r1, [sp, #16] e476: e7e8 b.n e44a <__vfprintf+0x702> e478: 0662 lsls r2, r4, #25 e47a: d517 bpl.n e4ac <__vfprintf+0x764> e47c: f10b 0607 add.w r6, fp, #7 e480: f026 0607 bic.w r6, r6, #7 e484: e8f6 2302 ldrd r2, r3, [r6], #8 e488: e9cd 2304 strd r2, r3, [sp, #16] e48c: f014 0180 ands.w r1, r4, #128 ; 0x80 e490: d014 beq.n e4bc <__vfprintf+0x774> e492: f8bd 1010 ldrh.w r1, [sp, #16] e496: 9104 str r1, [sp, #16] e498: 2300 movs r3, #0 e49a: 9305 str r3, [sp, #20] e49c: f014 0110 ands.w r1, r4, #16 e4a0: d002 beq.n e4a8 <__vfprintf+0x760> e4a2: f424 7400 bic.w r4, r4, #512 ; 0x200 e4a6: 2100 movs r1, #0 e4a8: 4845 ldr r0, [pc, #276] ; (e5c0 <__vfprintf+0x878>) e4aa: e728 b.n e2fe <__vfprintf+0x5b6> e4ac: 465e mov r6, fp e4ae: 2100 movs r1, #0 e4b0: f856 2b04 ldr.w r2, [r6], #4 e4b4: 4610 mov r0, r2 e4b6: e9cd 0104 strd r0, r1, [sp, #16] e4ba: e7e7 b.n e48c <__vfprintf+0x744> e4bc: 05e3 lsls r3, r4, #23 e4be: d5ed bpl.n e49c <__vfprintf+0x754> e4c0: 9b04 ldr r3, [sp, #16] e4c2: f003 00ff and.w r0, r3, #255 ; 0xff e4c6: e9cd 0104 strd r0, r1, [sp, #16] e4ca: e7e7 b.n e49c <__vfprintf+0x754> e4cc: 05e1 lsls r1, r4, #23 e4ce: f57f ad9e bpl.w e00e <__vfprintf+0x2c6> e4d2: b252 sxtb r2, r2 e4d4: e59a b.n e00c <__vfprintf+0x2c4> e4d6: e9cd 2304 strd r2, r3, [sp, #16] e4da: 07a2 lsls r2, r4, #30 e4dc: d403 bmi.n e4e6 <__vfprintf+0x79e> e4de: f014 0f04 tst.w r4, #4 e4e2: 4838 ldr r0, [pc, #224] ; (e5c4 <__vfprintf+0x87c>) e4e4: e7b4 b.n e450 <__vfprintf+0x708> e4e6: 4838 ldr r0, [pc, #224] ; (e5c8 <__vfprintf+0x880>) e4e8: e59c b.n e024 <__vfprintf+0x2dc> e4ea: 06e3 lsls r3, r4, #27 e4ec: bf5c itt pl e4ee: f044 0410 orrpl.w r4, r4, #16 e4f2: f04f 080d movpl.w r8, #13 e4f6: f10b 0607 add.w r6, fp, #7 e4fa: f026 0607 bic.w r6, r6, #7 e4fe: e8f6 2302 ldrd r2, r3, [r6], #8 e502: f014 0f10 tst.w r4, #16 e506: e9cd 2314 strd r2, r3, [sp, #80] ; 0x50 e50a: f04f 0100 mov.w r1, #0 e50e: f04f 0200 mov.w r2, #0 e512: f04f 0300 mov.w r3, #0 e516: bf08 it eq e518: f04f 0806 moveq.w r8, #6 e51c: f444 6480 orr.w r4, r4, #1024 ; 0x400 e520: e9cd 2304 strd r2, r3, [sp, #16] e524: 4608 mov r0, r1 e526: e6ea b.n e2fe <__vfprintf+0x5b6> e528: 2f61 cmp r7, #97 ; 0x61 e52a: f000 80b7 beq.w e69c <__vfprintf+0x954> e52e: 2f64 cmp r7, #100 ; 0x64 e530: f000 80b0 beq.w e694 <__vfprintf+0x94c> e534: 2f58 cmp r7, #88 ; 0x58 e536: f04f 0700 mov.w r7, #0 e53a: f47f af11 bne.w e360 <__vfprintf+0x618> e53e: e9dd 2304 ldrd r2, r3, [sp, #16] e542: 4313 orrs r3, r2 e544: f43f af0c beq.w e360 <__vfprintf+0x618> e548: 9b04 ldr r3, [sp, #16] e54a: f003 000f and.w r0, r3, #15 e54e: 3701 adds r7, #1 e550: 5c08 ldrb r0, [r1, r0] e552: f80c 0b01 strb.w r0, [ip], #1 e556: 0918 lsrs r0, r3, #4 e558: 9b05 ldr r3, [sp, #20] e55a: ea40 7003 orr.w r0, r0, r3, lsl #28 e55e: ea4f 1e13 mov.w lr, r3, lsr #4 e562: e9cd 0e04 strd r0, lr, [sp, #16] e566: e7ea b.n e53e <__vfprintf+0x7f6> e568: 2f70 cmp r7, #112 ; 0x70 e56a: d020 beq.n e5ae <__vfprintf+0x866> e56c: dc1b bgt.n e5a6 <__vfprintf+0x85e> e56e: 2f69 cmp r7, #105 ; 0x69 e570: f000 8090 beq.w e694 <__vfprintf+0x94c> e574: 2f6f cmp r7, #111 ; 0x6f e576: f04f 0700 mov.w r7, #0 e57a: f47f aef1 bne.w e360 <__vfprintf+0x618> e57e: e9dd 2304 ldrd r2, r3, [sp, #16] e582: 4313 orrs r3, r2 e584: f43f aeec beq.w e360 <__vfprintf+0x618> e588: 9b04 ldr r3, [sp, #16] e58a: f003 0107 and.w r1, r3, #7 e58e: 3130 adds r1, #48 ; 0x30 e590: f80c 1b01 strb.w r1, [ip], #1 e594: 08d9 lsrs r1, r3, #3 e596: 9b05 ldr r3, [sp, #20] e598: ea41 7143 orr.w r1, r1, r3, lsl #29 e59c: 08d8 lsrs r0, r3, #3 e59e: 3701 adds r7, #1 e5a0: e9cd 1004 strd r1, r0, [sp, #16] e5a4: e7eb b.n e57e <__vfprintf+0x836> e5a6: 2f75 cmp r7, #117 ; 0x75 e5a8: d074 beq.n e694 <__vfprintf+0x94c> e5aa: 2f78 cmp r7, #120 ; 0x78 e5ac: e7c3 b.n e536 <__vfprintf+0x7ee> e5ae: 2700 movs r7, #0 e5b0: e7c5 b.n e53e <__vfprintf+0x7f6> e5b2: bf00 nop e5b4: 00013209 .word 0x00013209 e5b8: 000131ef .word 0x000131ef e5bc: 000131f2 .word 0x000131f2 e5c0: 000131e0 .word 0x000131e0 e5c4: 000131c7 .word 0x000131c7 e5c8: 000131f6 .word 0x000131f6 e5cc: 9b04 ldr r3, [sp, #16] e5ce: 9a04 ldr r2, [sp, #16] e5d0: 0859 lsrs r1, r3, #1 e5d2: 9b05 ldr r3, [sp, #20] e5d4: ea4f 0e53 mov.w lr, r3, lsr #1 e5d8: ea41 71c3 orr.w r1, r1, r3, lsl #31 e5dc: 9b04 ldr r3, [sp, #16] e5de: ea4f 0893 mov.w r8, r3, lsr #2 e5e2: 9b05 ldr r3, [sp, #20] e5e4: ea48 7883 orr.w r8, r8, r3, lsl #30 e5e8: eb11 0108 adds.w r1, r1, r8 e5ec: ea4f 0093 mov.w r0, r3, lsr #2 e5f0: eb4e 0000 adc.w r0, lr, r0 e5f4: ea4f 1811 mov.w r8, r1, lsr #4 e5f8: ea48 7800 orr.w r8, r8, r0, lsl #28 e5fc: eb11 0108 adds.w r1, r1, r8 e600: ea4f 1e10 mov.w lr, r0, lsr #4 e604: eb40 000e adc.w r0, r0, lr e608: ea4f 2811 mov.w r8, r1, lsr #8 e60c: ea48 6800 orr.w r8, r8, r0, lsl #24 e610: eb11 0108 adds.w r1, r1, r8 e614: ea4f 2e10 mov.w lr, r0, lsr #8 e618: eb40 000e adc.w r0, r0, lr e61c: ea4f 4e11 mov.w lr, r1, lsr #16 e620: ea4e 4e00 orr.w lr, lr, r0, lsl #16 e624: eb11 010e adds.w r1, r1, lr e628: ea4f 4810 mov.w r8, r0, lsr #16 e62c: eb40 0008 adc.w r0, r0, r8 e630: 1809 adds r1, r1, r0 e632: 9b04 ldr r3, [sp, #16] e634: f04f 0e00 mov.w lr, #0 e638: eb40 000e adc.w r0, r0, lr e63c: ea4f 0ed1 mov.w lr, r1, lsr #3 e640: f113 0a06 adds.w sl, r3, #6 e644: ea4e 7e40 orr.w lr, lr, r0, lsl #29 e648: 9b05 ldr r3, [sp, #20] e64a: ea4f 08d0 mov.w r8, r0, lsr #3 e64e: fbae 010b umull r0, r1, lr, fp e652: f143 0300 adc.w r3, r3, #0 e656: fb0b 1108 mla r1, fp, r8, r1 e65a: ebba 0a00 subs.w sl, sl, r0 e65e: eb63 0001 sbc.w r0, r3, r1 e662: ea4f 131a mov.w r3, sl, lsr #4 e666: ea43 7300 orr.w r3, r3, r0, lsl #28 e66a: eb13 0e0e adds.w lr, r3, lr e66e: ea4f 1110 mov.w r1, r0, lsr #4 e672: eb41 0808 adc.w r8, r1, r8 e676: 3230 adds r2, #48 ; 0x30 e678: eb0e 038e add.w r3, lr, lr, lsl #2 e67c: eba2 0243 sub.w r2, r2, r3, lsl #1 e680: e9cd e804 strd lr, r8, [sp, #16] e684: f80c 2b01 strb.w r2, [ip], #1 e688: 3701 adds r7, #1 e68a: e9dd 2304 ldrd r2, r3, [sp, #16] e68e: 4313 orrs r3, r2 e690: d19c bne.n e5cc <__vfprintf+0x884> e692: e665 b.n e360 <__vfprintf+0x618> e694: 2700 movs r7, #0 e696: f04f 0b0a mov.w fp, #10 e69a: e7f6 b.n e68a <__vfprintf+0x942> e69c: ab13 add r3, sp, #76 ; 0x4c e69e: 9303 str r3, [sp, #12] e6a0: ab12 add r3, sp, #72 ; 0x48 e6a2: 9302 str r3, [sp, #8] e6a4: ab10 add r3, sp, #64 ; 0x40 e6a6: 9301 str r3, [sp, #4] e6a8: ab11 add r3, sp, #68 ; 0x44 e6aa: 9300 str r3, [sp, #0] e6ac: 4638 mov r0, r7 e6ae: 4623 mov r3, r4 e6b0: 9f2a ldr r7, [sp, #168] ; 0xa8 e6b2: aa16 add r2, sp, #88 ; 0x58 e6b4: a914 add r1, sp, #80 ; 0x50 e6b6: 47b8 blx r7 e6b8: 4607 mov r7, r0 e6ba: e651 b.n e360 <__vfprintf+0x618> e6bc: 9b10 ldr r3, [sp, #64] ; 0x40 e6be: 9a0d ldr r2, [sp, #52] ; 0x34 e6c0: 1bdb subs r3, r3, r7 e6c2: bf48 it mi e6c4: 4613 movmi r3, r2 e6c6: e65e b.n e386 <__vfprintf+0x63e> e6c8: e9dd 2308 ldrd r2, r3, [sp, #32] e6cc: 4590 cmp r8, r2 e6ce: eb79 0303 sbcs.w r3, r9, r3 e6d2: da09 bge.n e6e8 <__vfprintf+0x9a0> e6d4: 68ab ldr r3, [r5, #8] e6d6: 3b01 subs r3, #1 e6d8: 2b00 cmp r3, #0 e6da: 60ab str r3, [r5, #8] e6dc: db13 blt.n e706 <__vfprintf+0x9be> e6de: 682b ldr r3, [r5, #0] e6e0: 1c5a adds r2, r3, #1 e6e2: 602a str r2, [r5, #0] e6e4: f883 a000 strb.w sl, [r3] e6e8: f118 0801 adds.w r8, r8, #1 e6ec: f149 0900 adc.w r9, r9, #0 e6f0: ebab 0308 sub.w r3, fp, r8 e6f4: 2b00 cmp r3, #0 e6f6: dae7 bge.n e6c8 <__vfprintf+0x980> e6f8: 9b04 ldr r3, [sp, #16] e6fa: ea23 7ae3 bic.w sl, r3, r3, asr #31 e6fe: ebab 030a sub.w r3, fp, sl e702: 9304 str r3, [sp, #16] e704: e655 b.n e3b2 <__vfprintf+0x66a> e706: 4629 mov r1, r5 e708: 2020 movs r0, #32 e70a: f003 fba2 bl 11e52 <__flsbuf> e70e: e7eb b.n e6e8 <__vfprintf+0x9a0> e710: 9b04 ldr r3, [sp, #16] e712: f04f 0800 mov.w r8, #0 e716: f04f 0900 mov.w r9, #0 e71a: f103 3bff add.w fp, r3, #4294967295 ; 0xffffffff e71e: f04f 0a20 mov.w sl, #32 e722: e7e5 b.n e6f0 <__vfprintf+0x9a8> e724: e9dd 2308 ldrd r2, r3, [sp, #32] e728: 4590 cmp r8, r2 e72a: eb79 0303 sbcs.w r3, r9, r3 e72e: f10a 0a01 add.w sl, sl, #1 e732: da09 bge.n e748 <__vfprintf+0xa00> e734: 68ab ldr r3, [r5, #8] e736: 3b01 subs r3, #1 e738: 2b00 cmp r3, #0 e73a: 60ab str r3, [r5, #8] e73c: db09 blt.n e752 <__vfprintf+0xa0a> e73e: 682b ldr r3, [r5, #0] e740: 1c5a adds r2, r3, #1 e742: 602a str r2, [r5, #0] e744: f883 b000 strb.w fp, [r3] e748: f118 0801 adds.w r8, r8, #1 e74c: f149 0900 adc.w r9, r9, #0 e750: e632 b.n e3b8 <__vfprintf+0x670> e752: 4629 mov r1, r5 e754: 4658 mov r0, fp e756: f003 fb7c bl 11e52 <__flsbuf> e75a: e7f5 b.n e748 <__vfprintf+0xa00> e75c: e9dd 1208 ldrd r1, r2, [sp, #32] e760: 4588 cmp r8, r1 e762: eb79 0202 sbcs.w r2, r9, r2 e766: da08 bge.n e77a <__vfprintf+0xa32> e768: 68aa ldr r2, [r5, #8] e76a: 3a01 subs r2, #1 e76c: 2a00 cmp r2, #0 e76e: 60aa str r2, [r5, #8] e770: db08 blt.n e784 <__vfprintf+0xa3c> e772: 682a ldr r2, [r5, #0] e774: 1c51 adds r1, r2, #1 e776: 6029 str r1, [r5, #0] e778: 7013 strb r3, [r2, #0] e77a: f118 0801 adds.w r8, r8, #1 e77e: f149 0900 adc.w r9, r9, #0 e782: e62d b.n e3e0 <__vfprintf+0x698> e784: 4618 mov r0, r3 e786: 4629 mov r1, r5 e788: 930f str r3, [sp, #60] ; 0x3c e78a: f003 fb62 bl 11e52 <__flsbuf> e78e: 9b0f ldr r3, [sp, #60] ; 0x3c e790: e7f3 b.n e77a <__vfprintf+0xa32> e792: 46d0 mov r8, sl e794: ea4f 79ea mov.w r9, sl, asr #31 e798: 2430 movs r4, #48 ; 0x30 e79a: 9b10 ldr r3, [sp, #64] ; 0x40 e79c: 3b01 subs r3, #1 e79e: 2b00 cmp r3, #0 e7a0: 9310 str r3, [sp, #64] ; 0x40 e7a2: da6e bge.n e882 <__vfprintf+0xb3a> e7a4: 46d0 mov r8, sl e7a6: ea4f 79ea mov.w r9, sl, asr #31 e7aa: 463b mov r3, r7 e7ac: 2b00 cmp r3, #0 e7ae: f103 34ff add.w r4, r3, #4294967295 ; 0xffffffff e7b2: f300 8081 bgt.w e8b8 <__vfprintf+0xb70> e7b6: 2f00 cmp r7, #0 e7b8: bfa8 it ge e7ba: 44ba addge sl, r7 e7bc: e622 b.n e404 <__vfprintf+0x6bc> e7be: ab16 add r3, sp, #88 ; 0x58 e7c0: 46d0 mov r8, sl e7c2: f813 000b ldrb.w r0, [r3, fp] e7c6: 283c cmp r0, #60 ; 0x3c e7c8: ea4f 79ea mov.w r9, sl, asr #31 e7cc: d031 beq.n e832 <__vfprintf+0xaea> e7ce: 283e cmp r0, #62 ; 0x3e e7d0: d141 bne.n e856 <__vfprintf+0xb0e> e7d2: 9b13 ldr r3, [sp, #76] ; 0x4c e7d4: 3b01 subs r3, #1 e7d6: 2b00 cmp r3, #0 e7d8: 9313 str r3, [sp, #76] ; 0x4c e7da: db2f blt.n e83c <__vfprintf+0xaf4> e7dc: e9dd 2308 ldrd r2, r3, [sp, #32] e7e0: 4590 cmp r8, r2 e7e2: eb79 0303 sbcs.w r3, r9, r3 e7e6: f10a 0a01 add.w sl, sl, #1 e7ea: da08 bge.n e7fe <__vfprintf+0xab6> e7ec: 68ab ldr r3, [r5, #8] e7ee: 3b01 subs r3, #1 e7f0: 2b00 cmp r3, #0 e7f2: 60ab str r3, [r5, #8] e7f4: db2a blt.n e84c <__vfprintf+0xb04> e7f6: 682b ldr r3, [r5, #0] e7f8: 1c5a adds r2, r3, #1 e7fa: 602a str r2, [r5, #0] e7fc: 701c strb r4, [r3, #0] e7fe: f118 0801 adds.w r8, r8, #1 e802: f149 0900 adc.w r9, r9, #0 e806: e7e4 b.n e7d2 <__vfprintf+0xa8a> e808: e9dd 2308 ldrd r2, r3, [sp, #32] e80c: 4590 cmp r8, r2 e80e: eb79 0303 sbcs.w r3, r9, r3 e812: f10a 0a01 add.w sl, sl, #1 e816: da08 bge.n e82a <__vfprintf+0xae2> e818: 68ab ldr r3, [r5, #8] e81a: 3b01 subs r3, #1 e81c: 2b00 cmp r3, #0 e81e: 60ab str r3, [r5, #8] e820: db0f blt.n e842 <__vfprintf+0xafa> e822: 682b ldr r3, [r5, #0] e824: 1c5a adds r2, r3, #1 e826: 602a str r2, [r5, #0] e828: 701c strb r4, [r3, #0] e82a: f118 0801 adds.w r8, r8, #1 e82e: f149 0900 adc.w r9, r9, #0 e832: 9b12 ldr r3, [sp, #72] ; 0x48 e834: 3b01 subs r3, #1 e836: 2b00 cmp r3, #0 e838: 9312 str r3, [sp, #72] ; 0x48 e83a: dae5 bge.n e808 <__vfprintf+0xac0> e83c: f10b 0b01 add.w fp, fp, #1 e840: e5dd b.n e3fe <__vfprintf+0x6b6> e842: 4629 mov r1, r5 e844: 2030 movs r0, #48 ; 0x30 e846: f003 fb04 bl 11e52 <__flsbuf> e84a: e7ee b.n e82a <__vfprintf+0xae2> e84c: 4629 mov r1, r5 e84e: 2030 movs r0, #48 ; 0x30 e850: f003 faff bl 11e52 <__flsbuf> e854: e7d3 b.n e7fe <__vfprintf+0xab6> e856: e9dd 2308 ldrd r2, r3, [sp, #32] e85a: 4590 cmp r8, r2 e85c: eb79 0303 sbcs.w r3, r9, r3 e860: f10a 0a01 add.w sl, sl, #1 e864: daea bge.n e83c <__vfprintf+0xaf4> e866: 68ab ldr r3, [r5, #8] e868: 3b01 subs r3, #1 e86a: 2b00 cmp r3, #0 e86c: 60ab str r3, [r5, #8] e86e: db04 blt.n e87a <__vfprintf+0xb32> e870: 682b ldr r3, [r5, #0] e872: 1c5a adds r2, r3, #1 e874: 602a str r2, [r5, #0] e876: 7018 strb r0, [r3, #0] e878: e7e0 b.n e83c <__vfprintf+0xaf4> e87a: 4629 mov r1, r5 e87c: f003 fae9 bl 11e52 <__flsbuf> e880: e7dc b.n e83c <__vfprintf+0xaf4> e882: e9dd 2308 ldrd r2, r3, [sp, #32] e886: 4590 cmp r8, r2 e888: eb79 0303 sbcs.w r3, r9, r3 e88c: f10a 0a01 add.w sl, sl, #1 e890: da08 bge.n e8a4 <__vfprintf+0xb5c> e892: 68ab ldr r3, [r5, #8] e894: 3b01 subs r3, #1 e896: 2b00 cmp r3, #0 e898: 60ab str r3, [r5, #8] e89a: db08 blt.n e8ae <__vfprintf+0xb66> e89c: 682b ldr r3, [r5, #0] e89e: 1c5a adds r2, r3, #1 e8a0: 602a str r2, [r5, #0] e8a2: 701c strb r4, [r3, #0] e8a4: f118 0801 adds.w r8, r8, #1 e8a8: f149 0900 adc.w r9, r9, #0 e8ac: e775 b.n e79a <__vfprintf+0xa52> e8ae: 4629 mov r1, r5 e8b0: 2030 movs r0, #48 ; 0x30 e8b2: f003 face bl 11e52 <__flsbuf> e8b6: e7f5 b.n e8a4 <__vfprintf+0xb5c> e8b8: e9dd 2308 ldrd r2, r3, [sp, #32] e8bc: 4590 cmp r8, r2 e8be: eb79 0303 sbcs.w r3, r9, r3 e8c2: da0a bge.n e8da <__vfprintf+0xb92> e8c4: 68ab ldr r3, [r5, #8] e8c6: aa16 add r2, sp, #88 ; 0x58 e8c8: 3b01 subs r3, #1 e8ca: 2b00 cmp r3, #0 e8cc: 60ab str r3, [r5, #8] e8ce: 5d10 ldrb r0, [r2, r4] e8d0: db09 blt.n e8e6 <__vfprintf+0xb9e> e8d2: 682b ldr r3, [r5, #0] e8d4: 1c5a adds r2, r3, #1 e8d6: 602a str r2, [r5, #0] e8d8: 7018 strb r0, [r3, #0] e8da: f118 0801 adds.w r8, r8, #1 e8de: f149 0900 adc.w r9, r9, #0 e8e2: 4623 mov r3, r4 e8e4: e762 b.n e7ac <__vfprintf+0xa64> e8e6: 4629 mov r1, r5 e8e8: f003 fab3 bl 11e52 <__flsbuf> e8ec: e7f5 b.n e8da <__vfprintf+0xb92> e8ee: e9dd 2308 ldrd r2, r3, [sp, #32] e8f2: 4590 cmp r8, r2 e8f4: eb79 0303 sbcs.w r3, r9, r3 e8f8: da08 bge.n e90c <__vfprintf+0xbc4> e8fa: 68ab ldr r3, [r5, #8] e8fc: 3b01 subs r3, #1 e8fe: 2b00 cmp r3, #0 e900: 60ab str r3, [r5, #8] e902: db08 blt.n e916 <__vfprintf+0xbce> e904: 682b ldr r3, [r5, #0] e906: 1c5a adds r2, r3, #1 e908: 602a str r2, [r5, #0] e90a: 701f strb r7, [r3, #0] e90c: f118 0801 adds.w r8, r8, #1 e910: f149 0900 adc.w r9, r9, #0 e914: e57d b.n e412 <__vfprintf+0x6ca> e916: 4629 mov r1, r5 e918: 2020 movs r0, #32 e91a: f003 fa9a bl 11e52 <__flsbuf> e91e: e7f5 b.n e90c <__vfprintf+0xbc4> e920: 465e mov r6, fp e922: 940c str r4, [sp, #48] ; 0x30 e924: f7ff bb24 b.w df70 <__vfprintf+0x228> 0000e928 <_vsnprintf>: e928: b5f0 push {r4, r5, r6, r7, lr} e92a: 460d mov r5, r1 e92c: b095 sub sp, #84 ; 0x54 e92e: 4616 mov r6, r2 e930: 461f mov r7, r3 e932: 4604 mov r4, r0 e934: b910 cbnz r0, e93c <_vsnprintf+0x14> e936: bb31 cbnz r1, e986 <_vsnprintf+0x5e> e938: 2501 movs r5, #1 e93a: ac04 add r4, sp, #16 e93c: 223c movs r2, #60 ; 0x3c e93e: 2100 movs r1, #0 e940: a805 add r0, sp, #20 e942: f003 fa64 bl 11e0e e946: 230a movs r3, #10 e948: 9308 str r3, [sp, #32] e94a: f06f 4300 mvn.w r3, #2147483648 ; 0x80000000 e94e: 9307 str r3, [sp, #28] e950: 4b0e ldr r3, [pc, #56] ; (e98c <_vsnprintf+0x64>) e952: 9405 str r4, [sp, #20] e954: 2400 movs r4, #0 e956: e9cd 7301 strd r7, r3, [sp, #4] e95a: 1e6a subs r2, r5, #1 e95c: 4623 mov r3, r4 e95e: 9600 str r6, [sp, #0] e960: a805 add r0, sp, #20 e962: f7ff f9f1 bl dd48 <__vfprintf> e966: 9b07 ldr r3, [sp, #28] e968: 3b01 subs r3, #1 e96a: 42a3 cmp r3, r4 e96c: 4605 mov r5, r0 e96e: 9307 str r3, [sp, #28] e970: db04 blt.n e97c <_vsnprintf+0x54> e972: 9b05 ldr r3, [sp, #20] e974: 701c strb r4, [r3, #0] e976: 4628 mov r0, r5 e978: b015 add sp, #84 ; 0x54 e97a: bdf0 pop {r4, r5, r6, r7, pc} e97c: a905 add r1, sp, #20 e97e: 4620 mov r0, r4 e980: f003 fa67 bl 11e52 <__flsbuf> e984: e7f7 b.n e976 <_vsnprintf+0x4e> e986: f04f 35ff mov.w r5, #4294967295 ; 0xffffffff e98a: e7f4 b.n e976 <_vsnprintf+0x4e> e98c: 00012041 .word 0x00012041 0000e990 <_printf>: e990: b40f push {r0, r1, r2, r3} e992: b573 push {r0, r1, r4, r5, r6, lr} e994: ab06 add r3, sp, #24 e996: 2101 movs r1, #1 e998: f853 6b04 ldr.w r6, [r3], #4 e99c: 9301 str r3, [sp, #4] e99e: 4632 mov r2, r6 e9a0: 4668 mov r0, sp e9a2: f7ff ffc1 bl e928 <_vsnprintf> e9a6: 1e04 subs r4, r0, #0 e9a8: dd13 ble.n e9d2 <_printf+0x42> e9aa: 1c65 adds r5, r4, #1 e9ac: 4628 mov r0, r5 e9ae: f7ff f877 bl daa0 e9b2: 9000 str r0, [sp, #0] e9b4: b168 cbz r0, e9d2 <_printf+0x42> e9b6: 9b01 ldr r3, [sp, #4] e9b8: 4632 mov r2, r6 e9ba: 4629 mov r1, r5 e9bc: f7ff ffb4 bl e928 <_vsnprintf> e9c0: 4b07 ldr r3, [pc, #28] ; (e9e0 <_printf+0x50>) e9c2: 9900 ldr r1, [sp, #0] e9c4: 6d18 ldr r0, [r3, #80] ; 0x50 e9c6: 4622 mov r2, r4 e9c8: f003 fcfe bl 123c8 <__sys_write> e9cc: 9800 ldr r0, [sp, #0] e9ce: f003 fb09 bl 11fe4 e9d2: 4620 mov r0, r4 e9d4: b002 add sp, #8 e9d6: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} e9da: b004 add sp, #16 e9dc: 4770 bx lr e9de: bf00 nop e9e0: 20001220 .word 0x20001220 0000e9e4 : e9e4: b570 push {r4, r5, r6, lr} e9e6: 68c4 ldr r4, [r0, #12] e9e8: 07a5 lsls r5, r4, #30 e9ea: d008 beq.n e9fe e9ec: f5b2 7f00 cmp.w r2, #512 ; 0x200 e9f0: d011 beq.n ea16 e9f2: f5b2 6f80 cmp.w r2, #1024 ; 0x400 e9f6: d004 beq.n ea02 e9f8: f5b2 7f80 cmp.w r2, #256 ; 0x100 e9fc: d00b beq.n ea16 e9fe: 2001 movs r0, #1 ea00: e008 b.n ea14 ea02: f100 0124 add.w r1, r0, #36 ; 0x24 ea06: 2301 movs r3, #1 ea08: 4314 orrs r4, r2 ea0a: 6101 str r1, [r0, #16] ea0c: 6001 str r1, [r0, #0] ea0e: 61c3 str r3, [r0, #28] ea10: 60c4 str r4, [r0, #12] ea12: 2000 movs r0, #0 ea14: bd70 pop {r4, r5, r6, pc} ea16: 4d02 ldr r5, [pc, #8] ; (ea20 ) ea18: 1e5e subs r6, r3, #1 ea1a: 42ae cmp r6, r5 ea1c: d9f4 bls.n ea08 ea1e: e7ee b.n e9fe ea20: 00fffffe .word 0x00fffffe 0000ea24 <_sbrk>: ea24: b570 push {r4, r5, r6, lr} ea26: 4d0b ldr r5, [pc, #44] ; (ea54 <_sbrk+0x30>) ea28: 682b ldr r3, [r5, #0] ea2a: b90b cbnz r3, ea30 <_sbrk+0xc> ea2c: 4b0a ldr r3, [pc, #40] ; (ea58 <_sbrk+0x34>) ea2e: 602b str r3, [r5, #0] ea30: 1cc4 adds r4, r0, #3 ea32: 682e ldr r6, [r5, #0] ea34: f024 0403 bic.w r4, r4, #3 ea38: 4434 add r4, r6 ea3a: 4620 mov r0, r4 ea3c: f000 f832 bl eaa4 <__check_heap_overflow> ea40: b910 cbnz r0, ea48 <_sbrk+0x24> ea42: 602c str r4, [r5, #0] ea44: 4630 mov r0, r6 ea46: bd70 pop {r4, r5, r6, pc} ea48: 4b04 ldr r3, [pc, #16] ; (ea5c <_sbrk+0x38>) ea4a: 220c movs r2, #12 ea4c: 601a str r2, [r3, #0] ea4e: f04f 36ff mov.w r6, #4294967295 ; 0xffffffff ea52: e7f7 b.n ea44 <_sbrk+0x20> ea54: 200012d4 .word 0x200012d4 ea58: 200012f8 .word 0x200012f8 ea5c: 200012dc .word 0x200012dc 0000ea60 : ea60: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} ea62: 4604 mov r4, r0 ea64: b198 cbz r0, ea8e ea66: b003 add sp, #12 ea68: e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} ea6c: f003 bb7a b.w 12164 <_do_fflush> ea70: fb07 6004 mla r0, r7, r4, r6 ea74: f003 fb76 bl 12164 <_do_fflush> ea78: 2800 cmp r0, #0 ea7a: bf18 it ne ea7c: f04f 35ff movne.w r5, #4294967295 ; 0xffffffff ea80: 3401 adds r4, #1 ea82: 9b01 ldr r3, [sp, #4] ea84: 42a3 cmp r3, r4 ea86: dcf3 bgt.n ea70 ea88: 4628 mov r0, r5 ea8a: b003 add sp, #12 ea8c: bdf0 pop {r4, r5, r6, r7, pc} ea8e: 4b03 ldr r3, [pc, #12] ; (ea9c ) ea90: 4e03 ldr r6, [pc, #12] ; (eaa0 ) ea92: 681b ldr r3, [r3, #0] ea94: 9301 str r3, [sp, #4] ea96: 4605 mov r5, r0 ea98: 273c movs r7, #60 ; 0x3c ea9a: e7f2 b.n ea82 ea9c: 000131b0 .word 0x000131b0 eaa0: 20001220 .word 0x20001220 0000eaa4 <__check_heap_overflow>: eaa4: 4b04 ldr r3, [pc, #16] ; (eab8 <__check_heap_overflow+0x14>) eaa6: b123 cbz r3, eab2 <__check_heap_overflow+0xe> eaa8: 4298 cmp r0, r3 eaaa: bf34 ite cc eaac: 2000 movcc r0, #0 eaae: 2001 movcs r0, #1 eab0: 4770 bx lr eab2: 4618 mov r0, r3 eab4: 4770 bx lr eab6: bf00 nop eab8: 200022f8 .word 0x200022f8 0000eabc : // your own handler routines in your application code. These routines call // driver exception handlers or IntDefaultHandler() if no driver exception // handler is included. //***************************************************************************** WEAK void DMA0_IRQHandler(void) { DMA0_DriverIRQHandler(); eabc: b508 push {r3, lr} eabe: f7f9 fca0 bl 8402 } eac2: bd08 pop {r3, pc} 0000eac4 : WEAK void DMA1_IRQHandler(void) { DMA1_DriverIRQHandler(); eac4: b508 push {r3, lr} eac6: f7f9 fc9c bl 8402 } eaca: bd08 pop {r3, pc} 0000eacc : WEAK void DMA2_IRQHandler(void) { DMA2_DriverIRQHandler(); eacc: b508 push {r3, lr} eace: f7f9 fc98 bl 8402 } ead2: bd08 pop {r3, pc} 0000ead4 : WEAK void DMA3_IRQHandler(void) { DMA3_DriverIRQHandler(); ead4: b508 push {r3, lr} ead6: f7f9 fc94 bl 8402 } eada: bd08 pop {r3, pc} 0000eadc : WEAK void DMA4_IRQHandler(void) { DMA4_DriverIRQHandler(); eadc: b508 push {r3, lr} eade: f7f9 fc90 bl 8402 } eae2: bd08 pop {r3, pc} 0000eae4 : WEAK void DMA5_IRQHandler(void) { DMA5_DriverIRQHandler(); eae4: b508 push {r3, lr} eae6: f7f9 fc8c bl 8402 } eaea: bd08 pop {r3, pc} 0000eaec : WEAK void DMA6_IRQHandler(void) { DMA6_DriverIRQHandler(); eaec: b508 push {r3, lr} eaee: f7f9 fc88 bl 8402 } eaf2: bd08 pop {r3, pc} 0000eaf4 : WEAK void DMA7_IRQHandler(void) { DMA7_DriverIRQHandler(); eaf4: b508 push {r3, lr} eaf6: f7f9 fc84 bl 8402 } eafa: bd08 pop {r3, pc} 0000eafc : WEAK void DMA8_IRQHandler(void) { DMA8_DriverIRQHandler(); eafc: b508 push {r3, lr} eafe: f7f9 fc80 bl 8402 } eb02: bd08 pop {r3, pc} 0000eb04 : WEAK void DMA9_IRQHandler(void) { DMA9_DriverIRQHandler(); eb04: b508 push {r3, lr} eb06: f7f9 fc7c bl 8402 } eb0a: bd08 pop {r3, pc} 0000eb0c : WEAK void DMA10_IRQHandler(void) { DMA10_DriverIRQHandler(); eb0c: b508 push {r3, lr} eb0e: f7f9 fc78 bl 8402 } eb12: bd08 pop {r3, pc} 0000eb14 : WEAK void DMA11_IRQHandler(void) { DMA11_DriverIRQHandler(); eb14: b508 push {r3, lr} eb16: f7f9 fc74 bl 8402 } eb1a: bd08 pop {r3, pc} 0000eb1c : WEAK void DMA12_IRQHandler(void) { DMA12_DriverIRQHandler(); eb1c: b508 push {r3, lr} eb1e: f7f9 fc70 bl 8402 } eb22: bd08 pop {r3, pc} 0000eb24 : WEAK void DMA13_IRQHandler(void) { DMA13_DriverIRQHandler(); eb24: b508 push {r3, lr} eb26: f7f9 fc6c bl 8402 } eb2a: bd08 pop {r3, pc} 0000eb2c : WEAK void DMA14_IRQHandler(void) { DMA14_DriverIRQHandler(); eb2c: b508 push {r3, lr} eb2e: f7f9 fc68 bl 8402 } eb32: bd08 pop {r3, pc} 0000eb34 : WEAK void DMA15_IRQHandler(void) { DMA15_DriverIRQHandler(); eb34: b508 push {r3, lr} eb36: f7f9 fc64 bl 8402 } eb3a: bd08 pop {r3, pc} 0000eb3c : WEAK void DMA_Error_IRQHandler(void) { DMA_Error_DriverIRQHandler(); eb3c: b508 push {r3, lr} eb3e: f7f9 fc60 bl 8402 } eb42: bd08 pop {r3, pc} 0000eb44 : WEAK void MCM_IRQHandler(void) { MCM_DriverIRQHandler(); eb44: b508 push {r3, lr} eb46: f7f9 fc5c bl 8402 } eb4a: bd08 pop {r3, pc} 0000eb4c : WEAK void FTF_IRQHandler(void) { FTF_DriverIRQHandler(); eb4c: b508 push {r3, lr} eb4e: f7f9 fc58 bl 8402 } eb52: bd08 pop {r3, pc} 0000eb54 : WEAK void Read_Collision_IRQHandler(void) { Read_Collision_DriverIRQHandler(); eb54: b508 push {r3, lr} eb56: f7f9 fc54 bl 8402 } eb5a: bd08 pop {r3, pc} 0000eb5c : WEAK void LVD_LVW_IRQHandler(void) { LVD_LVW_DriverIRQHandler(); eb5c: b508 push {r3, lr} eb5e: f7f9 fc50 bl 8402 } eb62: bd08 pop {r3, pc} 0000eb64 : WEAK void LLWU_IRQHandler(void) { LLWU_DriverIRQHandler(); eb64: b508 push {r3, lr} eb66: f7f9 fc4c bl 8402 } eb6a: bd08 pop {r3, pc} 0000eb6c : WEAK void WDOG_EWM_IRQHandler(void) { WDOG_EWM_DriverIRQHandler(); eb6c: b508 push {r3, lr} eb6e: f7f9 fc48 bl 8402 } eb72: bd08 pop {r3, pc} 0000eb74 : WEAK void RNG_IRQHandler(void) { RNG_DriverIRQHandler(); eb74: b508 push {r3, lr} eb76: f7f9 fc44 bl 8402 } eb7a: bd08 pop {r3, pc} 0000eb7c : WEAK void I2C0_IRQHandler(void) { I2C0_DriverIRQHandler(); eb7c: b508 push {r3, lr} eb7e: f7f9 fc40 bl 8402 } eb82: bd08 pop {r3, pc} 0000eb84 : WEAK void I2C1_IRQHandler(void) { I2C1_DriverIRQHandler(); eb84: b508 push {r3, lr} eb86: f7f9 fc3c bl 8402 } eb8a: bd08 pop {r3, pc} 0000eb8c : WEAK void SPI0_IRQHandler(void) { SPI0_DriverIRQHandler(); eb8c: b508 push {r3, lr} eb8e: f7fe fdf5 bl d77c } eb92: bd08 pop {r3, pc} 0000eb94 : WEAK void SPI1_IRQHandler(void) { SPI1_DriverIRQHandler(); eb94: b508 push {r3, lr} eb96: f7fe fe03 bl d7a0 } eb9a: bd08 pop {r3, pc} 0000eb9c : WEAK void I2S0_Tx_IRQHandler(void) { I2S0_Tx_DriverIRQHandler(); eb9c: b508 push {r3, lr} eb9e: f7f9 fc30 bl 8402 } eba2: bd08 pop {r3, pc} 0000eba4 : WEAK void I2S0_Rx_IRQHandler(void) { I2S0_Rx_DriverIRQHandler(); eba4: b508 push {r3, lr} eba6: f7f9 fc2c bl 8402 } ebaa: bd08 pop {r3, pc} 0000ebac : WEAK void LPUART0_IRQHandler(void) { LPUART0_DriverIRQHandler(); ebac: b508 push {r3, lr} ebae: f7f9 fc28 bl 8402 } ebb2: bd08 pop {r3, pc} 0000ebb4 : WEAK void UART0_RX_TX_IRQHandler(void) { UART0_RX_TX_DriverIRQHandler(); ebb4: b508 push {r3, lr} ebb6: f7fa ff79 bl 9aac } ebba: bd08 pop {r3, pc} 0000ebbc : WEAK void UART0_ERR_IRQHandler(void) { UART0_ERR_DriverIRQHandler(); ebbc: b508 push {r3, lr} ebbe: f7f9 fc20 bl 8402 } ebc2: bd08 pop {r3, pc} 0000ebc4 : WEAK void UART1_RX_TX_IRQHandler(void) { UART1_RX_TX_DriverIRQHandler(); ebc4: b508 push {r3, lr} ebc6: f7fb f811 bl 9bec } ebca: bd08 pop {r3, pc} 0000ebcc : WEAK void UART1_ERR_IRQHandler(void) { UART1_ERR_DriverIRQHandler(); ebcc: b508 push {r3, lr} ebce: f7f9 fc18 bl 8402 } ebd2: bd08 pop {r3, pc} 0000ebd4 : WEAK void UART2_RX_TX_IRQHandler(void) { UART2_RX_TX_DriverIRQHandler(); ebd4: b508 push {r3, lr} ebd6: f7f9 fc14 bl 8402 } ebda: bd08 pop {r3, pc} 0000ebdc : WEAK void UART2_ERR_IRQHandler(void) { UART2_ERR_DriverIRQHandler(); ebdc: b508 push {r3, lr} ebde: f7f9 fc10 bl 8402 } ebe2: bd08 pop {r3, pc} 0000ebe4 : WEAK void Reserved53_IRQHandler(void) { Reserved53_DriverIRQHandler(); ebe4: b508 push {r3, lr} ebe6: f7f9 fc0c bl 8402 } ebea: bd08 pop {r3, pc} 0000ebec : WEAK void Reserved54_IRQHandler(void) { Reserved54_DriverIRQHandler(); ebec: b508 push {r3, lr} ebee: f7f9 fc08 bl 8402 } ebf2: bd08 pop {r3, pc} 0000ebf4 : WEAK void ADC0_IRQHandler(void) { ADC0_DriverIRQHandler(); ebf4: b508 push {r3, lr} ebf6: f7f9 fc04 bl 8402 } ebfa: bd08 pop {r3, pc} 0000ebfc : WEAK void CMP0_IRQHandler(void) { CMP0_DriverIRQHandler(); ebfc: b508 push {r3, lr} ebfe: f7f9 fc00 bl 8402 } ec02: bd08 pop {r3, pc} 0000ec04 : WEAK void CMP1_IRQHandler(void) { CMP1_DriverIRQHandler(); ec04: b508 push {r3, lr} ec06: f7f9 fbfc bl 8402 } ec0a: bd08 pop {r3, pc} 0000ec0c : WEAK void FTM0_IRQHandler(void) { FTM0_DriverIRQHandler(); ec0c: b508 push {r3, lr} ec0e: f7f9 fbf8 bl 8402 } ec12: bd08 pop {r3, pc} 0000ec14 : WEAK void FTM1_IRQHandler(void) { FTM1_DriverIRQHandler(); ec14: b508 push {r3, lr} ec16: f7f9 fbf4 bl 8402 } ec1a: bd08 pop {r3, pc} 0000ec1c : WEAK void FTM2_IRQHandler(void) { FTM2_DriverIRQHandler(); ec1c: b508 push {r3, lr} ec1e: f7f9 fbf0 bl 8402 } ec22: bd08 pop {r3, pc} 0000ec24 : WEAK void Reserved61_IRQHandler(void) { Reserved61_DriverIRQHandler(); ec24: b508 push {r3, lr} ec26: f7f9 fbec bl 8402 } ec2a: bd08 pop {r3, pc} 0000ec2c : WEAK void RTC_IRQHandler(void) { RTC_DriverIRQHandler(); ec2c: b508 push {r3, lr} ec2e: f7f9 fbe8 bl 8402 } ec32: bd08 pop {r3, pc} 0000ec34 : WEAK void RTC_Seconds_IRQHandler(void) { RTC_Seconds_DriverIRQHandler(); ec34: b508 push {r3, lr} ec36: f7f9 fbe4 bl 8402 } ec3a: bd08 pop {r3, pc} 0000ec3c : WEAK void PIT0_IRQHandler(void) { PIT0_DriverIRQHandler(); } WEAK void PIT1_IRQHandler(void) { PIT1_DriverIRQHandler(); ec3c: b508 push {r3, lr} ec3e: f7f9 fbe0 bl 8402 } ec42: bd08 pop {r3, pc} 0000ec44 : WEAK void PIT2_IRQHandler(void) { PIT2_DriverIRQHandler(); ec44: b508 push {r3, lr} ec46: f7f9 fbdc bl 8402 } ec4a: bd08 pop {r3, pc} 0000ec4c : WEAK void PIT3_IRQHandler(void) { PIT3_DriverIRQHandler(); ec4c: b508 push {r3, lr} ec4e: f7f9 fbd8 bl 8402 } ec52: bd08 pop {r3, pc} 0000ec54 : WEAK void PDB0_IRQHandler(void) { PDB0_DriverIRQHandler(); ec54: b508 push {r3, lr} ec56: f7f9 fbd4 bl 8402 } ec5a: bd08 pop {r3, pc} 0000ec5c : WEAK void USB0_IRQHandler(void) { USB0_DriverIRQHandler(); } WEAK void Reserved70_IRQHandler(void) { Reserved70_DriverIRQHandler(); ec5c: b508 push {r3, lr} ec5e: f7f9 fbd0 bl 8402 } ec62: bd08 pop {r3, pc} 0000ec64 : WEAK void Reserved71_IRQHandler(void) { Reserved71_DriverIRQHandler(); ec64: b508 push {r3, lr} ec66: f7f9 fbcc bl 8402 } ec6a: bd08 pop {r3, pc} 0000ec6c : WEAK void DAC0_IRQHandler(void) { DAC0_DriverIRQHandler(); ec6c: b508 push {r3, lr} ec6e: f7f9 fbc8 bl 8402 } ec72: bd08 pop {r3, pc} 0000ec74 : WEAK void MCG_IRQHandler(void) { MCG_DriverIRQHandler(); ec74: b508 push {r3, lr} ec76: f7f9 fbc4 bl 8402 } ec7a: bd08 pop {r3, pc} 0000ec7c : WEAK void LPTMR0_IRQHandler(void) { LPTMR0_DriverIRQHandler(); ec7c: b508 push {r3, lr} ec7e: f7f9 fbc0 bl 8402 } ec82: bd08 pop {r3, pc} 0000ec84 : WEAK void PORTA_IRQHandler(void) { PORTA_DriverIRQHandler(); ec84: b508 push {r3, lr} ec86: f7f9 fbbc bl 8402 } ec8a: bd08 pop {r3, pc} 0000ec8c : WEAK void PORTB_IRQHandler(void) { PORTB_DriverIRQHandler(); ec8c: b508 push {r3, lr} ec8e: f7f9 fbb8 bl 8402 } ec92: bd08 pop {r3, pc} 0000ec94 : WEAK void PORTC_IRQHandler(void) { PORTC_DriverIRQHandler(); ec94: b508 push {r3, lr} ec96: f7f9 fbb4 bl 8402 } ec9a: bd08 pop {r3, pc} 0000ec9c : WEAK void PORTD_IRQHandler(void) { PORTD_DriverIRQHandler(); ec9c: b508 push {r3, lr} ec9e: f7f9 fbb0 bl 8402 } eca2: bd08 pop {r3, pc} 0000eca4 : WEAK void PORTE_IRQHandler(void) { PORTE_DriverIRQHandler(); eca4: b508 push {r3, lr} eca6: f7f9 fbac bl 8402 } ecaa: bd08 pop {r3, pc} 0000ecac : WEAK void SWI_IRQHandler(void) { SWI_DriverIRQHandler(); ecac: b508 push {r3, lr} ecae: f7f9 fba8 bl 8402 } ecb2: bd08 pop {r3, pc} 0000ecb4 : WEAK void Reserved81_IRQHandler(void) { Reserved81_DriverIRQHandler(); ecb4: b508 push {r3, lr} ecb6: f7f9 fba4 bl 8402 } ecba: bd08 pop {r3, pc} 0000ecbc : WEAK void Reserved82_IRQHandler(void) { Reserved82_DriverIRQHandler(); ecbc: b508 push {r3, lr} ecbe: f7f9 fba0 bl 8402 } ecc2: bd08 pop {r3, pc} 0000ecc4 : WEAK void Reserved83_IRQHandler(void) { Reserved83_DriverIRQHandler(); ecc4: b508 push {r3, lr} ecc6: f7f9 fb9c bl 8402 } ecca: bd08 pop {r3, pc} 0000eccc : WEAK void Reserved84_IRQHandler(void) { Reserved84_DriverIRQHandler(); eccc: b508 push {r3, lr} ecce: f7f9 fb98 bl 8402 } ecd2: bd08 pop {r3, pc} 0000ecd4 : WEAK void Reserved85_IRQHandler(void) { Reserved85_DriverIRQHandler(); ecd4: b508 push {r3, lr} ecd6: f7f9 fb94 bl 8402 } ecda: bd08 pop {r3, pc} 0000ecdc : WEAK void Reserved86_IRQHandler(void) { Reserved86_DriverIRQHandler(); ecdc: b508 push {r3, lr} ecde: f7f9 fb90 bl 8402 } ece2: bd08 pop {r3, pc} 0000ece4 : WEAK void FTM3_IRQHandler(void) { FTM3_DriverIRQHandler(); ece4: b508 push {r3, lr} ece6: f7f9 fb8c bl 8402 } ecea: bd08 pop {r3, pc} 0000ecec : WEAK void DAC1_IRQHandler(void) { DAC1_DriverIRQHandler(); ecec: b508 push {r3, lr} ecee: f7f9 fb88 bl 8402 } ecf2: bd08 pop {r3, pc} 0000ecf4 : WEAK void ADC1_IRQHandler(void) { ADC1_DriverIRQHandler(); ecf4: b508 push {r3, lr} ecf6: f7f9 fb84 bl 8402 } ecfa: bd08 pop {r3, pc} 0000ecfc : { ecfc: b5f0 push {r4, r5, r6, r7, lr} ecfe: b083 sub sp, #12 ed00: 4604 mov r4, r0 ed02: 460f mov r7, r1 ed04: 4616 mov r6, r2 ed06: 461d mov r5, r3 uint8_t state = 0U; ed08: 2300 movs r3, #0 ed0a: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ed0e: f10d 0207 add.w r2, sp, #7 ed12: 2106 movs r1, #6 ed14: 6800 ldr r0, [r0, #0] ed16: f000 fb35 bl f384 if (state != (uint8_t)kUSB_DeviceStateConfigured) ed1a: f89d 3007 ldrb.w r3, [sp, #7] ed1e: b963 cbnz r3, ed3a classHandle->standardTranscationBuffer = USB_SHORT_FROM_LITTLE_ENDIAN(setup->wIndex); ed20: 88bb ldrh r3, [r7, #4] ed22: 81a3 strh r3, [r4, #12] USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusSynchFrame, &classHandle->standardTranscationBuffer); ed24: f854 0b0c ldr.w r0, [r4], #12 ed28: 4622 mov r2, r4 ed2a: 2108 movs r1, #8 ed2c: f000 fb2a bl f384 *buffer = (uint8_t *)&classHandle->standardTranscationBuffer; ed30: 6034 str r4, [r6, #0] *length = sizeof(classHandle->standardTranscationBuffer); ed32: 2302 movs r3, #2 ed34: 602b str r3, [r5, #0] } ed36: b003 add sp, #12 ed38: bdf0 pop {r4, r5, r6, r7, pc} return error; ed3a: 2005 movs r0, #5 ed3c: e7fb b.n ed36 0000ed3e : { ed3e: b5f0 push {r4, r5, r6, r7, lr} ed40: b083 sub sp, #12 ed42: 4604 mov r4, r0 ed44: 460f mov r7, r1 ed46: 4615 mov r5, r2 ed48: 461e mov r6, r3 uint8_t state = 0U; ed4a: 2300 movs r3, #0 ed4c: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ed50: f10d 0207 add.w r2, sp, #7 ed54: 2106 movs r1, #6 ed56: 6800 ldr r0, [r0, #0] ed58: f000 fb14 bl f384 if (((uint8_t)kUSB_DeviceStateAddress != state) && ((uint8_t)kUSB_DeviceStateConfigured != state)) ed5c: f89d 3007 ldrb.w r3, [sp, #7] ed60: 2b01 cmp r3, #1 ed62: d831 bhi.n edc8 if ((setup->bmRequestType & USB_REQUEST_TYPE_RECIPIENT_MASK) == USB_REQUEST_TYPE_RECIPIENT_DEVICE) ed64: 783b ldrb r3, [r7, #0] ed66: f013 031f ands.w r3, r3, #31 ed6a: d008 beq.n ed7e else if ((setup->bmRequestType & USB_REQUEST_TYPE_RECIPIENT_MASK) == USB_REQUEST_TYPE_RECIPIENT_INTERFACE) ed6c: 2b01 cmp r3, #1 ed6e: d013 beq.n ed98 else if ((setup->bmRequestType & USB_REQUEST_TYPE_RECIPIENT_MASK) == USB_REQUEST_TYPE_RECIPIENT_ENDPOINT) ed70: 2b02 cmp r3, #2 ed72: d016 beq.n eda2 usb_status_t error = kStatus_USB_InvalidRequest; ed74: 2005 movs r0, #5 *buffer = (uint8_t *)&classHandle->standardTranscationBuffer; ed76: 340c adds r4, #12 ed78: 602c str r4, [r5, #0] } ed7a: b003 add sp, #12 ed7c: bdf0 pop {r4, r5, r6, r7, pc} &classHandle->standardTranscationBuffer); ed7e: 4622 mov r2, r4 error = USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDevice, ed80: f852 0b0c ldr.w r0, [r2], #12 ed84: 2104 movs r1, #4 ed86: f000 fafd bl f384 classHandle->standardTranscationBuffer & USB_GET_STATUS_DEVICE_MASK; ed8a: 89a3 ldrh r3, [r4, #12] ed8c: f003 0303 and.w r3, r3, #3 classHandle->standardTranscationBuffer = ed90: 81a3 strh r3, [r4, #12] *length = USB_DEVICE_STATUS_SIZE; ed92: 2302 movs r3, #2 ed94: 6033 str r3, [r6, #0] ed96: e7ee b.n ed76 classHandle->standardTranscationBuffer = 0U; ed98: 2000 movs r0, #0 ed9a: 81a0 strh r0, [r4, #12] *length = USB_INTERFACE_STATUS_SIZE; ed9c: 2302 movs r3, #2 ed9e: 6033 str r3, [r6, #0] eda0: e7e9 b.n ed76 endpointStatus.endpointAddress = (uint8_t)setup->wIndex; eda2: 88bb ldrh r3, [r7, #4] eda4: f88d 3000 strb.w r3, [sp] endpointStatus.endpointStatus = (uint16_t)kUSB_DeviceEndpointStateIdle; eda8: 2300 movs r3, #0 edaa: f8ad 3002 strh.w r3, [sp, #2] error = USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusEndpoint, &endpointStatus); edae: 466a mov r2, sp edb0: 2105 movs r1, #5 edb2: 6820 ldr r0, [r4, #0] edb4: f000 fae6 bl f384 classHandle->standardTranscationBuffer = endpointStatus.endpointStatus & USB_GET_STATUS_ENDPOINT_MASK; edb8: f8bd 3002 ldrh.w r3, [sp, #2] edbc: f003 0303 and.w r3, r3, #3 edc0: 81a3 strh r3, [r4, #12] *length = USB_ENDPOINT_STATUS_SIZE; edc2: 2302 movs r3, #2 edc4: 6033 str r3, [r6, #0] edc6: e7d6 b.n ed76 return error; edc8: 2005 movs r0, #5 edca: e7d6 b.n ed7a 0000edcc : { edcc: b530 push {r4, r5, lr} edce: b083 sub sp, #12 edd0: 4604 mov r4, r0 edd2: 460d mov r5, r1 uint8_t state = 0U; edd4: 2300 movs r3, #0 edd6: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); edda: f10d 0207 add.w r2, sp, #7 edde: 2106 movs r1, #6 ede0: 6800 ldr r0, [r0, #0] ede2: f000 facf bl f384 if (state != (uint8_t)kUSB_DeviceStateConfigured) ede6: f89d 3007 ldrb.w r3, [sp, #7] edea: b993 cbnz r3, ee12 classHandle->standardTranscationBuffer = ((setup->wIndex & 0xFFU) << 8U) | (setup->wValue & 0xFFU); edec: 88aa ldrh r2, [r5, #4] edee: 78ab ldrb r3, [r5, #2] edf0: ea43 2302 orr.w r3, r3, r2, lsl #8 edf4: 81a3 strh r3, [r4, #12] &classHandle->standardTranscationBuffer); edf6: 4625 mov r5, r4 (void)USB_DeviceClassEvent(classHandle->handle, kUSB_DeviceClassEventSetInterface, edf8: f855 0b0c ldr.w r0, [r5], #12 edfc: 462a mov r2, r5 edfe: 2104 movs r1, #4 ee00: f7f9 fc76 bl 86f0 return USB_DeviceClassCallback(classHandle->handle, (uint32_t)kUSB_DeviceEventSetInterface, ee04: 462a mov r2, r5 ee06: 210a movs r1, #10 ee08: 6820 ldr r0, [r4, #0] ee0a: f7f9 fcb7 bl 877c } ee0e: b003 add sp, #12 ee10: bd30 pop {r4, r5, pc} return kStatus_USB_InvalidRequest; ee12: 2005 movs r0, #5 ee14: e7fb b.n ee0e 0000ee16 : { ee16: b5f0 push {r4, r5, r6, r7, lr} ee18: b083 sub sp, #12 ee1a: 4604 mov r4, r0 ee1c: 460d mov r5, r1 ee1e: 4616 mov r6, r2 ee20: 461f mov r7, r3 uint8_t state = 0U; ee22: 2300 movs r3, #0 ee24: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ee28: f10d 0207 add.w r2, sp, #7 ee2c: 2106 movs r1, #6 ee2e: 6800 ldr r0, [r0, #0] ee30: f000 faa8 bl f384 if (state != (uint8_t)kUSB_DeviceStateConfigured) ee34: f89d 3007 ldrb.w r3, [sp, #7] ee38: b96b cbnz r3, ee56 *length = USB_INTERFACE_SIZE; ee3a: 2301 movs r3, #1 ee3c: 603b str r3, [r7, #0] *buffer = (uint8_t *)&classHandle->standardTranscationBuffer; ee3e: f104 020c add.w r2, r4, #12 ee42: 6032 str r2, [r6, #0] classHandle->standardTranscationBuffer = (uint16_t)(((uint32_t)setup->wIndex & 0xFFU) << 8U); ee44: 88ab ldrh r3, [r5, #4] ee46: 021b lsls r3, r3, #8 ee48: 81a3 strh r3, [r4, #12] error = USB_DeviceClassCallback(classHandle->handle, (uint32_t)kUSB_DeviceEventGetInterface, ee4a: 2116 movs r1, #22 ee4c: 6820 ldr r0, [r4, #0] ee4e: f7f9 fc95 bl 877c } ee52: b003 add sp, #12 ee54: bdf0 pop {r4, r5, r6, r7, pc} return error; ee56: 2005 movs r0, #5 ee58: e7fb b.n ee52 0000ee5a : { ee5a: b570 push {r4, r5, r6, lr} ee5c: b082 sub sp, #8 ee5e: 4604 mov r4, r0 ee60: 4615 mov r5, r2 ee62: 461e mov r6, r3 uint8_t state = 0U; ee64: 2300 movs r3, #0 ee66: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ee6a: f10d 0207 add.w r2, sp, #7 ee6e: 2106 movs r1, #6 ee70: 6800 ldr r0, [r0, #0] ee72: f000 fa87 bl f384 if (((uint8_t)kUSB_DeviceStateAddress != state) && (((uint8_t)kUSB_DeviceStateConfigured != state))) ee76: f89d 3007 ldrb.w r3, [sp, #7] ee7a: 2b01 cmp r3, #1 ee7c: d80a bhi.n ee94 *length = USB_CONFIGURE_SIZE; ee7e: 2301 movs r3, #1 ee80: 6033 str r3, [r6, #0] *buffer = (uint8_t *)&classHandle->standardTranscationBuffer; ee82: f104 020c add.w r2, r4, #12 ee86: 602a str r2, [r5, #0] return USB_DeviceClassCallback(classHandle->handle, (uint8_t)kUSB_DeviceEventGetConfiguration, ee88: 2115 movs r1, #21 ee8a: 6820 ldr r0, [r4, #0] ee8c: f7f9 fc76 bl 877c } ee90: b002 add sp, #8 ee92: bd70 pop {r4, r5, r6, pc} return kStatus_USB_InvalidRequest; ee94: 2005 movs r0, #5 ee96: e7fb b.n ee90 0000ee98 : { ee98: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} ee9c: b085 sub sp, #20 ee9e: 4607 mov r7, r0 eea0: 460e mov r6, r1 eea2: 4691 mov r9, r2 eea4: 4698 mov r8, r3 uint8_t state = 0U; eea6: 2300 movs r3, #0 eea8: f88d 3003 strb.w r3, [sp, #3] uint8_t descriptorType = (uint8_t)((setup->wValue & 0xFF00U) >> 8U); eeac: 884c ldrh r4, [r1, #2] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); eeae: f10d 0203 add.w r2, sp, #3 eeb2: 2106 movs r1, #6 eeb4: 6800 ldr r0, [r0, #0] eeb6: f000 fa65 bl f384 if (((uint8_t)kUSB_DeviceStateAddress != state) && ((uint8_t)kUSB_DeviceStateConfigured != state) && eeba: f89d 3003 ldrb.w r3, [sp, #3] eebe: 2b02 cmp r3, #2 eec0: d82c bhi.n ef1c eec2: 0a25 lsrs r5, r4, #8 commonDescriptor.commonDescriptor.length = setup->wLength; eec4: 88f3 ldrh r3, [r6, #6] eec6: 9302 str r3, [sp, #8] if (USB_DESCRIPTOR_TYPE_DEVICE == descriptorType) eec8: 2d01 cmp r5, #1 eeca: d00e beq.n eeea uint8_t descriptorIndex = (uint8_t)((setup->wValue & 0x00FFU)); eecc: b2e4 uxtb r4, r4 else if (USB_DESCRIPTOR_TYPE_CONFIGURE == descriptorType) eece: 2d02 cmp r5, #2 eed0: d011 beq.n eef6 else if (USB_DESCRIPTOR_TYPE_STRING == descriptorType) eed2: 2d03 cmp r5, #3 eed4: d017 beq.n ef06 usb_status_t error = kStatus_USB_InvalidRequest; eed6: 2005 movs r0, #5 *buffer = commonDescriptor.commonDescriptor.buffer; eed8: 9b01 ldr r3, [sp, #4] eeda: f8c9 3000 str.w r3, [r9] *length = commonDescriptor.commonDescriptor.length; eede: 9b02 ldr r3, [sp, #8] eee0: f8c8 3000 str.w r3, [r8] } eee4: b005 add sp, #20 eee6: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} error = USB_DeviceClassCallback(classHandle->handle, (uint32_t)kUSB_DeviceEventGetDeviceDescriptor, eeea: aa01 add r2, sp, #4 eeec: 210b movs r1, #11 eeee: 6838 ldr r0, [r7, #0] eef0: f7f9 fc44 bl 877c eef4: e7f0 b.n eed8 commonDescriptor.configurationDescriptor.configuration = descriptorIndex; eef6: f88d 400c strb.w r4, [sp, #12] error = USB_DeviceClassCallback(classHandle->handle, (uint32_t)kUSB_DeviceEventGetConfigurationDescriptor, eefa: aa01 add r2, sp, #4 eefc: 210c movs r1, #12 eefe: 6838 ldr r0, [r7, #0] ef00: f7f9 fc3c bl 877c ef04: e7e8 b.n eed8 commonDescriptor.stringDescriptor.stringIndex = descriptorIndex; ef06: f88d 400e strb.w r4, [sp, #14] commonDescriptor.stringDescriptor.languageId = setup->wIndex; ef0a: 88b3 ldrh r3, [r6, #4] ef0c: f8ad 300c strh.w r3, [sp, #12] error = USB_DeviceClassCallback(classHandle->handle, (uint32_t)kUSB_DeviceEventGetStringDescriptor, ef10: aa01 add r2, sp, #4 ef12: 210d movs r1, #13 ef14: 6838 ldr r0, [r7, #0] ef16: f7f9 fc31 bl 877c ef1a: e7dd b.n eed8 return error; ef1c: 2005 movs r0, #5 ef1e: e7e1 b.n eee4 0000ef20 : { ef20: b530 push {r4, r5, lr} ef22: b083 sub sp, #12 ef24: 4604 mov r4, r0 ef26: 460d mov r5, r1 uint8_t state = 0U; ef28: 2300 movs r3, #0 ef2a: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ef2e: f10d 0207 add.w r2, sp, #7 ef32: 2106 movs r1, #6 ef34: 6800 ldr r0, [r0, #0] ef36: f000 fa25 bl f384 if (((uint8_t)kUSB_DeviceStateAddress != state) && ((uint8_t)kUSB_DeviceStateConfigured != state)) ef3a: f89d 3007 ldrb.w r3, [sp, #7] ef3e: 2b01 cmp r3, #1 ef40: d821 bhi.n ef86 state = (uint8_t)kUSB_DeviceStateConfigured; ef42: 2300 movs r3, #0 ef44: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceSetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ef48: f10d 0207 add.w r2, sp, #7 ef4c: 2106 movs r1, #6 ef4e: 6820 ldr r0, [r4, #0] ef50: f000 fa45 bl f3de if (0U == setup->wValue) ef54: 886b ldrh r3, [r5, #2] ef56: b163 cbz r3, ef72 (void)USB_DeviceClassEvent(classHandle->handle, kUSB_DeviceClassEventSetConfiguration, &setup->wValue); ef58: 3502 adds r5, #2 ef5a: 462a mov r2, r5 ef5c: 2103 movs r1, #3 ef5e: 6820 ldr r0, [r4, #0] ef60: f7f9 fbc6 bl 86f0 return USB_DeviceClassCallback(classHandle->handle, (uint32_t)kUSB_DeviceEventSetConfiguration, &setup->wValue); ef64: 462a mov r2, r5 ef66: 2109 movs r1, #9 ef68: 6820 ldr r0, [r4, #0] ef6a: f7f9 fc07 bl 877c } ef6e: b003 add sp, #12 ef70: bd30 pop {r4, r5, pc} state = (uint8_t)kUSB_DeviceStateAddress; ef72: 2301 movs r3, #1 ef74: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceSetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ef78: f10d 0207 add.w r2, sp, #7 ef7c: 2106 movs r1, #6 ef7e: 6820 ldr r0, [r4, #0] ef80: f000 fa2d bl f3de ef84: e7e8 b.n ef58 return kStatus_USB_InvalidRequest; ef86: 2005 movs r0, #5 ef88: e7f1 b.n ef6e 0000ef8a : { ef8a: b530 push {r4, r5, lr} ef8c: b083 sub sp, #12 ef8e: 4604 mov r4, r0 ef90: 460d mov r5, r1 uint8_t state = 0U; ef92: 2300 movs r3, #0 ef94: f88d 3007 strb.w r3, [sp, #7] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); ef98: f10d 0207 add.w r2, sp, #7 ef9c: 2106 movs r1, #6 ef9e: 6800 ldr r0, [r0, #0] efa0: f000 f9f0 bl f384 if (((uint8_t)kUSB_DeviceStateAddressing != state) && ((uint8_t)kUSB_DeviceStateAddress != state) && efa4: f89d 3007 ldrb.w r3, [sp, #7] efa8: 2b03 cmp r3, #3 efaa: d00e beq.n efca ((uint8_t)kUSB_DeviceStateDefault != state) && ((uint8_t)kUSB_DeviceStateConfigured != state)) efac: 2b02 cmp r3, #2 efae: d81f bhi.n eff0 state = (uint8_t)(setup->wValue & 0xFFU); efb0: 886b ldrh r3, [r5, #2] efb2: f88d 3007 strb.w r3, [sp, #7] error = USB_DeviceSetStatus(classHandle->handle, kUSB_DeviceStatusAddress, &state); efb6: f10d 0207 add.w r2, sp, #7 efba: 2107 movs r1, #7 efbc: 6820 ldr r0, [r4, #0] efbe: f000 fa0e bl f3de efc2: 4603 mov r3, r0 } efc4: 4618 mov r0, r3 efc6: b003 add sp, #12 efc8: bd30 pop {r4, r5, pc} error = USB_DeviceSetStatus(classHandle->handle, kUSB_DeviceStatusAddress, NULL); efca: 2200 movs r2, #0 efcc: 2107 movs r1, #7 efce: 6820 ldr r0, [r4, #0] efd0: f000 fa05 bl f3de if (kStatus_USB_Success == error) efd4: 4603 mov r3, r0 efd6: 2800 cmp r0, #0 efd8: d1f4 bne.n efc4 state = (uint8_t)kUSB_DeviceStateAddress; efda: 2301 movs r3, #1 efdc: f88d 3007 strb.w r3, [sp, #7] error = USB_DeviceSetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); efe0: f10d 0207 add.w r2, sp, #7 efe4: 2106 movs r1, #6 efe6: 6820 ldr r0, [r4, #0] efe8: f000 f9f9 bl f3de efec: 4603 mov r3, r0 efee: e7e9 b.n efc4 return error; eff0: 2305 movs r3, #5 eff2: e7e7 b.n efc4 0000eff4 : { eff4: b530 push {r4, r5, lr} eff6: b083 sub sp, #12 eff8: 4605 mov r5, r0 effa: 460c mov r4, r1 uint8_t state = 0U; effc: 2300 movs r3, #0 effe: f88d 3007 strb.w r3, [sp, #7] uint8_t isSet = 0U; f002: f88d 3006 strb.w r3, [sp, #6] (void)USB_DeviceGetStatus(classHandle->handle, kUSB_DeviceStatusDeviceState, &state); f006: f10d 0207 add.w r2, sp, #7 f00a: 2106 movs r1, #6 f00c: 6800 ldr r0, [r0, #0] f00e: f000 f9b9 bl f384 if (((uint8_t)kUSB_DeviceStateAddress != state) && ((uint8_t)kUSB_DeviceStateConfigured != state)) f012: f89d 3007 ldrb.w r3, [sp, #7] f016: 2b01 cmp r3, #1 f018: d83a bhi.n f090 if (USB_REQUEST_STANDARD_SET_FEATURE == setup->bRequest) f01a: 7863 ldrb r3, [r4, #1] f01c: 2b03 cmp r3, #3 isSet = 1U; f01e: bf04 itt eq f020: 2301 moveq r3, #1 f022: f88d 3006 strbeq.w r3, [sp, #6] if ((setup->bmRequestType & USB_REQUEST_TYPE_RECIPIENT_MASK) == USB_REQUEST_TYPE_RECIPIENT_DEVICE) f026: 7823 ldrb r3, [r4, #0] f028: f013 031f ands.w r3, r3, #31 f02c: d10b bne.n f046 if (USB_REQUEST_STANDARD_FEATURE_SELECTOR_DEVICE_REMOTE_WAKEUP == setup->wValue) f02e: 8863 ldrh r3, [r4, #2] f030: 2b01 cmp r3, #1 f032: d001 beq.n f038 usb_status_t error = kStatus_USB_InvalidRequest; f034: 2005 movs r0, #5 f036: e02c b.n f092 error = USB_DeviceClassCallback(classHandle->handle, (uint32_t)kUSB_DeviceEventSetRemoteWakeup, &isSet); f038: f10d 0206 add.w r2, sp, #6 f03c: 2114 movs r1, #20 f03e: 6828 ldr r0, [r5, #0] f040: f7f9 fb9c bl 877c f044: e025 b.n f092 else if ((setup->bmRequestType & USB_REQUEST_TYPE_RECIPIENT_MASK) == USB_REQUEST_TYPE_RECIPIENT_ENDPOINT) f046: 2b02 cmp r3, #2 f048: d001 beq.n f04e usb_status_t error = kStatus_USB_InvalidRequest; f04a: 2005 movs r0, #5 f04c: e021 b.n f092 if (USB_REQUEST_STANDARD_FEATURE_SELECTOR_ENDPOINT_HALT == setup->wValue) f04e: 8863 ldrh r3, [r4, #2] f050: bb0b cbnz r3, f096 if (USB_CONTROL_ENDPOINT == (setup->wIndex & USB_ENDPOINT_NUMBER_MASK)) f052: 88a1 ldrh r1, [r4, #4] f054: f011 0f0f tst.w r1, #15 f058: d106 bne.n f068 if (0U != isSet) f05a: f89d 3006 ldrb.w r3, [sp, #6] f05e: b163 cbz r3, f07a (void)USB_DeviceStallEndpoint(classHandle->handle, (uint8_t)setup->wIndex); f060: b2c9 uxtb r1, r1 f062: 6828 ldr r0, [r5, #0] f064: f000 f96c bl f340 if (0U != isSet) f068: f89d 3006 ldrb.w r3, [sp, #6] f06c: b153 cbz r3, f084 error = USB_DeviceClassEvent(classHandle->handle, kUSB_DeviceClassEventSetEndpointHalt, &setup->wIndex); f06e: 1d22 adds r2, r4, #4 f070: 2105 movs r1, #5 f072: 6828 ldr r0, [r5, #0] f074: f7f9 fb3c bl 86f0 f078: e00b b.n f092 (void)USB_DeviceUnstallEndpoint(classHandle->handle, (uint8_t)setup->wIndex); f07a: b2c9 uxtb r1, r1 f07c: 6828 ldr r0, [r5, #0] f07e: f000 f970 bl f362 f082: e7f1 b.n f068 USB_DeviceClassEvent(classHandle->handle, kUSB_DeviceClassEventClearEndpointHalt, &setup->wIndex); f084: 1d22 adds r2, r4, #4 f086: 2106 movs r1, #6 f088: 6828 ldr r0, [r5, #0] f08a: f7f9 fb31 bl 86f0 f08e: e000 b.n f092 return error; f090: 2005 movs r0, #5 } f092: b003 add sp, #12 f094: bd30 pop {r4, r5, pc} usb_status_t error = kStatus_USB_InvalidRequest; f096: 2005 movs r0, #5 f098: e7fb b.n f092 0000f09a : { f09a: b538 push {r3, r4, r5, lr} f09c: 4605 mov r5, r0 f09e: 460c mov r4, r1 f0a0: 9905 ldr r1, [sp, #20] if (kStatus_USB_InvalidRequest == error) f0a2: 2a05 cmp r2, #5 f0a4: d018 beq.n f0d8 if (*length > setup->wLength) f0a6: 88e3 ldrh r3, [r4, #6] f0a8: 680a ldr r2, [r1, #0] f0aa: 429a cmp r2, r3 *length = setup->wLength; f0ac: bf88 it hi f0ae: 600b strhi r3, [r1, #0] status = USB_DeviceSendRequest(handle, (USB_CONTROL_ENDPOINT), *buffer, *length); f0b0: 680b ldr r3, [r1, #0] f0b2: 9a04 ldr r2, [sp, #16] f0b4: 6812 ldr r2, [r2, #0] f0b6: 2100 movs r1, #0 f0b8: f000 f8e0 bl f27c if ((kStatus_USB_Success == status) && f0bc: 4603 mov r3, r0 f0be: b9f0 cbnz r0, f0fe f0c0: f994 2000 ldrsb.w r2, [r4] f0c4: 2a00 cmp r2, #0 f0c6: da1a bge.n f0fe status = USB_DeviceRecvRequest(handle, (USB_CONTROL_ENDPOINT), (uint8_t *)NULL, 0U); f0c8: 2300 movs r3, #0 f0ca: 461a mov r2, r3 f0cc: 4619 mov r1, r3 f0ce: 4628 mov r0, r5 f0d0: f000 f8dc bl f28c f0d4: 4603 mov r3, r0 f0d6: e012 b.n f0fe if ((!((setup->bmRequestType & USB_REQUEST_TYPE_TYPE_MASK) == USB_REQUEST_TYPE_TYPE_STANDARD)) && f0d8: 7822 ldrb r2, [r4, #0] f0da: f012 0f60 tst.w r2, #96 ; 0x60 f0de: d008 beq.n f0f2 f0e0: f012 0f80 tst.w r2, #128 ; 0x80 f0e4: d10d bne.n f102 ((setup->bmRequestType & USB_REQUEST_TYPE_DIR_MASK) == USB_REQUEST_TYPE_DIR_OUT) && f0e6: 88e2 ldrh r2, [r4, #6] f0e8: b16a cbz r2, f106 uint8_t direction = USB_IN; f0ea: 1c19 adds r1, r3, #0 f0ec: bf18 it ne f0ee: 2101 movne r1, #1 f0f0: e000 b.n f0f4 f0f2: 2101 movs r1, #1 status = USB_DeviceStallEndpoint( f0f4: 01c9 lsls r1, r1, #7 f0f6: 4628 mov r0, r5 f0f8: f000 f922 bl f340 f0fc: 4603 mov r3, r0 } f0fe: 4618 mov r0, r3 f100: bd38 pop {r3, r4, r5, pc} uint8_t direction = USB_IN; f102: 2101 movs r1, #1 f104: e7f6 b.n f0f4 f106: 2101 movs r1, #1 f108: e7f4 b.n f0f4 0000f10a : if (NULL == deviceHandle) f10a: b318 cbz r0, f154 { f10c: b5f8 push {r3, r4, r5, r6, r7, lr} f10e: 4605 mov r5, r0 if (NULL != deviceHandle->controllerInterface) f110: 6846 ldr r6, [r0, #4] f112: b30e cbz r6, f158 if (0U != deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].isBusy) f114: 004c lsls r4, r1, #1 f116: f004 041e and.w r4, r4, #30 f11a: ea44 14d1 orr.w r4, r4, r1, lsr #7 f11e: eb04 0044 add.w r0, r4, r4, lsl #1 f122: eb05 0080 add.w r0, r5, r0, lsl #2 f126: 7d00 ldrb r0, [r0, #20] f128: b9c0 cbnz r0, f15c deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].isBusy = 1U; f12a: eb04 0044 add.w r0, r4, r4, lsl #1 f12e: eb05 0080 add.w r0, r5, r0, lsl #2 f132: 2701 movs r7, #1 f134: 7507 strb r7, [r0, #20] if (0U != (endpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK)) f136: f011 0f80 tst.w r1, #128 ; 0x80 status = deviceHandle->controllerInterface->deviceSend(deviceHandle->controllerHandle, endpointAddress, f13a: bf14 ite ne f13c: 68b6 ldrne r6, [r6, #8] status = deviceHandle->controllerInterface->deviceRecv(deviceHandle->controllerHandle, endpointAddress, f13e: 68f6 ldreq r6, [r6, #12] f140: 6828 ldr r0, [r5, #0] f142: 47b0 blx r6 if (kStatus_USB_Success != status) f144: b128 cbz r0, f152 deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].isBusy = 0U; f146: eb04 0444 add.w r4, r4, r4, lsl #1 f14a: eb05 0484 add.w r4, r5, r4, lsl #2 f14e: 2300 movs r3, #0 f150: 7523 strb r3, [r4, #20] } f152: bdf8 pop {r3, r4, r5, r6, r7, pc} return kStatus_USB_InvalidHandle; f154: 2003 movs r0, #3 } f156: 4770 bx lr status = kStatus_USB_ControllerNotFound; f158: 2006 movs r0, #6 f15a: e7fa b.n f152 return kStatus_USB_Busy; f15c: 2002 movs r0, #2 f15e: e7f8 b.n f152 0000f160 : if (NULL == deviceHandle) f160: b138 cbz r0, f172 f162: 4603 mov r3, r0 if (NULL != deviceHandle->controllerInterface) f164: 6840 ldr r0, [r0, #4] f166: b130 cbz r0, f176 { f168: b510 push {r4, lr} status = deviceHandle->controllerInterface->deviceControl(deviceHandle->controllerHandle, type, param); f16a: 6944 ldr r4, [r0, #20] f16c: 6818 ldr r0, [r3, #0] f16e: 47a0 blx r4 } f170: bd10 pop {r4, pc} return kStatus_USB_InvalidHandle; f172: 2003 movs r0, #3 f174: 4770 bx lr status = kStatus_USB_ControllerNotFound; f176: 2006 movs r0, #6 } f178: 4770 bx lr 0000f17a : if ((NULL == msg) || (NULL == handle)) f17a: 2900 cmp r1, #0 f17c: d056 beq.n f22c f17e: 2800 cmp r0, #0 f180: d056 beq.n f230 if (NULL == deviceHandle->deviceCallback) f182: 6882 ldr r2, [r0, #8] f184: 2a00 cmp r2, #0 f186: d055 beq.n f234 { f188: b510 push {r4, lr} f18a: b084 sub sp, #16 f18c: 4604 mov r4, r0 uint8_t endpoint = message->code & USB_ENDPOINT_NUMBER_MASK; f18e: 7a0a ldrb r2, [r1, #8] switch (deviceNotify) f190: 2a10 cmp r2, #16 f192: d024 beq.n f1de if (endpoint < USB_DEVICE_CONFIG_ENDPOINTS) f194: f012 0f0c tst.w r2, #12 f198: d14e bne.n f238 if (NULL != handle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].callbackFn) f19a: 0053 lsls r3, r2, #1 f19c: f003 031e and.w r3, r3, #30 f1a0: ea43 13d2 orr.w r3, r3, r2, lsr #7 f1a4: eb03 0243 add.w r2, r3, r3, lsl #1 f1a8: eb00 0282 add.w r2, r0, r2, lsl #2 f1ac: 68d2 ldr r2, [r2, #12] f1ae: 2a00 cmp r2, #0 f1b0: d045 beq.n f23e endpointCallbackMessage.buffer = message->buffer; f1b2: 680a ldr r2, [r1, #0] f1b4: 9201 str r2, [sp, #4] endpointCallbackMessage.length = message->length; f1b6: 684a ldr r2, [r1, #4] f1b8: 9202 str r2, [sp, #8] endpointCallbackMessage.isSetup = message->isSetup; f1ba: 7a4a ldrb r2, [r1, #9] f1bc: f88d 200c strb.w r2, [sp, #12] if (0U != message->isSetup) f1c0: b36a cbz r2, f21e handle->epCallback[0].isBusy = 0U; f1c2: 2200 movs r2, #0 f1c4: 7502 strb r2, [r0, #20] handle->epCallback[1].isBusy = 0U; f1c6: f880 2020 strb.w r2, [r0, #32] status = handle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].callbackFn( f1ca: 005a lsls r2, r3, #1 f1cc: 18d1 adds r1, r2, r3 f1ce: eb04 0181 add.w r1, r4, r1, lsl #2 f1d2: 68cb ldr r3, [r1, #12] f1d4: 690a ldr r2, [r1, #16] f1d6: a901 add r1, sp, #4 f1d8: 4620 mov r0, r4 f1da: 4798 blx r3 f1dc: e02d b.n f23a handle->isResetting = 1U; f1de: 2301 movs r3, #1 f1e0: f880 306f strb.w r3, [r0, #111] ; 0x6f (void)USB_DeviceControl(handle, kUSB_DeviceControlSetDefaultStatus, NULL); f1e4: 2200 movs r2, #0 f1e6: 210e movs r1, #14 f1e8: f7ff ffba bl f160 handle->state = (uint8_t)kUSB_DeviceStateDefault; f1ec: 2302 movs r3, #2 f1ee: f884 306e strb.w r3, [r4, #110] ; 0x6e handle->deviceAddress = 0U; f1f2: 2300 movs r3, #0 f1f4: f884 306c strb.w r3, [r4, #108] ; 0x6c for (count = 0U; count < (USB_DEVICE_CONFIG_ENDPOINTS * 2U); count++) f1f8: 4623 mov r3, r4 f1fa: f104 0160 add.w r1, r4, #96 ; 0x60 handle->epCallback[count].callbackFn = (usb_device_endpoint_callback_t)NULL; f1fe: 2200 movs r2, #0 f200: 60da str r2, [r3, #12] handle->epCallback[count].callbackParam = NULL; f202: 611a str r2, [r3, #16] handle->epCallback[count].isBusy = 0U; f204: 751a strb r2, [r3, #20] f206: 330c adds r3, #12 for (count = 0U; count < (USB_DEVICE_CONFIG_ENDPOINTS * 2U); count++) f208: 428b cmp r3, r1 f20a: d1f9 bne.n f200 (void)handle->deviceCallback(handle, kUSB_DeviceEventBusReset, NULL); f20c: 68a3 ldr r3, [r4, #8] f20e: 2200 movs r2, #0 f210: 2101 movs r1, #1 f212: 4620 mov r0, r4 f214: 4798 blx r3 handle->isResetting = 0U; f216: 2000 movs r0, #0 f218: f884 006f strb.w r0, [r4, #111] ; 0x6f break; f21c: e00d b.n f23a handle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].isBusy = 0U; f21e: eb03 0243 add.w r2, r3, r3, lsl #1 f222: eb00 0282 add.w r2, r0, r2, lsl #2 f226: 2100 movs r1, #0 f228: 7511 strb r1, [r2, #20] f22a: e7ce b.n f1ca return kStatus_USB_InvalidHandle; f22c: 2003 movs r0, #3 f22e: 4770 bx lr f230: 2003 movs r0, #3 f232: 4770 bx lr return kStatus_USB_Error; f234: 2001 movs r0, #1 } f236: 4770 bx lr usb_status_t status = kStatus_USB_Error; f238: 2001 movs r0, #1 } f23a: b004 add sp, #16 f23c: bd10 pop {r4, pc} usb_status_t status = kStatus_USB_Error; f23e: 2001 movs r0, #1 f240: e7fb b.n f23a 0000f242 : * @retval kStatus_USB_ControllerNotFound Cannot find the controller. * @retval kStatus_USB_InvalidHandle The device handle is a NULL pointer. Or the controller handle is invalid. * */ usb_status_t USB_DeviceRun(usb_device_handle handle) { f242: b508 push {r3, lr} return USB_DeviceControl(handle, kUSB_DeviceControlRun, NULL); f244: 2200 movs r2, #0 f246: 4611 mov r1, r2 f248: f7ff ff8a bl f160 } f24c: bd08 pop {r3, pc} 0000f24e : * @retval kStatus_USB_Success The device is stopped successfully. * @retval kStatus_USB_ControllerNotFound Cannot find the controller. * @retval kStatus_USB_InvalidHandle The device handle is a NULL pointer. Or the controller handle is invalid. */ usb_status_t USB_DeviceStop(usb_device_handle handle) { f24e: b508 push {r3, lr} return USB_DeviceControl(handle, kUSB_DeviceControlStop, NULL); f250: 2200 movs r2, #0 f252: 2101 movs r1, #1 f254: f7ff ff84 bl f160 } f258: bd08 pop {r3, pc} 0000f25a : */ usb_status_t USB_DeviceDeinit(usb_device_handle handle) { usb_device_struct_t *deviceHandle = (usb_device_struct_t *)handle; if (NULL == deviceHandle) f25a: b168 cbz r0, f278 { f25c: b510 push {r4, lr} f25e: 4604 mov r4, r0 { return kStatus_USB_InvalidHandle; } /* De-initialize the controller */ if (NULL != deviceHandle->controllerInterface) f260: 6843 ldr r3, [r0, #4] f262: b123 cbz r3, f26e { /* the callbackFn is initialized in USB_DeviceGetControllerInterface */ (void)deviceHandle->controllerInterface->deviceDeinit(deviceHandle->controllerHandle); f264: 685b ldr r3, [r3, #4] f266: 6800 ldr r0, [r0, #0] f268: 4798 blx r3 deviceHandle->controllerInterface = (usb_device_controller_interface_struct_t *)NULL; f26a: 2300 movs r3, #0 f26c: 6063 str r3, [r4, #4] handle->controllerHandle = NULL; f26e: 2000 movs r0, #0 f270: 6020 str r0, [r4, #0] handle->controllerId = 0U; f272: f884 006d strb.w r0, [r4, #109] ; 0x6d #endif /* Free the device handle. */ (void)USB_DeviceFreeHandle(deviceHandle); return kStatus_USB_Success; } f276: bd10 pop {r4, pc} return kStatus_USB_InvalidHandle; f278: 2003 movs r0, #3 } f27a: 4770 bx lr 0000f27c : * should implement a queue in the application level. * The subsequent transfer could begin only when the previous transfer is done (get notification through the endpoint * callback). */ usb_status_t USB_DeviceSendRequest(usb_device_handle handle, uint8_t endpointAddress, uint8_t *buffer, uint32_t length) { f27c: b508 push {r3, lr} return USB_DeviceTransfer( handle, (endpointAddress & USB_ENDPOINT_NUMBER_MASK) | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), f27e: f001 010f and.w r1, r1, #15 return USB_DeviceTransfer( f282: f041 0180 orr.w r1, r1, #128 ; 0x80 f286: f7ff ff40 bl f10a buffer, length); } f28a: bd08 pop {r3, pc} 0000f28c : * should implement a queue in the application level. * The subsequent transfer could begin only when the previous transfer is done (get notification through the endpoint * callback). */ usb_status_t USB_DeviceRecvRequest(usb_device_handle handle, uint8_t endpointAddress, uint8_t *buffer, uint32_t length) { f28c: b508 push {r3, lr} return USB_DeviceTransfer( f28e: f001 010f and.w r1, r1, #15 f292: f7ff ff3a bl f10a handle, (endpointAddress & USB_ENDPOINT_NUMBER_MASK) | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), buffer, length); } f296: bd08 pop {r3, pc} 0000f298 : usb_status_t USB_DeviceCancel(usb_device_handle handle, uint8_t endpointAddress) { usb_device_struct_t *deviceHandle = (usb_device_struct_t *)handle; usb_status_t status; if (NULL == deviceHandle) f298: b130 cbz r0, f2a8 { f29a: b508 push {r3, lr} { return kStatus_USB_InvalidHandle; } if (NULL != deviceHandle->controllerInterface) f29c: 6842 ldr r2, [r0, #4] f29e: b12a cbz r2, f2ac { /* the callbackFn is initialized in USB_DeviceGetControllerInterface */ status = deviceHandle->controllerInterface->deviceCancel(deviceHandle->controllerHandle, endpointAddress); f2a0: 6912 ldr r2, [r2, #16] f2a2: 6800 ldr r0, [r0, #0] f2a4: 4790 blx r2 else { status = kStatus_USB_ControllerNotFound; } return status; } f2a6: bd08 pop {r3, pc} return kStatus_USB_InvalidHandle; f2a8: 2003 movs r0, #3 } f2aa: 4770 bx lr status = kStatus_USB_ControllerNotFound; f2ac: 2006 movs r0, #6 f2ae: e7fa b.n f2a6 0000f2b0 : { usb_device_struct_t *deviceHandle = (usb_device_struct_t *)handle; uint8_t endpoint; uint8_t direction; if (NULL == deviceHandle) f2b0: b1e0 cbz r0, f2ec { return kStatus_USB_InvalidHandle; } if ((NULL == epInit) || (NULL == epCallback)) f2b2: b1e9 cbz r1, f2f0 f2b4: b1f2 cbz r2, f2f4 { f2b6: b570 push {r4, r5, r6, lr} { return kStatus_USB_InvalidParameter; } endpoint = epInit->endpointAddress & USB_ENDPOINT_NUMBER_MASK; f2b8: 788d ldrb r5, [r1, #2] direction = (epInit->endpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) >> USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT; if (endpoint < USB_DEVICE_CONFIG_ENDPOINTS) f2ba: f015 0f0c tst.w r5, #12 f2be: d11b bne.n f2f8 f2c0: 4614 mov r4, r2 f2c2: 460a mov r2, r1 { deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].callbackFn = epCallback->callbackFn; f2c4: 006b lsls r3, r5, #1 f2c6: f003 031e and.w r3, r3, #30 f2ca: ea43 13d5 orr.w r3, r3, r5, lsr #7 f2ce: 6826 ldr r6, [r4, #0] f2d0: 005d lsls r5, r3, #1 f2d2: 18e9 adds r1, r5, r3 f2d4: eb00 0181 add.w r1, r0, r1, lsl #2 f2d8: 60ce str r6, [r1, #12] deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].callbackParam = epCallback->callbackParam; f2da: 6864 ldr r4, [r4, #4] deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].callbackParam = f2dc: 610c str r4, [r1, #16] deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].isBusy = 0U; f2de: 460b mov r3, r1 f2e0: 2100 movs r1, #0 f2e2: 7519 strb r1, [r3, #20] } else { return kStatus_USB_InvalidParameter; } return USB_DeviceControl(handle, kUSB_DeviceControlEndpointInit, epInit); f2e4: 2102 movs r1, #2 f2e6: f7ff ff3b bl f160 } f2ea: bd70 pop {r4, r5, r6, pc} return kStatus_USB_InvalidHandle; f2ec: 2003 movs r0, #3 f2ee: 4770 bx lr return kStatus_USB_InvalidParameter; f2f0: 2004 movs r0, #4 f2f2: 4770 bx lr f2f4: 2004 movs r0, #4 } f2f6: 4770 bx lr return kStatus_USB_InvalidParameter; f2f8: 2004 movs r0, #4 f2fa: e7f6 b.n f2ea 0000f2fc : * @retval kStatus_USB_InvalidParameter The endpoint number is more than USB_DEVICE_CONFIG_ENDPOINTS. * @retval kStatus_USB_Busy The endpoint is busy in EHCI driver. * @retval kStatus_USB_ControllerNotFound Cannot find the controller. */ usb_status_t USB_DeviceDeinitEndpoint(usb_device_handle handle, uint8_t endpointAddress) { f2fc: b530 push {r4, r5, lr} f2fe: b083 sub sp, #12 f300: f88d 1007 strb.w r1, [sp, #7] usb_status_t status; #if (defined(USB_DEVICE_CONFIG_USE_TASK) && (USB_DEVICE_CONFIG_USE_TASK > 0U)) OSA_SR_ALLOC(); #endif if (NULL == deviceHandle) f304: b1c0 cbz r0, f338 f306: 4604 mov r4, r0 uint8_t endpoint = endpointAddress & USB_ENDPOINT_NUMBER_MASK; f308: b2cd uxtb r5, r1 #if (defined(USB_DEVICE_CONFIG_USE_TASK) && (USB_DEVICE_CONFIG_USE_TASK > 0U)) OSA_ENTER_CRITICAL(); deviceHandle->epCallbackDirectly = 1U; OSA_EXIT_CRITICAL(); #endif status = USB_DeviceControl(handle, kUSB_DeviceControlEndpointDeinit, &endpointAddress); f30a: f10d 0207 add.w r2, sp, #7 f30e: 2103 movs r1, #3 f310: f7ff ff26 bl f160 OSA_ENTER_CRITICAL(); deviceHandle->epCallbackDirectly = 0U; OSA_EXIT_CRITICAL(); #endif if (endpoint < USB_DEVICE_CONFIG_ENDPOINTS) f314: f015 0f0c tst.w r5, #12 f318: d110 bne.n f33c { deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].callbackFn = f31a: 006b lsls r3, r5, #1 f31c: f003 031e and.w r3, r3, #30 f320: ea43 13d5 orr.w r3, r3, r5, lsr #7 f324: 005a lsls r2, r3, #1 f326: 18d1 adds r1, r2, r3 f328: eb04 0181 add.w r1, r4, r1, lsl #2 f32c: 2500 movs r5, #0 f32e: 60cd str r5, [r1, #12] (usb_device_endpoint_callback_t)NULL; deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].callbackParam = NULL; f330: 610d str r5, [r1, #16] deviceHandle->epCallback[(uint8_t)((uint32_t)endpoint << 1U) | direction].isBusy = 0U; f332: 750d strb r5, [r1, #20] else { return kStatus_USB_InvalidParameter; } return status; } f334: b003 add sp, #12 f336: bd30 pop {r4, r5, pc} return kStatus_USB_InvalidHandle; f338: 2003 movs r0, #3 f33a: e7fb b.n f334 return kStatus_USB_InvalidParameter; f33c: 2004 movs r0, #4 f33e: e7f9 b.n f334 0000f340 : * @retval kStatus_USB_InvalidHandle The handle is a NULL pointer. Or the controller handle is invalid. * @retval kStatus_USB_InvalidParameter The endpoint number is more than USB_DEVICE_CONFIG_ENDPOINTS. * @retval kStatus_USB_ControllerNotFound Cannot find the controller. */ usb_status_t USB_DeviceStallEndpoint(usb_device_handle handle, uint8_t endpointAddress) { f340: b500 push {lr} f342: b083 sub sp, #12 f344: f88d 1007 strb.w r1, [sp, #7] if ((endpointAddress & USB_ENDPOINT_NUMBER_MASK) < USB_DEVICE_CONFIG_ENDPOINTS) f348: f011 0f0c tst.w r1, #12 f34c: d003 beq.n f356 { return USB_DeviceControl(handle, kUSB_DeviceControlEndpointStall, &endpointAddress); } else { return kStatus_USB_InvalidParameter; f34e: 2004 movs r0, #4 } } f350: b003 add sp, #12 f352: f85d fb04 ldr.w pc, [sp], #4 return USB_DeviceControl(handle, kUSB_DeviceControlEndpointStall, &endpointAddress); f356: f10d 0207 add.w r2, sp, #7 f35a: 2104 movs r1, #4 f35c: f7ff ff00 bl f160 f360: e7f6 b.n f350 0000f362 : * @retval kStatus_USB_InvalidHandle The handle is a NULL pointer. Or the controller handle is invalid. * @retval kStatus_USB_InvalidParameter The endpoint number is more than USB_DEVICE_CONFIG_ENDPOINTS. * @retval kStatus_USB_ControllerNotFound Cannot find the controller. */ usb_status_t USB_DeviceUnstallEndpoint(usb_device_handle handle, uint8_t endpointAddress) { f362: b500 push {lr} f364: b083 sub sp, #12 f366: f88d 1007 strb.w r1, [sp, #7] if ((endpointAddress & USB_ENDPOINT_NUMBER_MASK) < USB_DEVICE_CONFIG_ENDPOINTS) f36a: f011 0f0c tst.w r1, #12 f36e: d003 beq.n f378 { return USB_DeviceControl(handle, kUSB_DeviceControlEndpointUnstall, &endpointAddress); } else { return kStatus_USB_InvalidParameter; f370: 2004 movs r0, #4 } } f372: b003 add sp, #12 f374: f85d fb04 ldr.w pc, [sp], #4 return USB_DeviceControl(handle, kUSB_DeviceControlEndpointUnstall, &endpointAddress); f378: f10d 0207 add.w r2, sp, #7 f37c: 2105 movs r1, #5 f37e: f7ff feef bl f160 f382: e7f6 b.n f372 0000f384 : usb_status_t USB_DeviceGetStatus(usb_device_handle handle, usb_device_status_t type, void *param) { uint8_t *temp8; usb_status_t status = kStatus_USB_Error; if (NULL == param) f384: b33a cbz r2, f3d6 { f386: b508 push {r3, lr} { return kStatus_USB_InvalidParameter; } switch (type) f388: 3902 subs r1, #2 f38a: 2906 cmp r1, #6 f38c: d825 bhi.n f3da f38e: e8df f001 tbb [pc, r1] f392: 0804 .short 0x0804 f394: 110c1a16 .word 0x110c1a16 f398: 1e .byte 0x1e f399: 00 .byte 0x00 { case kUSB_DeviceStatusSpeed: status = USB_DeviceControl(handle, kUSB_DeviceControlGetSpeed, param); f39a: 210f movs r1, #15 f39c: f7ff fee0 bl f160 default: /*no action*/ break; } return status; } f3a0: bd08 pop {r3, pc} status = USB_DeviceControl(handle, kUSB_DeviceControlGetOtgStatus, param); f3a2: 2110 movs r1, #16 f3a4: f7ff fedc bl f160 break; f3a8: e7fa b.n f3a0 *temp8 = ((usb_device_struct_t *)handle)->state; f3aa: f890 306e ldrb.w r3, [r0, #110] ; 0x6e f3ae: 7013 strb r3, [r2, #0] status = kStatus_USB_Success; f3b0: 2000 movs r0, #0 break; f3b2: e7f5 b.n f3a0 *temp8 = ((usb_device_struct_t *)handle)->deviceAddress; f3b4: f890 306c ldrb.w r3, [r0, #108] ; 0x6c f3b8: 7013 strb r3, [r2, #0] status = kStatus_USB_Success; f3ba: 2000 movs r0, #0 break; f3bc: e7f0 b.n f3a0 status = USB_DeviceControl(handle, kUSB_DeviceControlGetDeviceStatus, param); f3be: 2106 movs r1, #6 f3c0: f7ff fece bl f160 break; f3c4: e7ec b.n f3a0 status = USB_DeviceControl(handle, kUSB_DeviceControlGetEndpointStatus, param); f3c6: 2107 movs r1, #7 f3c8: f7ff feca bl f160 break; f3cc: e7e8 b.n f3a0 status = USB_DeviceControl(handle, kUSB_DeviceControlGetSynchFrame, param); f3ce: 2109 movs r1, #9 f3d0: f7ff fec6 bl f160 break; f3d4: e7e4 b.n f3a0 return kStatus_USB_InvalidParameter; f3d6: 2004 movs r0, #4 } f3d8: 4770 bx lr usb_status_t status = kStatus_USB_Error; f3da: 2001 movs r0, #1 f3dc: e7e0 b.n f3a0 0000f3de : * @retval kStatus_USB_InvalidHandle The handle is a NULL pointer. Or the controller handle is invalid. * @retval kStatus_USB_ControllerNotFound Cannot find the controller. * @retval kStatus_USB_Error Unsupported type, or the param is NULL pointer. */ usb_status_t USB_DeviceSetStatus(usb_device_handle handle, usb_device_status_t type, void *param) { f3de: b508 push {r3, lr} usb_status_t status = kStatus_USB_Error; switch (type) f3e0: 3903 subs r1, #3 f3e2: 290b cmp r1, #11 f3e4: d838 bhi.n f458 f3e6: e8df f001 tbb [pc, r1] f3ea: 3706 .short 0x3706 f3ec: 37100a37 .word 0x37100a37 f3f0: 27332f37 .word 0x27332f37 f3f4: 2b37 .short 0x2b37 case kUSB_DeviceStatusTestMode: status = USB_DeviceControl(handle, kUSB_DeviceControlSetTestMode, param); break; #endif case kUSB_DeviceStatusOtg: status = USB_DeviceControl(handle, kUSB_DeviceControlSetOtgStatus, param); f3f6: 2111 movs r1, #17 f3f8: f7ff feb2 bl f160 default: /*no action*/ break; } return status; } f3fc: bd08 pop {r3, pc} if (NULL != param) f3fe: b36a cbz r2, f45c ((usb_device_struct_t *)handle)->state = (uint8_t)(*(uint8_t *)param); f400: 7813 ldrb r3, [r2, #0] f402: f880 306e strb.w r3, [r0, #110] ; 0x6e status = kStatus_USB_Success; f406: 2000 movs r0, #0 f408: e7f8 b.n f3fc if ((uint8_t)kUSB_DeviceStateAddressing != ((usb_device_struct_t *)handle)->state) f40a: f890 306e ldrb.w r3, [r0, #110] ; 0x6e f40e: 2b03 cmp r3, #3 f410: d00c beq.n f42c if (NULL != param) f412: b32a cbz r2, f460 ((usb_device_struct_t *)handle)->deviceAddress = (uint8_t)(*(uint8_t *)param); f414: 7813 ldrb r3, [r2, #0] f416: f880 306c strb.w r3, [r0, #108] ; 0x6c ((usb_device_struct_t *)handle)->state = (uint8_t)kUSB_DeviceStateAddressing; f41a: 2303 movs r3, #3 f41c: f880 306e strb.w r3, [r0, #110] ; 0x6e status = USB_DeviceControl(handle, kUSB_DeviceControlPreSetDeviceAddress, f420: f100 026c add.w r2, r0, #108 ; 0x6c f424: 2114 movs r1, #20 f426: f7ff fe9b bl f160 f42a: e7e7 b.n f3fc status = USB_DeviceControl(handle, kUSB_DeviceControlSetDeviceAddress, f42c: f100 026c add.w r2, r0, #108 ; 0x6c f430: 2108 movs r1, #8 f432: f7ff fe95 bl f160 f436: e7e1 b.n f3fc status = USB_DeviceControl(handle, kUSB_DeviceControlResume, param); f438: 210a movs r1, #10 f43a: f7ff fe91 bl f160 break; f43e: e7dd b.n f3fc status = USB_DeviceControl(handle, kUSB_DeviceControlSleepResume, param); f440: 210b movs r1, #11 f442: f7ff fe8d bl f160 break; f446: e7d9 b.n f3fc status = USB_DeviceControl(handle, kUSB_DeviceControlSuspend, param); f448: 210c movs r1, #12 f44a: f7ff fe89 bl f160 break; f44e: e7d5 b.n f3fc status = USB_DeviceControl(handle, kUSB_DeviceControlSleep, param); f450: 210d movs r1, #13 f452: f7ff fe85 bl f160 break; f456: e7d1 b.n f3fc usb_status_t status = kStatus_USB_Error; f458: 2001 movs r0, #1 f45a: e7cf b.n f3fc f45c: 2001 movs r0, #1 f45e: e7cd b.n f3fc f460: 2001 movs r0, #1 f462: e7cb b.n f3fc 0000f464 : { f464: b530 push {r4, r5, lr} f466: b083 sub sp, #12 (uint8_t *)&khciState->setupPacketBuffer[0] + f468: f100 030c add.w r3, r0, #12 khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_OUT].stateUnion.stateBitField.bdtOdd * f46c: f890 402d ldrb.w r4, [r0, #45] ; 0x2d f470: f3c4 1100 ubfx r1, r4, #4, #1 (uint8_t *)&khciState->setupPacketBuffer[0] + f474: eb03 03c1 add.w r3, r3, r1, lsl #3 khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_OUT].transferBuffer = f478: 6203 str r3, [r0, #32] khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_OUT].transferDone = 0U; f47a: 2100 movs r1, #0 f47c: 6281 str r1, [r0, #40] ; 0x28 khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_OUT].transferLength = USB_SETUP_PACKET_SIZE; f47e: 2508 movs r5, #8 f480: 6245 str r5, [r0, #36] ; 0x24 khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_OUT].stateUnion.stateBitField.data0 = 0U; f482: f044 0420 orr.w r4, r4, #32 f486: f361 04c3 bfi r4, r1, #3, #1 f48a: f880 402d strb.w r4, [r0, #45] ; 0x2d (void)USB_DeviceKhciEndpointTransfer( f48e: 9500 str r5, [sp, #0] f490: 460a mov r2, r1 f492: f7f9 fa49 bl 8928 } f496: b003 add sp, #12 f498: bd30 pop {r4, r5, pc} 0000f49a : { f49a: b4f0 push {r4, r5, r6, r7} khciState->registerBase->ERRSTAT = 0xFFU; f49c: 6883 ldr r3, [r0, #8] f49e: 22ff movs r2, #255 ; 0xff f4a0: f883 2088 strb.w r2, [r3, #136] ; 0x88 khciState->registerBase->CTL |= USB_CTL_ODDRST_MASK; f4a4: 6882 ldr r2, [r0, #8] f4a6: f892 3094 ldrb.w r3, [r2, #148] ; 0x94 f4aa: f043 0302 orr.w r3, r3, #2 f4ae: f882 3094 strb.w r3, [r2, #148] ; 0x94 khciState->registerBase->ADDR = 0U; f4b2: 6883 ldr r3, [r0, #8] f4b4: 2400 movs r4, #0 f4b6: f883 4098 strb.w r4, [r3, #152] ; 0x98 USB_KHCI_BDT_SET_CONTROL((uint32_t)khciState->bdt, count, USB_OUT, 0U, 0U); f4ba: 4621 mov r1, r4 khciState->endpointState[((uint32_t)count << 1U) | USB_OUT].stateUnion.state = 0U; f4bc: f100 062c add.w r6, r0, #44 ; 0x2c USB_KHCI_BDT_SET_CONTROL((uint32_t)khciState->bdt, count, USB_OUT, 0U, 0U); f4c0: 0165 lsls r5, r4, #5 f4c2: f405 77f0 and.w r7, r5, #480 ; 0x1e0 f4c6: 6843 ldr r3, [r0, #4] f4c8: f423 73ff bic.w r3, r3, #510 ; 0x1fe f4cc: f023 0301 bic.w r3, r3, #1 f4d0: 433b orrs r3, r7 f4d2: 6019 str r1, [r3, #0] USB_KHCI_BDT_SET_CONTROL((uint32_t)khciState->bdt, count, USB_OUT, 1U, 0U); f4d4: 6842 ldr r2, [r0, #4] f4d6: f422 72ff bic.w r2, r2, #510 ; 0x1fe f4da: f022 0201 bic.w r2, r2, #1 f4de: 433a orrs r2, r7 f4e0: f042 0208 orr.w r2, r2, #8 f4e4: 6011 str r1, [r2, #0] USB_KHCI_BDT_SET_CONTROL((uint32_t)khciState->bdt, count, USB_IN, 0U, 0U); f4e6: 6842 ldr r2, [r0, #4] f4e8: f422 72ff bic.w r2, r2, #510 ; 0x1fe f4ec: f022 0201 bic.w r2, r2, #1 f4f0: 433a orrs r2, r7 f4f2: f042 0210 orr.w r2, r2, #16 f4f6: 6011 str r1, [r2, #0] USB_KHCI_BDT_SET_CONTROL((uint32_t)khciState->bdt, count, USB_IN, 1U, 0U); f4f8: 6843 ldr r3, [r0, #4] f4fa: f423 73ff bic.w r3, r3, #510 ; 0x1fe f4fe: f023 0301 bic.w r3, r3, #1 f502: 433b orrs r3, r7 f504: f043 0318 orr.w r3, r3, #24 f508: 6019 str r1, [r3, #0] khciState->endpointState[((uint32_t)count << 1U) | USB_OUT].stateUnion.state = 0U; f50a: 5171 str r1, [r6, r5] khciState->endpointState[((uint32_t)count << 1U) | USB_IN].stateUnion.state = 0U; f50c: f045 0310 orr.w r3, r5, #16 f510: 4403 add r3, r0 f512: 62d9 str r1, [r3, #44] ; 0x2c khciState->registerBase->ENDPOINT[count].ENDPT = 0x00U; f514: 6883 ldr r3, [r0, #8] f516: f104 0230 add.w r2, r4, #48 ; 0x30 f51a: f803 1022 strb.w r1, [r3, r2, lsl #2] f51e: 3401 adds r4, #1 for (count = 0U; count < USB_DEVICE_CONFIG_ENDPOINTS; count++) f520: 2c04 cmp r4, #4 f522: d1cd bne.n f4c0 khciState->isDmaAlignBufferInusing = 0U; f524: 2200 movs r2, #0 f526: f880 20a0 strb.w r2, [r0, #160] ; 0xa0 khciState->registerBase->CTL &= (uint8_t)(~USB_CTL_ODDRST_MASK); f52a: 6881 ldr r1, [r0, #8] f52c: f891 3094 ldrb.w r3, [r1, #148] ; 0x94 f530: f003 03fd and.w r3, r3, #253 ; 0xfd f534: f881 3094 strb.w r3, [r1, #148] ; 0x94 khciState->registerBase->ERREN = 0xFFU; f538: 6883 ldr r3, [r0, #8] f53a: 21ff movs r1, #255 ; 0xff f53c: f883 108c strb.w r1, [r3, #140] ; 0x8c khciState->registerBase->INTEN = interruptFlag; f540: 6883 ldr r3, [r0, #8] f542: 2189 movs r1, #137 ; 0x89 f544: f883 1084 strb.w r1, [r3, #132] ; 0x84 khciState->isResetting = 0U; f548: f880 20a1 strb.w r2, [r0, #161] ; 0xa1 khciState->registerBase->CTL &= (uint8_t)(~USB_CTL_TXSUSPENDTOKENBUSY_MASK); f54c: 6882 ldr r2, [r0, #8] f54e: f892 3094 ldrb.w r3, [r2, #148] ; 0x94 f552: f003 03df and.w r3, r3, #223 ; 0xdf f556: f882 3094 strb.w r3, [r2, #148] ; 0x94 } f55a: bcf0 pop {r4, r5, r6, r7} f55c: 4770 bx lr 0000f55e : */ usb_status_t USB_DeviceKhciDeinit(usb_device_controller_handle khciHandle) { usb_device_khci_state_struct_t *khciState = (usb_device_khci_state_struct_t *)khciHandle; if (NULL == khciHandle) f55e: 4603 mov r3, r0 f560: b1a8 cbz r0, f58e { return kStatus_USB_InvalidHandle; } /* Clear all interrupt flags. */ khciState->registerBase->ISTAT = 0xFFU; f562: 6882 ldr r2, [r0, #8] f564: 21ff movs r1, #255 ; 0xff f566: f882 1080 strb.w r1, [r2, #128] ; 0x80 /* Disable all interrupts. */ khciState->registerBase->INTEN = (0U); f56a: 6882 ldr r2, [r0, #8] f56c: 2000 movs r0, #0 f56e: f882 0084 strb.w r0, [r2, #132] ; 0x84 /* Clear device address. */ khciState->registerBase->ADDR = (0U); f572: 689a ldr r2, [r3, #8] f574: f882 0098 strb.w r0, [r2, #152] ; 0x98 /* Clear USB_CTL register */ khciState->registerBase->CTL = 0x00U; f578: 689a ldr r2, [r3, #8] f57a: f882 0094 strb.w r0, [r2, #148] ; 0x94 khciState->registerBase->USBCTRL |= USB_USBCTRL_PDE_MASK | USB_USBCTRL_SUSP_MASK; f57e: 689a ldr r2, [r3, #8] f580: f892 3100 ldrb.w r3, [r2, #256] ; 0x100 f584: f043 03c0 orr.w r3, r3, #192 ; 0xc0 f588: f882 3100 strb.w r3, [r2, #256] ; 0x100 return kStatus_USB_Success; f58c: 4770 bx lr return kStatus_USB_InvalidHandle; f58e: 2003 movs r0, #3 } f590: 4770 bx lr 0000f592 : */ usb_status_t USB_DeviceKhciSend(usb_device_controller_handle khciHandle, uint8_t endpointAddress, uint8_t *buffer, uint32_t length) { f592: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} f596: b082 sub sp, #8 f598: 4606 mov r6, r0 f59a: 460f mov r7, r1 usb_device_khci_state_struct_t *khciState = (usb_device_khci_state_struct_t *)khciHandle; uint32_t index = (((uint32_t)endpointAddress & USB_ENDPOINT_NUMBER_MASK) << 1U) | USB_IN; f59c: 004c lsls r4, r1, #1 f59e: f004 041e and.w r4, r4, #30 f5a2: f044 0401 orr.w r4, r4, #1 usb_status_t status = kStatus_USB_Error; /* Save the transfer information */ if (0U == khciState->endpointState[index].stateUnion.stateBitField.transferring) f5a6: eb00 1104 add.w r1, r0, r4, lsl #4 f5aa: f891 102d ldrb.w r1, [r1, #45] ; 0x2d f5ae: f011 0f40 tst.w r1, #64 ; 0x40 f5b2: d10b bne.n f5cc { khciState->endpointState[index].transferDone = 0U; f5b4: eb00 1104 add.w r1, r0, r4, lsl #4 f5b8: 2500 movs r5, #0 f5ba: 628d str r5, [r1, #40] ; 0x28 khciState->endpointState[index].transferBuffer = buffer; f5bc: 620a str r2, [r1, #32] khciState->endpointState[index].transferLength = length; f5be: 624b str r3, [r1, #36] ; 0x24 khciState->endpointState[index].stateUnion.stateBitField.dmaAlign = 1U; f5c0: f891 202d ldrb.w r2, [r1, #45] ; 0x2d f5c4: f042 0220 orr.w r2, r2, #32 f5c8: f881 202d strb.w r2, [r1, #45] ; 0x2d } /* Data length needs to less than max packet size in each call. */ if (length > khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize) f5cc: eb06 1204 add.w r2, r6, r4, lsl #4 f5d0: 8d95 ldrh r5, [r2, #44] ; 0x2c f5d2: f3c5 0509 ubfx r5, r5, #0, #10 f5d6: 429d cmp r5, r3 f5d8: bf28 it cs f5da: 461d movcs r5, r3 { length = khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize; } /* Send data when the device is not resetting. */ if (0U == khciState->isResetting) f5dc: f896 30a1 ldrb.w r3, [r6, #161] ; 0xa1 f5e0: b16b cbz r3, f5fe usb_status_t status = kStatus_USB_Error; f5e2: f04f 0801 mov.w r8, #1 (uint32_t)khciState->endpointState[index].transferDone), length); } /* Prime a transfer to receive next setup packet if the dat length is zero in a control in endpoint. */ if ((0U == khciState->endpointState[index].transferDone) && (0U == length) && f5e6: eb06 1404 add.w r4, r6, r4, lsl #4 f5ea: 6aa3 ldr r3, [r4, #40] ; 0x28 f5ec: 432b orrs r3, r5 f5ee: d102 bne.n f5f6 f5f0: f017 0f0f tst.w r7, #15 f5f4: d00f beq.n f616 (USB_CONTROL_ENDPOINT == (endpointAddress & USB_ENDPOINT_NUMBER_MASK))) { USB_DeviceKhciPrimeNextSetup(khciState); } return status; } f5f6: 4640 mov r0, r8 f5f8: b002 add sp, #8 f5fa: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} (uint8_t *)((uint32_t)khciState->endpointState[index].transferBuffer + f5fe: 6a11 ldr r1, [r2, #32] f600: 6a93 ldr r3, [r2, #40] ; 0x28 status = USB_DeviceKhciEndpointTransfer(khciState, endpointAddress & USB_ENDPOINT_NUMBER_MASK, USB_IN, f602: 9500 str r5, [sp, #0] f604: 440b add r3, r1 f606: 2201 movs r2, #1 f608: f007 010f and.w r1, r7, #15 f60c: 4630 mov r0, r6 f60e: f7f9 f98b bl 8928 f612: 4680 mov r8, r0 f614: e7e7 b.n f5e6 USB_DeviceKhciPrimeNextSetup(khciState); f616: 4630 mov r0, r6 f618: f7ff ff24 bl f464 f61c: e7eb b.n f5f6 0000f61e : */ usb_status_t USB_DeviceKhciRecv(usb_device_controller_handle khciHandle, uint8_t endpointAddress, uint8_t *buffer, uint32_t length) { f61e: b5f0 push {r4, r5, r6, r7, lr} f620: b083 sub sp, #12 usb_device_khci_state_struct_t *khciState = (usb_device_khci_state_struct_t *)khciHandle; uint32_t index = (((uint32_t)endpointAddress & USB_ENDPOINT_NUMBER_MASK) << 1U) | USB_OUT; f622: 004c lsls r4, r1, #1 f624: f004 041e and.w r4, r4, #30 usb_status_t status = kStatus_USB_Error; if ((0U == length) && (USB_CONTROL_ENDPOINT == (endpointAddress & USB_ENDPOINT_NUMBER_MASK))) f628: 461f mov r7, r3 f62a: b913 cbnz r3, f632 f62c: f011 0f0f tst.w r1, #15 f630: d03a beq.n f6a8 USB_DeviceKhciPrimeNextSetup(khciState); } else { /* Save the transfer information */ if (0U == khciState->endpointState[index].stateUnion.stateBitField.transferring) f632: eb00 1304 add.w r3, r0, r4, lsl #4 f636: f893 302d ldrb.w r3, [r3, #45] ; 0x2d f63a: f013 0f40 tst.w r3, #64 ; 0x40 f63e: d105 bne.n f64c { khciState->endpointState[index].transferDone = 0U; f640: eb00 1304 add.w r3, r0, r4, lsl #4 f644: 2500 movs r5, #0 f646: 629d str r5, [r3, #40] ; 0x28 khciState->endpointState[index].transferBuffer = buffer; f648: 621a str r2, [r3, #32] khciState->endpointState[index].transferLength = length; f64a: 625f str r7, [r3, #36] ; 0x24 } khciState->endpointState[index].stateUnion.stateBitField.dmaAlign = 1U; f64c: eb00 1604 add.w r6, r0, r4, lsl #4 f650: f896 502d ldrb.w r5, [r6, #45] ; 0x2d f654: f045 0520 orr.w r5, r5, #32 f658: f886 502d strb.w r5, [r6, #45] ; 0x2d /* Data length needs to less than max packet size in each call. */ if (length > khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize) f65c: 8db5 ldrh r5, [r6, #44] ; 0x2c f65e: f3c5 0309 ubfx r3, r5, #0, #10 f662: 42bb cmp r3, r7 f664: bf28 it cs f666: 463b movcs r3, r7 { length = khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize; } buffer = (uint8_t *)((uint32_t)buffer + (uint32_t)khciState->endpointState[index].transferDone); f668: 6ab5 ldr r5, [r6, #40] ; 0x28 f66a: 442a add r2, r5 f66c: 4616 mov r6, r2 if ((NULL != khciState->dmaAlignBuffer) && (0U == khciState->isDmaAlignBufferInusing) && f66e: 69c5 ldr r5, [r0, #28] f670: b1a5 cbz r5, f69c f672: f890 70a0 ldrb.w r7, [r0, #160] ; 0xa0 f676: b98f cbnz r7, f69c f678: 2b40 cmp r3, #64 ; 0x40 f67a: d80f bhi.n f69c (USB_DEVICE_CONFIG_KHCI_DMA_ALIGN_BUFFER_LENGTH >= length) && ((0U != (length & 0x03U)) || (0U != (((uint32_t)buffer) & 0x03U)))) f67c: 431a orrs r2, r3 f67e: f012 0f03 tst.w r2, #3 f682: d00b beq.n f69c { khciState->endpointState[index].stateUnion.stateBitField.dmaAlign = 0U; f684: eb00 1404 add.w r4, r0, r4, lsl #4 f688: f894 202d ldrb.w r2, [r4, #45] ; 0x2d f68c: f36f 1245 bfc r2, #5, #1 f690: f884 202d strb.w r2, [r4, #45] ; 0x2d buffer = khciState->dmaAlignBuffer; khciState->isDmaAlignBufferInusing = 1U; f694: 2201 movs r2, #1 f696: f880 20a0 strb.w r2, [r0, #160] ; 0xa0 buffer = khciState->dmaAlignBuffer; f69a: 462e mov r6, r5 } /* Receive data when the device is not resetting. */ if (0U == khciState->isResetting) f69c: f890 20a1 ldrb.w r2, [r0, #161] ; 0xa1 f6a0: b172 cbz r2, f6c0 usb_status_t status = kStatus_USB_Error; f6a2: 2001 movs r0, #1 status = USB_DeviceKhciEndpointTransfer(khciState, endpointAddress & USB_ENDPOINT_NUMBER_MASK, USB_OUT, buffer, length); } } return status; } f6a4: b003 add sp, #12 f6a6: bdf0 pop {r4, r5, r6, r7, pc} khciState->endpointState[index].stateUnion.stateBitField.transferring = 0U; f6a8: eb00 1404 add.w r4, r0, r4, lsl #4 f6ac: f894 302d ldrb.w r3, [r4, #45] ; 0x2d f6b0: f36f 1386 bfc r3, #6, #1 f6b4: f884 302d strb.w r3, [r4, #45] ; 0x2d USB_DeviceKhciPrimeNextSetup(khciState); f6b8: f7ff fed4 bl f464 usb_status_t status = kStatus_USB_Error; f6bc: 2001 movs r0, #1 USB_DeviceKhciPrimeNextSetup(khciState); f6be: e7f1 b.n f6a4 status = USB_DeviceKhciEndpointTransfer(khciState, endpointAddress & USB_ENDPOINT_NUMBER_MASK, USB_OUT, f6c0: 9300 str r3, [sp, #0] f6c2: 4633 mov r3, r6 f6c4: f001 010f and.w r1, r1, #15 f6c8: f7f9 f92e bl 8928 f6cc: e7ea b.n f6a4 0000f6ce : */ usb_status_t USB_DeviceKhciCancel(usb_device_controller_handle khciHandle, uint8_t ep) { usb_device_khci_state_struct_t *khciState = (usb_device_khci_state_struct_t *)khciHandle; usb_device_callback_message_struct_t message; uint8_t index = ((ep & USB_ENDPOINT_NUMBER_MASK) << 1U) | ((ep & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) >> f6ce: 004b lsls r3, r1, #1 f6d0: f003 031e and.w r3, r3, #30 USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); /* Cancel the transfer and notify the up layer when the endpoint is busy. */ if (0U != khciState->endpointState[index].stateUnion.stateBitField.transferring) f6d4: ea43 13d1 orr.w r3, r3, r1, lsr #7 f6d8: eb00 1203 add.w r2, r0, r3, lsl #4 f6dc: f892 202d ldrb.w r2, [r2, #45] ; 0x2d f6e0: f012 0f40 tst.w r2, #64 ; 0x40 f6e4: d101 bne.n f6ea message.isSetup = 0U; khciState->endpointState[index].stateUnion.stateBitField.transferring = 0U; (void)USB_DeviceNotificationTrigger(khciState->deviceHandle, &message); } return kStatus_USB_Success; } f6e6: 2000 movs r0, #0 f6e8: 4770 bx lr { f6ea: b500 push {lr} f6ec: b085 sub sp, #20 message.length = USB_UNINITIALIZED_VAL_32; f6ee: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff f6f2: 9202 str r2, [sp, #8] message.buffer = khciState->endpointState[index].transferBuffer; f6f4: eb00 1203 add.w r2, r0, r3, lsl #4 f6f8: 6a12 ldr r2, [r2, #32] f6fa: 9201 str r2, [sp, #4] message.code = ep; f6fc: f88d 100c strb.w r1, [sp, #12] message.isSetup = 0U; f700: 2100 movs r1, #0 f702: f88d 100d strb.w r1, [sp, #13] khciState->endpointState[index].stateUnion.stateBitField.transferring = 0U; f706: eb00 1303 add.w r3, r0, r3, lsl #4 f70a: f893 202d ldrb.w r2, [r3, #45] ; 0x2d f70e: f361 1286 bfi r2, r1, #6, #1 f712: f883 202d strb.w r2, [r3, #45] ; 0x2d (void)USB_DeviceNotificationTrigger(khciState->deviceHandle, &message); f716: a901 add r1, sp, #4 f718: 6800 ldr r0, [r0, #0] f71a: f7ff fd2e bl f17a } f71e: 2000 movs r0, #0 f720: b005 add sp, #20 f722: f85d fb04 ldr.w pc, [sp], #4 0000f726 : { f726: b5f8 push {r3, r4, r5, r6, r7, lr} f728: 4604 mov r4, r0 uint8_t endpoint = ep & USB_ENDPOINT_NUMBER_MASK; f72a: f001 050f and.w r5, r1, #15 uint8_t direction = f72e: 09ce lsrs r6, r1, #7 khciState->endpointState[index].stateUnion.stateBitField.stalled = 0U; f730: ea46 0245 orr.w r2, r6, r5, lsl #1 f734: eb00 1202 add.w r2, r0, r2, lsl #4 f738: f892 302d ldrb.w r3, [r2, #45] ; 0x2d khciState->endpointState[index].stateUnion.stateBitField.data0 = 0U; f73c: f003 03fb and.w r3, r3, #251 ; 0xfb f740: f36f 03c3 bfc r3, #3, #1 f744: f882 302d strb.w r3, [r2, #45] ; 0x2d USB_KHCI_BDT_SET_CONTROL( f748: 0133 lsls r3, r6, #4 f74a: ea43 1c45 orr.w ip, r3, r5, lsl #5 f74e: 6840 ldr r0, [r0, #4] f750: f420 70ff bic.w r0, r0, #510 ; 0x1fe f754: f020 0001 bic.w r0, r0, #1 f758: ea40 000c orr.w r0, r0, ip f75c: 8d97 ldrh r7, [r2, #44] ; 0x2c khciState->endpointState[index].stateUnion.stateBitField.stalled = 0U; f75e: 3228 adds r2, #40 ; 0x28 USB_KHCI_BDT_SET_CONTROL( f760: f3c7 0709 ubfx r7, r7, #0, #10 f764: 043f lsls r7, r7, #16 f766: f047 0708 orr.w r7, r7, #8 f76a: 6007 str r7, [r0, #0] f76c: 6863 ldr r3, [r4, #4] f76e: f423 73ff bic.w r3, r3, #510 ; 0x1fe f772: f023 0301 bic.w r3, r3, #1 f776: f043 0308 orr.w r3, r3, #8 f77a: ea43 030c orr.w r3, r3, ip f77e: 8892 ldrh r2, [r2, #4] f780: f3c2 0209 ubfx r2, r2, #0, #10 f784: 0412 lsls r2, r2, #16 f786: f042 0208 orr.w r2, r2, #8 f78a: 601a str r2, [r3, #0] khciState->registerBase->ENDPOINT[endpoint].ENDPT &= (uint8_t)(~USB_ENDPT_EPSTALL_MASK); f78c: 68a3 ldr r3, [r4, #8] f78e: eb03 0385 add.w r3, r3, r5, lsl #2 f792: f893 20c0 ldrb.w r2, [r3, #192] ; 0xc0 f796: f002 02fd and.w r2, r2, #253 ; 0xfd f79a: f883 20c0 strb.w r2, [r3, #192] ; 0xc0 if ((USB_CONTROL_ENDPOINT != endpoint)) f79e: b94d cbnz r5, f7b4 if ((USB_CONTROL_ENDPOINT == endpoint) && (USB_OUT == direction)) f7a0: b166 cbz r6, f7bc khciState->registerBase->CTL &= (uint8_t)(~USB_CTL_TXSUSPENDTOKENBUSY_MASK); f7a2: 68a2 ldr r2, [r4, #8] f7a4: f892 3094 ldrb.w r3, [r2, #148] ; 0x94 f7a8: f003 03df and.w r3, r3, #223 ; 0xdf f7ac: f882 3094 strb.w r3, [r2, #148] ; 0x94 } f7b0: 2000 movs r0, #0 f7b2: bdf8 pop {r3, r4, r5, r6, r7, pc} (void)USB_DeviceKhciCancel(khciState, ep); f7b4: 4620 mov r0, r4 f7b6: f7ff ff8a bl f6ce if ((USB_CONTROL_ENDPOINT == endpoint) && (USB_OUT == direction)) f7ba: e7f2 b.n f7a2 USB_DeviceKhciPrimeNextSetup(khciState); f7bc: 4620 mov r0, r4 f7be: f7ff fe51 bl f464 f7c2: e7ee b.n f7a2 0000f7c4 : { f7c4: b570 push {r4, r5, r6, lr} f7c6: 4604 mov r4, r0 uint8_t endpoint = (ep & USB_ENDPOINT_NUMBER_MASK); f7c8: f001 060f and.w r6, r1, #15 uint8_t direction = f7cc: 09cb lsrs r3, r1, #7 uint8_t index = ((uint8_t)((uint32_t)endpoint << 1U)) | (uint8_t)direction; f7ce: ea43 0546 orr.w r5, r3, r6, lsl #1 (void)USB_DeviceKhciCancel(khciState, ep); f7d2: f7ff ff7c bl f6ce khciState->registerBase->ENDPOINT[endpoint].ENDPT = 0x00U; f7d6: 68a3 ldr r3, [r4, #8] f7d8: 3630 adds r6, #48 ; 0x30 f7da: 2000 movs r0, #0 f7dc: f803 0026 strb.w r0, [r3, r6, lsl #2] khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize = 0U; f7e0: eb04 1405 add.w r4, r4, r5, lsl #4 f7e4: 8da3 ldrh r3, [r4, #44] ; 0x2c f7e6: f360 0309 bfi r3, r0, #0, #10 f7ea: 85a3 strh r3, [r4, #44] ; 0x2c } f7ec: bd70 pop {r4, r5, r6, pc} 0000f7ee : usb_device_struct_t *deviceHandle; uint64_t startTick; #endif usb_status_t status = kStatus_USB_Error; if (NULL == khciHandle) f7ee: 2800 cmp r0, #0 f7f0: f000 8108 beq.w fa04 { f7f4: b5f8 push {r3, r4, r5, r6, r7, lr} f7f6: 4604 mov r4, r0 #if ((defined(USB_DEVICE_CONFIG_REMOTE_WAKEUP)) && (USB_DEVICE_CONFIG_REMOTE_WAKEUP > 0U)) deviceHandle = (usb_device_struct_t *)khciState->deviceHandle; #endif switch (type) f7f8: 290f cmp r1, #15 f7fa: f200 8105 bhi.w fa08 f7fe: e8df f011 tbh [pc, r1, lsl #1] f802: 0010 .short 0x0010 f804: 003f002d .word 0x003f002d f808: 0091008b .word 0x0091008b f80c: 00c900c3 .word 0x00c900c3 f810: 00e200cf .word 0x00e200cf f814: 01030103 .word 0x01030103 f818: 01030103 .word 0x01030103 f81c: 00e90103 .word 0x00e90103 f820: 00fc .short 0x00fc { case kUSB_DeviceControlRun: khciState->registerBase->USBCTRL = 0U; f822: 6883 ldr r3, [r0, #8] f824: 2200 movs r2, #0 f826: f883 2100 strb.w r2, [r3, #256] ; 0x100 #if defined(FSL_FEATURE_USB_KHCI_OTG_ENABLED) && (FSL_FEATURE_USB_KHCI_OTG_ENABLED > 0U) if (0U != (khciState->registerBase->OTGCTL & USB_OTGCTL_OTGEN_MASK)) f82a: 6883 ldr r3, [r0, #8] f82c: 7f1a ldrb r2, [r3, #28] f82e: f012 0f04 tst.w r2, #4 f832: d003 beq.n f83c { khciState->registerBase->OTGCTL |= USB_OTGCTL_DPHIGH_MASK; f834: 7f1a ldrb r2, [r3, #28] f836: f042 0280 orr.w r2, r2, #128 ; 0x80 f83a: 771a strb r2, [r3, #28] } #endif /* FSL_FEATURE_USB_KHCI_OTG_ENABLED */ khciState->registerBase->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK; f83c: 68a2 ldr r2, [r4, #8] f83e: f892 3108 ldrb.w r3, [r2, #264] ; 0x108 f842: f043 0310 orr.w r3, r3, #16 f846: f882 3108 strb.w r3, [r2, #264] ; 0x108 khciState->registerBase->CTL |= USB_CTL_USBENSOFEN_MASK; f84a: 68a2 ldr r2, [r4, #8] f84c: f892 3094 ldrb.w r3, [r2, #148] ; 0x94 f850: f043 0301 orr.w r3, r3, #1 f854: f882 3094 strb.w r3, [r2, #148] ; 0x94 status = kStatus_USB_Success; f858: 4608 mov r0, r1 /*no action*/ break; } return status; } f85a: bdf8 pop {r3, r4, r5, r6, r7, pc} if (0U != (khciState->registerBase->OTGCTL & USB_OTGCTL_OTGEN_MASK)) f85c: 6883 ldr r3, [r0, #8] f85e: 7f1a ldrb r2, [r3, #28] f860: f012 0f04 tst.w r2, #4 f864: d003 beq.n f86e khciState->registerBase->OTGCTL &= (uint8_t)(~USB_OTGCTL_DPHIGH_MASK); f866: 7f1a ldrb r2, [r3, #28] f868: f002 027f and.w r2, r2, #127 ; 0x7f f86c: 771a strb r2, [r3, #28] khciState->registerBase->CONTROL &= (uint8_t)(~USB_CONTROL_DPPULLUPNONOTG_MASK); f86e: 68a2 ldr r2, [r4, #8] f870: f892 3108 ldrb.w r3, [r2, #264] ; 0x108 f874: f003 03ef and.w r3, r3, #239 ; 0xef f878: f882 3108 strb.w r3, [r2, #264] ; 0x108 status = kStatus_USB_Success; f87c: 2000 movs r0, #0 break; f87e: e7ec b.n f85a if (NULL != param) f880: 2a00 cmp r2, #0 f882: f000 80c3 beq.w fa0c uint16_t maxPacketSize = epInit->maxPacketSize; f886: 8816 ldrh r6, [r2, #0] uint8_t endpoint = (epInit->endpointAddress & USB_ENDPOINT_NUMBER_MASK); f888: 7891 ldrb r1, [r2, #2] f88a: f001 050f and.w r5, r1, #15 uint8_t direction = (epInit->endpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) >> f88e: 09c8 lsrs r0, r1, #7 uint8_t index = ((uint8_t)((uint32_t)endpoint << 1U)) | (uint8_t)direction; f890: ea40 0145 orr.w r1, r0, r5, lsl #1 if (USB_ENDPOINT_ISOCHRONOUS == epInit->transferType) f894: 78d3 ldrb r3, [r2, #3] f896: 2b01 cmp r3, #1 f898: d038 beq.n f90c if (maxPacketSize > USB_DEVICE_MAX_FS_NONE_ISO_MAX_PACKET_SIZE) f89a: 2e40 cmp r6, #64 ; 0x40 f89c: bf28 it cs f89e: 2640 movcs r6, #64 ; 0x40 khciState->registerBase->ENDPOINT[endpoint].ENDPT |= USB_ENDPT_EPHSHK_MASK; f8a0: 68a3 ldr r3, [r4, #8] f8a2: eb03 0385 add.w r3, r3, r5, lsl #2 f8a6: f893 70c0 ldrb.w r7, [r3, #192] ; 0xc0 f8aa: f047 0701 orr.w r7, r7, #1 f8ae: f883 70c0 strb.w r7, [r3, #192] ; 0xc0 khciState->endpointState[index].stateUnion.stateBitField.transferring = 0U; f8b2: eb04 1101 add.w r1, r4, r1, lsl #4 f8b6: f891 302d ldrb.w r3, [r1, #45] ; 0x2d f8ba: f36f 1386 bfc r3, #6, #1 f8be: f881 302d strb.w r3, [r1, #45] ; 0x2d khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize = maxPacketSize; f8c2: 8d8b ldrh r3, [r1, #44] ; 0x2c f8c4: f366 0309 bfi r3, r6, #0, #10 f8c8: 858b strh r3, [r1, #44] ; 0x2c khciState->endpointState[index].stateUnion.stateBitField.data0 = 0U; f8ca: f3c3 2307 ubfx r3, r3, #8, #8 khciState->endpointState[index].stateUnion.stateBitField.stalled = 0U; f8ce: f003 03f7 and.w r3, r3, #247 ; 0xf7 f8d2: f36f 0382 bfc r3, #2, #1 f8d6: f881 302d strb.w r3, [r1, #45] ; 0x2d khciState->endpointState[index].stateUnion.stateBitField.zlt = epInit->zlt; f8da: 7912 ldrb r2, [r2, #4] f8dc: f362 13c7 bfi r3, r2, #7, #1 f8e0: f881 302d strb.w r3, [r1, #45] ; 0x2d khciState->registerBase->ENDPOINT[endpoint].ENDPT |= f8e4: 68a2 ldr r2, [r4, #8] f8e6: eb02 0285 add.w r2, r2, r5, lsl #2 f8ea: f892 30c0 ldrb.w r3, [r2, #192] ; 0xc0 f8ee: b2db uxtb r3, r3 f8f0: 2801 cmp r0, #1 f8f2: f000 809d beq.w fa30 f8f6: f043 0308 orr.w r3, r3, #8 f8fa: f882 30c0 strb.w r3, [r2, #192] ; 0xc0 if ((USB_CONTROL_ENDPOINT == endpoint) && (USB_OUT == direction)) f8fe: 2d00 cmp r5, #0 f900: d1ab bne.n f85a USB_DeviceKhciPrimeNextSetup(khciState); f902: 4620 mov r0, r4 f904: f7ff fdae bl f464 status = USB_DeviceKhciEndpointInit(khciState, (usb_device_endpoint_init_struct_t *)param); f908: 4628 mov r0, r5 f90a: e7a6 b.n f85a if (maxPacketSize > USB_DEVICE_MAX_FS_ISO_MAX_PACKET_SIZE) f90c: f240 33ff movw r3, #1023 ; 0x3ff f910: 429e cmp r6, r3 f912: bf28 it cs f914: 461e movcs r6, r3 f916: e7cc b.n f8b2 if (NULL != param) f918: 2a00 cmp r2, #0 f91a: d079 beq.n fa10 status = USB_DeviceKhciEndpointDeinit(khciState, *temp8); f91c: 7811 ldrb r1, [r2, #0] f91e: f7ff ff51 bl f7c4 f922: e79a b.n f85a if (NULL != param) f924: 2a00 cmp r2, #0 f926: d075 beq.n fa14 status = USB_DeviceKhciEndpointStall(khciState, *temp8); f928: 7811 ldrb r1, [r2, #0] uint8_t endpoint = ep & USB_ENDPOINT_NUMBER_MASK; f92a: f001 070f and.w r7, r1, #15 uint8_t direction = f92e: 09cd lsrs r5, r1, #7 uint8_t index = ((uint8_t)((uint32_t)endpoint << 1U)) | (uint8_t)direction; f930: ea45 0647 orr.w r6, r5, r7, lsl #1 (void)USB_DeviceKhciCancel(khciState, ep); f934: f7ff fecb bl f6ce khciState->endpointState[index].stateUnion.stateBitField.stalled = 1U; f938: eb04 1206 add.w r2, r4, r6, lsl #4 f93c: f892 302d ldrb.w r3, [r2, #45] ; 0x2d f940: f043 0304 orr.w r3, r3, #4 f944: f882 302d strb.w r3, [r2, #45] ; 0x2d USB_KHCI_BDT_SET_CONTROL( f948: 012b lsls r3, r5, #4 f94a: ea43 1347 orr.w r3, r3, r7, lsl #5 f94e: 6861 ldr r1, [r4, #4] f950: f421 71ff bic.w r1, r1, #510 ; 0x1fe f954: f021 0101 bic.w r1, r1, #1 f958: 430b orrs r3, r1 f95a: f892 102d ldrb.w r1, [r2, #45] ; 0x2d khciState->endpointState[index].stateUnion.stateBitField.stalled = 1U; f95e: 3228 adds r2, #40 ; 0x28 USB_KHCI_BDT_SET_CONTROL( f960: f3c1 1100 ubfx r1, r1, #4, #1 f964: ea43 03c1 orr.w r3, r3, r1, lsl #3 f968: 8892 ldrh r2, [r2, #4] f96a: f3c2 0209 ubfx r2, r2, #0, #10 f96e: 0412 lsls r2, r2, #16 f970: f042 028c orr.w r2, r2, #140 ; 0x8c f974: 601a str r2, [r3, #0] khciState->registerBase->CTL &= (uint8_t)(~USB_CTL_TXSUSPENDTOKENBUSY_MASK); f976: 68a2 ldr r2, [r4, #8] f978: f892 3094 ldrb.w r3, [r2, #148] ; 0x94 f97c: f003 03df and.w r3, r3, #223 ; 0xdf f980: f882 3094 strb.w r3, [r2, #148] ; 0x94 status = USB_DeviceKhciEndpointStall(khciState, *temp8); f984: 2000 movs r0, #0 f986: e768 b.n f85a if (NULL != param) f988: 2a00 cmp r2, #0 f98a: d045 beq.n fa18 status = USB_DeviceKhciEndpointUnstall(khciState, *temp8); f98c: 7811 ldrb r1, [r2, #0] f98e: f7ff feca bl f726 f992: e762 b.n f85a if (NULL != param) f994: 2a00 cmp r2, #0 f996: d041 beq.n fa1c *temp16 = (USB_DEVICE_CONFIG_SELF_POWER << (USB_REQUEST_STANDARD_GET_STATUS_DEVICE_SELF_POWERED_SHIFT)) f998: 2301 movs r3, #1 f99a: 8013 strh r3, [r2, #0] status = kStatus_USB_Success; f99c: 2000 movs r0, #0 f99e: e75c b.n f85a if (NULL != param) f9a0: 2a00 cmp r2, #0 f9a2: d03d beq.n fa20 if (((endpointStatus->endpointAddress) & USB_ENDPOINT_NUMBER_MASK) < USB_DEVICE_CONFIG_ENDPOINTS) f9a4: 7811 ldrb r1, [r2, #0] f9a6: f011 000c ands.w r0, r1, #12 f9aa: d13b bne.n fa24 ->endpointState[(((endpointStatus->endpointAddress) & USB_ENDPOINT_NUMBER_MASK) << 1U) | f9ac: 004b lsls r3, r1, #1 f9ae: f003 031e and.w r3, r3, #30 f9b2: ea43 13d1 orr.w r3, r3, r1, lsr #7 .stateUnion.stateBitField.stalled == 1U) ? f9b6: eb04 1403 add.w r4, r4, r3, lsl #4 f9ba: f894 302d ldrb.w r3, [r4, #45] ; 0x2d endpointStatus->endpointStatus = (uint16_t)( f9be: f3c3 0380 ubfx r3, r3, #2, #1 f9c2: 8053 strh r3, [r2, #2] status = kStatus_USB_Success; f9c4: e749 b.n f85a if (NULL != param) f9c6: b37a cbz r2, fa28 khciState->registerBase->ADDR = (*temp8); f9c8: 6883 ldr r3, [r0, #8] f9ca: 7812 ldrb r2, [r2, #0] f9cc: f883 2098 strb.w r2, [r3, #152] ; 0x98 status = kStatus_USB_Success; f9d0: 2000 movs r0, #0 f9d2: e742 b.n f85a switch (type) f9d4: 2500 movs r5, #0 f9d6: b2ee uxtb r6, r5 (void)USB_DeviceKhciEndpointDeinit(khciState, (count | (USB_IN << 0x07U))); f9d8: f046 0180 orr.w r1, r6, #128 ; 0x80 f9dc: 4620 mov r0, r4 f9de: f7ff fef1 bl f7c4 (void)USB_DeviceKhciEndpointDeinit(khciState, (count | (USB_OUT << 0x07U))); f9e2: 4631 mov r1, r6 f9e4: 4620 mov r0, r4 f9e6: f7ff feed bl f7c4 f9ea: 3501 adds r5, #1 for (count = 0U; count < USB_DEVICE_CONFIG_ENDPOINTS; count++) f9ec: 2d04 cmp r5, #4 f9ee: d1f2 bne.n f9d6 USB_DeviceKhciSetDefaultState(khciState); f9f0: 4620 mov r0, r4 f9f2: f7ff fd52 bl f49a status = kStatus_USB_Success; f9f6: 2000 movs r0, #0 break; f9f8: e72f b.n f85a if (NULL != param) f9fa: b1ba cbz r2, fa2c *temp8 = USB_SPEED_FULL; f9fc: 2100 movs r1, #0 f9fe: 7011 strb r1, [r2, #0] status = kStatus_USB_Success; fa00: 4608 mov r0, r1 fa02: e72a b.n f85a return kStatus_USB_InvalidHandle; fa04: 2003 movs r0, #3 } fa06: 4770 bx lr usb_status_t status = kStatus_USB_Error; fa08: 2001 movs r0, #1 fa0a: e726 b.n f85a fa0c: 2001 movs r0, #1 fa0e: e724 b.n f85a fa10: 2001 movs r0, #1 fa12: e722 b.n f85a fa14: 2001 movs r0, #1 fa16: e720 b.n f85a fa18: 2001 movs r0, #1 fa1a: e71e b.n f85a fa1c: 2001 movs r0, #1 fa1e: e71c b.n f85a fa20: 2001 movs r0, #1 fa22: e71a b.n f85a fa24: 2001 movs r0, #1 fa26: e718 b.n f85a fa28: 2001 movs r0, #1 fa2a: e716 b.n f85a fa2c: 2001 movs r0, #1 fa2e: e714 b.n f85a khciState->registerBase->ENDPOINT[endpoint].ENDPT |= fa30: f043 0304 orr.w r3, r3, #4 fa34: f882 30c0 strb.w r3, [r2, #192] ; 0xc0 status = USB_DeviceKhciEndpointInit(khciState, (usb_device_endpoint_init_struct_t *)param); fa38: 2000 movs r0, #0 fa3a: e70e b.n f85a 0000fa3c : { usb_device_struct_t *handle = (usb_device_struct_t *)deviceHandle; usb_device_khci_state_struct_t *khciState; uint8_t status; if (NULL == deviceHandle) fa3c: 2800 cmp r0, #0 fa3e: f000 81a5 beq.w fd8c { fa42: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} fa46: b087 sub sp, #28 { return; } khciState = (usb_device_khci_state_struct_t *)(handle->controllerHandle); fa48: 6804 ldr r4, [r0, #0] status = khciState->registerBase->ISTAT; fa4a: 68a3 ldr r3, [r4, #8] fa4c: f893 2080 ldrb.w r2, [r3, #128] ; 0x80 status &= khciState->registerBase->INTEN; fa50: f893 5084 ldrb.w r5, [r3, #132] ; 0x84 fa54: 4015 ands r5, r2 { USB_DeviceKhciInterruptError(khciState); } #endif /* USB_DEVICE_CONFIG_ERROR_HANDLING */ /* Token done interrupt */ if (0U != (status & USB_INTEN_TOKDNEEN_MASK)) fa56: f015 0f08 tst.w r5, #8 fa5a: d10a bne.n fa72 { USB_DeviceKhciInterruptTokenDone(khciState); } /* Reset interrupt */ if (0U != (status & USB_INTEN_USBRSTEN_MASK)) fa5c: f015 0f01 tst.w r5, #1 fa60: f040 812c bne.w fcbc USB_DeviceKhciInterruptResume(khciState); } #endif /* USB_DEVICE_CONFIG_LOW_POWER_MODE */ /* Endpoint stalled interrupt */ if (0U != (status & USB_INTEN_STALLEN_MASK)) fa64: f015 0f80 tst.w r5, #128 ; 0x80 fa68: f040 813b bne.w fce2 */ } khciState->registerBase->CLK_RECOVER_INT_STATUS = status; } #endif } fa6c: b007 add sp, #28 fa6e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} uint8_t stateRegister = khciState->registerBase->STAT; fa72: f893 1090 ldrb.w r1, [r3, #144] ; 0x90 fa76: b2c9 uxtb r1, r1 endpoint = (stateRegister & USB_STAT_ENDP_MASK) >> USB_STAT_ENDP_SHIFT; fa78: 090e lsrs r6, r1, #4 direction = (stateRegister & USB_STAT_TX_MASK) >> USB_STAT_TX_SHIFT; fa7a: f3c1 07c0 ubfx r7, r1, #3, #1 bdtOdd = (stateRegister & USB_STAT_ODD_MASK) >> USB_STAT_ODD_SHIFT; fa7e: f3c1 0180 ubfx r1, r1, #2, #1 khciState->registerBase->ISTAT = USB_INTEN_TOKDNEEN_MASK; fa82: 2208 movs r2, #8 fa84: f883 2080 strb.w r2, [r3, #128] ; 0x80 control = USB_KHCI_BDT_GET_CONTROL((uint32_t)khciState->bdt, endpoint, direction, bdtOdd); fa88: 6863 ldr r3, [r4, #4] fa8a: f423 73ff bic.w r3, r3, #510 ; 0x1fe fa8e: f023 0301 bic.w r3, r3, #1 fa92: ea43 1246 orr.w r2, r3, r6, lsl #5 fa96: 00cb lsls r3, r1, #3 fa98: ea43 1307 orr.w r3, r3, r7, lsl #4 fa9c: 4313 orrs r3, r2 fa9e: 6818 ldr r0, [r3, #0] bdtBuffer = (uint8_t *)USB_KHCI_BDT_GET_ADDRESS((uint32_t)khciState->bdt, endpoint, direction, bdtOdd); faa0: f8d3 b004 ldr.w fp, [r3, #4] index = ((uint8_t)((uint32_t)endpoint << 1U)) | (uint8_t)direction; faa4: ea47 0846 orr.w r8, r7, r6, lsl #1 if (0U == khciState->endpointState[index].stateUnion.stateBitField.transferring) faa8: eb04 1308 add.w r3, r4, r8, lsl #4 faac: f893 302d ldrb.w r3, [r3, #45] ; 0x2d fab0: f013 0f40 tst.w r3, #64 ; 0x40 fab4: d0d2 beq.n fa5c isSetup = (USB_KHCI_BDT_DEVICE_SETUP_TOKEN == ((uint8_t)(((USB_LONG_FROM_LITTLE_ENDIAN(control)) >> 2U) & 0x0FU))) ? fab6: f3c0 0a83 ubfx sl, r0, #2, #4 if (0U != isSetup) faba: f1ba 0f0d cmp.w sl, #13 khciState->setupBufferIndex = bdtOdd; fabe: bf08 it eq fac0: f884 10a3 strbeq.w r1, [r4, #163] ; 0xa3 length = ((USB_LONG_FROM_LITTLE_ENDIAN(control)) >> 16U) & 0x3FFU; fac4: f3c0 4909 ubfx r9, r0, #16, #10 if (direction == USB_IN) fac8: 2f00 cmp r7, #0 faca: d064 beq.n fb96 khciState->endpointState[index].transferDone += length; facc: eb04 1208 add.w r2, r4, r8, lsl #4 fad0: f102 0c28 add.w ip, r2, #40 ; 0x28 fad4: 6a93 ldr r3, [r2, #40] ; 0x28 fad6: 444b add r3, r9 fad8: 6293 str r3, [r2, #40] ; 0x28 remainingLength = khciState->endpointState[index].transferLength - khciState->endpointState[index].transferDone; fada: 4610 mov r0, r2 fadc: 6a51 ldr r1, [r2, #36] ; 0x24 khciState->endpointState[index].stateUnion.stateBitField.data0 ^= 1U; fade: f892 202d ldrb.w r2, [r2, #45] ; 0x2d fae2: f3c2 0ec0 ubfx lr, r2, #3, #1 fae6: f08e 0e01 eor.w lr, lr, #1 faea: f36e 02c3 bfi r2, lr, #3, #1 khciState->endpointState[index].stateUnion.stateBitField.bdtOdd ^= 1U; faee: b2d2 uxtb r2, r2 faf0: f3c2 1e00 ubfx lr, r2, #4, #1 faf4: f08e 0e01 eor.w lr, lr, #1 faf8: f36e 1204 bfi r2, lr, #4, #1 fafc: f88c 2005 strb.w r2, [ip, #5] if ((0U == remainingLength) || fb00: 1acb subs r3, r1, r3 fb02: d004 beq.n fb0e (khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize > length)) fb04: 8d82 ldrh r2, [r0, #44] ; 0x2c fb06: f3c2 0209 ubfx r2, r2, #0, #10 if ((0U == remainingLength) || fb0a: 4591 cmp r9, r2 fb0c: d23c bcs.n fb88 message.length = khciState->endpointState[index].transferDone; fb0e: eb04 1208 add.w r2, r4, r8, lsl #4 fb12: f102 0328 add.w r3, r2, #40 ; 0x28 fb16: 6a92 ldr r2, [r2, #40] ; 0x28 fb18: 9204 str r2, [sp, #16] message.buffer = khciState->endpointState[index].transferBuffer; fb1a: 6a02 ldr r2, [r0, #32] fb1c: 9203 str r2, [sp, #12] khciState->endpointState[index].stateUnion.stateBitField.transferring = 0U; fb1e: 795a ldrb r2, [r3, #5] fb20: f36f 1286 bfc r2, #6, #1 fb24: 715a strb r2, [r3, #5] if ((0U != length) && fb26: f1b9 0f00 cmp.w r9, #0 fb2a: f000 80ae beq.w fc8a (0U == (length % khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize))) fb2e: eb04 1308 add.w r3, r4, r8, lsl #4 fb32: 8d9b ldrh r3, [r3, #44] ; 0x2c fb34: f3c3 0309 ubfx r3, r3, #0, #10 fb38: fbb9 f2f3 udiv r2, r9, r3 fb3c: fb03 9312 mls r3, r3, r2, r9 if ((0U != length) && fb40: 2b00 cmp r3, #0 fb42: f040 80a2 bne.w fc8a if (USB_CONTROL_ENDPOINT == endpoint) fb46: b986 cbnz r6, fb6a (void *)(&khciState->setupPacketBuffer[(USB_SETUP_PACKET_SIZE * khciState->setupBufferIndex)]); fb48: f894 30a3 ldrb.w r3, [r4, #163] ; 0xa3 if (USB_SHORT_FROM_LITTLE_ENDIAN(setup_packet->wLength) > fb4c: eb04 03c3 add.w r3, r4, r3, lsl #3 fb50: 8a5a ldrh r2, [r3, #18] fb52: 6a43 ldr r3, [r0, #36] ; 0x24 fb54: 429a cmp r2, r3 fb56: f240 8098 bls.w fc8a (void)USB_DeviceKhciEndpointTransfer(khciState, endpoint, USB_IN, (uint8_t *)NULL, 0U); fb5a: 2100 movs r1, #0 fb5c: 9100 str r1, [sp, #0] fb5e: 460b mov r3, r1 fb60: 2201 movs r2, #1 fb62: 4620 mov r0, r4 fb64: f7f8 fee0 bl 8928 return; fb68: e778 b.n fa5c else if (0U != khciState->endpointState[index].stateUnion.stateBitField.zlt) fb6a: eb04 1808 add.w r8, r4, r8, lsl #4 fb6e: f898 302d ldrb.w r3, [r8, #45] ; 0x2d fb72: 09db lsrs r3, r3, #7 fb74: f000 8089 beq.w fc8a (void)USB_DeviceKhciEndpointTransfer(khciState, endpoint, USB_IN, (uint8_t *)NULL, 0U); fb78: 2300 movs r3, #0 fb7a: 9300 str r3, [sp, #0] fb7c: 2201 movs r2, #1 fb7e: 4631 mov r1, r6 fb80: 4620 mov r0, r4 fb82: f7f8 fed1 bl 8928 return; fb86: e769 b.n fa5c (void)USB_DeviceKhciSend(khciState, endpoint | (USB_IN << 0x07U), fb88: 6a02 ldr r2, [r0, #32] fb8a: f046 0180 orr.w r1, r6, #128 ; 0x80 fb8e: 4620 mov r0, r4 fb90: f7ff fcff bl f592 return; fb94: e762 b.n fa5c if ((USB_CONTROL_ENDPOINT == endpoint) && (0U == length)) fb96: b936 cbnz r6, fba6 fb98: f1b9 0f00 cmp.w r9, #0 fb9c: d103 bne.n fba6 message.length = 0U; fb9e: 2300 movs r3, #0 fba0: 9304 str r3, [sp, #16] message.buffer = (uint8_t *)NULL; fba2: 9303 str r3, [sp, #12] fba4: e071 b.n fc8a if (0U == khciState->endpointState[index].stateUnion.stateBitField.dmaAlign) fba6: eb04 1308 add.w r3, r4, r8, lsl #4 fbaa: f893 302d ldrb.w r3, [r3, #45] ; 0x2d fbae: f013 0f20 tst.w r3, #32 fbb2: d113 bne.n fbdc uint8_t *buffer = (uint8_t *)USB_LONG_FROM_LITTLE_ENDIAN( fbb4: eb04 1c08 add.w ip, r4, r8, lsl #4 fbb8: f3c3 1300 ubfx r3, r3, #4, #1 fbbc: ea42 03c3 orr.w r3, r2, r3, lsl #3 fbc0: 6859 ldr r1, [r3, #4] uint8_t *transferBuffer = fbc2: f8dc 0020 ldr.w r0, [ip, #32] fbc6: f8dc 3028 ldr.w r3, [ip, #40] ; 0x28 fbca: 4418 add r0, r3 if (buffer != transferBuffer) fbcc: 4281 cmp r1, r0 fbce: d002 beq.n fbd6 (void)memcpy(transferBuffer, buffer, length); fbd0: 464a mov r2, r9 fbd2: f002 f91a bl 11e0a khciState->isDmaAlignBufferInusing = 0U; fbd6: 2300 movs r3, #0 fbd8: f884 30a0 strb.w r3, [r4, #160] ; 0xa0 khciState->endpointState[index].transferDone += length; fbdc: eb04 1108 add.w r1, r4, r8, lsl #4 fbe0: 6a8a ldr r2, [r1, #40] ; 0x28 fbe2: 444a add r2, r9 fbe4: 628a str r2, [r1, #40] ; 0x28 khciState->endpointState[index].transferLength - khciState->endpointState[index].transferDone; fbe6: 6a48 ldr r0, [r1, #36] ; 0x24 if ((USB_CONTROL_ENDPOINT == endpoint) && (0U != isSetup)) fbe8: bb2e cbnz r6, fc36 fbea: f1ba 0f0d cmp.w sl, #13 fbee: f040 80a5 bne.w fd3c khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_OUT].stateUnion.stateBitField.data0 = 1U; fbf2: f894 302d ldrb.w r3, [r4, #45] ; 0x2d fbf6: f043 0308 orr.w r3, r3, #8 fbfa: f884 302d strb.w r3, [r4, #45] ; 0x2d khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_IN].stateUnion.stateBitField.data0 = 1U; fbfe: f894 303d ldrb.w r3, [r4, #61] ; 0x3d fc02: f043 0308 orr.w r3, r3, #8 fc06: f884 303d strb.w r3, [r4, #61] ; 0x3d khciState->endpointState[index].stateUnion.stateBitField.bdtOdd ^= 1U; fc0a: f891 302d ldrb.w r3, [r1, #45] ; 0x2d fc0e: f3c3 1e00 ubfx lr, r3, #4, #1 fc12: f08e 0e01 eor.w lr, lr, #1 fc16: f36e 1304 bfi r3, lr, #4, #1 fc1a: f881 302d strb.w r3, [r1, #45] ; 0x2d if ((0U == khciState->endpointState[index].transferLength) || (0U == remainingLength) || fc1e: 6a4b ldr r3, [r1, #36] ; 0x24 fc20: 2b00 cmp r3, #0 fc22: f000 8081 beq.w fd28 fc26: 1a83 subs r3, r0, r2 fc28: f040 80a1 bne.w fd6e message.length = khciState->endpointState[index].transferDone; fc2c: eb04 1308 add.w r3, r4, r8, lsl #4 fc30: 6a9b ldr r3, [r3, #40] ; 0x28 fc32: 9304 str r3, [sp, #16] if (0U != isSetup) fc34: e01f b.n fc76 khciState->endpointState[index].stateUnion.stateBitField.data0 ^= 1U; fc36: eb04 1c08 add.w ip, r4, r8, lsl #4 fc3a: f89c 302d ldrb.w r3, [ip, #45] ; 0x2d fc3e: f3c3 0ec0 ubfx lr, r3, #3, #1 fc42: f08e 0e01 eor.w lr, lr, #1 fc46: f36e 03c3 bfi r3, lr, #3, #1 khciState->endpointState[index].stateUnion.stateBitField.bdtOdd ^= 1U; fc4a: b2db uxtb r3, r3 fc4c: f3c3 1e00 ubfx lr, r3, #4, #1 fc50: f08e 0e01 eor.w lr, lr, #1 fc54: f36e 1304 bfi r3, lr, #4, #1 fc58: f88c 302d strb.w r3, [ip, #45] ; 0x2d if ((0U == khciState->endpointState[index].transferLength) || (0U == remainingLength) || fc5c: 6a4b ldr r3, [r1, #36] ; 0x24 fc5e: 2b00 cmp r3, #0 fc60: f040 8082 bne.w fd68 message.length = khciState->endpointState[index].transferDone; fc64: eb04 1308 add.w r3, r4, r8, lsl #4 fc68: 6a9b ldr r3, [r3, #40] ; 0x28 fc6a: 9304 str r3, [sp, #16] if (0U != isSetup) fc6c: f1ba 0f0d cmp.w sl, #13 fc70: d001 beq.n fc76 message.buffer = khciState->endpointState[index].transferBuffer; fc72: f8d1 b020 ldr.w fp, [r1, #32] fc76: f8cd b00c str.w fp, [sp, #12] khciState->endpointState[index].stateUnion.stateBitField.transferring = 0U; fc7a: eb04 1808 add.w r8, r4, r8, lsl #4 fc7e: f898 302d ldrb.w r3, [r8, #45] ; 0x2d fc82: f36f 1386 bfc r3, #6, #1 fc86: f888 302d strb.w r3, [r8, #45] ; 0x2d isSetup = (USB_KHCI_BDT_DEVICE_SETUP_TOKEN == ((uint8_t)(((USB_LONG_FROM_LITTLE_ENDIAN(control)) >> 2U) & 0x0FU))) ? fc8a: f1ba 0f0d cmp.w sl, #13 fc8e: bf14 ite ne fc90: f04f 0a00 movne.w sl, #0 fc94: f04f 0a01 moveq.w sl, #1 fc98: f88d a015 strb.w sl, [sp, #21] message.code = (endpoint) | (uint8_t)(((uint32_t)direction << 0x07U)); fc9c: ea46 16c7 orr.w r6, r6, r7, lsl #7 fca0: f88d 6014 strb.w r6, [sp, #20] (void)USB_DeviceNotificationTrigger(khciState->deviceHandle, &message); fca4: a903 add r1, sp, #12 fca6: 6820 ldr r0, [r4, #0] fca8: f7ff fa67 bl f17a khciState->registerBase->CTL &= (uint8_t)(~USB_CTL_TXSUSPENDTOKENBUSY_MASK); fcac: 68a2 ldr r2, [r4, #8] fcae: f892 3094 ldrb.w r3, [r2, #148] ; 0x94 fcb2: f003 03df and.w r3, r3, #223 ; 0xdf fcb6: f882 3094 strb.w r3, [r2, #148] ; 0x94 fcba: e6cf b.n fa5c khciState->isResetting = 1U; fcbc: 2301 movs r3, #1 fcbe: f884 30a1 strb.w r3, [r4, #161] ; 0xa1 khciState->registerBase->ISTAT = (USB_INTEN_USBRSTEN_MASK); fcc2: 68a2 ldr r2, [r4, #8] fcc4: f882 3080 strb.w r3, [r2, #128] ; 0x80 message.buffer = (uint8_t *)NULL; fcc8: 2300 movs r3, #0 fcca: 9303 str r3, [sp, #12] message.code = (uint8_t)kUSB_DeviceNotifyBusReset; fccc: 2210 movs r2, #16 fcce: f88d 2014 strb.w r2, [sp, #20] message.length = 0U; fcd2: 9304 str r3, [sp, #16] message.isSetup = 0U; fcd4: f88d 3015 strb.w r3, [sp, #21] (void)USB_DeviceNotificationTrigger(khciState->deviceHandle, &message); fcd8: a903 add r1, sp, #12 fcda: 6820 ldr r0, [r4, #0] fcdc: f7ff fa4d bl f17a fce0: e6c0 b.n fa64 while (0U != (khciState->registerBase->ISTAT & (USB_INTEN_STALLEN_MASK))) fce2: 68a3 ldr r3, [r4, #8] fce4: f893 2080 ldrb.w r2, [r3, #128] ; 0x80 fce8: f012 0f80 tst.w r2, #128 ; 0x80 fcec: d008 beq.n fd00 khciState->registerBase->ISTAT = (USB_INTEN_STALLEN_MASK); fcee: 2180 movs r1, #128 ; 0x80 fcf0: f883 1080 strb.w r1, [r3, #128] ; 0x80 while (0U != (khciState->registerBase->ISTAT & (USB_INTEN_STALLEN_MASK))) fcf4: 68a3 ldr r3, [r4, #8] fcf6: f893 2080 ldrb.w r2, [r3, #128] ; 0x80 fcfa: f012 0f80 tst.w r2, #128 ; 0x80 fcfe: d1f7 bne.n fcf0 if ((0U != khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_IN].stateUnion.stateBitField.stalled) || fd00: f894 303d ldrb.w r3, [r4, #61] ; 0x3d fd04: f013 0f04 tst.w r3, #4 fd08: d105 bne.n fd16 (0U != khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_OUT].stateUnion.stateBitField.stalled)) fd0a: f894 302d ldrb.w r3, [r4, #45] ; 0x2d if ((0U != khciState->endpointState[(USB_CONTROL_ENDPOINT << 1U) | USB_IN].stateUnion.stateBitField.stalled) || fd0e: f013 0f04 tst.w r3, #4 fd12: f43f aeab beq.w fa6c (void)USB_DeviceKhciEndpointUnstall( fd16: 2180 movs r1, #128 ; 0x80 fd18: 4620 mov r0, r4 fd1a: f7ff fd04 bl f726 (void)USB_DeviceKhciEndpointUnstall( fd1e: 2100 movs r1, #0 fd20: 4620 mov r0, r4 fd22: f7ff fd00 bl f726 fd26: e6a1 b.n fa6c message.length = khciState->endpointState[index].transferDone; fd28: eb04 1308 add.w r3, r4, r8, lsl #4 fd2c: 6a9b ldr r3, [r3, #40] ; 0x28 fd2e: 9304 str r3, [sp, #16] if (0U != isSetup) fd30: e7a1 b.n fc76 message.length = khciState->endpointState[index].transferDone; fd32: eb04 1308 add.w r3, r4, r8, lsl #4 fd36: 6a9b ldr r3, [r3, #40] ; 0x28 fd38: 9304 str r3, [sp, #16] if (0U != isSetup) fd3a: e79a b.n fc72 khciState->endpointState[index].stateUnion.stateBitField.data0 ^= 1U; fd3c: eb04 1c08 add.w ip, r4, r8, lsl #4 fd40: f89c 302d ldrb.w r3, [ip, #45] ; 0x2d fd44: f3c3 0ec0 ubfx lr, r3, #3, #1 fd48: f08e 0e01 eor.w lr, lr, #1 fd4c: f36e 03c3 bfi r3, lr, #3, #1 khciState->endpointState[index].stateUnion.stateBitField.bdtOdd ^= 1U; fd50: b2db uxtb r3, r3 fd52: f3c3 1e00 ubfx lr, r3, #4, #1 fd56: f08e 0e01 eor.w lr, lr, #1 fd5a: f36e 1304 bfi r3, lr, #4, #1 fd5e: f88c 302d strb.w r3, [ip, #45] ; 0x2d if ((0U == khciState->endpointState[index].transferLength) || (0U == remainingLength) || fd62: 6a4b ldr r3, [r1, #36] ; 0x24 fd64: 2b00 cmp r3, #0 fd66: d0e4 beq.n fd32 fd68: 1a83 subs r3, r0, r2 fd6a: f43f af7b beq.w fc64 (khciState->endpointState[index].stateUnion.stateBitField.maxPacketSize > length)) fd6e: eb04 1208 add.w r2, r4, r8, lsl #4 fd72: f8b2 c02c ldrh.w ip, [r2, #44] ; 0x2c fd76: f3cc 0c09 ubfx ip, ip, #0, #10 if ((0U == khciState->endpointState[index].transferLength) || (0U == remainingLength) || fd7a: 45e1 cmp r9, ip fd7c: f4ff af72 bcc.w fc64 (void)USB_DeviceKhciRecv(khciState, (endpoint) | (USB_OUT << 0x07U), fd80: 6a0a ldr r2, [r1, #32] fd82: 4631 mov r1, r6 fd84: 4620 mov r0, r4 fd86: f7ff fc4a bl f61e return; fd8a: e667 b.n fa5c fd8c: 4770 bx lr 0000fd8e : { fd8e: b538 push {r3, r4, r5, lr} if (NULL == mscHandle->interfaceHandle) fd90: 6883 ldr r3, [r0, #8] fd92: b1ab cbz r3, fdc0 fd94: 4605 mov r5, r0 for (count = 0; count < mscHandle->interfaceHandle->endpointList.count; count++) fd96: 791a ldrb r2, [r3, #4] fd98: b182 cbz r2, fdbc fd9a: 2400 movs r4, #0 status = USB_DeviceDeinitEndpoint(mscHandle->handle, fd9c: 689b ldr r3, [r3, #8] fd9e: eb04 0244 add.w r2, r4, r4, lsl #1 fda2: f813 1012 ldrb.w r1, [r3, r2, lsl #1] fda6: 6828 ldr r0, [r5, #0] fda8: f7ff faa8 bl f2fc for (count = 0; count < mscHandle->interfaceHandle->endpointList.count; count++) fdac: 3401 adds r4, #1 fdae: 68ab ldr r3, [r5, #8] fdb0: 791a ldrb r2, [r3, #4] fdb2: 42a2 cmp r2, r4 fdb4: d8f2 bhi.n fd9c mscHandle->interfaceHandle = NULL; fdb6: 2300 movs r3, #0 fdb8: 60ab str r3, [r5, #8] } fdba: bd38 pop {r3, r4, r5, pc} usb_status_t status = kStatus_USB_Error; fdbc: 2001 movs r0, #1 fdbe: e7fa b.n fdb6 return status; fdc0: 2001 movs r0, #1 fdc2: e7fa b.n fdba 0000fdc4 : usb_device_msc_struct_t *mscHandle; usb_status_t status = kStatus_USB_Error; mscHandle = (usb_device_msc_struct_t *)handle; if (NULL == mscHandle) fdc4: b158 cbz r0, fdde { fdc6: b510 push {r4, lr} fdc8: 4604 mov r4, r0 { return kStatus_USB_InvalidHandle; } status = USB_DeviceMscEndpointsDeinit(mscHandle); fdca: f7ff ffe0 bl fd8e handle->handle = NULL; fdce: 2300 movs r3, #0 fdd0: 6023 str r3, [r4, #0] handle->configurationStruct = (usb_device_class_config_struct_t *)NULL; fdd2: 6063 str r3, [r4, #4] handle->configuration = 0; fdd4: f884 3094 strb.w r3, [r4, #148] ; 0x94 handle->alternate = 0; fdd8: f884 3093 strb.w r3, [r4, #147] ; 0x93 (void)USB_DeviceMscFreeHandle(mscHandle); return status; } fddc: bd10 pop {r4, pc} return kStatus_USB_InvalidHandle; fdde: 2003 movs r0, #3 } fde0: 4770 bx lr 0000fde2 : * @retval kStatus_USB_Success Free device handle successfully. * @retval kStatus_USB_InvalidParameter The device handle not be found. * @retval kStatus_USB_InvalidRequest The request is invalid, and the control pipe will be stalled by the caller. */ usb_status_t USB_DeviceMscEvent(void *handle, uint32_t event, void *param) { fde2: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} fde6: b08f sub sp, #60 ; 0x3c uint16_t interfaceAlternate; uint8_t *temp8; uint8_t alternate; uint8_t index; usb_device_class_event_t eventCode = (usb_device_class_event_t)event; if ((NULL == param) || (NULL == handle)) fde8: 2a00 cmp r2, #0 fdea: f000 8198 beq.w 1011e fdee: 4615 mov r5, r2 fdf0: 2800 cmp r0, #0 fdf2: f000 8199 beq.w 10128 fdf6: 4604 mov r4, r0 return kStatus_USB_InvalidHandle; } /* Get the msc class handle. */ mscHandle = (usb_device_msc_struct_t *)handle; switch (eventCode) fdf8: b2c9 uxtb r1, r1 fdfa: 3901 subs r1, #1 fdfc: 2905 cmp r1, #5 fdfe: f200 8195 bhi.w 1012c fe02: e8df f011 tbh [pc, r1, lsl #1] fe06: 014d .short 0x014d fe08: 00480006 .word 0x00480006 fe0c: 0096006e .word 0x0096006e fe10: 00cc .short 0x00cc { case kUSB_DeviceClassEventDeviceReset: /* Bus reset, clear the configuration. */ mscHandle->configuration = 0U; fe12: 2300 movs r3, #0 fe14: f880 3094 strb.w r3, [r0, #148] ; 0x94 /* Get device information. classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ error = mscHandle->configurationStruct->classCallback( fe18: 6843 ldr r3, [r0, #4] fe1a: 681b ldr r3, [r3, #0] fe1c: aa01 add r2, sp, #4 fe1e: 2105 movs r1, #5 fe20: 4798 blx r3 fe22: 4606 mov r6, r0 (class_handle_t)mscHandle, kUSB_DeviceMscEventGetLbaInformation, (void *)&diskInformation); if (0U >= diskInformation.logicalUnitNumberSupported) fe24: 9b01 ldr r3, [sp, #4] fe26: 2b00 cmp r3, #0 fe28: f000 8182 beq.w 10130 { diskInformation.logicalUnitNumberSupported = 0U; } else { mscHandle->logicalUnitNumber = (uint8_t)diskInformation.logicalUnitNumberSupported - 1U; fe2c: f103 3cff add.w ip, r3, #4294967295 ; 0xffffffff fe30: fa5f fc8c uxtb.w ip, ip fe34: f884 c090 strb.w ip, [r4, #144] ; 0x90 } /*add for misra2.2*/ if (0U == diskInformation.logicalUnitNumberSupported) fe38: ad01 add r5, sp, #4 mscHandle->logicalUnitNumber = (uint8_t)diskInformation.logicalUnitNumberSupported - 1U; fe3a: 2701 movs r7, #1 for (index = 0U; (index <= mscHandle->logicalUnitNumber) && (index < USB_DEVICE_MSC_MAX_LUN); ++index) { if (((0U == diskInformation.logicalUnitInformations[index].lengthOfEachLba) || (0U == diskInformation.logicalUnitInformations[index].totalLbaNumberSupports))) { error = kStatus_USB_Error; fe3c: 46be mov lr, r7 } else { mscHandle->luInformations[index] = diskInformation.logicalUnitInformations[index]; fe3e: f104 0844 add.w r8, r4, #68 ; 0x44 fe42: e007 b.n fe54 error = kStatus_USB_Error; fe44: 4676 mov r6, lr for (index = 0U; (index <= mscHandle->logicalUnitNumber) && (index < USB_DEVICE_MSC_MAX_LUN); ++index) fe46: b2fb uxtb r3, r7 fe48: 459c cmp ip, r3 fe4a: d312 bcc.n fe72 fe4c: 3701 adds r7, #1 fe4e: 3510 adds r5, #16 fe50: 2f04 cmp r7, #4 fe52: d00e beq.n fe72 if (((0U == diskInformation.logicalUnitInformations[index].lengthOfEachLba) || fe54: 462b mov r3, r5 fe56: 68aa ldr r2, [r5, #8] fe58: 2a00 cmp r2, #0 fe5a: d0f3 beq.n fe44 fe5c: 686a ldr r2, [r5, #4] fe5e: b132 cbz r2, fe6e mscHandle->luInformations[index] = diskInformation.logicalUnitInformations[index]; fe60: eb08 1907 add.w r9, r8, r7, lsl #4 fe64: 3304 adds r3, #4 fe66: cb0f ldmia r3, {r0, r1, r2, r3} fe68: e889 000f stmia.w r9, {r0, r1, r2, r3} fe6c: e7eb b.n fe46 error = kStatus_USB_Error; fe6e: 4676 mov r6, lr fe70: e7e9 b.n fe46 } } ufi = &mscHandle->mscUfi; ufi->requestSense->validErrorCode = USB_DEVICE_MSC_UFI_REQ_SENSE_VALID_ERROR_CODE; fe72: 6a23 ldr r3, [r4, #32] fe74: 2270 movs r2, #112 ; 0x70 fe76: 701a strb r2, [r3, #0] ufi->requestSense->additionalSenseLength = USB_DEVICE_MSC_UFI_REQ_SENSE_ADDITIONAL_SENSE_LEN; fe78: 6a23 ldr r3, [r4, #32] fe7a: 220a movs r2, #10 fe7c: 71da strb r2, [r3, #7] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_NO_SENSE; fe7e: 6a22 ldr r2, [r4, #32] fe80: 2300 movs r3, #0 fe82: 7093 strb r3, [r2, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_NO_SENSE; fe84: 6a22 ldr r2, [r4, #32] fe86: 7313 strb r3, [r2, #12] ufi->requestSense->additionalSenseQualifer = USB_DEVICE_MSC_UFI_NO_SENSE; fe88: 6a22 ldr r2, [r4, #32] fe8a: 7353 strb r3, [r2, #13] mscHandle->cbwPrimeFlag = 0U; fe8c: f884 308d strb.w r3, [r4, #141] ; 0x8d mscHandle->cswPrimeFlag = 0U; fe90: f884 308e strb.w r3, [r4, #142] ; 0x8e break; fe94: e144 b.n 10120 case kUSB_DeviceClassEventSetConfiguration: /* Get the new configuration. */ temp8 = ((uint8_t *)param); if (NULL == mscHandle->configurationStruct) fe96: 6843 ldr r3, [r0, #4] fe98: 2b00 cmp r3, #0 fe9a: f000 814b beq.w 10134 { break; } if (*temp8 == mscHandle->configuration) fe9e: f890 3094 ldrb.w r3, [r0, #148] ; 0x94 fea2: 7812 ldrb r2, [r2, #0] fea4: 429a cmp r2, r3 fea6: f000 8147 beq.w 10138 { break; } if (0U != mscHandle->configuration) feaa: b9bb cbnz r3, fedc { /* De-initialize the endpoints when current configuration is none zero. */ error = USB_DeviceMscEndpointsDeinit(mscHandle); } /* Save new configuration. */ mscHandle->configuration = *temp8; feac: 782b ldrb r3, [r5, #0] feae: f884 3094 strb.w r3, [r4, #148] ; 0x94 /* Clear the alternate setting value. */ mscHandle->alternate = 0; feb2: 2300 movs r3, #0 feb4: f884 3093 strb.w r3, [r4, #147] ; 0x93 /* Initialize the endpoints of the new current configuration by using the alternate setting 0. */ error = USB_DeviceMscEndpointsInit(mscHandle); feb8: 4620 mov r0, r4 feba: f7f8 fdad bl 8a18 if (kStatus_USB_Success == error) febe: 4606 mov r6, r0 fec0: 2800 cmp r0, #0 fec2: f040 812d bne.w 10120 { (void)USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, (uint8_t *)mscHandle->mscCbw, fec6: 231f movs r3, #31 fec8: 69a2 ldr r2, [r4, #24] feca: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 fece: 6820 ldr r0, [r4, #0] fed0: f7ff f9dc bl f28c USB_DEVICE_MSC_CBW_LENGTH); mscHandle->cbwPrimeFlag = 1U; fed4: 2301 movs r3, #1 fed6: f884 308d strb.w r3, [r4, #141] ; 0x8d feda: e121 b.n 10120 error = USB_DeviceMscEndpointsDeinit(mscHandle); fedc: f7ff ff57 bl fd8e fee0: e7e4 b.n feac } break; case kUSB_DeviceClassEventSetInterface: if (NULL == mscHandle->configurationStruct) fee2: 6843 ldr r3, [r0, #4] fee4: 2b00 cmp r3, #0 fee6: f000 8129 beq.w 1013c { break; } /* Get the new alternate setting of the interface */ interfaceAlternate = *((uint16_t *)param); feea: 8813 ldrh r3, [r2, #0] /* Get the alternate setting value */ alternate = (uint8_t)(interfaceAlternate & 0xFFU); /* Whether the interface belongs to the class. */ if (mscHandle->interfaceNumber != ((uint8_t)(interfaceAlternate >> 8))) feec: f890 2095 ldrb.w r2, [r0, #149] ; 0x95 fef0: ebb2 2f13 cmp.w r2, r3, lsr #8 fef4: d001 beq.n fefa usb_status_t error = kStatus_USB_Error; fef6: 2601 movs r6, #1 fef8: e112 b.n 10120 alternate = (uint8_t)(interfaceAlternate & 0xFFU); fefa: b2dd uxtb r5, r3 { break; } /* Only handle new alternate setting. */ if (alternate == mscHandle->alternate) fefc: f890 3093 ldrb.w r3, [r0, #147] ; 0x93 ff00: 42ab cmp r3, r5 ff02: d101 bne.n ff08 usb_status_t error = kStatus_USB_Error; ff04: 2601 movs r6, #1 ff06: e10b b.n 10120 { break; } error = USB_DeviceMscEndpointsDeinit(mscHandle); ff08: f7ff ff41 bl fd8e /* Initialize new endpoints */ error = USB_DeviceMscEndpointsInit(mscHandle); ff0c: 4620 mov r0, r4 ff0e: f7f8 fd83 bl 8a18 if (kStatus_USB_Success == error) ff12: 4606 mov r6, r0 ff14: b110 cbz r0, ff1c { (void)USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, (uint8_t *)mscHandle->mscCbw, USB_DEVICE_MSC_CBW_LENGTH); mscHandle->cbwPrimeFlag = 1U; } mscHandle->alternate = alternate; ff16: f884 5093 strb.w r5, [r4, #147] ; 0x93 break; ff1a: e101 b.n 10120 (void)USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, (uint8_t *)mscHandle->mscCbw, ff1c: 231f movs r3, #31 ff1e: 69a2 ldr r2, [r4, #24] ff20: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 ff24: 6820 ldr r0, [r4, #0] ff26: f7ff f9b1 bl f28c mscHandle->cbwPrimeFlag = 1U; ff2a: 2301 movs r3, #1 ff2c: f884 308d strb.w r3, [r4, #141] ; 0x8d ff30: e7f1 b.n ff16 case kUSB_DeviceClassEventSetEndpointHalt: if ((NULL == mscHandle->configurationStruct) || (NULL == mscHandle->interfaceHandle)) ff32: 6843 ldr r3, [r0, #4] ff34: 2b00 cmp r3, #0 ff36: f000 8103 beq.w 10140 ff3a: 6883 ldr r3, [r0, #8] ff3c: 2b00 cmp r3, #0 ff3e: f000 8101 beq.w 10144 break; } /* Get the endpoint address */ temp8 = ((uint8_t *)param); if ((mscHandle->inEndpointStallFlag == 0U) && (*temp8 == mscHandle->bulkInEndpoint)) ff42: f890 3086 ldrb.w r3, [r0, #134] ; 0x86 ff46: b993 cbnz r3, ff6e ff48: 7812 ldrb r2, [r2, #0] ff4a: f890 3091 ldrb.w r3, [r0, #145] ; 0x91 ff4e: 429a cmp r2, r3 ff50: d001 beq.n ff56 usb_status_t error = kStatus_USB_Error; ff52: 2601 movs r6, #1 ff54: e00c b.n ff70 { /* Only stall the endpoint belongs to the class */ mscHandle->inEndpointStallFlag = 1U; ff56: 2301 movs r3, #1 ff58: f880 3086 strb.w r3, [r0, #134] ; 0x86 mscHandle->cswPrimeFlag = 0U; ff5c: 2300 movs r3, #0 ff5e: f880 308e strb.w r3, [r0, #142] ; 0x8e error = USB_DeviceStallEndpoint(mscHandle->handle, *temp8); ff62: 7829 ldrb r1, [r5, #0] ff64: 6800 ldr r0, [r0, #0] ff66: f7ff f9eb bl f340 ff6a: 4606 mov r6, r0 ff6c: e000 b.n ff70 usb_status_t error = kStatus_USB_Error; ff6e: 2601 movs r6, #1 } if ((mscHandle->outEndpointStallFlag == 0U) && (*temp8 == mscHandle->bulkOutEndpoint)) ff70: f894 3087 ldrb.w r3, [r4, #135] ; 0x87 ff74: 2b00 cmp r3, #0 ff76: f040 80d3 bne.w 10120 ff7a: 782a ldrb r2, [r5, #0] ff7c: f894 3092 ldrb.w r3, [r4, #146] ; 0x92 ff80: 429a cmp r2, r3 ff82: f040 80cd bne.w 10120 { mscHandle->outEndpointStallFlag = 1U; ff86: 2301 movs r3, #1 ff88: f884 3087 strb.w r3, [r4, #135] ; 0x87 mscHandle->cbwPrimeFlag = 0U; ff8c: 2300 movs r3, #0 ff8e: f884 308d strb.w r3, [r4, #141] ; 0x8d error = USB_DeviceStallEndpoint(mscHandle->handle, *temp8); ff92: 7829 ldrb r1, [r5, #0] ff94: 6820 ldr r0, [r4, #0] ff96: f7ff f9d3 bl f340 ff9a: 4606 mov r6, r0 ff9c: e0c0 b.n 10120 } break; case kUSB_DeviceClassEventClearEndpointHalt: if ((NULL == mscHandle->configurationStruct) || (NULL == mscHandle->interfaceHandle) || ff9e: 6843 ldr r3, [r0, #4] ffa0: 2b00 cmp r3, #0 ffa2: f000 80d1 beq.w 10148 ffa6: 6883 ldr r3, [r0, #8] ffa8: 2b00 cmp r3, #0 ffaa: f000 80cf beq.w 1014c (mscHandle->performResetRecover == 1U)) ffae: f890 6089 ldrb.w r6, [r0, #137] ; 0x89 if ((NULL == mscHandle->configurationStruct) || (NULL == mscHandle->interfaceHandle) || ffb2: 2e01 cmp r6, #1 ffb4: f000 80b4 beq.w 10120 } /* Get the endpoint address */ temp8 = ((uint8_t *)param); /* Only un-stall the endpoint belongs to the class , If the endpoint is in stall status ,then * un-stall it*/ if ((mscHandle->inEndpointStallFlag == 1U) && (*temp8 == mscHandle->bulkInEndpoint)) ffb8: f890 6086 ldrb.w r6, [r0, #134] ; 0x86 ffbc: 2e01 cmp r6, #1 ffbe: d028 beq.n 10012 usb_status_t error = kStatus_USB_Error; ffc0: 2601 movs r6, #1 { mscHandle->inEndpointStallFlag = 0; mscHandle->cswPrimeFlag = 0; error = USB_DeviceUnstallEndpoint(mscHandle->handle, *temp8); } if ((mscHandle->outEndpointStallFlag == 1U) && (*temp8 == mscHandle->bulkOutEndpoint)) ffc2: f894 3087 ldrb.w r3, [r4, #135] ; 0x87 ffc6: 2b01 cmp r3, #1 ffc8: d033 beq.n 10032 { mscHandle->outEndpointStallFlag = 0U; mscHandle->cbwPrimeFlag = 0U; error = USB_DeviceUnstallEndpoint(mscHandle->handle, *temp8); } if (((mscHandle->stallStatus == (uint8_t)USB_DEVICE_MSC_STALL_IN_CSW) || ffca: f894 308f ldrb.w r3, [r4, #143] ; 0x8f ffce: 3b02 subs r3, #2 ffd0: b2db uxtb r3, r3 ffd2: 2b01 cmp r3, #1 ffd4: d93d bls.n 10052 (uint8_t *)mscHandle->mscCsw, USB_DEVICE_MSC_CSW_LENGTH); mscHandle->cswPrimeFlag = 1U; } mscHandle->stallStatus = 0U; } if ((mscHandle->performResetDoneFlag == 1U) && (mscHandle->inEndpointStallFlag == 0U) && ffd6: f894 308a ldrb.w r3, [r4, #138] ; 0x8a ffda: 2b01 cmp r3, #1 ffdc: f040 80a0 bne.w 10120 ffe0: f8b4 3086 ldrh.w r3, [r4, #134] ; 0x86 ffe4: 2b00 cmp r3, #0 ffe6: f040 809b bne.w 10120 (mscHandle->outEndpointStallFlag == 0U)) { mscHandle->performResetDoneFlag = 0U; ffea: f884 308a strb.w r3, [r4, #138] ; 0x8a if (mscHandle->cbwPrimeFlag == 1U) ffee: f894 308d ldrb.w r3, [r4, #141] ; 0x8d fff2: 2b01 cmp r3, #1 fff4: d04b beq.n 1008e (void)USB_DeviceCancel(mscHandle->handle, mscHandle->bulkOutEndpoint); } else { /*prime cbw for new transfer*/ (void)USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, fff6: 231f movs r3, #31 fff8: 69a2 ldr r2, [r4, #24] fffa: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 fffe: 6820 ldr r0, [r4, #0] 10000: f7ff f944 bl f28c (uint8_t *)mscHandle->mscCbw, USB_DEVICE_MSC_CBW_LENGTH); mscHandle->cbwPrimeFlag = 1U; 10004: 2301 movs r3, #1 10006: f884 308d strb.w r3, [r4, #141] ; 0x8d } mscHandle->stallStatus = 0; 1000a: 2300 movs r3, #0 1000c: f884 308f strb.w r3, [r4, #143] ; 0x8f 10010: e086 b.n 10120 if ((mscHandle->inEndpointStallFlag == 1U) && (*temp8 == mscHandle->bulkInEndpoint)) 10012: 7812 ldrb r2, [r2, #0] 10014: f890 3091 ldrb.w r3, [r0, #145] ; 0x91 10018: 429a cmp r2, r3 1001a: d1d2 bne.n ffc2 mscHandle->inEndpointStallFlag = 0; 1001c: 2300 movs r3, #0 1001e: f880 3086 strb.w r3, [r0, #134] ; 0x86 mscHandle->cswPrimeFlag = 0; 10022: f880 308e strb.w r3, [r0, #142] ; 0x8e error = USB_DeviceUnstallEndpoint(mscHandle->handle, *temp8); 10026: 7829 ldrb r1, [r5, #0] 10028: 6800 ldr r0, [r0, #0] 1002a: f7ff f99a bl f362 1002e: 4606 mov r6, r0 10030: e7c7 b.n ffc2 if ((mscHandle->outEndpointStallFlag == 1U) && (*temp8 == mscHandle->bulkOutEndpoint)) 10032: 782a ldrb r2, [r5, #0] 10034: f894 3092 ldrb.w r3, [r4, #146] ; 0x92 10038: 429a cmp r2, r3 1003a: d1c6 bne.n ffca mscHandle->outEndpointStallFlag = 0U; 1003c: 2300 movs r3, #0 1003e: f884 3087 strb.w r3, [r4, #135] ; 0x87 mscHandle->cbwPrimeFlag = 0U; 10042: f884 308d strb.w r3, [r4, #141] ; 0x8d error = USB_DeviceUnstallEndpoint(mscHandle->handle, *temp8); 10046: 7829 ldrb r1, [r5, #0] 10048: 6820 ldr r0, [r4, #0] 1004a: f7ff f98a bl f362 1004e: 4606 mov r6, r0 10050: e7bb b.n ffca (mscHandle->stallStatus == (uint8_t)USB_DEVICE_MSC_STALL_IN_DATA)) && 10052: f894 308a ldrb.w r3, [r4, #138] ; 0x8a 10056: 2b01 cmp r3, #1 10058: d0c2 beq.n ffe0 if (mscHandle->cswPrimeFlag == 1U) 1005a: f894 308e ldrb.w r3, [r4, #142] ; 0x8e 1005e: 2b01 cmp r3, #1 10060: d00d beq.n 1007e (void)USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, 10062: 230d movs r3, #13 10064: 69e2 ldr r2, [r4, #28] 10066: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 1006a: 6820 ldr r0, [r4, #0] 1006c: f7ff f906 bl f27c mscHandle->cswPrimeFlag = 1U; 10070: 2301 movs r3, #1 10072: f884 308e strb.w r3, [r4, #142] ; 0x8e mscHandle->stallStatus = 0U; 10076: 2300 movs r3, #0 10078: f884 308f strb.w r3, [r4, #143] ; 0x8f 1007c: e7ab b.n ffd6 mscHandle->inEndpointCswCancelFlag = 1U; 1007e: f884 3096 strb.w r3, [r4, #150] ; 0x96 (void)USB_DeviceCancel(mscHandle->handle, mscHandle->bulkInEndpoint); 10082: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 10086: 6820 ldr r0, [r4, #0] 10088: f7ff f906 bl f298 1008c: e7f3 b.n 10076 mscHandle->cbwPrimeFlag = 0U; 1008e: 2300 movs r3, #0 10090: f884 308d strb.w r3, [r4, #141] ; 0x8d (void)USB_DeviceCancel(mscHandle->handle, mscHandle->bulkOutEndpoint); 10094: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 10098: 6820 ldr r0, [r4, #0] 1009a: f7ff f8fd bl f298 1009e: e7b4 b.n 1000a case kUSB_DeviceClassEventClassRequest: { /* Handle the msc class specific request. */ usb_device_control_request_struct_t *control_request = (usb_device_control_request_struct_t *)param; if ((control_request->setup->bmRequestType & USB_REQUEST_TYPE_RECIPIENT_MASK) != 100a0: 6813 ldr r3, [r2, #0] 100a2: 781a ldrb r2, [r3, #0] 100a4: f002 061f and.w r6, r2, #31 100a8: 2e01 cmp r6, #1 100aa: d001 beq.n 100b0 usb_status_t error = kStatus_USB_Error; 100ac: 2601 movs r6, #1 100ae: e037 b.n 10120 USB_REQUEST_TYPE_RECIPIENT_INTERFACE) { break; } switch (control_request->setup->bRequest) 100b0: 7859 ldrb r1, [r3, #1] 100b2: 29fe cmp r1, #254 ; 0xfe 100b4: d008 beq.n 100c8 100b6: 29ff cmp r1, #255 ; 0xff 100b8: d132 bne.n 10120 } break; case USB_DEVICE_MSC_BULK_ONLY_MASS_STORAGE_RESET: /*Bulk-Only Mass Storage Reset (class-specific request)*/ if ((control_request->setup->wIndex == mscHandle->interfaceNumber) && 100ba: 8898 ldrh r0, [r3, #4] 100bc: f894 1095 ldrb.w r1, [r4, #149] ; 0x95 100c0: 4288 cmp r0, r1 100c2: d018 beq.n 100f6 mscHandle->performResetRecover = 0U; mscHandle->performResetDoneFlag = 1U; } else { error = kStatus_USB_InvalidRequest; 100c4: 2605 movs r6, #5 100c6: e02b b.n 10120 if ((control_request->setup->wIndex == mscHandle->interfaceNumber) && 100c8: 8898 ldrh r0, [r3, #4] 100ca: f894 1095 ldrb.w r1, [r4, #149] ; 0x95 100ce: 4288 cmp r0, r1 100d0: d001 beq.n 100d6 error = kStatus_USB_InvalidRequest; 100d2: 2605 movs r6, #5 100d4: e024 b.n 10120 if ((control_request->setup->wIndex == mscHandle->interfaceNumber) && 100d6: 8859 ldrh r1, [r3, #2] 100d8: 2900 cmp r1, #0 100da: d139 bne.n 10150 (0U == control_request->setup->wValue) && (control_request->setup->wLength == 0x0001U) && 100dc: 88d9 ldrh r1, [r3, #6] 100de: 2901 cmp r1, #1 100e0: d001 beq.n 100e6 error = kStatus_USB_InvalidRequest; 100e2: 2605 movs r6, #5 100e4: e01c b.n 10120 (0U == control_request->setup->wValue) && (control_request->setup->wLength == 0x0001U) && 100e6: f012 0f80 tst.w r2, #128 ; 0x80 100ea: d033 beq.n 10154 control_request->buffer = &mscHandle->logicalUnitNumber; 100ec: 3490 adds r4, #144 ; 0x90 100ee: 606c str r4, [r5, #4] control_request->length = (uint32_t)control_request->setup->wLength; 100f0: 88db ldrh r3, [r3, #6] 100f2: 60ab str r3, [r5, #8] 100f4: e014 b.n 10120 if ((control_request->setup->wIndex == mscHandle->interfaceNumber) && 100f6: 8859 ldrh r1, [r3, #2] 100f8: bb71 cbnz r1, 10158 (0U == control_request->setup->wValue) && (0U == control_request->setup->wLength) && 100fa: 88db ldrh r3, [r3, #6] 100fc: bb73 cbnz r3, 1015c 100fe: f012 0f80 tst.w r2, #128 ; 0x80 10102: d12d bne.n 10160 mscHandle->outEndpointStallFlag = 1U; 10104: 2301 movs r3, #1 10106: f884 3087 strb.w r3, [r4, #135] ; 0x87 mscHandle->inEndpointStallFlag = 1U; 1010a: f884 3086 strb.w r3, [r4, #134] ; 0x86 mscHandle->cbwValidFlag = 1U; 1010e: f884 3088 strb.w r3, [r4, #136] ; 0x88 mscHandle->performResetRecover = 0U; 10112: 2200 movs r2, #0 10114: f884 2089 strb.w r2, [r4, #137] ; 0x89 mscHandle->performResetDoneFlag = 1U; 10118: f884 308a strb.w r3, [r4, #138] ; 0x8a 1011c: e000 b.n 10120 return kStatus_USB_InvalidHandle; 1011e: 2603 movs r6, #3 /*no action*/ break; } return error; } 10120: 4630 mov r0, r6 10122: b00f add sp, #60 ; 0x3c 10124: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} return kStatus_USB_InvalidHandle; 10128: 2603 movs r6, #3 1012a: e7f9 b.n 10120 usb_status_t error = kStatus_USB_Error; 1012c: 2601 movs r6, #1 1012e: e7f7 b.n 10120 error = kStatus_USB_InvalidParameter; 10130: 2604 movs r6, #4 10132: e7f5 b.n 10120 usb_status_t error = kStatus_USB_Error; 10134: 2601 movs r6, #1 10136: e7f3 b.n 10120 10138: 2601 movs r6, #1 1013a: e7f1 b.n 10120 1013c: 2601 movs r6, #1 1013e: e7ef b.n 10120 10140: 2601 movs r6, #1 10142: e7ed b.n 10120 10144: 2601 movs r6, #1 10146: e7eb b.n 10120 10148: 2601 movs r6, #1 1014a: e7e9 b.n 10120 1014c: 2601 movs r6, #1 1014e: e7e7 b.n 10120 error = kStatus_USB_InvalidRequest; 10150: 2605 movs r6, #5 10152: e7e5 b.n 10120 10154: 2605 movs r6, #5 10156: e7e3 b.n 10120 error = kStatus_USB_InvalidRequest; 10158: 2605 movs r6, #5 1015a: e7e1 b.n 10120 1015c: 2605 movs r6, #5 1015e: e7df b.n 10120 10160: 2605 movs r6, #5 10162: e7dd b.n 10120 00010164 : * should implement a queue in the application level. * The subsequent transfer could begin only when the previous transfer is done (get notification through the endpoint * callback). */ usb_status_t USB_DeviceMscSend(usb_device_msc_struct_t *mscHandle) { 10164: b530 push {r4, r5, lr} 10166: b085 sub sp, #20 10168: 4604 mov r4, r0 usb_status_t status = kStatus_USB_Success; usb_device_lba_app_struct_t lba; lba.offset = mscHandle->currentOffset; 1016a: 6903 ldr r3, [r0, #16] 1016c: 9300 str r3, [sp, #0] /*bulkInBufferSize is the application buffer size, USB_DEVICE_MSC_MAX_SEND_TRANSFER_LENGTH is the max transfer length by the hardware, lba.size is the data pending for transfer ,select the minimum size to transfer ,the remaining will be transfer next time*/ lba.size = (mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].bulkInBufferSize > 1016e: 6983 ldr r3, [r0, #24] 10170: 7b5a ldrb r2, [r3, #13] USB_DEVICE_MSC_MAX_SEND_TRANSFER_LENGTH) ? USB_DEVICE_MSC_MAX_SEND_TRANSFER_LENGTH : mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].bulkInBufferSize; lba.size = (mscHandle->transferRemaining > lba.size) ? lba.size : mscHandle->transferRemaining; /* which one is smaller */ 10172: 68c3 ldr r3, [r0, #12] 10174: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 10178: bf28 it cs 1017a: f44f 3380 movcs.w r3, #65536 ; 0x10000 lba.size = (mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].bulkInBufferSize > 1017e: eb00 1102 add.w r1, r0, r2, lsl #4 (mscHandle->transferRemaining > lba.size) ? lba.size : mscHandle->transferRemaining; /* which one is smaller */ 10182: 6dc9 ldr r1, [r1, #92] ; 0x5c 10184: 428b cmp r3, r1 10186: bf28 it cs 10188: 460b movcs r3, r1 lba.size = 1018a: 9301 str r3, [sp, #4] lba.buffer = NULL; 1018c: 2300 movs r3, #0 1018e: 9302 str r3, [sp, #8] lba.lun = mscHandle->mscCbw->logicalUnitNumber; 10190: f88d 200c strb.w r2, [sp, #12] /*classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit*/ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, kUSB_DeviceMscEventReadRequest, 10194: 6843 ldr r3, [r0, #4] 10196: 681b ldr r3, [r3, #0] 10198: 466a mov r2, sp 1019a: 2104 movs r1, #4 1019c: 4798 blx r3 &lba); if (mscHandle->currentOffset < mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].totalLbaNumberSupports) 1019e: 69a3 ldr r3, [r4, #24] 101a0: 7b5b ldrb r3, [r3, #13] 101a2: eb04 1303 add.w r3, r4, r3, lsl #4 if (mscHandle->currentOffset < 101a6: 6922 ldr r2, [r4, #16] 101a8: 6d5b ldr r3, [r3, #84] ; 0x54 101aa: 429a cmp r2, r3 101ac: d208 bcs.n 101c0 { status = USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, lba.buffer, lba.size); 101ae: 9b01 ldr r3, [sp, #4] 101b0: 9a02 ldr r2, [sp, #8] 101b2: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 101b6: 6820 ldr r0, [r4, #0] 101b8: f7ff f860 bl f27c mscHandle->dataInFlag = 0U; mscHandle->stallStatus = (uint8_t)USB_DEVICE_MSC_STALL_IN_DATA; (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkInEndpoint); } return status; } 101bc: b005 add sp, #20 101be: bd30 pop {r4, r5, pc} mscHandle->needInStallFlag = 0U; 101c0: 2500 movs r5, #0 101c2: f884 508b strb.w r5, [r4, #139] ; 0x8b mscHandle->inEndpointStallFlag = 1U; 101c6: 2301 movs r3, #1 101c8: f884 3086 strb.w r3, [r4, #134] ; 0x86 mscHandle->dataInFlag = 0U; 101cc: f884 5085 strb.w r5, [r4, #133] ; 0x85 mscHandle->stallStatus = (uint8_t)USB_DEVICE_MSC_STALL_IN_DATA; 101d0: 2302 movs r3, #2 101d2: f884 308f strb.w r3, [r4, #143] ; 0x8f (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkInEndpoint); 101d6: f894 1091 ldrb.w r1, [r4, #145] ; 0x91 101da: 6820 ldr r0, [r4, #0] 101dc: f7ff f8b0 bl f340 usb_status_t status = kStatus_USB_Success; 101e0: 4628 mov r0, r5 101e2: e7eb b.n 101bc 000101e4 : * should implement a queue in the application level. * The subsequent transfer could begin only when the previous transfer is done (get notification through the endpoint * callback). */ usb_status_t USB_DeviceMscRecv(usb_device_msc_struct_t *mscHandle) { 101e4: b530 push {r4, r5, lr} 101e6: b085 sub sp, #20 101e8: 4604 mov r4, r0 usb_status_t status = kStatus_USB_Success; usb_device_lba_app_struct_t lba; lba.offset = mscHandle->currentOffset; 101ea: 6903 ldr r3, [r0, #16] 101ec: 9300 str r3, [sp, #0] /*bulkOutBufferSize is the application buffer size, USB_DEVICE_MSC_MAX_RECV_TRANSFER_LENGTH is the max transfer length by the hardware, lba.size is the data pending for transfer ,select the minimum size to transfer ,the remaining will be transfer next time*/ lba.size = (mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].bulkOutBufferSize > 101ee: 6983 ldr r3, [r0, #24] 101f0: 7b5a ldrb r2, [r3, #13] USB_DEVICE_MSC_MAX_RECV_TRANSFER_LENGTH) ? USB_DEVICE_MSC_MAX_RECV_TRANSFER_LENGTH : mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].bulkOutBufferSize; lba.size = (mscHandle->transferRemaining > lba.size) ? lba.size : mscHandle->transferRemaining; /* whichever is smaller */ 101f2: 68c3 ldr r3, [r0, #12] 101f4: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 101f8: bf28 it cs 101fa: f44f 3380 movcs.w r3, #65536 ; 0x10000 lba.size = (mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].bulkOutBufferSize > 101fe: eb00 1102 add.w r1, r0, r2, lsl #4 (mscHandle->transferRemaining > lba.size) ? lba.size : mscHandle->transferRemaining; /* whichever is smaller */ 10202: 6e09 ldr r1, [r1, #96] ; 0x60 10204: 428b cmp r3, r1 10206: bf28 it cs 10208: 460b movcs r3, r1 lba.size = 1020a: 9301 str r3, [sp, #4] lba.buffer = NULL; 1020c: 2300 movs r3, #0 1020e: 9302 str r3, [sp, #8] lba.lun = mscHandle->mscCbw->logicalUnitNumber; 10210: f88d 200c strb.w r2, [sp, #12] /*classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit*/ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, kUSB_DeviceMscEventWriteRequest, 10214: 6843 ldr r3, [r0, #4] 10216: 681b ldr r3, [r3, #0] 10218: 466a mov r2, sp 1021a: 2103 movs r1, #3 1021c: 4798 blx r3 &lba); if (mscHandle->currentOffset < mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].totalLbaNumberSupports) 1021e: 69a3 ldr r3, [r4, #24] 10220: 7b5b ldrb r3, [r3, #13] 10222: eb04 1303 add.w r3, r4, r3, lsl #4 if (mscHandle->currentOffset < 10226: 6922 ldr r2, [r4, #16] 10228: 6d5b ldr r3, [r3, #84] ; 0x54 1022a: 429a cmp r2, r3 1022c: d208 bcs.n 10240 { status = USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, lba.buffer, lba.size); 1022e: 9b01 ldr r3, [sp, #4] 10230: 9a02 ldr r2, [sp, #8] 10232: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 10236: 6820 ldr r0, [r4, #0] 10238: f7ff f828 bl f28c mscHandle->dataOutFlag = 0U; mscHandle->stallStatus = (uint8_t)USB_DEVICE_MSC_STALL_IN_DATA; (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkOutEndpoint); } return status; } 1023c: b005 add sp, #20 1023e: bd30 pop {r4, r5, pc} mscHandle->needOutStallFlag = 0U; 10240: 2500 movs r5, #0 10242: f884 508c strb.w r5, [r4, #140] ; 0x8c mscHandle->outEndpointStallFlag = 1U; 10246: 2301 movs r3, #1 10248: f884 3087 strb.w r3, [r4, #135] ; 0x87 mscHandle->dataOutFlag = 0U; 1024c: f884 5084 strb.w r5, [r4, #132] ; 0x84 mscHandle->stallStatus = (uint8_t)USB_DEVICE_MSC_STALL_IN_DATA; 10250: 2302 movs r3, #2 10252: f884 308f strb.w r3, [r4, #143] ; 0x8f (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkOutEndpoint); 10256: f894 1092 ldrb.w r1, [r4, #146] ; 0x92 1025a: 6820 ldr r0, [r4, #0] 1025c: f7ff f870 bl f340 usb_status_t status = kStatus_USB_Success; 10260: 4628 mov r0, r5 10262: e7eb b.n 1023c 00010264 : * @note The return value just means if the sending or receiving request is successful or not. */ usb_status_t USB_DeviceMscLbaTransfer(usb_device_msc_struct_t *mscHandle, uint8_t direction, usb_lba_transfer_information_struct_t *lba_info_ptr) { 10264: b510 push {r4, lr} usb_status_t error = kStatus_USB_Success; mscHandle->transferRemaining = lba_info_ptr->transferNumber * mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba; 10266: 6983 ldr r3, [r0, #24] 10268: 7b5b ldrb r3, [r3, #13] 1026a: eb00 1303 add.w r3, r0, r3, lsl #4 1026e: 6d9c ldr r4, [r3, #88] ; 0x58 10270: 6853 ldr r3, [r2, #4] 10272: fb03 f304 mul.w r3, r3, r4 mscHandle->transferRemaining = 10276: 60c3 str r3, [r0, #12] mscHandle->currentOffset = lba_info_ptr->startingLogicalBlockAddress; 10278: 6813 ldr r3, [r2, #0] 1027a: 6103 str r3, [r0, #16] if (direction == USB_IN) 1027c: 2901 cmp r1, #1 1027e: d002 beq.n 10286 { error = USB_DeviceMscSend(mscHandle); } else { error = USB_DeviceMscRecv(mscHandle); 10280: f7ff ffb0 bl 101e4 } return error; } 10284: bd10 pop {r4, pc} error = USB_DeviceMscSend(mscHandle); 10286: f7ff ff6d bl 10164 1028a: e7fb b.n 10284 0001028c : *@return A USB error code or kStatus_USB_Success. more information about return value ,refer to *USB_DeviceMscLbaTransfer and USB_DeviceRecvRequest */ usb_status_t USB_DeviceMscUfiThirteenCasesCheck(struct _usb_device_msc_struct *mscHandle) { 1028c: b538 push {r3, r4, r5, lr} mscCheckEvent = (usb_device_msc_thirteen_case_struct_t *)&mscHandle->mscUfi.thirteenCase; ufi = &mscHandle->mscUfi; /* The following code describe the thirteen possible cases of host expectations and device intent in absence of overriding error conditions ,refer to bulk-only spec chapter 6.7 The Thirteen Cases*/ if (mscCheckEvent->hostExpectedDataLength == 0U) 1028e: 6a43 ldr r3, [r0, #36] ; 0x24 10290: b96b cbnz r3, 102ae { /*Host expects no data transfers*/ mscHandle->mscCsw->dataResidue = 0; 10292: 69c3 ldr r3, [r0, #28] 10294: 2200 movs r2, #0 10296: 609a str r2, [r3, #8] if (mscCheckEvent->deviceExpectedDataLength == 0U) 10298: 6a83 ldr r3, [r0, #40] ; 0x28 1029a: b91b cbnz r3, 102a4 { /*case 1, Device intends to transfer no data*/ mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 1029c: 69c3 ldr r3, [r0, #28] 1029e: 4610 mov r0, r2 102a0: 731a strb r2, [r3, #12] } } } } return status; } 102a2: bd38 pop {r3, r4, r5, pc} mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_PHASE_ERROR; 102a4: 69c3 ldr r3, [r0, #28] 102a6: 2202 movs r2, #2 102a8: 731a strb r2, [r3, #12] usb_status_t status = kStatus_USB_Success; 102aa: 2000 movs r0, #0 102ac: e7f9 b.n 102a2 102ae: 4604 mov r4, r0 else if (0U != mscCheckEvent->hostExpectedDirection) 102b0: f890 2039 ldrb.w r2, [r0, #57] ; 0x39 102b4: 2a00 cmp r2, #0 102b6: f000 80b6 beq.w 10426 if (mscCheckEvent->deviceExpectedDataLength == 0U) 102ba: 6a82 ldr r2, [r0, #40] ; 0x28 102bc: b1d2 cbz r2, 102f4 else if (0U != mscCheckEvent->deviceExpectedDirection) 102be: f890 103a ldrb.w r1, [r0, #58] ; 0x3a 102c2: 2900 cmp r1, #0 102c4: f000 80a1 beq.w 1040a if (mscCheckEvent->hostExpectedDataLength > mscCheckEvent->deviceExpectedDataLength) 102c8: 4293 cmp r3, r2 102ca: d93e bls.n 1034a mscHandle->mscCsw->dataResidue = 102cc: 69c1 ldr r1, [r0, #28] mscCheckEvent->hostExpectedDataLength - mscCheckEvent->deviceExpectedDataLength; 102ce: 1a9b subs r3, r3, r2 mscHandle->mscCsw->dataResidue = 102d0: 608b str r3, [r1, #8] if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 102d2: f890 3038 ldrb.w r3, [r0, #56] ; 0x38 102d6: 2b01 cmp r3, #1 102d8: d026 beq.n 10328 status = USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, mscCheckEvent->buffer, 102da: 6a83 ldr r3, [r0, #40] ; 0x28 102dc: 6ac2 ldr r2, [r0, #44] ; 0x2c 102de: f890 1091 ldrb.w r1, [r0, #145] ; 0x91 102e2: 6800 ldr r0, [r0, #0] 102e4: f7fe ffca bl f27c if (kStatus_USB_Success == status) 102e8: bb20 cbnz r0, 10334 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 102ea: 69e3 ldr r3, [r4, #28] 102ec: 2200 movs r2, #0 102ee: 731a strb r2, [r3, #12] status = kStatus_USB_InvalidRequest; 102f0: 2005 movs r0, #5 102f2: e7d6 b.n 102a2 mscHandle->mscCsw->dataResidue = 102f4: 69c2 ldr r2, [r0, #28] 102f6: 6093 str r3, [r2, #8] status = USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, mscCheckEvent->buffer, 102f8: 6a83 ldr r3, [r0, #40] ; 0x28 102fa: 6ac2 ldr r2, [r0, #44] ; 0x2c 102fc: f890 1091 ldrb.w r1, [r0, #145] ; 0x91 10300: 6800 ldr r0, [r0, #0] 10302: f7fe ffbb bl f27c if (kStatus_USB_Success == status) 10306: b920 cbnz r0, 10312 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 10308: 69e3 ldr r3, [r4, #28] 1030a: 2200 movs r2, #0 1030c: 731a strb r2, [r3, #12] status = kStatus_USB_InvalidRequest; 1030e: 2005 movs r0, #5 10310: e7c7 b.n 102a2 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 10312: 69e3 ldr r3, [r4, #28] 10314: 2201 movs r2, #1 10316: 731a strb r2, [r3, #12] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_MEDIUM_ERROR; 10318: 6a23 ldr r3, [r4, #32] 1031a: 2203 movs r2, #3 1031c: 709a strb r2, [r3, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_UNRECOVERED_READ_ERROR; 1031e: 6a23 ldr r3, [r4, #32] 10320: 2211 movs r2, #17 10322: 731a strb r2, [r3, #12] status = kStatus_USB_InvalidRequest; 10324: 2005 movs r0, #5 10326: e7bc b.n 102a2 status = USB_DeviceMscLbaTransfer(mscHandle, USB_IN, &mscCheckEvent->lbaInformation); 10328: f100 0230 add.w r2, r0, #48 ; 0x30 1032c: 2101 movs r1, #1 1032e: f7ff ff99 bl 10264 10332: e7d9 b.n 102e8 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 10334: 69e3 ldr r3, [r4, #28] 10336: 2201 movs r2, #1 10338: 731a strb r2, [r3, #12] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_MEDIUM_ERROR; 1033a: 6a23 ldr r3, [r4, #32] 1033c: 2203 movs r2, #3 1033e: 709a strb r2, [r3, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_UNRECOVERED_READ_ERROR; 10340: 6a23 ldr r3, [r4, #32] 10342: 2211 movs r2, #17 10344: 731a strb r2, [r3, #12] status = kStatus_USB_InvalidRequest; 10346: 2005 movs r0, #5 10348: e7ab b.n 102a2 else if (mscCheckEvent->hostExpectedDataLength == mscCheckEvent->deviceExpectedDataLength) 1034a: 4293 cmp r3, r2 1034c: d018 beq.n 10380 mscHandle->mscCsw->dataResidue = 0U; 1034e: 69c3 ldr r3, [r0, #28] 10350: 2200 movs r2, #0 10352: 609a str r2, [r3, #8] if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 10354: f890 3038 ldrb.w r3, [r0, #56] ; 0x38 10358: 2b01 cmp r3, #1 1035a: d034 beq.n 103c6 status = USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, mscCheckEvent->buffer, 1035c: 6a43 ldr r3, [r0, #36] ; 0x24 1035e: 6ac2 ldr r2, [r0, #44] ; 0x2c 10360: f890 1091 ldrb.w r1, [r0, #145] ; 0x91 10364: 6800 ldr r0, [r0, #0] 10366: f7fe ff89 bl f27c if (kStatus_USB_Success == status) 1036a: 2800 cmp r0, #0 1036c: d143 bne.n 103f6 if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 1036e: f894 3038 ldrb.w r3, [r4, #56] ; 0x38 10372: 2b01 cmp r3, #1 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_PHASE_ERROR; 10374: 69e3 ldr r3, [r4, #28] 10376: bf0c ite eq 10378: 2202 moveq r2, #2 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 1037a: 2200 movne r2, #0 1037c: 731a strb r2, [r3, #12] 1037e: e790 b.n 102a2 mscHandle->mscCsw->dataResidue = 0; 10380: 69c3 ldr r3, [r0, #28] 10382: 2200 movs r2, #0 10384: 609a str r2, [r3, #8] if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 10386: f890 3038 ldrb.w r3, [r0, #56] ; 0x38 1038a: 2b01 cmp r3, #1 1038c: d00b beq.n 103a6 status = USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, mscCheckEvent->buffer, 1038e: 6a83 ldr r3, [r0, #40] ; 0x28 10390: 6ac2 ldr r2, [r0, #44] ; 0x2c 10392: f890 1091 ldrb.w r1, [r0, #145] ; 0x91 10396: 6800 ldr r0, [r0, #0] 10398: f7fe ff70 bl f27c if (kStatus_USB_Success == status) 1039c: b948 cbnz r0, 103b2 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 1039e: 69e3 ldr r3, [r4, #28] 103a0: 2200 movs r2, #0 103a2: 731a strb r2, [r3, #12] 103a4: e77d b.n 102a2 status = USB_DeviceMscLbaTransfer(mscHandle, USB_IN, &mscCheckEvent->lbaInformation); 103a6: f100 0230 add.w r2, r0, #48 ; 0x30 103aa: 2101 movs r1, #1 103ac: f7ff ff5a bl 10264 103b0: e7f4 b.n 1039c mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 103b2: 69e3 ldr r3, [r4, #28] 103b4: 2201 movs r2, #1 103b6: 731a strb r2, [r3, #12] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_MEDIUM_ERROR; 103b8: 6a23 ldr r3, [r4, #32] 103ba: 2203 movs r2, #3 103bc: 709a strb r2, [r3, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_UNRECOVERED_READ_ERROR; 103be: 6a23 ldr r3, [r4, #32] 103c0: 2211 movs r2, #17 103c2: 731a strb r2, [r3, #12] 103c4: e76d b.n 102a2 mscCheckEvent->hostExpectedDataLength / 103c6: 6a41 ldr r1, [r0, #36] ; 0x24 mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba; 103c8: 6982 ldr r2, [r0, #24] 103ca: 7b53 ldrb r3, [r2, #13] 103cc: eb00 1303 add.w r3, r0, r3, lsl #4 mscCheckEvent->hostExpectedDataLength / 103d0: 6d9b ldr r3, [r3, #88] ; 0x58 103d2: fbb1 f3f3 udiv r3, r1, r3 mscCheckEvent->lbaInformation.transferNumber = 103d6: 6343 str r3, [r0, #52] ; 0x34 mscHandle->mscCsw->dataResidue = 103d8: 69c0 ldr r0, [r0, #28] mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba; 103da: 7b52 ldrb r2, [r2, #13] 103dc: eb04 1202 add.w r2, r4, r2, lsl #4 mscCheckEvent->lbaInformation.transferNumber * 103e0: 6d92 ldr r2, [r2, #88] ; 0x58 mscCheckEvent->hostExpectedDataLength - 103e2: fb02 1313 mls r3, r2, r3, r1 mscHandle->mscCsw->dataResidue = 103e6: 6083 str r3, [r0, #8] status = USB_DeviceMscLbaTransfer(mscHandle, USB_IN, &mscCheckEvent->lbaInformation); 103e8: f104 0230 add.w r2, r4, #48 ; 0x30 103ec: 2101 movs r1, #1 103ee: 4620 mov r0, r4 103f0: f7ff ff38 bl 10264 103f4: e7b9 b.n 1036a mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 103f6: 69e3 ldr r3, [r4, #28] 103f8: 2201 movs r2, #1 103fa: 731a strb r2, [r3, #12] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_MEDIUM_ERROR; 103fc: 6a23 ldr r3, [r4, #32] 103fe: 2203 movs r2, #3 10400: 709a strb r2, [r3, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_UNRECOVERED_READ_ERROR; 10402: 6a23 ldr r3, [r4, #32] 10404: 2211 movs r2, #17 10406: 731a strb r2, [r3, #12] 10408: e74b b.n 102a2 mscHandle->mscCsw->dataResidue = mscCheckEvent->hostExpectedDataLength; 1040a: 69c2 ldr r2, [r0, #28] 1040c: 6093 str r3, [r2, #8] (void)USB_DeviceSendRequest(mscHandle->handle, mscHandle->bulkInEndpoint, mscCheckEvent->buffer, 0); 1040e: 2300 movs r3, #0 10410: 6ac2 ldr r2, [r0, #44] ; 0x2c 10412: f890 1091 ldrb.w r1, [r0, #145] ; 0x91 10416: 6800 ldr r0, [r0, #0] 10418: f7fe ff30 bl f27c mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_PHASE_ERROR; 1041c: 69e3 ldr r3, [r4, #28] 1041e: 2202 movs r2, #2 10420: 731a strb r2, [r3, #12] status = kStatus_USB_InvalidRequest; 10422: 2005 movs r0, #5 10424: e73d b.n 102a2 if (0U == mscCheckEvent->deviceExpectedDataLength) 10426: 6a82 ldr r2, [r0, #40] ; 0x28 10428: b1c2 cbz r2, 1045c else if (0U != mscCheckEvent->deviceExpectedDirection) 1042a: f890 103a ldrb.w r1, [r0, #58] ; 0x3a 1042e: bb21 cbnz r1, 1047a if (mscCheckEvent->hostExpectedDataLength > mscCheckEvent->deviceExpectedDataLength) 10430: 4293 cmp r3, r2 10432: d942 bls.n 104ba mscHandle->mscCsw->dataResidue = 10434: 69c1 ldr r1, [r0, #28] mscCheckEvent->hostExpectedDataLength - mscCheckEvent->deviceExpectedDataLength; 10436: 1a9b subs r3, r3, r2 mscHandle->mscCsw->dataResidue = 10438: 608b str r3, [r1, #8] if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 1043a: f890 3038 ldrb.w r3, [r0, #56] ; 0x38 1043e: 2b01 cmp r3, #1 10440: d02b beq.n 1049a status = USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, mscCheckEvent->buffer, 10442: 6a83 ldr r3, [r0, #40] ; 0x28 10444: 6ac2 ldr r2, [r0, #44] ; 0x2c 10446: f890 1092 ldrb.w r1, [r0, #146] ; 0x92 1044a: 6800 ldr r0, [r0, #0] 1044c: f7fe ff1e bl f28c if (kStatus_USB_Success == status) 10450: bb48 cbnz r0, 104a6 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 10452: 69e3 ldr r3, [r4, #28] 10454: 2200 movs r2, #0 10456: 731a strb r2, [r3, #12] status = kStatus_USB_InvalidRequest; 10458: 2005 movs r0, #5 1045a: e722 b.n 102a2 (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkOutEndpoint); 1045c: f890 1092 ldrb.w r1, [r0, #146] ; 0x92 10460: 6800 ldr r0, [r0, #0] 10462: f7fe ff6d bl f340 mscHandle->mscCsw->dataResidue = mscCheckEvent->hostExpectedDataLength; 10466: 69e3 ldr r3, [r4, #28] 10468: 6a62 ldr r2, [r4, #36] ; 0x24 1046a: 609a str r2, [r3, #8] mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 1046c: 69e2 ldr r2, [r4, #28] 1046e: 2301 movs r3, #1 10470: 7313 strb r3, [r2, #12] mscHandle->outEndpointStallFlag = 1; 10472: f884 3087 strb.w r3, [r4, #135] ; 0x87 status = kStatus_USB_InvalidRequest; 10476: 2005 movs r0, #5 10478: e713 b.n 102a2 (void)USB_DeviceStallEndpoint(mscHandle->handle, mscHandle->bulkOutEndpoint); 1047a: f890 1092 ldrb.w r1, [r0, #146] ; 0x92 1047e: 6800 ldr r0, [r0, #0] 10480: f7fe ff5e bl f340 mscHandle->mscCsw->dataResidue = mscCheckEvent->hostExpectedDataLength; 10484: 69e3 ldr r3, [r4, #28] 10486: 6a62 ldr r2, [r4, #36] ; 0x24 10488: 609a str r2, [r3, #8] mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_PHASE_ERROR; 1048a: 69e3 ldr r3, [r4, #28] 1048c: 2202 movs r2, #2 1048e: 731a strb r2, [r3, #12] mscHandle->outEndpointStallFlag = 1U; 10490: 2301 movs r3, #1 10492: f884 3087 strb.w r3, [r4, #135] ; 0x87 status = kStatus_USB_InvalidRequest; 10496: 2005 movs r0, #5 10498: e703 b.n 102a2 status = USB_DeviceMscLbaTransfer(mscHandle, USB_OUT, &mscCheckEvent->lbaInformation); 1049a: f100 0230 add.w r2, r0, #48 ; 0x30 1049e: 2100 movs r1, #0 104a0: f7ff fee0 bl 10264 104a4: e7d4 b.n 10450 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 104a6: 69e3 ldr r3, [r4, #28] 104a8: 2201 movs r2, #1 104aa: 731a strb r2, [r3, #12] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_MEDIUM_ERROR; 104ac: 6a22 ldr r2, [r4, #32] 104ae: 2303 movs r3, #3 104b0: 7093 strb r3, [r2, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_WRITE_FAULT; 104b2: 6a22 ldr r2, [r4, #32] 104b4: 7313 strb r3, [r2, #12] status = kStatus_USB_InvalidRequest; 104b6: 2005 movs r0, #5 104b8: e6f3 b.n 102a2 else if (mscCheckEvent->hostExpectedDataLength == mscCheckEvent->deviceExpectedDataLength) 104ba: 4293 cmp r3, r2 104bc: d018 beq.n 104f0 mscHandle->mscCsw->dataResidue = 0; 104be: 69c3 ldr r3, [r0, #28] 104c0: 2200 movs r2, #0 104c2: 609a str r2, [r3, #8] if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 104c4: f890 3038 ldrb.w r3, [r0, #56] ; 0x38 104c8: 2b01 cmp r3, #1 104ca: d033 beq.n 10534 status = USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, mscCheckEvent->buffer, 104cc: 6a43 ldr r3, [r0, #36] ; 0x24 104ce: 6ac2 ldr r2, [r0, #44] ; 0x2c 104d0: f890 1092 ldrb.w r1, [r0, #146] ; 0x92 104d4: 6800 ldr r0, [r0, #0] 104d6: f7fe fed9 bl f28c if (kStatus_USB_Success == status) 104da: 2800 cmp r0, #0 104dc: d142 bne.n 10564 if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 104de: f894 3038 ldrb.w r3, [r4, #56] ; 0x38 104e2: 2b01 cmp r3, #1 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_PHASE_ERROR; 104e4: 69e3 ldr r3, [r4, #28] 104e6: bf0c ite eq 104e8: 2202 moveq r2, #2 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 104ea: 2200 movne r2, #0 104ec: 731a strb r2, [r3, #12] 104ee: e6d8 b.n 102a2 mscHandle->mscCsw->dataResidue = 0; 104f0: 69c3 ldr r3, [r0, #28] 104f2: 2200 movs r2, #0 104f4: 609a str r2, [r3, #8] if (ufi->thirteenCase.lbaSendRecvSelect == 1U) 104f6: f890 3038 ldrb.w r3, [r0, #56] ; 0x38 104fa: 2b01 cmp r3, #1 104fc: d00b beq.n 10516 status = USB_DeviceRecvRequest(mscHandle->handle, mscHandle->bulkOutEndpoint, mscCheckEvent->buffer, 104fe: 6a83 ldr r3, [r0, #40] ; 0x28 10500: 6ac2 ldr r2, [r0, #44] ; 0x2c 10502: f890 1092 ldrb.w r1, [r0, #146] ; 0x92 10506: 6800 ldr r0, [r0, #0] 10508: f7fe fec0 bl f28c if (kStatus_USB_Success == status) 1050c: b948 cbnz r0, 10522 mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 1050e: 69e3 ldr r3, [r4, #28] 10510: 2200 movs r2, #0 10512: 731a strb r2, [r3, #12] 10514: e6c5 b.n 102a2 status = USB_DeviceMscLbaTransfer(mscHandle, USB_OUT, &mscCheckEvent->lbaInformation); 10516: f100 0230 add.w r2, r0, #48 ; 0x30 1051a: 2100 movs r1, #0 1051c: f7ff fea2 bl 10264 10520: e7f4 b.n 1050c mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 10522: 69e3 ldr r3, [r4, #28] 10524: 2201 movs r2, #1 10526: 731a strb r2, [r3, #12] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_MEDIUM_ERROR; 10528: 6a22 ldr r2, [r4, #32] 1052a: 2303 movs r3, #3 1052c: 7093 strb r3, [r2, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_WRITE_FAULT; 1052e: 6a22 ldr r2, [r4, #32] 10530: 7313 strb r3, [r2, #12] 10532: e6b6 b.n 102a2 mscCheckEvent->hostExpectedDataLength / 10534: 6a41 ldr r1, [r0, #36] ; 0x24 mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba; 10536: 6980 ldr r0, [r0, #24] 10538: 7b42 ldrb r2, [r0, #13] 1053a: eb04 1202 add.w r2, r4, r2, lsl #4 mscCheckEvent->hostExpectedDataLength / 1053e: 6d93 ldr r3, [r2, #88] ; 0x58 10540: fbb1 f3f3 udiv r3, r1, r3 mscCheckEvent->lbaInformation.transferNumber = 10544: 6363 str r3, [r4, #52] ; 0x34 mscHandle->mscCsw->dataResidue = 10546: 69e5 ldr r5, [r4, #28] mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba; 10548: 7b42 ldrb r2, [r0, #13] 1054a: eb04 1202 add.w r2, r4, r2, lsl #4 mscCheckEvent->lbaInformation.transferNumber * 1054e: 6d92 ldr r2, [r2, #88] ; 0x58 mscCheckEvent->hostExpectedDataLength - 10550: fb02 1313 mls r3, r2, r3, r1 mscHandle->mscCsw->dataResidue = 10554: 60ab str r3, [r5, #8] status = USB_DeviceMscLbaTransfer(mscHandle, USB_OUT, &mscCheckEvent->lbaInformation); 10556: f104 0230 add.w r2, r4, #48 ; 0x30 1055a: 2100 movs r1, #0 1055c: 4620 mov r0, r4 1055e: f7ff fe81 bl 10264 10562: e7ba b.n 104da ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_MEDIUM_ERROR; 10564: 6a22 ldr r2, [r4, #32] 10566: 2303 movs r3, #3 10568: 7093 strb r3, [r2, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_WRITE_FAULT; 1056a: 6a22 ldr r2, [r4, #32] 1056c: 7313 strb r3, [r2, #12] 1056e: e698 b.n 102a2 00010570 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiRequestSenseCommand(struct _usb_device_msc_struct *mscHandle) { 10570: b510 push {r4, lr} 10572: b086 sub sp, #24 10574: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 10576: 6a03 ldr r3, [r0, #32] 10578: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 1057a: 6983 ldr r3, [r0, #24] 1057c: f103 020f add.w r2, r3, #15 10580: 9201 str r2, [sp, #4] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 10582: 7b5b ldrb r3, [r3, #13] 10584: f88d 3014 strb.w r3, [sp, #20] if (mscHandle->configurationStruct->classCallback != NULL) 10588: 6843 ldr r3, [r0, #4] 1058a: 681b ldr r3, [r3, #0] 1058c: b113 cbz r3, 10594 { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, kUSB_DeviceMscEventRequestSense, 1058e: aa01 add r2, sp, #4 10590: 210f movs r1, #15 10592: 4798 blx r3 (void *)&temp); } ufi->thirteenCase.deviceExpectedDataLength = USB_DEVICE_MSC_UFI_REQ_SENSE_DATA_LENGTH; 10594: 2312 movs r3, #18 10596: 62a3 str r3, [r4, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10598: 2301 movs r3, #1 1059a: f884 303a strb.w r3, [r4, #58] ; 0x3a ufi->thirteenCase.buffer = (uint8_t *)ufi->requestSense; 1059e: 6a23 ldr r3, [r4, #32] 105a0: 62e3 str r3, [r4, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0; 105a2: 2300 movs r3, #0 105a4: f884 3038 strb.w r3, [r4, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 105a8: 4620 mov r0, r4 105aa: f7ff fe6f bl 1028c return status; } 105ae: b006 add sp, #24 105b0: bd10 pop {r4, pc} 000105b2 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiInquiryCommand(struct _usb_device_msc_struct *mscHandle) { 105b2: b510 push {r4, lr} 105b4: b086 sub sp, #24 105b6: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 105b8: 6a03 ldr r3, [r0, #32] 105ba: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 105bc: 6983 ldr r3, [r0, #24] 105be: f103 020f add.w r2, r3, #15 105c2: 9201 str r2, [sp, #4] temp.size = 0U; 105c4: 2200 movs r2, #0 105c6: 9202 str r2, [sp, #8] temp.buffer = NULL; 105c8: 9203 str r2, [sp, #12] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 105ca: 7b5b ldrb r3, [r3, #13] 105cc: f88d 3014 strb.w r3, [sp, #20] if (mscHandle->configurationStruct->classCallback != NULL) 105d0: 6843 ldr r3, [r0, #4] 105d2: 681b ldr r3, [r3, #0] 105d4: b113 cbz r3, 105dc { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, kUSB_DeviceMscEventInquiry, 105d6: aa01 add r2, sp, #4 105d8: 2108 movs r1, #8 105da: 4798 blx r3 (void *)&temp); } ufi->thirteenCase.deviceExpectedDataLength = temp.size; 105dc: 9b02 ldr r3, [sp, #8] 105de: 62a3 str r3, [r4, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 105e0: 2301 movs r3, #1 105e2: f884 303a strb.w r3, [r4, #58] ; 0x3a ufi->thirteenCase.buffer = temp.buffer; 105e6: 9b03 ldr r3, [sp, #12] 105e8: 62e3 str r3, [r4, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0; 105ea: 2300 movs r3, #0 105ec: f884 3038 strb.w r3, [r4, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 105f0: 4620 mov r0, r4 105f2: f7ff fe4b bl 1028c return status; } 105f6: b006 add sp, #24 105f8: bd10 pop {r4, pc} 000105fa : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiReadCommand(struct _usb_device_msc_struct *mscHandle) { 105fa: b510 push {r4, lr} uint32_t logicalBlockAddress = 0; uint32_t lbaTransferLength = 0; ufi = &mscHandle->mscUfi; logicalBlockAddress = ((uint32_t)mscHandle->mscCbw->cbwcb[2] << 24); 105fc: 6982 ldr r2, [r0, #24] logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[3] << 16); 105fe: 7c91 ldrb r1, [r2, #18] logicalBlockAddress = ((uint32_t)mscHandle->mscCbw->cbwcb[2] << 24); 10600: 7c53 ldrb r3, [r2, #17] 10602: 061b lsls r3, r3, #24 10604: ea43 4301 orr.w r3, r3, r1, lsl #16 logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[4] << 8); logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[5]); 10608: 7d11 ldrb r1, [r2, #20] 1060a: 430b orrs r3, r1 logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[4] << 8); 1060c: 7cd1 ldrb r1, [r2, #19] logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[5]); 1060e: ea43 2301 orr.w r3, r3, r1, lsl #8 if (mscHandle->mscCbw->cbwcb[0] == USB_DEVICE_MSC_READ_10_COMMAND) 10612: 7bd1 ldrb r1, [r2, #15] 10614: 2928 cmp r1, #40 ; 0x28 10616: d015 beq.n 10644 { lbaTransferLength = (uint16_t)((uint16_t)mscHandle->mscCbw->cbwcb[7] << 8); lbaTransferLength |= (uint16_t)mscHandle->mscCbw->cbwcb[8]; } else if (mscHandle->mscCbw->cbwcb[0] == USB_DEVICE_MSC_READ_12_COMMAND) 10618: 29a8 cmp r1, #168 ; 0xa8 1061a: d018 beq.n 1064e uint32_t lbaTransferLength = 0; 1061c: 2100 movs r1, #0 else { /*no action*/ } ufi->thirteenCase.deviceExpectedDirection = USB_IN; 1061e: 2401 movs r4, #1 10620: f880 403a strb.w r4, [r0, #58] ; 0x3a ufi->thirteenCase.deviceExpectedDataLength = mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba * lbaTransferLength; 10624: 7b52 ldrb r2, [r2, #13] 10626: eb00 1202 add.w r2, r0, r2, lsl #4 1062a: 6d92 ldr r2, [r2, #88] ; 0x58 1062c: fb01 f202 mul.w r2, r1, r2 ufi->thirteenCase.deviceExpectedDataLength = 10630: 6282 str r2, [r0, #40] ; 0x28 ufi->thirteenCase.buffer = NULL; 10632: 2200 movs r2, #0 10634: 62c2 str r2, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 1U; 10636: f880 4038 strb.w r4, [r0, #56] ; 0x38 ufi->thirteenCase.lbaInformation.startingLogicalBlockAddress = logicalBlockAddress; 1063a: 6303 str r3, [r0, #48] ; 0x30 ufi->thirteenCase.lbaInformation.transferNumber = lbaTransferLength; 1063c: 6341 str r1, [r0, #52] ; 0x34 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 1063e: f7ff fe25 bl 1028c return status; } 10642: bd10 pop {r4, pc} lbaTransferLength = (uint16_t)((uint16_t)mscHandle->mscCbw->cbwcb[7] << 8); 10644: 7d94 ldrb r4, [r2, #22] lbaTransferLength |= (uint16_t)mscHandle->mscCbw->cbwcb[8]; 10646: 7dd1 ldrb r1, [r2, #23] 10648: ea41 2104 orr.w r1, r1, r4, lsl #8 1064c: e7e7 b.n 1061e lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[7] << 16); 1064e: 7d94 ldrb r4, [r2, #22] lbaTransferLength = ((uint32_t)mscHandle->mscCbw->cbwcb[6] << 24); 10650: 7d51 ldrb r1, [r2, #21] 10652: 0609 lsls r1, r1, #24 10654: ea41 4104 orr.w r1, r1, r4, lsl #16 lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[9]); 10658: 7e14 ldrb r4, [r2, #24] 1065a: 4321 orrs r1, r4 lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[8] << 8); 1065c: 7dd4 ldrb r4, [r2, #23] lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[9]); 1065e: ea41 2104 orr.w r1, r1, r4, lsl #8 10662: e7dc b.n 1061e 00010664 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiWriteCommand(struct _usb_device_msc_struct *mscHandle) { 10664: b510 push {r4, lr} uint32_t logicalBlockAddress = 0; uint32_t lbaTransferLength = 0; ufi = &mscHandle->mscUfi; logicalBlockAddress = ((uint32_t)mscHandle->mscCbw->cbwcb[2] << 24); 10666: 6982 ldr r2, [r0, #24] logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[3] << 16); 10668: 7c91 ldrb r1, [r2, #18] logicalBlockAddress = ((uint32_t)mscHandle->mscCbw->cbwcb[2] << 24); 1066a: 7c53 ldrb r3, [r2, #17] 1066c: 061b lsls r3, r3, #24 1066e: ea43 4301 orr.w r3, r3, r1, lsl #16 logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[4] << 8); logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[5]); 10672: 7d11 ldrb r1, [r2, #20] 10674: 430b orrs r3, r1 logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[4] << 8); 10676: 7cd1 ldrb r1, [r2, #19] logicalBlockAddress |= ((uint32_t)mscHandle->mscCbw->cbwcb[5]); 10678: ea43 2301 orr.w r3, r3, r1, lsl #8 if (mscHandle->mscCbw->cbwcb[0] == USB_DEVICE_MSC_WRITE_10_COMMAND) 1067c: 7bd1 ldrb r1, [r2, #15] 1067e: 292a cmp r1, #42 ; 0x2a 10680: d015 beq.n 106ae { lbaTransferLength = (uint16_t)((uint16_t)mscHandle->mscCbw->cbwcb[7] << 8); lbaTransferLength |= (uint16_t)mscHandle->mscCbw->cbwcb[8]; } else if (mscHandle->mscCbw->cbwcb[0] == USB_DEVICE_MSC_WRITE_12_COMMAND) 10682: 29aa cmp r1, #170 ; 0xaa 10684: d018 beq.n 106b8 uint32_t lbaTransferLength = 0; 10686: 2100 movs r1, #0 } else { /*no action*/ } ufi->thirteenCase.deviceExpectedDirection = USB_OUT; 10688: 2400 movs r4, #0 1068a: f880 403a strb.w r4, [r0, #58] ; 0x3a ufi->thirteenCase.deviceExpectedDataLength = mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba * lbaTransferLength; 1068e: 7b52 ldrb r2, [r2, #13] 10690: eb00 1202 add.w r2, r0, r2, lsl #4 10694: 6d92 ldr r2, [r2, #88] ; 0x58 10696: fb01 f202 mul.w r2, r1, r2 ufi->thirteenCase.deviceExpectedDataLength = 1069a: 6282 str r2, [r0, #40] ; 0x28 ufi->thirteenCase.buffer = NULL; 1069c: 62c4 str r4, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 1U; 1069e: 2201 movs r2, #1 106a0: f880 2038 strb.w r2, [r0, #56] ; 0x38 ufi->thirteenCase.lbaInformation.startingLogicalBlockAddress = logicalBlockAddress; 106a4: 6303 str r3, [r0, #48] ; 0x30 ufi->thirteenCase.lbaInformation.transferNumber = lbaTransferLength; 106a6: 6341 str r1, [r0, #52] ; 0x34 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 106a8: f7ff fdf0 bl 1028c return status; } 106ac: bd10 pop {r4, pc} lbaTransferLength = (uint16_t)((uint16_t)mscHandle->mscCbw->cbwcb[7] << 8); 106ae: 7d94 ldrb r4, [r2, #22] lbaTransferLength |= (uint16_t)mscHandle->mscCbw->cbwcb[8]; 106b0: 7dd1 ldrb r1, [r2, #23] 106b2: ea41 2104 orr.w r1, r1, r4, lsl #8 106b6: e7e7 b.n 10688 lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[7] << 16); 106b8: 7d94 ldrb r4, [r2, #22] lbaTransferLength = ((uint32_t)mscHandle->mscCbw->cbwcb[6] << 24); 106ba: 7d51 ldrb r1, [r2, #21] 106bc: 0609 lsls r1, r1, #24 106be: ea41 4104 orr.w r1, r1, r4, lsl #16 lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[9]); 106c2: 7e14 ldrb r4, [r2, #24] 106c4: 4321 orrs r1, r4 lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[8] << 8); 106c6: 7dd4 ldrb r4, [r2, #23] lbaTransferLength |= ((uint32_t)mscHandle->mscCbw->cbwcb[9]); 106c8: ea41 2104 orr.w r1, r1, r4, lsl #8 106cc: e7dc b.n 10688 000106ce : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiTestUnitReadyCommand(struct _usb_device_msc_struct *mscHandle) { 106ce: b530 push {r4, r5, lr} 106d0: b087 sub sp, #28 106d2: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 106d4: 6a03 ldr r3, [r0, #32] 106d6: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 106d8: 6983 ldr r3, [r0, #24] 106da: f103 020f add.w r2, r3, #15 106de: 9201 str r2, [sp, #4] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 106e0: 7b5b ldrb r3, [r3, #13] 106e2: f88d 3014 strb.w r3, [sp, #20] ufi->thirteenCase.deviceExpectedDataLength = 0U; 106e6: 2300 movs r3, #0 106e8: 6283 str r3, [r0, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 106ea: 2201 movs r2, #1 106ec: f880 203a strb.w r2, [r0, #58] ; 0x3a ufi->thirteenCase.buffer = NULL; 106f0: 62c3 str r3, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0U; 106f2: f880 3038 strb.w r3, [r0, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 106f6: f7ff fdc9 bl 1028c 106fa: 4605 mov r5, r0 if (mscHandle->configurationStruct->classCallback != NULL) 106fc: 6863 ldr r3, [r4, #4] 106fe: 681b ldr r3, [r3, #0] 10700: b11b cbz r3, 1070a { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, kUSB_DeviceMscEventTestUnitReady, 10702: aa01 add r2, sp, #4 10704: 2107 movs r1, #7 10706: 4620 mov r0, r4 10708: 4798 blx r3 (void *)&temp); } return status; } 1070a: 4628 mov r0, r5 1070c: b007 add sp, #28 1070e: bd30 pop {r4, r5, pc} 00010710 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiVerifyCommand(struct _usb_device_msc_struct *mscHandle) { 10710: b508 push {r3, lr} usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; ufi = &mscHandle->mscUfi; ufi->thirteenCase.deviceExpectedDataLength = 0; 10712: 2200 movs r2, #0 10714: 6282 str r2, [r0, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10716: 2101 movs r1, #1 10718: f880 103a strb.w r1, [r0, #58] ; 0x3a ufi->thirteenCase.buffer = NULL; 1071c: 62c2 str r2, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0U; 1071e: f880 2038 strb.w r2, [r0, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10722: f7ff fdb3 bl 1028c return status; } 10726: bd08 pop {r3, pc} 00010728 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiModeSenseCommand(struct _usb_device_msc_struct *mscHandle) { 10728: b510 push {r4, lr} 1072a: b086 sub sp, #24 1072c: 4604 mov r4, r0 usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 1072e: 6a03 ldr r3, [r0, #32] 10730: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 10732: 6983 ldr r3, [r0, #24] 10734: f103 020f add.w r2, r3, #15 10738: 9201 str r2, [sp, #4] temp.size = 0U; 1073a: 2200 movs r2, #0 1073c: 9202 str r2, [sp, #8] temp.buffer = NULL; 1073e: 9203 str r2, [sp, #12] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 10740: 7b5b ldrb r3, [r3, #13] 10742: f88d 3014 strb.w r3, [sp, #20] if (mscHandle->configurationStruct->classCallback != NULL) 10746: 6843 ldr r3, [r0, #4] 10748: 681b ldr r3, [r3, #0] 1074a: b113 cbz r3, 10752 { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, kUSB_DeviceMscEventModeSense, 1074c: aa01 add r2, sp, #4 1074e: 2109 movs r1, #9 10750: 4798 blx r3 (void *)&temp); } ufi->thirteenCase.deviceExpectedDataLength = temp.size; 10752: 9b02 ldr r3, [sp, #8] 10754: 62a3 str r3, [r4, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10756: 2301 movs r3, #1 10758: f884 303a strb.w r3, [r4, #58] ; 0x3a ufi->thirteenCase.buffer = temp.buffer; 1075c: 9b03 ldr r3, [sp, #12] 1075e: 62e3 str r3, [r4, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0U; 10760: 2300 movs r3, #0 10762: f884 3038 strb.w r3, [r4, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10766: 4620 mov r0, r4 10768: f7ff fd90 bl 1028c return status; } 1076c: b006 add sp, #24 1076e: bd10 pop {r4, pc} 00010770 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiModeSelectCommand(struct _usb_device_msc_struct *mscHandle) { 10770: b510 push {r4, lr} 10772: b086 sub sp, #24 10774: 4604 mov r4, r0 usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 10776: 6a03 ldr r3, [r0, #32] 10778: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 1077a: 6983 ldr r3, [r0, #24] 1077c: f103 020f add.w r2, r3, #15 10780: 9201 str r2, [sp, #4] temp.buffer = NULL; 10782: 2200 movs r2, #0 10784: 9203 str r2, [sp, #12] temp.size = 0U; 10786: 9202 str r2, [sp, #8] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 10788: 7b5b ldrb r3, [r3, #13] 1078a: f88d 3014 strb.w r3, [sp, #20] if (mscHandle->configurationStruct->classCallback != NULL) 1078e: 6843 ldr r3, [r0, #4] 10790: 681b ldr r3, [r3, #0] 10792: b113 cbz r3, 1079a { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, kUSB_DeviceMscEventModeSelect, 10794: aa01 add r2, sp, #4 10796: 210a movs r1, #10 10798: 4798 blx r3 (void *)&temp); } ufi->thirteenCase.deviceExpectedDataLength = temp.size; 1079a: 9b02 ldr r3, [sp, #8] 1079c: 62a3 str r3, [r4, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_OUT; 1079e: 2300 movs r3, #0 107a0: f884 303a strb.w r3, [r4, #58] ; 0x3a ufi->thirteenCase.buffer = temp.buffer; 107a4: 9a03 ldr r2, [sp, #12] 107a6: 62e2 str r2, [r4, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0; 107a8: f884 3038 strb.w r3, [r4, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 107ac: 4620 mov r0, r4 107ae: f7ff fd6d bl 1028c if (0U != (mscHandle->mscCbw->cbwcb[1] & 0x01U)) 107b2: 69a3 ldr r3, [r4, #24] 107b4: 7c1b ldrb r3, [r3, #16] 107b6: f013 0f01 tst.w r3, #1 107ba: d005 beq.n 107c8 { ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_ILLEGAL_REQUEST; 107bc: 6a23 ldr r3, [r4, #32] 107be: 2205 movs r2, #5 107c0: 709a strb r2, [r3, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_INVALID_FIELD_IN_COMMAND_PKT; 107c2: 6a23 ldr r3, [r4, #32] 107c4: 2224 movs r2, #36 ; 0x24 107c6: 731a strb r2, [r3, #12] } return status; } 107c8: b006 add sp, #24 107ca: bd10 pop {r4, pc} 000107cc : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiReadCapacityCommand(struct _usb_device_msc_struct *mscHandle) { 107cc: b530 push {r4, r5, lr} 107ce: b085 sub sp, #20 107d0: 4604 mov r4, r0 usb_device_capacity_information_struct_t diskInformation; uint32_t deviceExpectedDataLength; uint8_t logicalUnitNumber; ufi = &mscHandle->mscUfi; logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 107d2: 6983 ldr r3, [r0, #24] 107d4: 7b5d ldrb r5, [r3, #13] diskInformation.logicalUnitNumber = logicalUnitNumber; 107d6: f88d 500c strb.w r5, [sp, #12] diskInformation.lengthOfEachLba = 0U; 107da: 2300 movs r3, #0 107dc: 9302 str r3, [sp, #8] diskInformation.totalLbaNumberSupports = 0U; 107de: 9301 str r3, [sp, #4] /* Get device information.*/ if (mscHandle->configurationStruct->classCallback != NULL) 107e0: 6843 ldr r3, [r0, #4] 107e2: 681b ldr r3, [r3, #0] 107e4: 2b00 cmp r3, #0 107e6: d074 beq.n 108d2 { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ status = mscHandle->configurationStruct->classCallback( 107e8: aa01 add r2, sp, #4 107ea: 2110 movs r1, #16 107ec: 4798 blx r3 (class_handle_t)mscHandle, kUSB_DeviceMscEventReadCapacity, (void *)&diskInformation); } if (logicalUnitNumber > mscHandle->logicalUnitNumber) 107ee: f894 3090 ldrb.w r3, [r4, #144] ; 0x90 107f2: 42ab cmp r3, r5 107f4: d203 bcs.n 107fe { ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_ILLEGAL_REQUEST; 107f6: 6a23 ldr r3, [r4, #32] 107f8: 2205 movs r2, #5 107fa: 709a strb r2, [r3, #2] logicalUnitNumber = 0; 107fc: 2500 movs r5, #0 } if ((0U != diskInformation.lengthOfEachLba) && (0U != diskInformation.totalLbaNumberSupports)) 107fe: 9b02 ldr r3, [sp, #8] 10800: b13b cbz r3, 10812 10802: 9a01 ldr r2, [sp, #4] 10804: 2a00 cmp r2, #0 10806: d03a beq.n 1087e { mscHandle->luInformations[logicalUnitNumber].totalLbaNumberSupports = diskInformation.totalLbaNumberSupports; 10808: eb04 1505 add.w r5, r4, r5, lsl #4 1080c: 656a str r2, [r5, #84] ; 0x54 mscHandle->luInformations[logicalUnitNumber].lengthOfEachLba = diskInformation.lengthOfEachLba; 1080e: 65ab str r3, [r5, #88] ; 0x58 deviceExpectedDataLength = USB_DEVICE_MSC_UFI_READ_CAPACITY_DATA_LENGTH; 10810: 2308 movs r3, #8 } else { deviceExpectedDataLength = 0U; } if (mscHandle->mscCbw->cbwcb[0] == USB_DEVICE_MSC_READ_CAPACITY_10_COMMAND) 10812: 69a2 ldr r2, [r4, #24] 10814: 7bd1 ldrb r1, [r2, #15] 10816: 2925 cmp r1, #37 ; 0x25 10818: d033 beq.n 10882 (uint32_t)mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba); ufi->thirteenCase.buffer = (uint8_t *)(ufi->readCapacity); } else { ufi->thirteenCase.deviceExpectedDataLength = deviceExpectedDataLength; 1081a: 62a3 str r3, [r4, #40] ; 0x28 ufi->readCapacity16->lastLogicalBlockAddress1 = USB_LONG_TO_BIG_ENDIAN( 1081c: 7b53 ldrb r3, [r2, #13] 1081e: eb04 1303 add.w r3, r4, r3, lsl #4 10822: 6d5b ldr r3, [r3, #84] ; 0x54 10824: 3b01 subs r3, #1 10826: 6c21 ldr r1, [r4, #64] ; 0x40 10828: 0e1a lsrs r2, r3, #24 1082a: ea42 6203 orr.w r2, r2, r3, lsl #24 1082e: 0218 lsls r0, r3, #8 10830: f400 007f and.w r0, r0, #16711680 ; 0xff0000 10834: 4302 orrs r2, r0 10836: 0a1b lsrs r3, r3, #8 10838: f403 437f and.w r3, r3, #65280 ; 0xff00 1083c: 4313 orrs r3, r2 1083e: 604b str r3, [r1, #4] mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].totalLbaNumberSupports - 1U); ufi->readCapacity16->blockSize = USB_LONG_TO_BIG_ENDIAN( 10840: 69a3 ldr r3, [r4, #24] 10842: 7b5b ldrb r3, [r3, #13] 10844: eb04 1303 add.w r3, r4, r3, lsl #4 10848: 6d9b ldr r3, [r3, #88] ; 0x58 1084a: 6c21 ldr r1, [r4, #64] ; 0x40 1084c: 0e1a lsrs r2, r3, #24 1084e: ea42 6203 orr.w r2, r2, r3, lsl #24 10852: 0218 lsls r0, r3, #8 10854: f400 007f and.w r0, r0, #16711680 ; 0xff0000 10858: 4302 orrs r2, r0 1085a: 0a1b lsrs r3, r3, #8 1085c: f403 437f and.w r3, r3, #65280 ; 0xff00 10860: 4313 orrs r3, r2 10862: 608b str r3, [r1, #8] (uint32_t)mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba); ufi->thirteenCase.buffer = (uint8_t *)(ufi->readCapacity16); 10864: 6c23 ldr r3, [r4, #64] ; 0x40 10866: 62e3 str r3, [r4, #44] ; 0x2c } ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10868: 2301 movs r3, #1 1086a: f884 303a strb.w r3, [r4, #58] ; 0x3a ufi->thirteenCase.lbaSendRecvSelect = 0; 1086e: 2300 movs r3, #0 10870: f884 3038 strb.w r3, [r4, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10874: 4620 mov r0, r4 10876: f7ff fd09 bl 1028c return status; } 1087a: b005 add sp, #20 1087c: bd30 pop {r4, r5, pc} deviceExpectedDataLength = 0U; 1087e: 4613 mov r3, r2 10880: e7c7 b.n 10812 ufi->thirteenCase.deviceExpectedDataLength = deviceExpectedDataLength; 10882: 62a3 str r3, [r4, #40] ; 0x28 ufi->readCapacity->lastLogicalBlockAddress = USB_LONG_TO_BIG_ENDIAN( 10884: 7b53 ldrb r3, [r2, #13] 10886: eb04 1303 add.w r3, r4, r3, lsl #4 1088a: 6d5b ldr r3, [r3, #84] ; 0x54 1088c: 3b01 subs r3, #1 1088e: 6be1 ldr r1, [r4, #60] ; 0x3c 10890: 0e1a lsrs r2, r3, #24 10892: ea42 6203 orr.w r2, r2, r3, lsl #24 10896: 0218 lsls r0, r3, #8 10898: f400 007f and.w r0, r0, #16711680 ; 0xff0000 1089c: 4302 orrs r2, r0 1089e: 0a1b lsrs r3, r3, #8 108a0: f403 437f and.w r3, r3, #65280 ; 0xff00 108a4: 4313 orrs r3, r2 108a6: 600b str r3, [r1, #0] ufi->readCapacity->blockSize = USB_LONG_TO_BIG_ENDIAN( 108a8: 69a3 ldr r3, [r4, #24] 108aa: 7b5b ldrb r3, [r3, #13] 108ac: eb04 1303 add.w r3, r4, r3, lsl #4 108b0: 6d9b ldr r3, [r3, #88] ; 0x58 108b2: 6be1 ldr r1, [r4, #60] ; 0x3c 108b4: 0e1a lsrs r2, r3, #24 108b6: ea42 6203 orr.w r2, r2, r3, lsl #24 108ba: 0218 lsls r0, r3, #8 108bc: f400 007f and.w r0, r0, #16711680 ; 0xff0000 108c0: 4302 orrs r2, r0 108c2: 0a1b lsrs r3, r3, #8 108c4: f403 437f and.w r3, r3, #65280 ; 0xff00 108c8: 4313 orrs r3, r2 108ca: 604b str r3, [r1, #4] ufi->thirteenCase.buffer = (uint8_t *)(ufi->readCapacity); 108cc: 6be3 ldr r3, [r4, #60] ; 0x3c 108ce: 62e3 str r3, [r4, #44] ; 0x2c 108d0: e7ca b.n 10868 if (logicalUnitNumber > mscHandle->logicalUnitNumber) 108d2: f890 3090 ldrb.w r3, [r0, #144] ; 0x90 108d6: 42ab cmp r3, r5 108d8: d38d bcc.n 107f6 deviceExpectedDataLength = 0U; 108da: 2300 movs r3, #0 108dc: e799 b.n 10812 000108de : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiReadFormatCapacityCommand(struct _usb_device_msc_struct *mscHandle) { 108de: b5f0 push {r4, r5, r6, r7, lr} 108e0: b089 sub sp, #36 ; 0x24 108e2: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status = kStatus_USB_TransferFailed; usb_device_capacity_information_struct_t diskInformation; usb_device_current_max_capacity_descriptor_struct_t current_max_head; usb_device_formattable_capacity_descriptor_struct_t formattable_capacity_head; usb_device_capacity_list_header_struct_t capacityListHead = {{0x00, 0x00, 0x00}, 0x00}; 108e4: 2300 movs r3, #0 108e6: 9300 str r3, [sp, #0] uint8_t j = 0; uint8_t logicalUnitNumber; uint8_t *ptr; ufi = &mscHandle->mscUfi; logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 108e8: 6982 ldr r2, [r0, #24] 108ea: 7b55 ldrb r5, [r2, #13] diskInformation.logicalUnitNumber = logicalUnitNumber; 108ec: f88d 501c strb.w r5, [sp, #28] diskInformation.lengthOfEachLba = 0U; 108f0: 9306 str r3, [sp, #24] diskInformation.totalLbaNumberSupports = 0U; 108f2: 9305 str r3, [sp, #20] /* Get device information. */ if (mscHandle->configurationStruct->classCallback != NULL) 108f4: 6843 ldr r3, [r0, #4] 108f6: 681b ldr r3, [r3, #0] 108f8: 2b00 cmp r3, #0 108fa: f000 8088 beq.w 10a0e { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ status = mscHandle->configurationStruct->classCallback( 108fe: aa05 add r2, sp, #20 10900: 2111 movs r1, #17 10902: 4798 blx r3 (class_handle_t)mscHandle, kUSB_DeviceMscEventReadFormatCapacity, (void *)&diskInformation); } if (logicalUnitNumber > mscHandle->logicalUnitNumber) 10904: f894 3090 ldrb.w r3, [r4, #144] ; 0x90 10908: 42ab cmp r3, r5 1090a: d203 bcs.n 10914 { ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_ILLEGAL_REQUEST; 1090c: 6a23 ldr r3, [r4, #32] 1090e: 2205 movs r2, #5 10910: 709a strb r2, [r3, #2] logicalUnitNumber = 0; 10912: 2500 movs r5, #0 } if ((0U != diskInformation.lengthOfEachLba) && (0U != diskInformation.totalLbaNumberSupports)) 10914: 9b06 ldr r3, [sp, #24] 10916: b12b cbz r3, 10924 10918: 9a05 ldr r2, [sp, #20] 1091a: b11a cbz r2, 10924 { mscHandle->luInformations[logicalUnitNumber].totalLbaNumberSupports = diskInformation.totalLbaNumberSupports; 1091c: eb04 1505 add.w r5, r4, r5, lsl #4 10920: 656a str r2, [r5, #84] ; 0x54 mscHandle->luInformations[logicalUnitNumber].lengthOfEachLba = diskInformation.lengthOfEachLba; 10922: 65ab str r3, [r5, #88] ; 0x58 } allocation_length = (uint16_t)((((uint16_t)mscHandle->mscCbw->cbwcb[7]) << 8) | mscHandle->mscCbw->cbwcb[8]); 10924: 69a3 ldr r3, [r4, #24] 10926: 7d9a ldrb r2, [r3, #22] 10928: 7dd9 ldrb r1, [r3, #23] 1092a: ea41 2102 orr.w r1, r1, r2, lsl #8 /*reference ufi command spec table-33 Descriptor Code definition*/ num_formattable_cap_desc = (uint8_t)((0U != ufi->formattedDisk) ? ((0U != mscHandle->implementingDiskDrive) ? 0x02U : 0x03U) : 0x00U); 1092e: f894 604c ldrb.w r6, [r4, #76] ; 0x4c 10932: 2e00 cmp r6, #0 10934: d069 beq.n 10a0a 10936: 6962 ldr r2, [r4, #20] 10938: 2a00 cmp r2, #0 1093a: bf14 ite ne 1093c: 2502 movne r5, #2 1093e: 2503 moveq r5, #3 formattable_capacity_head.blockNumber = 10940: 7b58 ldrb r0, [r3, #13] 10942: eb04 1000 add.w r0, r4, r0, lsl #4 USB_LONG_TO_BIG_ENDIAN(mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].totalLbaNumberSupports); 10946: 6d43 ldr r3, [r0, #84] ; 0x54 10948: 0e1a lsrs r2, r3, #24 1094a: ea42 6203 orr.w r2, r2, r3, lsl #24 1094e: 021f lsls r7, r3, #8 10950: f407 077f and.w r7, r7, #16711680 ; 0xff0000 10954: 433a orrs r2, r7 10956: 0a1b lsrs r3, r3, #8 10958: f403 437f and.w r3, r3, #65280 ; 0xff00 1095c: 431a orrs r2, r3 formattable_capacity_head.blockNumber = 1095e: 9201 str r2, [sp, #4] formattable_capacity_head.blockLength = USB_LONG_TO_BIG_ENDIAN(mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba); 10960: 6d87 ldr r7, [r0, #88] ; 0x58 10962: 0e38 lsrs r0, r7, #24 10964: ea40 6007 orr.w r0, r0, r7, lsl #24 10968: 023b lsls r3, r7, #8 1096a: f403 037f and.w r3, r3, #16711680 ; 0xff0000 1096e: 4318 orrs r0, r3 10970: 0a3b lsrs r3, r7, #8 10972: f403 437f and.w r3, r3, #65280 ; 0xff00 10976: 4318 orrs r0, r3 formattable_capacity_head.blockLength = 10978: 9002 str r0, [sp, #8] descriptor_code = (uint8_t)((0U != ufi->formattedDisk) ? USB_DEVICE_MSC_UFI_FORMATTED_MEDIA : 1097a: 2e00 cmp r6, #0 USB_DEVICE_MSC_UFI_UNFORMATTED_MEDIA); capacityListHead.capacityListLength = num_formattable_cap_desc * 8U; 1097c: ea4f 05c5 mov.w r5, r5, lsl #3 10980: b2e8 uxtb r0, r5 10982: f88d 0003 strb.w r0, [sp, #3] current_max_head.blockNumber = 10986: 9203 str r2, [sp, #12] USB_LONG_TO_BIG_ENDIAN(mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].totalLbaNumberSupports); current_max_head.descriptorCodeBlockLength = USB_LONG_TO_BIG_ENDIAN(((((uint32_t)descriptor_code) << 24) | 10988: bf14 ite ne 1098a: f04f 7300 movne.w r3, #33554432 ; 0x2000000 1098e: f04f 7380 moveq.w r3, #16777216 ; 0x1000000 10992: 433b orrs r3, r7 10994: 0e1a lsrs r2, r3, #24 10996: ea42 6203 orr.w r2, r2, r3, lsl #24 1099a: 021e lsls r6, r3, #8 1099c: f406 067f and.w r6, r6, #16711680 ; 0xff0000 109a0: 4332 orrs r2, r6 109a2: 0a1b lsrs r3, r3, #8 109a4: f403 437f and.w r3, r3, #65280 ; 0xff00 109a8: 4313 orrs r3, r2 current_max_head.descriptorCodeBlockLength = 109aa: 9304 str r3, [sp, #16] mscHandle->luInformations[mscHandle->mscCbw->logicalUnitNumber].lengthOfEachLba)); response_size = (uint32_t)sizeof(usb_device_capacity_list_header_struct_t) + 109ac: f105 070c add.w r7, r5, #12 sizeof(usb_device_current_max_capacity_descriptor_struct_t) + sizeof(usb_device_formattable_capacity_descriptor_struct_t) * ((uint32_t)num_formattable_cap_desc); if (response_size > allocation_length) 109b0: 428f cmp r7, r1 109b2: bf28 it cs 109b4: 460f movcs r7, r1 } ptr = (uint8_t *)&capacityListHead; for (count = 0U; count < sizeof(capacityListHead); count++) { ufi->formatCapacityData[count] = ptr[i++]; 109b6: 6d23 ldr r3, [r4, #80] ; 0x50 109b8: f89d 2000 ldrb.w r2, [sp] 109bc: 701a strb r2, [r3, #0] 109be: 6d23 ldr r3, [r4, #80] ; 0x50 109c0: f89d 2001 ldrb.w r2, [sp, #1] 109c4: 705a strb r2, [r3, #1] 109c6: 6d23 ldr r3, [r4, #80] ; 0x50 109c8: f89d 2002 ldrb.w r2, [sp, #2] 109cc: 709a strb r2, [r3, #2] 109ce: 6d23 ldr r3, [r4, #80] ; 0x50 109d0: 70d8 strb r0, [r3, #3] 109d2: f10d 030b add.w r3, sp, #11 109d6: f10d 0613 add.w r6, sp, #19 } ptr = (uint8_t *)¤t_max_head; for (i = 0U; i < sizeof(current_max_head); i++) { ufi->formatCapacityData[count] = ptr[i]; 109da: aa08 add r2, sp, #32 109dc: f1c2 0519 rsb r5, r2, #25 109e0: 18ea adds r2, r5, r3 109e2: 6d21 ldr r1, [r4, #80] ; 0x50 109e4: f813 0f01 ldrb.w r0, [r3, #1]! 109e8: 5488 strb r0, [r1, r2] for (i = 0U; i < sizeof(current_max_head); i++) 109ea: 429e cmp r6, r3 109ec: d1f8 bne.n 109e0 ufi->formatCapacityData[count] = ptr[j++]; } } } ufi->thirteenCase.deviceExpectedDataLength = response_size; 109ee: 62a7 str r7, [r4, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 109f0: 2301 movs r3, #1 109f2: f884 303a strb.w r3, [r4, #58] ; 0x3a ufi->thirteenCase.buffer = (uint8_t *)ufi->formatCapacityData; 109f6: 6d23 ldr r3, [r4, #80] ; 0x50 109f8: 62e3 str r3, [r4, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0U; 109fa: 2300 movs r3, #0 109fc: f884 3038 strb.w r3, [r4, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10a00: 4620 mov r0, r4 10a02: f7ff fc43 bl 1028c return status; } 10a06: b009 add sp, #36 ; 0x24 10a08: bdf0 pop {r4, r5, r6, r7, pc} (uint8_t)((0U != ufi->formattedDisk) ? ((0U != mscHandle->implementingDiskDrive) ? 0x02U : 0x03U) : 0x00U); 10a0a: 4635 mov r5, r6 10a0c: e798 b.n 10940 if (logicalUnitNumber > mscHandle->logicalUnitNumber) 10a0e: f890 3090 ldrb.w r3, [r0, #144] ; 0x90 10a12: 42ab cmp r3, r5 10a14: f4ff af7a bcc.w 1090c 10a18: e784 b.n 10924 00010a1a : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiFormatUnitCommand(struct _usb_device_msc_struct *mscHandle) { 10a1a: b510 push {r4, lr} 10a1c: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; ufi = &mscHandle->mscUfi; ufi->thirteenCase.deviceExpectedDataLength = 0U; 10a1e: 2300 movs r3, #0 10a20: 6283 str r3, [r0, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10a22: 2201 movs r2, #1 10a24: f880 203a strb.w r2, [r0, #58] ; 0x3a ufi->thirteenCase.buffer = NULL; 10a28: 62c3 str r3, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0U; 10a2a: f880 3038 strb.w r3, [r0, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10a2e: f7ff fc2d bl 1028c if (mscHandle->mscCsw->cswStatus != USB_DEVICE_MSC_PHASE_ERROR) 10a32: 69e3 ldr r3, [r4, #28] 10a34: 7b1a ldrb r2, [r3, #12] 10a36: 2a02 cmp r2, #2 10a38: d00d beq.n 10a56 { if ((mscHandle->mscCbw->cbwcb[1] & 0x1fU) == 0x17U) 10a3a: 69a2 ldr r2, [r4, #24] 10a3c: 7c12 ldrb r2, [r2, #16] 10a3e: f002 021f and.w r2, r2, #31 10a42: 2a17 cmp r2, #23 10a44: d008 beq.n 10a58 { mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; } else { mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 10a46: 2201 movs r2, #1 10a48: 731a strb r2, [r3, #12] ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_ILLEGAL_REQUEST; 10a4a: 6a23 ldr r3, [r4, #32] 10a4c: 2205 movs r2, #5 10a4e: 709a strb r2, [r3, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_INVALID_FIELD_IN_COMMAND_PKT; 10a50: 6a23 ldr r3, [r4, #32] 10a52: 2224 movs r2, #36 ; 0x24 10a54: 731a strb r2, [r3, #12] } } return status; } 10a56: bd10 pop {r4, pc} mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_PASSED; 10a58: 2200 movs r2, #0 10a5a: 731a strb r2, [r3, #12] 10a5c: e7fb b.n 10a56 00010a5e : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiPreventAllowMediumCommand(struct _usb_device_msc_struct *mscHandle) { 10a5e: b530 push {r4, r5, lr} 10a60: b087 sub sp, #28 10a62: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 10a64: 6a03 ldr r3, [r0, #32] 10a66: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 10a68: 6983 ldr r3, [r0, #24] 10a6a: f103 020f add.w r2, r3, #15 10a6e: 9201 str r2, [sp, #4] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 10a70: 7b5b ldrb r3, [r3, #13] 10a72: f88d 3014 strb.w r3, [sp, #20] ufi->thirteenCase.deviceExpectedDataLength = 0U; 10a76: 2300 movs r3, #0 10a78: 6283 str r3, [r0, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10a7a: 2201 movs r2, #1 10a7c: f880 203a strb.w r2, [r0, #58] ; 0x3a ufi->thirteenCase.buffer = NULL; 10a80: 62c3 str r3, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0U; 10a82: f880 3038 strb.w r3, [r0, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10a86: f7ff fc01 bl 1028c 10a8a: 4605 mov r5, r0 if (mscHandle->configurationStruct->classCallback != NULL) 10a8c: 6863 ldr r3, [r4, #4] 10a8e: 681b ldr r3, [r3, #0] 10a90: b11b cbz r3, 10a9a { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 10a92: aa01 add r2, sp, #4 10a94: 210c movs r1, #12 10a96: 4620 mov r0, r4 10a98: 4798 blx r3 kUSB_DeviceMscEventRemovalRequest, (void *)&temp); } return status; } 10a9a: 4628 mov r0, r5 10a9c: b007 add sp, #28 10a9e: bd30 pop {r4, r5, pc} 00010aa0 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiSendDiagnosticCommand(struct _usb_device_msc_struct *mscHandle) { 10aa0: b530 push {r4, r5, lr} 10aa2: b087 sub sp, #28 10aa4: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 10aa6: 6a03 ldr r3, [r0, #32] 10aa8: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 10aaa: 6983 ldr r3, [r0, #24] 10aac: f103 020f add.w r2, r3, #15 10ab0: 9201 str r2, [sp, #4] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 10ab2: 7b5b ldrb r3, [r3, #13] 10ab4: f88d 3014 strb.w r3, [sp, #20] ufi->thirteenCase.deviceExpectedDataLength = 0; 10ab8: 2300 movs r3, #0 10aba: 6283 str r3, [r0, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10abc: 2201 movs r2, #1 10abe: f880 203a strb.w r2, [r0, #58] ; 0x3a ufi->thirteenCase.buffer = NULL; 10ac2: 62c3 str r3, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0; 10ac4: f880 3038 strb.w r3, [r0, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10ac8: f7ff fbe0 bl 1028c 10acc: 4605 mov r5, r0 if (mscHandle->configurationStruct->classCallback != NULL) 10ace: 6863 ldr r3, [r4, #4] 10ad0: 681b ldr r3, [r3, #0] 10ad2: b11b cbz r3, 10adc { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 10ad4: aa01 add r2, sp, #4 10ad6: 210d movs r1, #13 10ad8: 4620 mov r0, r4 10ada: 4798 blx r3 kUSB_DeviceMscEventSendDiagnostic, (void *)&temp); } return status; } 10adc: 4628 mov r0, r5 10ade: b007 add sp, #28 10ae0: bd30 pop {r4, r5, pc} 00010ae2 : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiStartStopUnitCommand(struct _usb_device_msc_struct *mscHandle) { 10ae2: b530 push {r4, r5, lr} 10ae4: b087 sub sp, #28 10ae6: 4604 mov r4, r0 usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; usb_device_ufi_app_struct_t temp; ufi = &mscHandle->mscUfi; temp.requestSense = ufi->requestSense; 10ae8: 6a03 ldr r3, [r0, #32] 10aea: 9304 str r3, [sp, #16] temp.cbwcb = &mscHandle->mscCbw->cbwcb[0]; 10aec: 6983 ldr r3, [r0, #24] 10aee: f103 020f add.w r2, r3, #15 10af2: 9201 str r2, [sp, #4] temp.logicalUnitNumber = mscHandle->mscCbw->logicalUnitNumber; 10af4: 7b5b ldrb r3, [r3, #13] 10af6: f88d 3014 strb.w r3, [sp, #20] ufi->thirteenCase.deviceExpectedDataLength = 0U; 10afa: 2300 movs r3, #0 10afc: 6283 str r3, [r0, #40] ; 0x28 ufi->thirteenCase.deviceExpectedDirection = USB_IN; 10afe: 2201 movs r2, #1 10b00: f880 203a strb.w r2, [r0, #58] ; 0x3a ufi->thirteenCase.buffer = NULL; 10b04: 62c3 str r3, [r0, #44] ; 0x2c ufi->thirteenCase.lbaSendRecvSelect = 0U; 10b06: f880 3038 strb.w r3, [r0, #56] ; 0x38 status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10b0a: f7ff fbbf bl 1028c 10b0e: 4605 mov r5, r0 if (mscHandle->mscCsw->cswStatus != USB_DEVICE_MSC_PHASE_ERROR) 10b10: 69e3 ldr r3, [r4, #28] 10b12: 7b1b ldrb r3, [r3, #12] 10b14: 2b02 cmp r3, #2 10b16: d006 beq.n 10b26 { if (mscHandle->configurationStruct->classCallback != NULL) 10b18: 6863 ldr r3, [r4, #4] 10b1a: 681b ldr r3, [r3, #0] 10b1c: b11b cbz r3, 10b26 { /* classCallback is initialized in classInit of s_UsbDeviceClassInterfaceMap, it is from the second parameter of classInit */ (void)mscHandle->configurationStruct->classCallback((class_handle_t)mscHandle, 10b1e: aa01 add r2, sp, #4 10b20: 210e movs r1, #14 10b22: 4620 mov r0, r4 10b24: 4798 blx r3 kUSB_DeviceMscEventStopEjectMedia, (void *)&temp); } } return status; } 10b26: 4628 mov r0, r5 10b28: b007 add sp, #28 10b2a: bd30 pop {r4, r5, pc} 00010b2c : * @param handle The device msc class handle. * *@return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscUfiUnsupportCommand(struct _usb_device_msc_struct *mscHandle) { 10b2c: b510 push {r4, lr} usb_device_msc_ufi_struct_t *ufi = NULL; usb_status_t status; ufi = &mscHandle->mscUfi; mscHandle->mscCsw->dataResidue = 0; 10b2e: 69c1 ldr r1, [r0, #28] 10b30: 2200 movs r2, #0 10b32: 608a str r2, [r1, #8] mscHandle->mscCsw->cswStatus = USB_DEVICE_MSC_COMMAND_FAILED; 10b34: 69c1 ldr r1, [r0, #28] 10b36: 2401 movs r4, #1 10b38: 730c strb r4, [r1, #12] ufi->thirteenCase.deviceExpectedDataLength = 0; 10b3a: 6282 str r2, [r0, #40] ; 0x28 ufi->requestSense->senseKey = USB_DEVICE_MSC_UFI_ILLEGAL_REQUEST; 10b3c: 6a01 ldr r1, [r0, #32] 10b3e: 2405 movs r4, #5 10b40: 708c strb r4, [r1, #2] ufi->requestSense->additionalSenseCode = USB_DEVICE_MSC_UFI_INVALID_COMMAND_OPCODE; 10b42: 6a01 ldr r1, [r0, #32] 10b44: 2420 movs r4, #32 10b46: 730c strb r4, [r1, #12] ufi->requestSense->additionalSenseQualifer = USB_DEVICE_MSC_UFI_NO_SENSE; 10b48: 6a03 ldr r3, [r0, #32] 10b4a: 735a strb r2, [r3, #13] status = USB_DeviceMscUfiThirteenCasesCheck(mscHandle); 10b4c: f7ff fb9e bl 1028c return status; } 10b50: bd10 pop {r4, pc} 00010b52 : /*------------------------------------------------------------------*/ /* DELAY ROUTINES */ /*------------------------------------------------------------------*/ static void DelayOneMicrosecond(void) { 10b52: b082 sub sp, #8 volatile uint32_t i = 6; /* Bench testing determined this value gives a high pulse of "E" of about 1.2us */ 10b54: 2306 movs r3, #6 10b56: 9301 str r3, [sp, #4] while (i--) 10b58: 9b01 ldr r3, [sp, #4] 10b5a: 1e5a subs r2, r3, #1 10b5c: 9201 str r2, [sp, #4] 10b5e: b12b cbz r3, 10b6c { __NOP(); 10b60: bf00 nop while (i--) 10b62: 9b01 ldr r3, [sp, #4] 10b64: 1e5a subs r2, r3, #1 10b66: 9201 str r2, [sp, #4] 10b68: 2b00 cmp r3, #0 10b6a: d1f9 bne.n 10b60 } } 10b6c: b002 add sp, #8 10b6e: 4770 bx lr 00010b70 : } 10b70: 4770 bx lr 00010b72 : void BOARD_LCDbacklightOn(void) { //!!!! GPIOA->PDOR = 0x00000; /* Set output pins and drive to 0V to turn the backlight on */ //!!!! GPIOA->PDDR = 0x000FF; } 10b72: 4770 bx lr 00010b74 : void BOARD_LCDbacklightOff(void) { //!!!! GPIOA->PDDR = 0x00000; /* Set input pins to float and turn the backlight off */ } 10b74: 4770 bx lr 00010b76 : DSTATUS disk_status ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { DSTATUS stat; switch (pdrv) 10b76: b108 cbz r0, 10b7c return stat; #endif default: break; } return STA_NOINIT; 10b78: 2001 movs r0, #1 } 10b7a: 4770 bx lr { 10b7c: b508 push {r3, lr} stat = spiflash_disk_status(pdrv); 10b7e: f7fb f9fd bl bf7c } 10b82: bd08 pop {r3, pc} 00010b84 : DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { DSTATUS stat; switch (pdrv) 10b84: b108 cbz r0, 10b8a return stat; #endif default: break; } return STA_NOINIT; 10b86: 2001 movs r0, #1 } 10b88: 4770 bx lr { 10b8a: b508 push {r3, lr} stat = spiflash_disk_initialize(pdrv); 10b8c: f7fb fb10 bl c1b0 } 10b90: bd08 pop {r3, pc} 00010b92 : LBA_t sector, /* Start sector in LBA */ UINT count /* Number of sectors to read */ ) { DRESULT res; switch (pdrv) 10b92: b108 cbz r0, 10b98 #endif default: break; } return RES_PARERR; 10b94: 2004 movs r0, #4 } 10b96: 4770 bx lr { 10b98: b508 push {r3, lr} res = spiflash_disk_read(pdrv, buff, sector, count); 10b9a: f001 f875 bl 11c88 } 10b9e: bd08 pop {r3, pc} 00010ba0 : LBA_t sector, /* Start sector in LBA */ UINT count /* Number of sectors to write */ ) { DRESULT res; switch (pdrv) 10ba0: b108 cbz r0, 10ba6 return res; #endif default: break; } return RES_PARERR; 10ba2: 2004 movs r0, #4 } 10ba4: 4770 bx lr { 10ba6: b508 push {r3, lr} res = spiflash_disk_write(pdrv, buff, sector, count); 10ba8: f001 f864 bl 11c74 } 10bac: bd08 pop {r3, pc} 00010bae : BYTE cmd, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { DRESULT res; switch (pdrv) 10bae: b108 cbz r0, 10bb4 return res; #endif default: break; } return RES_PARERR; 10bb0: 2004 movs r0, #4 } 10bb2: 4770 bx lr { 10bb4: b508 push {r3, lr} res = spiflash_disk_ioctl(pdrv, cmd, buff); 10bb6: f7fb fc85 bl c4c4 } 10bba: bd08 pop {r3, pc} 00010bbc : rv = ptr[3]; 10bbc: 78c2 ldrb r2, [r0, #3] rv = rv << 8 | ptr[2]; 10bbe: 7883 ldrb r3, [r0, #2] 10bc0: ea43 2202 orr.w r2, r3, r2, lsl #8 rv = rv << 8 | ptr[1]; 10bc4: 7843 ldrb r3, [r0, #1] 10bc6: ea43 2302 orr.w r3, r3, r2, lsl #8 rv = rv << 8 | ptr[0]; 10bca: 7800 ldrb r0, [r0, #0] } 10bcc: ea40 2003 orr.w r0, r0, r3, lsl #8 10bd0: 4770 bx lr 00010bd2 : if (cnt != 0) { 10bd2: b13a cbz r2, 10be4 10bd4: 3801 subs r0, #1 10bd6: 188a adds r2, r1, r2 *d++ = *s++; 10bd8: f811 3b01 ldrb.w r3, [r1], #1 10bdc: f800 3f01 strb.w r3, [r0, #1]! } while (--cnt); 10be0: 4291 cmp r1, r2 10be2: d1f9 bne.n 10bd8 } 10be4: 4770 bx lr 00010be6 : BYTE *d = (BYTE*)dst; 10be6: 4402 add r2, r0 *d++ = (BYTE)val; 10be8: f800 1b01 strb.w r1, [r0], #1 } while (--cnt); 10bec: 4290 cmp r0, r2 10bee: d1fb bne.n 10be8 } 10bf0: 4770 bx lr 00010bf2 : clst -= 2; /* Cluster number is origin from 2 */ 10bf2: 3902 subs r1, #2 if (clst >= fs->n_fatent - 2) return 0; /* Is it invalid cluster number? */ 10bf4: 6983 ldr r3, [r0, #24] 10bf6: 3b02 subs r3, #2 10bf8: 428b cmp r3, r1 return fs->database + (LBA_t)fs->csize * clst; /* Start sector number of the cluster */ 10bfa: bf83 ittte hi 10bfc: 8943 ldrhhi r3, [r0, #10] 10bfe: 6ac0 ldrhi r0, [r0, #44] ; 0x2c 10c00: fb01 0003 mlahi r0, r1, r3, r0 if (clst >= fs->n_fatent - 2) return 0; /* Is it invalid cluster number? */ 10c04: 2000 movls r0, #0 } 10c06: 4770 bx lr 00010c08 : { 10c08: 4602 mov r2, r0 UINT n = 11; 10c0a: f100 010b add.w r1, r0, #11 BYTE sum = 0; 10c0e: 2000 movs r0, #0 sum = (sum >> 1) + (sum << 7) + *dir++; 10c10: 01c3 lsls r3, r0, #7 10c12: ea43 0350 orr.w r3, r3, r0, lsr #1 10c16: f812 0b01 ldrb.w r0, [r2], #1 10c1a: fa50 f383 uxtab r3, r0, r3 10c1e: b2d8 uxtb r0, r3 } while (--n); 10c20: 428a cmp r2, r1 10c22: d1f5 bne.n 10c10 } 10c24: 4770 bx lr 00010c26 : tt = tp = *path; 10c26: 6801 ldr r1, [r0, #0] if (!tp) return vol; /* Invalid path name? */ 10c28: b1d9 cbz r1, 10c62 tt = tp = *path; 10c2a: 460a mov r2, r1 do tc = *tt++; while ((UINT)tc >= (FF_USE_LFN ? ' ' : '!') && tc != ':'); /* Find a colon in the path */ 10c2c: f812 3b01 ldrb.w r3, [r2], #1 10c30: 2b1f cmp r3, #31 10c32: d919 bls.n 10c68 10c34: 2b3a cmp r3, #58 ; 0x3a 10c36: d1f9 bne.n 10c2c { 10c38: b410 push {r4} if (IsDigit(*tp) && tp + 2 == tt) { /* Is there a numeric volume ID + colon? */ 10c3a: 780b ldrb r3, [r1, #0] 10c3c: f1a3 0430 sub.w r4, r3, #48 ; 0x30 10c40: b2e4 uxtb r4, r4 10c42: 2c09 cmp r4, #9 10c44: d813 bhi.n 10c6e 10c46: 3102 adds r1, #2 10c48: 428a cmp r2, r1 10c4a: d002 beq.n 10c52 int i, vol = -1; 10c4c: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff 10c50: e00f b.n 10c72 i = (int)*tp - '0'; /* Get the LD number */ 10c52: 3b30 subs r3, #48 ; 0x30 if (i < FF_VOLUMES) { /* If a volume ID is found, get the drive number and strip it */ 10c54: 2b00 cmp r3, #0 10c56: dd02 ble.n 10c5e int i, vol = -1; 10c58: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff 10c5c: e009 b.n 10c72 *path = tt; /* Snip the drive prefix off */ 10c5e: 6002 str r2, [r0, #0] 10c60: e007 b.n 10c72 if (!tp) return vol; /* Invalid path name? */ 10c62: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff 10c66: e000 b.n 10c6a return vol; /* Return the default drive */ 10c68: 2300 movs r3, #0 } 10c6a: 4618 mov r0, r3 10c6c: 4770 bx lr int i, vol = -1; 10c6e: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff } 10c72: 4618 mov r0, r3 10c74: f85d 4b04 ldr.w r4, [sp], #4 10c78: 4770 bx lr 00010c7a : { 10c7a: b538 push {r3, r4, r5, lr} 10c7c: 460d mov r5, r1 if (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) { /* Test if the object is valid */ 10c7e: 4604 mov r4, r0 10c80: b198 cbz r0, 10caa 10c82: 6803 ldr r3, [r0, #0] 10c84: b19b cbz r3, 10cae 10c86: 781a ldrb r2, [r3, #0] 10c88: b1a2 cbz r2, 10cb4 10c8a: 8881 ldrh r1, [r0, #4] 10c8c: 88da ldrh r2, [r3, #6] 10c8e: 4291 cmp r1, r2 10c90: d003 beq.n 10c9a FRESULT res = FR_INVALID_OBJECT; 10c92: 2009 movs r0, #9 *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ 10c94: 2400 movs r4, #0 10c96: 602c str r4, [r5, #0] } 10c98: bd38 pop {r3, r4, r5, pc} if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ 10c9a: 7858 ldrb r0, [r3, #1] 10c9c: f7ff ff6b bl 10b76 10ca0: f010 0001 ands.w r0, r0, #1 10ca4: d109 bne.n 10cba *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ 10ca6: 6824 ldr r4, [r4, #0] 10ca8: e7f5 b.n 10c96 FRESULT res = FR_INVALID_OBJECT; 10caa: 2009 movs r0, #9 10cac: e7f3 b.n 10c96 *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ 10cae: 461c mov r4, r3 FRESULT res = FR_INVALID_OBJECT; 10cb0: 2009 movs r0, #9 10cb2: e7f0 b.n 10c96 10cb4: 2009 movs r0, #9 *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ 10cb6: 2400 movs r4, #0 10cb8: e7ed b.n 10c96 FRESULT res = FR_INVALID_OBJECT; 10cba: 2009 movs r0, #9 *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ 10cbc: 2400 movs r4, #0 10cbe: e7ea b.n 10c96 00010cc0 : { 10cc0: b570 push {r4, r5, r6, lr} if (fs->wflag) { /* Is the disk access window dirty? */ 10cc2: 78c5 ldrb r5, [r0, #3] 10cc4: b90d cbnz r5, 10cca } 10cc6: 4628 mov r0, r5 10cc8: bd70 pop {r4, r5, r6, pc} 10cca: 4604 mov r4, r0 if (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) { /* Write it back into the volume */ 10ccc: f100 0634 add.w r6, r0, #52 ; 0x34 10cd0: 2301 movs r3, #1 10cd2: 6b02 ldr r2, [r0, #48] ; 0x30 10cd4: 4631 mov r1, r6 10cd6: 7840 ldrb r0, [r0, #1] 10cd8: f7ff ff62 bl 10ba0 10cdc: 4605 mov r5, r0 10cde: b988 cbnz r0, 10d04 fs->wflag = 0; /* Clear window dirty flag */ 10ce0: 2300 movs r3, #0 10ce2: 70e3 strb r3, [r4, #3] if (fs->winsect - fs->fatbase < fs->fsize) { /* Is it in the 1st FAT? */ 10ce4: 6b21 ldr r1, [r4, #48] ; 0x30 10ce6: 69e2 ldr r2, [r4, #28] 10ce8: 6a63 ldr r3, [r4, #36] ; 0x24 10cea: 1acb subs r3, r1, r3 10cec: 4293 cmp r3, r2 10cee: d2ea bcs.n 10cc6 if (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1); /* Reflect it to 2nd FAT if needed */ 10cf0: 78a3 ldrb r3, [r4, #2] 10cf2: 2b02 cmp r3, #2 10cf4: d1e7 bne.n 10cc6 10cf6: 2301 movs r3, #1 10cf8: 440a add r2, r1 10cfa: 4631 mov r1, r6 10cfc: 7860 ldrb r0, [r4, #1] 10cfe: f7ff ff4f bl 10ba0 10d02: e7e0 b.n 10cc6 res = FR_DISK_ERR; 10d04: 2501 movs r5, #1 10d06: e7de b.n 10cc6 00010d08 : { 10d08: b538 push {r3, r4, r5, lr} if (sect != fs->winsect) { /* Window offset changed? */ 10d0a: 6b03 ldr r3, [r0, #48] ; 0x30 10d0c: 428b cmp r3, r1 10d0e: d102 bne.n 10d16 FRESULT res = FR_OK; 10d10: 2300 movs r3, #0 } 10d12: 4618 mov r0, r3 10d14: bd38 pop {r3, r4, r5, pc} 10d16: 4604 mov r4, r0 10d18: 460d mov r5, r1 res = sync_window(fs); /* Flush the window */ 10d1a: f7ff ffd1 bl 10cc0 if (res == FR_OK) { /* Fill sector window with new data */ 10d1e: 4603 mov r3, r0 10d20: 2800 cmp r0, #0 10d22: d1f6 bne.n 10d12 if (disk_read(fs->pdrv, fs->win, sect, 1) != RES_OK) { 10d24: 2301 movs r3, #1 10d26: 462a mov r2, r5 10d28: f104 0134 add.w r1, r4, #52 ; 0x34 10d2c: 7860 ldrb r0, [r4, #1] 10d2e: f7ff ff30 bl 10b92 10d32: 4603 mov r3, r0 res = FR_DISK_ERR; 10d34: 2800 cmp r0, #0 10d36: bf0e itee eq 10d38: 4603 moveq r3, r0 10d3a: 2301 movne r3, #1 10d3c: f04f 35ff movne.w r5, #4294967295 ; 0xffffffff fs->winsect = sect; 10d40: 6325 str r5, [r4, #48] ; 0x30 10d42: e7e6 b.n 10d12 00010d44 : { 10d44: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 10d48: 4605 mov r5, r0 10d4a: 460c mov r4, r1 if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ 10d4c: f7ff ffb8 bl 10cc0 10d50: b110 cbz r0, 10d58 10d52: 2001 movs r0, #1 } 10d54: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} sect = clst2sect(fs, clst); /* Top of the cluster */ 10d58: 4621 mov r1, r4 10d5a: 4628 mov r0, r5 10d5c: f7ff ff49 bl 10bf2 10d60: 4607 mov r7, r0 fs->winsect = sect; /* Set window to top of the cluster */ 10d62: 6328 str r0, [r5, #48] ; 0x30 mem_set(fs->win, 0, sizeof fs->win); /* Clear window buffer */ 10d64: f105 0634 add.w r6, r5, #52 ; 0x34 10d68: f44f 7200 mov.w r2, #512 ; 0x200 10d6c: 2100 movs r1, #0 10d6e: 4630 mov r0, r6 10d70: f7ff ff39 bl 10be6 for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ 10d74: 896b ldrh r3, [r5, #10] 10d76: 2400 movs r4, #0 10d78: b16b cbz r3, 10d96 10d7a: 2400 movs r4, #0 10d7c: f04f 0801 mov.w r8, #1 10d80: 4643 mov r3, r8 10d82: 193a adds r2, r7, r4 10d84: 4631 mov r1, r6 10d86: 7868 ldrb r0, [r5, #1] 10d88: f7ff ff0a bl 10ba0 10d8c: b918 cbnz r0, 10d96 10d8e: 3401 adds r4, #1 10d90: 896b ldrh r3, [r5, #10] 10d92: 42a3 cmp r3, r4 10d94: d8f4 bhi.n 10d80 return (n == fs->csize) ? FR_OK : FR_DISK_ERR; 10d96: 8968 ldrh r0, [r5, #10] 10d98: 1b00 subs r0, r0, r4 10d9a: bf18 it ne 10d9c: 2001 movne r0, #1 10d9e: e7d9 b.n 10d54 00010da0 : { 10da0: b538 push {r3, r4, r5, lr} 10da2: 4605 mov r5, r0 wc = (BYTE)*p++; /* Get a byte */ 10da4: 6804 ldr r4, [r0, #0] 10da6: f814 3b01 ldrb.w r3, [r4], #1 if (wc != 0) { 10daa: b913 cbnz r3, 10db2 uc = wc; 10dac: 4618 mov r0, r3 *str = p; /* Next read pointer */ 10dae: 602c str r4, [r5, #0] } 10db0: bd38 pop {r3, r4, r5, pc} wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM ==> Unicode */ 10db2: f240 11b5 movw r1, #437 ; 0x1b5 10db6: 4618 mov r0, r3 10db8: f7fa febc bl bb34 if (wc == 0) return 0xFFFFFFFF; /* Invalid code? */ 10dbc: 4603 mov r3, r0 10dbe: 2800 cmp r0, #0 10dc0: d1f4 bne.n 10dac 10dc2: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 10dc6: e7f3 b.n 10db0 00010dc8 : { 10dc8: b538 push {r3, r4, r5, lr} 10dca: 4604 mov r4, r0 res = sync_window(fs); 10dcc: f7ff ff78 bl 10cc0 if (res == FR_OK) { 10dd0: 4603 mov r3, r0 10dd2: b950 cbnz r0, 10dea if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { /* FAT32: Update FSInfo sector if needed */ 10dd4: 7823 ldrb r3, [r4, #0] 10dd6: 2b03 cmp r3, #3 10dd8: d009 beq.n 10dee if (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; 10dda: 2200 movs r2, #0 10ddc: 4611 mov r1, r2 10dde: 7860 ldrb r0, [r4, #1] 10de0: f7ff fee5 bl 10bae res = sync_window(fs); 10de4: 1c03 adds r3, r0, #0 10de6: bf18 it ne 10de8: 2301 movne r3, #1 } 10dea: 4618 mov r0, r3 10dec: bd38 pop {r3, r4, r5, pc} if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { /* FAT32: Update FSInfo sector if needed */ 10dee: 7923 ldrb r3, [r4, #4] 10df0: 2b01 cmp r3, #1 10df2: d1f2 bne.n 10dda mem_set(fs->win, 0, sizeof fs->win); 10df4: f104 0534 add.w r5, r4, #52 ; 0x34 10df8: f44f 7200 mov.w r2, #512 ; 0x200 10dfc: 2100 movs r1, #0 10dfe: 4628 mov r0, r5 10e00: f7ff fef1 bl 10be6 *ptr++ = (BYTE)val; val >>= 8; 10e04: 2355 movs r3, #85 ; 0x55 10e06: f884 3232 strb.w r3, [r4, #562] ; 0x232 *ptr++ = (BYTE)val; 10e0a: 23aa movs r3, #170 ; 0xaa 10e0c: f884 3233 strb.w r3, [r4, #563] ; 0x233 *ptr++ = (BYTE)val; val >>= 8; 10e10: 2352 movs r3, #82 ; 0x52 10e12: f884 3034 strb.w r3, [r4, #52] ; 0x34 *ptr++ = (BYTE)val; val >>= 8; 10e16: f884 3035 strb.w r3, [r4, #53] ; 0x35 *ptr++ = (BYTE)val; val >>= 8; 10e1a: 2361 movs r3, #97 ; 0x61 10e1c: f884 3036 strb.w r3, [r4, #54] ; 0x36 *ptr++ = (BYTE)val; 10e20: 2241 movs r2, #65 ; 0x41 10e22: f884 2037 strb.w r2, [r4, #55] ; 0x37 *ptr++ = (BYTE)val; val >>= 8; 10e26: 2172 movs r1, #114 ; 0x72 10e28: f884 1218 strb.w r1, [r4, #536] ; 0x218 *ptr++ = (BYTE)val; val >>= 8; 10e2c: f884 1219 strb.w r1, [r4, #537] ; 0x219 *ptr++ = (BYTE)val; val >>= 8; 10e30: f884 221a strb.w r2, [r4, #538] ; 0x21a *ptr++ = (BYTE)val; 10e34: f884 321b strb.w r3, [r4, #539] ; 0x21b st_dword(fs->win + FSI_Free_Count, fs->free_clst); 10e38: 6963 ldr r3, [r4, #20] *ptr++ = (BYTE)val; val >>= 8; 10e3a: f884 321c strb.w r3, [r4, #540] ; 0x21c 10e3e: 0a1a lsrs r2, r3, #8 *ptr++ = (BYTE)val; val >>= 8; 10e40: f884 221d strb.w r2, [r4, #541] ; 0x21d 10e44: 0c1a lsrs r2, r3, #16 *ptr++ = (BYTE)val; val >>= 8; 10e46: f884 221e strb.w r2, [r4, #542] ; 0x21e 10e4a: 0e1b lsrs r3, r3, #24 *ptr++ = (BYTE)val; 10e4c: f884 321f strb.w r3, [r4, #543] ; 0x21f st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); 10e50: 6923 ldr r3, [r4, #16] *ptr++ = (BYTE)val; val >>= 8; 10e52: f884 3220 strb.w r3, [r4, #544] ; 0x220 10e56: 0a1a lsrs r2, r3, #8 *ptr++ = (BYTE)val; val >>= 8; 10e58: f884 2221 strb.w r2, [r4, #545] ; 0x221 10e5c: 0c1a lsrs r2, r3, #16 *ptr++ = (BYTE)val; val >>= 8; 10e5e: f884 2222 strb.w r2, [r4, #546] ; 0x222 10e62: 0e1b lsrs r3, r3, #24 *ptr++ = (BYTE)val; 10e64: f884 3223 strb.w r3, [r4, #547] ; 0x223 fs->winsect = fs->volbase + 1; 10e68: 6a22 ldr r2, [r4, #32] 10e6a: 3201 adds r2, #1 10e6c: 6322 str r2, [r4, #48] ; 0x30 disk_write(fs->pdrv, fs->win, fs->winsect, 1); 10e6e: 2301 movs r3, #1 10e70: 4629 mov r1, r5 10e72: 7860 ldrb r0, [r4, #1] 10e74: f7ff fe94 bl 10ba0 fs->fsi_flag = 0; 10e78: 2300 movs r3, #0 10e7a: 7123 strb r3, [r4, #4] 10e7c: e7ad b.n 10dda 00010e7e : { 10e7e: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ 10e82: 2901 cmp r1, #1 10e84: f240 8093 bls.w 10fae 10e88: 6983 ldr r3, [r0, #24] 10e8a: 428b cmp r3, r1 10e8c: f240 8091 bls.w 10fb2 10e90: 4616 mov r6, r2 10e92: 460c mov r4, r1 10e94: 4605 mov r5, r0 switch (fs->fs_type) { 10e96: 7803 ldrb r3, [r0, #0] 10e98: 2b02 cmp r3, #2 10e9a: d04d beq.n 10f38 10e9c: 2b03 cmp r3, #3 10e9e: d060 beq.n 10f62 10ea0: 2b01 cmp r3, #1 10ea2: d003 beq.n 10eac FRESULT res = FR_INT_ERR; 10ea4: 2702 movs r7, #2 } 10ea6: 4638 mov r0, r7 10ea8: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} bc = (UINT)clst; bc += bc / 2; /* bc: byte offset of the entry */ 10eac: eb01 0851 add.w r8, r1, r1, lsr #1 res = move_window(fs, fs->fatbase + (bc / SS(fs))); 10eb0: 6a41 ldr r1, [r0, #36] ; 0x24 10eb2: eb01 2158 add.w r1, r1, r8, lsr #9 10eb6: f7ff ff27 bl 10d08 if (res != FR_OK) break; 10eba: 4607 mov r7, r0 10ebc: 2800 cmp r0, #0 10ebe: d1f2 bne.n 10ea6 p = fs->win + bc++ % SS(fs); 10ec0: f105 0934 add.w r9, r5, #52 ; 0x34 10ec4: f108 0a01 add.w sl, r8, #1 10ec8: f3c8 0808 ubfx r8, r8, #0, #9 *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; /* Update 1st byte */ 10ecc: f014 0f01 tst.w r4, #1 10ed0: d01a beq.n 10f08 10ed2: f819 3008 ldrb.w r3, [r9, r8] 10ed6: f003 030f and.w r3, r3, #15 10eda: ea43 1306 orr.w r3, r3, r6, lsl #4 10ede: f809 3008 strb.w r3, [r9, r8] fs->wflag = 1; 10ee2: 2301 movs r3, #1 10ee4: 70eb strb r3, [r5, #3] res = move_window(fs, fs->fatbase + (bc / SS(fs))); 10ee6: 6a69 ldr r1, [r5, #36] ; 0x24 10ee8: eb01 215a add.w r1, r1, sl, lsr #9 10eec: 4628 mov r0, r5 10eee: f7ff ff0b bl 10d08 if (res != FR_OK) break; 10ef2: 2800 cmp r0, #0 10ef4: d15f bne.n 10fb6 p = fs->win + bc % SS(fs); 10ef6: f3ca 0108 ubfx r1, sl, #0, #9 10efa: 4449 add r1, r9 *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); /* Update 2nd byte */ 10efc: f3c6 1207 ubfx r2, r6, #4, #8 10f00: 700a strb r2, [r1, #0] fs->wflag = 1; 10f02: 2301 movs r3, #1 10f04: 70eb strb r3, [r5, #3] break; 10f06: e7ce b.n 10ea6 *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; /* Update 1st byte */ 10f08: f809 6008 strb.w r6, [r9, r8] fs->wflag = 1; 10f0c: 2301 movs r3, #1 10f0e: 70eb strb r3, [r5, #3] res = move_window(fs, fs->fatbase + (bc / SS(fs))); 10f10: 6a69 ldr r1, [r5, #36] ; 0x24 10f12: eb01 215a add.w r1, r1, sl, lsr #9 10f16: 4628 mov r0, r5 10f18: f7ff fef6 bl 10d08 if (res != FR_OK) break; 10f1c: 2800 cmp r0, #0 10f1e: d14c bne.n 10fba p = fs->win + bc % SS(fs); 10f20: f3ca 0a08 ubfx sl, sl, #0, #9 10f24: eb09 010a add.w r1, r9, sl *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); /* Update 2nd byte */ 10f28: f819 300a ldrb.w r3, [r9, sl] 10f2c: f023 030f bic.w r3, r3, #15 10f30: f3c6 2203 ubfx r2, r6, #8, #4 10f34: 431a orrs r2, r3 10f36: e7e3 b.n 10f00 res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); 10f38: 6a41 ldr r1, [r0, #36] ; 0x24 10f3a: eb01 2114 add.w r1, r1, r4, lsr #8 10f3e: f7ff fee3 bl 10d08 if (res != FR_OK) break; 10f42: 4607 mov r7, r0 10f44: 2800 cmp r0, #0 10f46: d1ae bne.n 10ea6 st_word(fs->win + clst * 2 % SS(fs), (WORD)val); /* Simple WORD array */ 10f48: f105 0334 add.w r3, r5, #52 ; 0x34 10f4c: 0061 lsls r1, r4, #1 10f4e: f401 71ff and.w r1, r1, #510 ; 0x1fe 10f52: 1858 adds r0, r3, r1 *ptr++ = (BYTE)val; val >>= 8; 10f54: 545e strb r6, [r3, r1] 10f56: f3c6 2207 ubfx r2, r6, #8, #8 *ptr++ = (BYTE)val; 10f5a: 7042 strb r2, [r0, #1] fs->wflag = 1; 10f5c: 2301 movs r3, #1 10f5e: 70eb strb r3, [r5, #3] break; 10f60: e7a1 b.n 10ea6 res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); 10f62: 6a41 ldr r1, [r0, #36] ; 0x24 10f64: eb01 11d4 add.w r1, r1, r4, lsr #7 10f68: f7ff fece bl 10d08 if (res != FR_OK) break; 10f6c: 4607 mov r7, r0 10f6e: 2800 cmp r0, #0 10f70: d199 bne.n 10ea6 val = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000); 10f72: f026 4670 bic.w r6, r6, #4026531840 ; 0xf0000000 10f76: f105 0934 add.w r9, r5, #52 ; 0x34 10f7a: 00a4 lsls r4, r4, #2 10f7c: f404 74fe and.w r4, r4, #508 ; 0x1fc 10f80: eb09 0804 add.w r8, r9, r4 10f84: 4640 mov r0, r8 10f86: f7ff fe19 bl 10bbc 10f8a: f000 4070 and.w r0, r0, #4026531840 ; 0xf0000000 10f8e: ea40 0206 orr.w r2, r0, r6 *ptr++ = (BYTE)val; val >>= 8; 10f92: f809 2004 strb.w r2, [r9, r4] 10f96: 0a13 lsrs r3, r2, #8 *ptr++ = (BYTE)val; val >>= 8; 10f98: f888 3001 strb.w r3, [r8, #1] 10f9c: 0c13 lsrs r3, r2, #16 *ptr++ = (BYTE)val; val >>= 8; 10f9e: f888 3002 strb.w r3, [r8, #2] 10fa2: 0e12 lsrs r2, r2, #24 *ptr++ = (BYTE)val; 10fa4: f888 2003 strb.w r2, [r8, #3] fs->wflag = 1; 10fa8: 2301 movs r3, #1 10faa: 70eb strb r3, [r5, #3] break; 10fac: e77b b.n 10ea6 FRESULT res = FR_INT_ERR; 10fae: 2702 movs r7, #2 10fb0: e779 b.n 10ea6 10fb2: 2702 movs r7, #2 10fb4: e777 b.n 10ea6 res = move_window(fs, fs->fatbase + (bc / SS(fs))); 10fb6: 4607 mov r7, r0 10fb8: e775 b.n 10ea6 10fba: 4607 mov r7, r0 return res; 10fbc: e773 b.n 10ea6 00010fbe : *ptr++ = (BYTE)val; val >>= 8; 10fbe: 768a strb r2, [r1, #26] 10fc0: f3c2 2307 ubfx r3, r2, #8, #8 *ptr++ = (BYTE)val; 10fc4: 76cb strb r3, [r1, #27] if (fs->fs_type == FS_FAT32) { 10fc6: 7803 ldrb r3, [r0, #0] 10fc8: 2b03 cmp r3, #3 10fca: d000 beq.n 10fce } 10fcc: 4770 bx lr st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); 10fce: 0c12 lsrs r2, r2, #16 *ptr++ = (BYTE)val; val >>= 8; 10fd0: 750a strb r2, [r1, #20] 10fd2: 0a12 lsrs r2, r2, #8 *ptr++ = (BYTE)val; 10fd4: 754a strb r2, [r1, #21] } 10fd6: e7f9 b.n 10fcc 00010fd8 : { 10fd8: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} FATFS *fs = dp->obj.fs; 10fdc: f8d0 a000 ldr.w sl, [r0] fno->fname[0] = 0; /* Invaidate file info */ 10fe0: 2300 movs r3, #0 10fe2: 758b strb r3, [r1, #22] if (dp->sect == 0) return; /* Exit if read pointer has reached end of directory */ 10fe4: 6983 ldr r3, [r0, #24] 10fe6: 2b00 cmp r3, #0 10fe8: f000 8091 beq.w 1110e 10fec: 460c mov r4, r1 10fee: 4605 mov r5, r0 if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ 10ff0: 6ac3 ldr r3, [r0, #44] ; 0x2c 10ff2: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff 10ff6: d02f beq.n 11058 10ff8: 2600 movs r6, #0 si = di = hs = 0; 10ffa: 4637 mov r7, r6 10ffc: 46b0 mov r8, r6 wc = ff_uni2oem(chr, CODEPAGE); 10ffe: f240 1bb5 movw fp, #437 ; 0x1b5 11002: e008 b.n 11016 *buf++ = (char)(wc >> 8); /* Store DBC 1st byte */ 11004: eb04 0308 add.w r3, r4, r8 11008: 0a02 lsrs r2, r0, #8 1100a: 759a strb r2, [r3, #22] *buf++ = (TCHAR)wc; /* Store DBC 2nd byte */ 1100c: 75d8 strb r0, [r3, #23] return 2; 1100e: 2302 movs r3, #2 di += wc; 11010: 4498 add r8, r3 hs = 0; 11012: 2700 movs r7, #0 11014: 3602 adds r6, #2 while (fs->lfnbuf[si] != 0) { 11016: f8da 300c ldr.w r3, [sl, #12] 1101a: 5b98 ldrh r0, [r3, r6] 1101c: b358 cbz r0, 11076 if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ 1101e: b92f cbnz r7, 1102c 11020: f500 5320 add.w r3, r0, #10240 ; 0x2800 11024: b29b uxth r3, r3 11026: f5b3 6f00 cmp.w r3, #2048 ; 0x800 1102a: d322 bcc.n 11072 wc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in UTF-16 or UTF-8 encoding */ 1102c: f1c8 09ff rsb r9, r8, #255 ; 0xff wc = ff_uni2oem(chr, CODEPAGE); 11030: 4659 mov r1, fp 11032: ea40 4007 orr.w r0, r0, r7, lsl #16 11036: f7fa fd59 bl baec if (wc >= 0x100) { /* Is this a DBC? */ 1103a: 28ff cmp r0, #255 ; 0xff 1103c: d910 bls.n 11060 if (szb < 2) return 0; 1103e: f1b9 0f01 cmp.w r9, #1 11042: d8df bhi.n 11004 if (wc == 0) { di = 0; break; } /* Invalid char or buffer overflow? */ 11044: f04f 0900 mov.w r9, #0 if (hs != 0) di = 0; /* Broken surrogate pair? */ 11048: 2f00 cmp r7, #0 1104a: bf18 it ne 1104c: f04f 0900 movne.w r9, #0 fno->fname[di] = 0; /* Terminate the LFN (null string means LFN is invalid) */ 11050: 44a1 add r9, r4 11052: 2300 movs r3, #0 11054: f889 3016 strb.w r3, [r9, #22] if (hs != 0) di = 0; /* Broken surrogate pair? */ 11058: 2100 movs r1, #0 1105a: 460b mov r3, r1 if (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.'; /* Insert a . if extension is exist */ 1105c: 262e movs r6, #46 ; 0x2e 1105e: e015 b.n 1108c if (wc == 0 || szb < 1) return 0; /* Invalid char or buffer overflow? */ 11060: b158 cbz r0, 1107a 11062: f1b9 0f00 cmp.w r9, #0 11066: d0ef beq.n 11048 *buf++ = (TCHAR)wc; /* Store the character */ 11068: eb04 0308 add.w r3, r4, r8 1106c: 7598 strb r0, [r3, #22] return 1; 1106e: 2301 movs r3, #1 11070: e7ce b.n 11010 hs = wc; continue; /* Get low surrogate */ 11072: 4607 mov r7, r0 11074: e7ce b.n 11014 11076: 46c1 mov r9, r8 11078: e7e6 b.n 11048 if (wc == 0) { di = 0; break; } /* Invalid char or buffer overflow? */ 1107a: f04f 0900 mov.w r9, #0 1107e: e7e3 b.n 11048 fno->altname[di++] = (TCHAR)wc; /* Store it without any conversion */ 11080: 1860 adds r0, r4, r1 11082: 7243 strb r3, [r0, #9] 11084: 3101 adds r1, #1 11086: 4613 mov r3, r2 while (si < 11) { /* Get SFN from SFN entry */ 11088: 2a0b cmp r2, #11 1108a: d00f beq.n 110ac wc = dp->dir[si++]; /* Get a char */ 1108c: 1c5a adds r2, r3, #1 1108e: 69e8 ldr r0, [r5, #28] 11090: 5cc3 ldrb r3, [r0, r3] if (wc == ' ') continue; /* Skip padding spaces */ 11092: 2b20 cmp r3, #32 11094: d0f7 beq.n 11086 if (wc == RDDEM) wc = DDEM; /* Restore replaced DDEM character */ 11096: 2b05 cmp r3, #5 11098: bf08 it eq 1109a: 23e5 moveq r3, #229 ; 0xe5 if (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.'; /* Insert a . if extension is exist */ 1109c: 2a09 cmp r2, #9 1109e: d1ef bne.n 11080 110a0: 290b cmp r1, #11 110a2: d8ed bhi.n 11080 110a4: 1860 adds r0, r4, r1 110a6: 7246 strb r6, [r0, #9] 110a8: 3101 adds r1, #1 110aa: e7e9 b.n 11080 fno->altname[di] = 0; /* Terminate the SFN (null string means SFN is invalid) */ 110ac: 1863 adds r3, r4, r1 110ae: 2200 movs r2, #0 110b0: 725a strb r2, [r3, #9] if (fno->fname[0] == 0) { /* If LFN is invalid, altname[] needs to be copied to fname[] */ 110b2: 7da3 ldrb r3, [r4, #22] 110b4: b9bb cbnz r3, 110e6 if (di == 0) { /* If LFN and SFN both are invalid, this object is inaccesible */ 110b6: b159 cbz r1, 110d0 for (si = di = 0, lcf = NS_BODY; fno->altname[si]; si++, di++) { /* Copy altname[] to fname[] with case information */ 110b8: 7a63 ldrb r3, [r4, #9] 110ba: 4610 mov r0, r2 110bc: b163 cbz r3, 110d8 110be: f104 0209 add.w r2, r4, #9 110c2: 2708 movs r7, #8 if (wc == '.') lcf = NS_EXT; 110c4: f04f 0c10 mov.w ip, #16 110c8: f06f 0607 mvn.w r6, #7 110cc: 1b36 subs r6, r6, r4 110ce: e027 b.n 11120 fno->fname[di++] = '?'; 110d0: 1c48 adds r0, r1, #1 110d2: 4421 add r1, r4 110d4: 233f movs r3, #63 ; 0x3f 110d6: 758b strb r3, [r1, #22] fno->fname[di] = 0; /* Terminate the LFN */ 110d8: 4420 add r0, r4 110da: 2300 movs r3, #0 110dc: 7583 strb r3, [r0, #22] if (!dp->dir[DIR_NTres]) fno->altname[0] = 0; /* Altname is not needed if neither LFN nor case info is exist. */ 110de: 69eb ldr r3, [r5, #28] 110e0: 7b1b ldrb r3, [r3, #12] 110e2: b903 cbnz r3, 110e6 110e4: 7263 strb r3, [r4, #9] fno->fattrib = dp->dir[DIR_Attr]; /* Attribute */ 110e6: 69eb ldr r3, [r5, #28] 110e8: 7adb ldrb r3, [r3, #11] 110ea: 7223 strb r3, [r4, #8] fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ 110ec: 69e8 ldr r0, [r5, #28] 110ee: 301c adds r0, #28 110f0: f7ff fd64 bl 10bbc 110f4: 6020 str r0, [r4, #0] fno->ftime = ld_word(dp->dir + DIR_ModTime + 0); /* Time */ 110f6: 69ea ldr r2, [r5, #28] rv = rv << 8 | ptr[0]; 110f8: 7dd1 ldrb r1, [r2, #23] 110fa: 7d93 ldrb r3, [r2, #22] 110fc: ea43 2301 orr.w r3, r3, r1, lsl #8 fno->ftime = ld_word(dp->dir + DIR_ModTime + 0); /* Time */ 11100: 80e3 strh r3, [r4, #6] fno->fdate = ld_word(dp->dir + DIR_ModTime + 2); /* Date */ 11102: 69ea ldr r2, [r5, #28] rv = rv << 8 | ptr[0]; 11104: 7e51 ldrb r1, [r2, #25] 11106: 7e13 ldrb r3, [r2, #24] 11108: ea43 2301 orr.w r3, r3, r1, lsl #8 fno->fdate = ld_word(dp->dir + DIR_ModTime + 2); /* Date */ 1110c: 80a3 strh r3, [r4, #4] } 1110e: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} if (wc == '.') lcf = NS_EXT; 11112: 4667 mov r7, ip fno->fname[di] = (TCHAR)wc; 11114: 7353 strb r3, [r2, #13] 11116: 18b0 adds r0, r6, r2 for (si = di = 0, lcf = NS_BODY; fno->altname[si]; si++, di++) { /* Copy altname[] to fname[] with case information */ 11118: f812 3f01 ldrb.w r3, [r2, #1]! 1111c: 2b00 cmp r3, #0 1111e: d0db beq.n 110d8 wc = (WCHAR)fno->altname[si]; 11120: b29b uxth r3, r3 if (wc == '.') lcf = NS_EXT; 11122: 2b2e cmp r3, #46 ; 0x2e 11124: d0f5 beq.n 11112 if (IsUpper(wc) && (dp->dir[DIR_NTres] & lcf)) wc += 0x20; 11126: f1a3 0141 sub.w r1, r3, #65 ; 0x41 1112a: b289 uxth r1, r1 1112c: 2919 cmp r1, #25 1112e: d8f1 bhi.n 11114 11130: 69e9 ldr r1, [r5, #28] 11132: 7b09 ldrb r1, [r1, #12] 11134: 420f tst r7, r1 11136: d0ed beq.n 11114 11138: 3320 adds r3, #32 1113a: e7eb b.n 11114 0001113c : if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ 1113c: 2901 cmp r1, #1 1113e: d958 bls.n 111f2 { 11140: b5f8 push {r3, r4, r5, r6, r7, lr} FATFS *fs = obj->fs; 11142: 6806 ldr r6, [r0, #0] if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ 11144: 69b3 ldr r3, [r6, #24] 11146: 428b cmp r3, r1 11148: d955 bls.n 111f6 1114a: 460c mov r4, r1 switch (fs->fs_type) { 1114c: 7833 ldrb r3, [r6, #0] 1114e: 2b02 cmp r3, #2 11150: d02c beq.n 111ac 11152: 2b03 cmp r3, #3 11154: d03c beq.n 111d0 11156: 2b01 cmp r3, #1 11158: d001 beq.n 1115e val = 1; /* Internal error */ 1115a: 2001 movs r0, #1 1115c: e04c b.n 111f8 bc = (UINT)clst; bc += bc / 2; 1115e: eb01 0551 add.w r5, r1, r1, lsr #1 if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; 11162: 6a71 ldr r1, [r6, #36] ; 0x24 11164: eb01 2155 add.w r1, r1, r5, lsr #9 11168: 4630 mov r0, r6 1116a: f7ff fdcd bl 10d08 1116e: b110 cbz r0, 11176 val = 0xFFFFFFFF; /* Default value falls on disk error */ 11170: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 11174: e040 b.n 111f8 wc = fs->win[bc++ % SS(fs)]; /* Get 1st byte of the entry */ 11176: 1c6f adds r7, r5, #1 11178: f3c5 0508 ubfx r5, r5, #0, #9 1117c: 4435 add r5, r6 1117e: f895 5034 ldrb.w r5, [r5, #52] ; 0x34 if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; 11182: 6a71 ldr r1, [r6, #36] ; 0x24 11184: eb01 2157 add.w r1, r1, r7, lsr #9 11188: 4630 mov r0, r6 1118a: f7ff fdbd bl 10d08 1118e: bba0 cbnz r0, 111fa wc |= fs->win[bc % SS(fs)] << 8; /* Merge 2nd byte of the entry */ 11190: f3c7 0308 ubfx r3, r7, #0, #9 11194: 4433 add r3, r6 11196: f893 0034 ldrb.w r0, [r3, #52] ; 0x34 1119a: ea45 2000 orr.w r0, r5, r0, lsl #8 val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF); /* Adjust bit position */ 1119e: f014 0f01 tst.w r4, #1 111a2: bf14 ite ne 111a4: 0900 lsrne r0, r0, #4 111a6: f3c0 000b ubfxeq r0, r0, #0, #12 111aa: e025 b.n 111f8 if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; 111ac: 6a71 ldr r1, [r6, #36] ; 0x24 111ae: eb01 2114 add.w r1, r1, r4, lsr #8 111b2: 4630 mov r0, r6 111b4: f7ff fda8 bl 10d08 111b8: bb10 cbnz r0, 11200 val = ld_word(fs->win + clst * 2 % SS(fs)); /* Simple WORD array */ 111ba: f106 0334 add.w r3, r6, #52 ; 0x34 111be: 0061 lsls r1, r4, #1 111c0: f401 71ff and.w r1, r1, #510 ; 0x1fe 111c4: 185a adds r2, r3, r1 rv = rv << 8 | ptr[0]; 111c6: 7852 ldrb r2, [r2, #1] 111c8: 5c58 ldrb r0, [r3, r1] val = ld_word(fs->win + clst * 2 % SS(fs)); /* Simple WORD array */ 111ca: ea40 2002 orr.w r0, r0, r2, lsl #8 break; 111ce: e013 b.n 111f8 if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; 111d0: 6a71 ldr r1, [r6, #36] ; 0x24 111d2: eb01 11d4 add.w r1, r1, r4, lsr #7 111d6: 4630 mov r0, r6 111d8: f7ff fd96 bl 10d08 111dc: b998 cbnz r0, 11206 val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF; /* Simple DWORD array but mask out upper 4 bits */ 111de: 3634 adds r6, #52 ; 0x34 111e0: 00a1 lsls r1, r4, #2 111e2: f401 70fe and.w r0, r1, #508 ; 0x1fc 111e6: 4430 add r0, r6 111e8: f7ff fce8 bl 10bbc 111ec: f020 4070 bic.w r0, r0, #4026531840 ; 0xf0000000 break; 111f0: e002 b.n 111f8 val = 1; /* Internal error */ 111f2: 2001 movs r0, #1 } 111f4: 4770 bx lr val = 1; /* Internal error */ 111f6: 2001 movs r0, #1 } 111f8: bdf8 pop {r3, r4, r5, r6, r7, pc} val = 0xFFFFFFFF; /* Default value falls on disk error */ 111fa: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 111fe: e7fb b.n 111f8 11200: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 11204: e7f8 b.n 111f8 11206: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff return val; 1120a: e7f5 b.n 111f8 0001120c : if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ 1120c: f5b1 1f00 cmp.w r1, #2097152 ; 0x200000 11210: d246 bcs.n 112a0 { 11212: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 11216: 4606 mov r6, r0 11218: 460d mov r5, r1 if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ 1121a: f011 0f1f tst.w r1, #31 1121e: d141 bne.n 112a4 FATFS *fs = dp->obj.fs; 11220: f8d0 8000 ldr.w r8, [r0] dp->dptr = ofs; /* Set current offset */ 11224: 6131 str r1, [r6, #16] clst = dp->obj.sclust; /* Table start cluster (0:root) */ 11226: 6884 ldr r4, [r0, #8] if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ 11228: b9f4 cbnz r4, 11268 1122a: f898 3000 ldrb.w r3, [r8] 1122e: 2b02 cmp r3, #2 11230: d902 bls.n 11238 clst = (DWORD)fs->dirbase; 11232: f8d8 3028 ldr.w r3, [r8, #40] ; 0x28 if (clst == 0) { /* Static table (root-directory on the FAT volume) */ 11236: b9b3 cbnz r3, 11266 if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ 11238: f8b8 3008 ldrh.w r3, [r8, #8] 1123c: ebb3 1f55 cmp.w r3, r5, lsr #5 11240: d932 bls.n 112a8 dp->sect = fs->dirbase; 11242: f8d8 3028 ldr.w r3, [r8, #40] ; 0x28 11246: 61b3 str r3, [r6, #24] dp->clust = clst; /* Current cluster# */ 11248: 6174 str r4, [r6, #20] if (dp->sect == 0) return FR_INT_ERR; 1124a: 69b3 ldr r3, [r6, #24] 1124c: b3a3 cbz r3, 112b8 dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ 1124e: eb03 2355 add.w r3, r3, r5, lsr #9 11252: 61b3 str r3, [r6, #24] dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ 11254: f108 0834 add.w r8, r8, #52 ; 0x34 11258: f3c5 0508 ubfx r5, r5, #0, #9 1125c: 4445 add r5, r8 1125e: 61f5 str r5, [r6, #28] return FR_OK; 11260: 2000 movs r0, #0 } 11262: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} clst = (DWORD)fs->dirbase; 11266: 461c mov r4, r3 csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ 11268: f8b8 700a ldrh.w r7, [r8, #10] 1126c: 027f lsls r7, r7, #9 while (ofs >= csz) { /* Follow cluster chain */ 1126e: 42bd cmp r5, r7 11270: d310 bcc.n 11294 clst = get_fat(&dp->obj, clst); /* Get next cluster */ 11272: 4621 mov r1, r4 11274: 4630 mov r0, r6 11276: f7ff ff61 bl 1113c 1127a: 4604 mov r4, r0 if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ 1127c: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 11280: d014 beq.n 112ac if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ 11282: 2801 cmp r0, #1 11284: d914 bls.n 112b0 11286: f8d8 3018 ldr.w r3, [r8, #24] 1128a: 4283 cmp r3, r0 1128c: d912 bls.n 112b4 ofs -= csz; 1128e: 1bed subs r5, r5, r7 while (ofs >= csz) { /* Follow cluster chain */ 11290: 42af cmp r7, r5 11292: d9ee bls.n 11272 dp->sect = clst2sect(fs, clst); 11294: 4621 mov r1, r4 11296: 4640 mov r0, r8 11298: f7ff fcab bl 10bf2 1129c: 61b0 str r0, [r6, #24] 1129e: e7d3 b.n 11248 return FR_INT_ERR; 112a0: 2002 movs r0, #2 } 112a2: 4770 bx lr return FR_INT_ERR; 112a4: 2002 movs r0, #2 112a6: e7dc b.n 11262 if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ 112a8: 2002 movs r0, #2 112aa: e7da b.n 11262 if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ 112ac: 2001 movs r0, #1 112ae: e7d8 b.n 11262 if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ 112b0: 2002 movs r0, #2 112b2: e7d6 b.n 11262 112b4: 2002 movs r0, #2 112b6: e7d4 b.n 11262 if (dp->sect == 0) return FR_INT_ERR; 112b8: 2002 movs r0, #2 112ba: e7d2 b.n 11262 000112bc : { 112bc: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 112c0: 4607 mov r7, r0 FATFS *fs = obj->fs; 112c2: 6806 ldr r6, [r0, #0] if (clst == 0) { /* Create a new chain */ 112c4: 4688 mov r8, r1 112c6: b959 cbnz r1, 112e0 scl = fs->last_clst; /* Suggested cluster to start to find */ 112c8: 6935 ldr r5, [r6, #16] if (scl == 0 || scl >= fs->n_fatent) scl = 1; 112ca: 2d00 cmp r5, #0 112cc: d074 beq.n 113b8 112ce: 69b3 ldr r3, [r6, #24] 112d0: 42ab cmp r3, r5 112d2: bf98 it ls 112d4: 2501 movls r5, #1 if (fs->free_clst == 0) return 0; /* No free cluster */ 112d6: 6973 ldr r3, [r6, #20] 112d8: 2b00 cmp r3, #0 112da: d06a beq.n 113b2 scl = clst; /* Cluster to start to find */ 112dc: 462c mov r4, r5 112de: e038 b.n 11352 cs = get_fat(obj, clst); /* Check the cluster status */ 112e0: f7ff ff2c bl 1113c 112e4: 4603 mov r3, r0 if (cs < 2) return 1; /* Test for insanity */ 112e6: 2801 cmp r0, #1 112e8: d95e bls.n 113a8 if (cs == 0xFFFFFFFF) return cs; /* Test for disk error */ 112ea: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 112ee: d060 beq.n 113b2 if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ 112f0: 69b2 ldr r2, [r6, #24] 112f2: 4282 cmp r2, r0 112f4: d85d bhi.n 113b2 if (fs->free_clst == 0) return 0; /* No free cluster */ 112f6: 6973 ldr r3, [r6, #20] 112f8: 2b00 cmp r3, #0 112fa: d05a beq.n 113b2 ncl = scl + 1; /* Test if next cluster is free */ 112fc: f108 0401 add.w r4, r8, #1 if (ncl >= fs->n_fatent) ncl = 2; 11300: 42a2 cmp r2, r4 11302: bf98 it ls 11304: 2402 movls r4, #2 cs = get_fat(obj, ncl); /* Get next cluster status */ 11306: 4621 mov r1, r4 11308: 4638 mov r0, r7 1130a: f7ff ff17 bl 1113c 1130e: 4603 mov r3, r0 if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ 11310: 2801 cmp r0, #1 11312: d04e beq.n 113b2 11314: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 11318: d04b beq.n 113b2 if (cs != 0) { /* Not free? */ 1131a: b138 cbz r0, 1132c cs = fs->last_clst; /* Start at suggested cluster if it is valid */ 1131c: 6935 ldr r5, [r6, #16] if (cs >= 2 && cs < fs->n_fatent) scl = cs; 1131e: 2d01 cmp r5, #1 11320: d908 bls.n 11334 11322: 69b3 ldr r3, [r6, #24] scl = clst; /* Cluster to start to find */ 11324: 42ab cmp r3, r5 11326: bf98 it ls 11328: 4645 movls r5, r8 1132a: e7d7 b.n 112dc if (ncl == 0) { /* The new cluster cannot be contiguous and find another fragment */ 1132c: 2c00 cmp r4, #0 1132e: d145 bne.n 113bc scl = clst; /* Cluster to start to find */ 11330: 4645 mov r5, r8 11332: e7d3 b.n 112dc 11334: 4645 mov r5, r8 11336: e7d1 b.n 112dc cs = get_fat(obj, ncl); /* Get the cluster status */ 11338: 4621 mov r1, r4 1133a: 4638 mov r0, r7 1133c: f7ff fefe bl 1113c if (cs == 0) break; /* Found a free cluster? */ 11340: 4603 mov r3, r0 11342: b170 cbz r0, 11362 if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ 11344: 2801 cmp r0, #1 11346: d034 beq.n 113b2 11348: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 1134c: d031 beq.n 113b2 if (ncl == scl) return 0; /* No free cluster found? */ 1134e: 42ac cmp r4, r5 11350: d02e beq.n 113b0 ncl++; /* Next cluster */ 11352: 3401 adds r4, #1 if (ncl >= fs->n_fatent) { /* Check wrap-around */ 11354: 69b3 ldr r3, [r6, #24] 11356: 42a3 cmp r3, r4 11358: d8ee bhi.n 11338 if (ncl > scl) return 0; /* No free cluster found? */ 1135a: 2d01 cmp r5, #1 1135c: d926 bls.n 113ac ncl = 2; 1135e: 2402 movs r4, #2 11360: e7ea b.n 11338 res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ 11362: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff 11366: 4621 mov r1, r4 11368: 4630 mov r0, r6 1136a: f7ff fd88 bl 10e7e if (res == FR_OK && clst != 0) { 1136e: 4603 mov r3, r0 11370: bb68 cbnz r0, 113ce 11372: f1b8 0f00 cmp.w r8, #0 11376: d10e bne.n 11396 fs->last_clst = ncl; 11378: 6134 str r4, [r6, #16] if (fs->free_clst <= fs->n_fatent - 2) fs->free_clst--; 1137a: 6972 ldr r2, [r6, #20] 1137c: 69b3 ldr r3, [r6, #24] 1137e: 3b02 subs r3, #2 11380: 429a cmp r2, r3 11382: bf9c itt ls 11384: f102 32ff addls.w r2, r2, #4294967295 ; 0xffffffff 11388: 6172 strls r2, [r6, #20] fs->fsi_flag |= 1; 1138a: 7933 ldrb r3, [r6, #4] 1138c: f043 0301 orr.w r3, r3, #1 11390: 7133 strb r3, [r6, #4] 11392: 4623 mov r3, r4 11394: e00d b.n 113b2 res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ 11396: 4622 mov r2, r4 11398: 4641 mov r1, r8 1139a: 4630 mov r0, r6 1139c: f7ff fd6f bl 10e7e if (res == FR_OK) { /* Update FSINFO if function succeeded. */ 113a0: 4603 mov r3, r0 113a2: 2800 cmp r0, #0 113a4: d0e8 beq.n 11378 113a6: e012 b.n 113ce if (cs < 2) return 1; /* Test for insanity */ 113a8: 2301 movs r3, #1 113aa: e002 b.n 113b2 if (ncl > scl) return 0; /* No free cluster found? */ 113ac: 2300 movs r3, #0 113ae: e000 b.n 113b2 if (ncl == scl) return 0; /* No free cluster found? */ 113b0: 2300 movs r3, #0 } 113b2: 4618 mov r0, r3 113b4: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (scl == 0 || scl >= fs->n_fatent) scl = 1; 113b8: 2501 movs r5, #1 113ba: e78c b.n 112d6 res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ 113bc: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff 113c0: 4621 mov r1, r4 113c2: 4630 mov r0, r6 113c4: f7ff fd5b bl 10e7e if (res == FR_OK && clst != 0) { 113c8: 4603 mov r3, r0 113ca: 2800 cmp r0, #0 113cc: d0e3 beq.n 11396 ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Generate error status */ 113ce: 2b01 cmp r3, #1 113d0: bf0c ite eq 113d2: f04f 33ff moveq.w r3, #4294967295 ; 0xffffffff 113d6: 2301 movne r3, #1 113d8: e7eb b.n 113b2 000113da : { 113da: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 113de: 460e mov r6, r1 FATFS *fs = obj->fs; 113e0: 6805 ldr r5, [r0, #0] if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ 113e2: 2901 cmp r1, #1 113e4: d932 bls.n 1144c 113e6: 4607 mov r7, r0 113e8: 4611 mov r1, r2 113ea: 69ab ldr r3, [r5, #24] 113ec: 42b3 cmp r3, r6 113ee: d930 bls.n 11452 if (pclst != 0 && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { 113f0: b912 cbnz r2, 113f8 res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ 113f2: f04f 0800 mov.w r8, #0 113f6: e00b b.n 11410 res = put_fat(fs, pclst, 0xFFFFFFFF); 113f8: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff 113fc: 4628 mov r0, r5 113fe: f7ff fd3e bl 10e7e if (res != FR_OK) return res; 11402: 4684 mov ip, r0 11404: 2800 cmp r0, #0 11406: d0f4 beq.n 113f2 11408: e025 b.n 11456 clst = nxt; /* Next cluster */ 1140a: 4626 mov r6, r4 } while (clst < fs->n_fatent); /* Repeat while not the last link */ 1140c: 42a2 cmp r2, r4 1140e: d922 bls.n 11456 nxt = get_fat(obj, clst); /* Get cluster status */ 11410: 4631 mov r1, r6 11412: 4638 mov r0, r7 11414: f7ff fe92 bl 1113c if (nxt == 0) break; /* Empty cluster? */ 11418: 4604 mov r4, r0 1141a: b1f8 cbz r0, 1145c if (nxt == 1) return FR_INT_ERR; /* Internal error? */ 1141c: 2801 cmp r0, #1 1141e: d020 beq.n 11462 if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ 11420: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 11424: d020 beq.n 11468 res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ 11426: 4642 mov r2, r8 11428: 4631 mov r1, r6 1142a: 4628 mov r0, r5 1142c: f7ff fd27 bl 10e7e if (res != FR_OK) return res; 11430: 4684 mov ip, r0 11432: b980 cbnz r0, 11456 if (fs->free_clst < fs->n_fatent - 2) { /* Update FSINFO */ 11434: 696b ldr r3, [r5, #20] 11436: 69aa ldr r2, [r5, #24] 11438: 1e91 subs r1, r2, #2 1143a: 428b cmp r3, r1 1143c: d2e5 bcs.n 1140a fs->free_clst++; 1143e: 3301 adds r3, #1 11440: 616b str r3, [r5, #20] fs->fsi_flag |= 1; 11442: 792b ldrb r3, [r5, #4] 11444: f043 0301 orr.w r3, r3, #1 11448: 712b strb r3, [r5, #4] 1144a: e7de b.n 1140a if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ 1144c: f04f 0c02 mov.w ip, #2 11450: e001 b.n 11456 11452: f04f 0c02 mov.w ip, #2 } 11456: 4660 mov r0, ip 11458: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return FR_OK; 1145c: f04f 0c00 mov.w ip, #0 11460: e7f9 b.n 11456 if (nxt == 1) return FR_INT_ERR; /* Internal error? */ 11462: f04f 0c02 mov.w ip, #2 11466: e7f6 b.n 11456 if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ 11468: f04f 0c01 mov.w ip, #1 1146c: e7f3 b.n 11456 0001146e : { 1146e: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} ofs = dp->dptr + SZDIRE; /* Next entry */ 11472: 6906 ldr r6, [r0, #16] 11474: 3620 adds r6, #32 if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) dp->sect = 0; /* Disable it if the offset reached the max value */ 11476: f5b6 1f00 cmp.w r6, #2097152 ; 0x200000 1147a: d303 bcc.n 11484 1147c: 2300 movs r3, #0 1147e: 6183 str r3, [r0, #24] if (dp->sect == 0) return FR_NO_FILE; /* Report EOT if it has been disabled */ 11480: 2004 movs r0, #4 11482: e015 b.n 114b0 11484: 6983 ldr r3, [r0, #24] 11486: 2b00 cmp r3, #0 11488: d047 beq.n 1151a 1148a: 4688 mov r8, r1 1148c: 4605 mov r5, r0 FATFS *fs = dp->obj.fs; 1148e: 6804 ldr r4, [r0, #0] if (ofs % SS(fs) == 0) { /* Sector changed? */ 11490: f3c6 0708 ubfx r7, r6, #0, #9 11494: b93f cbnz r7, 114a6 dp->sect++; /* Next sector */ 11496: 3301 adds r3, #1 11498: 6183 str r3, [r0, #24] if (dp->clust == 0) { /* Static table */ 1149a: 6941 ldr r1, [r0, #20] 1149c: b971 cbnz r1, 114bc if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ 1149e: 8923 ldrh r3, [r4, #8] 114a0: ebb3 1f56 cmp.w r3, r6, lsr #5 114a4: d906 bls.n 114b4 dp->dptr = ofs; /* Current entry */ 114a6: 612e str r6, [r5, #16] dp->dir = fs->win + ofs % SS(fs); /* Pointer to the entry in the win[] */ 114a8: 3434 adds r4, #52 ; 0x34 114aa: 443c add r4, r7 114ac: 61ec str r4, [r5, #28] return FR_OK; 114ae: 2000 movs r0, #0 } 114b0: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} dp->sect = 0; return FR_NO_FILE; 114b4: 2300 movs r3, #0 114b6: 6183 str r3, [r0, #24] 114b8: 2004 movs r0, #4 114ba: e7f9 b.n 114b0 if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ 114bc: 8963 ldrh r3, [r4, #10] 114be: 3b01 subs r3, #1 114c0: ea13 2356 ands.w r3, r3, r6, lsr #9 114c4: d1ef bne.n 114a6 clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ 114c6: f7ff fe39 bl 1113c 114ca: 4681 mov r9, r0 if (clst <= 1) return FR_INT_ERR; /* Internal error */ 114cc: 2801 cmp r0, #1 114ce: d926 bls.n 1151e if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ 114d0: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 114d4: d025 beq.n 11522 if (clst >= fs->n_fatent) { /* It reached end of dynamic table */ 114d6: 69a3 ldr r3, [r4, #24] 114d8: 4283 cmp r3, r0 114da: d812 bhi.n 11502 if (!stretch) { /* If no stretch, report EOT */ 114dc: f1b8 0f00 cmp.w r8, #0 114e0: d017 beq.n 11512 clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ 114e2: 6969 ldr r1, [r5, #20] 114e4: 4628 mov r0, r5 114e6: f7ff fee9 bl 112bc if (clst == 0) return FR_DENIED; /* No free cluster */ 114ea: 4681 mov r9, r0 114ec: b1d8 cbz r0, 11526 if (clst == 1) return FR_INT_ERR; /* Internal error */ 114ee: 2801 cmp r0, #1 114f0: d01b beq.n 1152a if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ 114f2: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 114f6: d01a beq.n 1152e if (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR; /* Clean up the stretched table */ 114f8: 4601 mov r1, r0 114fa: 4620 mov r0, r4 114fc: f7ff fc22 bl 10d44 11500: b9b8 cbnz r0, 11532 dp->clust = clst; /* Initialize data for new cluster */ 11502: f8c5 9014 str.w r9, [r5, #20] dp->sect = clst2sect(fs, clst); 11506: 4649 mov r1, r9 11508: 4620 mov r0, r4 1150a: f7ff fb72 bl 10bf2 1150e: 61a8 str r0, [r5, #24] 11510: e7c9 b.n 114a6 dp->sect = 0; return FR_NO_FILE; 11512: 2300 movs r3, #0 11514: 61ab str r3, [r5, #24] 11516: 2004 movs r0, #4 11518: e7ca b.n 114b0 if (dp->sect == 0) return FR_NO_FILE; /* Report EOT if it has been disabled */ 1151a: 2004 movs r0, #4 1151c: e7c8 b.n 114b0 if (clst <= 1) return FR_INT_ERR; /* Internal error */ 1151e: 2002 movs r0, #2 11520: e7c6 b.n 114b0 if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ 11522: 2001 movs r0, #1 11524: e7c4 b.n 114b0 if (clst == 0) return FR_DENIED; /* No free cluster */ 11526: 2007 movs r0, #7 11528: e7c2 b.n 114b0 if (clst == 1) return FR_INT_ERR; /* Internal error */ 1152a: 2002 movs r0, #2 1152c: e7c0 b.n 114b0 if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ 1152e: 2001 movs r0, #1 11530: e7be b.n 114b0 if (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR; /* Clean up the stretched table */ 11532: 2001 movs r0, #1 11534: e7bc b.n 114b0 00011536 : { 11536: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 1153a: 4604 mov r4, r0 1153c: 4688 mov r8, r1 FATFS *fs = dp->obj.fs; 1153e: 6806 ldr r6, [r0, #0] res = dir_sdi(dp, 0); 11540: 2100 movs r1, #0 11542: f7ff fe63 bl 1120c if (res == FR_OK) { 11546: 4603 mov r3, r0 11548: b9c8 cbnz r0, 1157e n = 0; 1154a: 2500 movs r5, #0 res = dir_next(dp, 1); 1154c: 2701 movs r7, #1 1154e: e008 b.n 11562 if (++n == nent) break; /* A block of contiguous free entries is found */ 11550: 3501 adds r5, #1 11552: 4545 cmp r5, r8 11554: d016 beq.n 11584 res = dir_next(dp, 1); 11556: 4639 mov r1, r7 11558: 4620 mov r0, r4 1155a: f7ff ff88 bl 1146e } while (res == FR_OK); /* Next entry with table stretch enabled */ 1155e: 4603 mov r3, r0 11560: b968 cbnz r0, 1157e res = move_window(fs, dp->sect); 11562: 69a1 ldr r1, [r4, #24] 11564: 4630 mov r0, r6 11566: f7ff fbcf bl 10d08 if (res != FR_OK) break; 1156a: 4603 mov r3, r0 1156c: b938 cbnz r0, 1157e if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { 1156e: 69e2 ldr r2, [r4, #28] 11570: 7812 ldrb r2, [r2, #0] 11572: 2ae5 cmp r2, #229 ; 0xe5 11574: d0ec beq.n 11550 11576: 2a00 cmp r2, #0 11578: d0ea beq.n 11550 n = 0; /* Not a blank entry. Restart to search */ 1157a: 2500 movs r5, #0 1157c: e7eb b.n 11556 if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ 1157e: 2b04 cmp r3, #4 11580: bf08 it eq 11582: 2307 moveq r3, #7 } 11584: 4618 mov r0, r3 11586: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 0001158a : rv = rv << 8 | ptr[0]; 1158a: 7eca ldrb r2, [r1, #27] 1158c: 7e8b ldrb r3, [r1, #26] cl = ld_word(dir + DIR_FstClusLO); 1158e: ea43 2302 orr.w r3, r3, r2, lsl #8 if (fs->fs_type == FS_FAT32) { 11592: 7802 ldrb r2, [r0, #0] 11594: 2a03 cmp r2, #3 11596: d001 beq.n 1159c } 11598: 4618 mov r0, r3 1159a: 4770 bx lr rv = rv << 8 | ptr[0]; 1159c: 7d48 ldrb r0, [r1, #21] 1159e: 7d0a ldrb r2, [r1, #20] cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; 115a0: ea42 2200 orr.w r2, r2, r0, lsl #8 115a4: ea43 4302 orr.w r3, r3, r2, lsl #16 return cl; 115a8: e7f6 b.n 11598 000115aa : { 115aa: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 115ae: b090 sub sp, #64 ; 0x40 115b0: 9101 str r1, [sp, #4] if (!fp) return FR_INVALID_OBJECT; 115b2: 2800 cmp r0, #0 115b4: f000 80d5 beq.w 11762 115b8: 4604 mov r4, r0 115ba: 4615 mov r5, r2 mode &= FF_FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND; 115bc: f002 073f and.w r7, r2, #63 ; 0x3f res = mount_volume(&path, &fs, mode); 115c0: 463a mov r2, r7 115c2: a902 add r1, sp, #8 115c4: a801 add r0, sp, #4 115c6: f7f8 fff1 bl a5ac if (res == FR_OK) { 115ca: 4606 mov r6, r0 115cc: b128 cbz r0, 115da if (res != FR_OK) fp->obj.fs = 0; /* Invalidate file object on error */ 115ce: 2300 movs r3, #0 115d0: 6023 str r3, [r4, #0] } 115d2: 4630 mov r0, r6 115d4: b010 add sp, #64 ; 0x40 115d6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} dj.obj.fs = fs; 115da: 9b02 ldr r3, [sp, #8] 115dc: 9303 str r3, [sp, #12] res = follow_path(&dj, path); /* Follow the file path */ 115de: 9901 ldr r1, [sp, #4] 115e0: a803 add r0, sp, #12 115e2: f7f9 fa2d bl aa40 if (res == FR_OK) { 115e6: 4603 mov r3, r0 115e8: 2800 cmp r0, #0 115ea: d155 bne.n 11698 if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ 115ec: f99d 3037 ldrsb.w r3, [sp, #55] ; 0x37 115f0: 2b00 cmp r3, #0 115f2: f2c0 80c3 blt.w 1177c if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { 115f6: f015 0f1c tst.w r5, #28 115fa: f040 808e bne.w 1171a if (dj.obj.attr & AM_DIR) { /* File open against a directory */ 115fe: f89d 3012 ldrb.w r3, [sp, #18] 11602: f013 0f10 tst.w r3, #16 11606: f040 80b3 bne.w 11770 if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* Write mode open against R/O file */ 1160a: f015 0f02 tst.w r5, #2 1160e: d003 beq.n 11618 11610: f013 0f01 tst.w r3, #1 11614: f040 80aa bne.w 1176c if (mode & FA_CREATE_ALWAYS) mode |= FA_MODIFIED; /* Set file change flag if created or overwritten */ 11618: f015 0f08 tst.w r5, #8 1161c: d001 beq.n 11622 1161e: f047 0740 orr.w r7, r7, #64 ; 0x40 fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ 11622: 9d02 ldr r5, [sp, #8] 11624: 6b2b ldr r3, [r5, #48] ; 0x30 11626: 6223 str r3, [r4, #32] fp->dir_ptr = dj.dir; 11628: f8dd 8028 ldr.w r8, [sp, #40] ; 0x28 1162c: f8c4 8024 str.w r8, [r4, #36] ; 0x24 fp->obj.sclust = ld_clust(fs, dj.dir); /* Get object allocation info */ 11630: 4641 mov r1, r8 11632: 4628 mov r0, r5 11634: f7ff ffa9 bl 1158a 11638: 60a0 str r0, [r4, #8] fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); 1163a: f108 001c add.w r0, r8, #28 1163e: f7ff fabd bl 10bbc 11642: 60e0 str r0, [r4, #12] fp->obj.fs = fs; /* Validate the file object */ 11644: 6025 str r5, [r4, #0] fp->obj.id = fs->id; 11646: 88eb ldrh r3, [r5, #6] 11648: 80a3 strh r3, [r4, #4] fp->flag = mode; /* Set file access mode */ 1164a: 7427 strb r7, [r4, #16] fp->err = 0; /* Clear error flag */ 1164c: 2100 movs r1, #0 1164e: 7461 strb r1, [r4, #17] fp->sect = 0; /* Invalidate current data sector */ 11650: 61e1 str r1, [r4, #28] fp->fptr = 0; /* Set file pointer top of the file */ 11652: 6161 str r1, [r4, #20] mem_set(fp->buf, 0, sizeof fp->buf); /* Clear sector buffer */ 11654: f104 0828 add.w r8, r4, #40 ; 0x28 11658: f44f 7200 mov.w r2, #512 ; 0x200 1165c: 4640 mov r0, r8 1165e: f7ff fac2 bl 10be6 if ((mode & FA_SEEKEND) && fp->obj.objsize > 0) { /* Seek to end of file if FA_OPEN_APPEND is specified */ 11662: f017 0f20 tst.w r7, #32 11666: d0b4 beq.n 115d2 11668: 68e5 ldr r5, [r4, #12] 1166a: 2d00 cmp r5, #0 1166c: d0b1 beq.n 115d2 fp->fptr = fp->obj.objsize; /* Offset to seek */ 1166e: 6165 str r5, [r4, #20] bcs = (DWORD)fs->csize * SS(fs); /* Cluster size in byte */ 11670: 9b02 ldr r3, [sp, #8] 11672: 895f ldrh r7, [r3, #10] 11674: 027f lsls r7, r7, #9 clst = fp->obj.sclust; /* Follow the cluster chain */ 11676: 68a1 ldr r1, [r4, #8] for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) { 11678: 42bd cmp r5, r7 1167a: f200 8089 bhi.w 11790 fp->clust = clst; 1167e: 61a1 str r1, [r4, #24] if (res == FR_OK && ofs % SS(fs)) { /* Fill sector buffer if not on the sector boundary */ 11680: f3c5 0308 ubfx r3, r5, #0, #9 11684: 2b00 cmp r3, #0 11686: d0a4 beq.n 115d2 sc = clst2sect(fs, clst); 11688: 9f02 ldr r7, [sp, #8] 1168a: 4638 mov r0, r7 1168c: f7ff fab1 bl 10bf2 if (sc == 0) { 11690: 2800 cmp r0, #0 11692: d159 bne.n 11748 res = FR_INT_ERR; 11694: 2602 movs r6, #2 11696: e79a b.n 115ce if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { 11698: f015 0f1c tst.w r5, #28 1169c: d072 beq.n 11784 if (res == FR_NO_FILE) { /* There is no file to open, create a new entry */ 1169e: 2804 cmp r0, #4 116a0: f040 8082 bne.w 117a8 res = dir_register(&dj); 116a4: a803 add r0, sp, #12 116a6: f7f8 fdad bl a204 if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate the file if overwrite mode */ 116aa: 2800 cmp r0, #0 116ac: d162 bne.n 11774 mode |= FA_CREATE_ALWAYS; /* File is created */ 116ae: f047 0708 orr.w r7, r7, #8 if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate the file if overwrite mode */ 116b2: f017 0f08 tst.w r7, #8 116b6: d0b4 beq.n 11622 cl = ld_clust(fs, dj.dir); /* Get current cluster chain */ 116b8: f8dd 9008 ldr.w r9, [sp, #8] 116bc: f8dd 8028 ldr.w r8, [sp, #40] ; 0x28 116c0: 4641 mov r1, r8 116c2: 4648 mov r0, r9 116c4: f7ff ff61 bl 1158a 116c8: 4682 mov sl, r0 *ptr++ = (BYTE)val; val >>= 8; 116ca: 2500 movs r5, #0 116cc: f888 500e strb.w r5, [r8, #14] *ptr++ = (BYTE)val; val >>= 8; 116d0: f888 500f strb.w r5, [r8, #15] *ptr++ = (BYTE)val; val >>= 8; 116d4: 2384 movs r3, #132 ; 0x84 116d6: f888 3010 strb.w r3, [r8, #16] *ptr++ = (BYTE)val; 116da: 2350 movs r3, #80 ; 0x50 116dc: f888 3011 strb.w r3, [r8, #17] dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ 116e0: 9b0a ldr r3, [sp, #40] ; 0x28 116e2: 2220 movs r2, #32 116e4: 72da strb r2, [r3, #11] st_clust(fs, dj.dir, 0); /* Reset file allocation info */ 116e6: 462a mov r2, r5 116e8: 990a ldr r1, [sp, #40] ; 0x28 116ea: 4648 mov r0, r9 116ec: f7ff fc67 bl 10fbe st_dword(dj.dir + DIR_FileSize, 0); 116f0: 9b0a ldr r3, [sp, #40] ; 0x28 *ptr++ = (BYTE)val; val >>= 8; 116f2: 771d strb r5, [r3, #28] *ptr++ = (BYTE)val; val >>= 8; 116f4: 775d strb r5, [r3, #29] *ptr++ = (BYTE)val; val >>= 8; 116f6: 779d strb r5, [r3, #30] *ptr++ = (BYTE)val; 116f8: 77dd strb r5, [r3, #31] fs->wflag = 1; 116fa: 9b02 ldr r3, [sp, #8] 116fc: 2201 movs r2, #1 116fe: 70da strb r2, [r3, #3] if (cl != 0) { /* Remove the cluster chain if exist */ 11700: f1ba 0f00 cmp.w sl, #0 11704: d08b beq.n 1161e sc = fs->winsect; 11706: 9b02 ldr r3, [sp, #8] 11708: 6b1d ldr r5, [r3, #48] ; 0x30 res = remove_chain(&dj.obj, cl, 0); 1170a: 2200 movs r2, #0 1170c: 4651 mov r1, sl 1170e: a803 add r0, sp, #12 11710: f7ff fe63 bl 113da if (res == FR_OK) { 11714: b158 cbz r0, 1172e res = remove_chain(&dj.obj, cl, 0); 11716: 4606 mov r6, r0 if (res == FR_OK) { 11718: e759 b.n 115ce if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ 1171a: f89d 3012 ldrb.w r3, [sp, #18] 1171e: f013 0f11 tst.w r3, #17 11722: d129 bne.n 11778 if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ 11724: f015 0f04 tst.w r5, #4 11728: d0c3 beq.n 116b2 1172a: 2608 movs r6, #8 1172c: e74f b.n 115ce res = move_window(fs, sc); 1172e: 4629 mov r1, r5 11730: 9802 ldr r0, [sp, #8] 11732: f7ff fae9 bl 10d08 fs->last_clst = cl - 1; /* Reuse the cluster hole */ 11736: f10a 33ff add.w r3, sl, #4294967295 ; 0xffffffff 1173a: 9a02 ldr r2, [sp, #8] 1173c: 6113 str r3, [r2, #16] if (res == FR_OK) { 1173e: 2800 cmp r0, #0 11740: f43f af6d beq.w 1161e res = move_window(fs, sc); 11744: 4606 mov r6, r0 11746: e742 b.n 115ce fp->sect = sc + (DWORD)(ofs / SS(fs)); 11748: eb00 2255 add.w r2, r0, r5, lsr #9 1174c: 61e2 str r2, [r4, #28] if (disk_read(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR; 1174e: 2301 movs r3, #1 11750: 4641 mov r1, r8 11752: 7878 ldrb r0, [r7, #1] 11754: f7ff fa1d bl 10b92 11758: 2800 cmp r0, #0 1175a: f43f af3a beq.w 115d2 1175e: 2601 movs r6, #1 11760: e735 b.n 115ce if (!fp) return FR_INVALID_OBJECT; 11762: 2609 movs r6, #9 11764: e735 b.n 115d2 if (clst <= 1) res = FR_INT_ERR; 11766: 2602 movs r6, #2 fp->clust = clst; 11768: 61a1 str r1, [r4, #24] if (res == FR_OK && ofs % SS(fs)) { /* Fill sector buffer if not on the sector boundary */ 1176a: e730 b.n 115ce res = FR_DENIED; 1176c: 2607 movs r6, #7 1176e: e72e b.n 115ce res = FR_NO_FILE; 11770: 2604 movs r6, #4 if (res == FR_OK) { 11772: e72c b.n 115ce res = dir_register(&dj); 11774: 4606 mov r6, r0 11776: e72a b.n 115ce res = FR_DENIED; 11778: 2607 movs r6, #7 1177a: e728 b.n 115ce if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { 1177c: f015 0f1c tst.w r5, #28 11780: d111 bne.n 117a6 res = FR_INVALID_NAME; 11782: 2306 movs r3, #6 if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ 11784: 461e mov r6, r3 11786: e722 b.n 115ce for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) { 11788: 1bed subs r5, r5, r7 1178a: 42bd cmp r5, r7 1178c: f67f af77 bls.w 1167e clst = get_fat(&fp->obj, clst); 11790: 4620 mov r0, r4 11792: f7ff fcd3 bl 1113c 11796: 4601 mov r1, r0 if (clst <= 1) res = FR_INT_ERR; 11798: 2801 cmp r0, #1 1179a: d9e4 bls.n 11766 if (clst == 0xFFFFFFFF) res = FR_DISK_ERR; 1179c: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 117a0: d1f2 bne.n 11788 117a2: 2601 movs r6, #1 117a4: e7e0 b.n 11768 res = FR_INVALID_NAME; 117a6: 2306 movs r3, #6 if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ 117a8: 461e mov r6, r3 117aa: e710 b.n 115ce 000117ac : { 117ac: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 117b0: b087 sub sp, #28 117b2: 4604 mov r4, r0 117b4: 4688 mov r8, r1 117b6: 4616 mov r6, r2 117b8: 4699 mov r9, r3 *bw = 0; /* Clear write byte counter */ 117ba: 2300 movs r3, #0 117bc: f8c9 3000 str.w r3, [r9] res = validate(&fp->obj, &fs); /* Check validity of the file object */ 117c0: 9003 str r0, [sp, #12] 117c2: a905 add r1, sp, #20 117c4: f7ff fa59 bl 10c7a if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ 117c8: 9001 str r0, [sp, #4] 117ca: 2800 cmp r0, #0 117cc: d145 bne.n 1185a 117ce: 7c63 ldrb r3, [r4, #17] 117d0: 9301 str r3, [sp, #4] 117d2: 2b00 cmp r3, #0 117d4: d141 bne.n 1185a if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ 117d6: 7c23 ldrb r3, [r4, #16] 117d8: f013 0f02 tst.w r3, #2 117dc: f000 80c6 beq.w 1196c if ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) { 117e0: 6963 ldr r3, [r4, #20] 117e2: 42f3 cmn r3, r6 117e4: d300 bcc.n 117e8 btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); 117e6: 43de mvns r6, r3 for ( ; btw; /* Repeat until all data written */ 117e8: 2e00 cmp r6, #0 117ea: f000 80ba beq.w 11962 mem_cpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ 117ee: f104 0328 add.w r3, r4, #40 ; 0x28 117f2: 9302 str r3, [sp, #8] 117f4: e090 b.n 11918 clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ 117f6: 69a1 ldr r1, [r4, #24] 117f8: 9803 ldr r0, [sp, #12] 117fa: f7ff fd5f bl 112bc if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ 117fe: 2800 cmp r0, #0 11800: f000 80af beq.w 11962 if (clst == 1) ABORT(fs, FR_INT_ERR); 11804: 2801 cmp r0, #1 11806: d02c beq.n 11862 if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); 11808: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 1180c: d02d beq.n 1186a fp->clust = clst; /* Update current cluster */ 1180e: 61a0 str r0, [r4, #24] if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ 11810: 68a3 ldr r3, [r4, #8] 11812: b903 cbnz r3, 11816 11814: 60a0 str r0, [r4, #8] if (fp->flag & FA_DIRTY) { /* Write-back sector cache */ 11816: f994 3010 ldrsb.w r3, [r4, #16] 1181a: 2b00 cmp r3, #0 1181c: db29 blt.n 11872 sect = clst2sect(fs, fp->clust); /* Get current sector */ 1181e: f8dd b014 ldr.w fp, [sp, #20] 11822: 69a1 ldr r1, [r4, #24] 11824: 4658 mov r0, fp 11826: f7ff f9e4 bl 10bf2 if (sect == 0) ABORT(fs, FR_INT_ERR); 1182a: 4682 mov sl, r0 1182c: b390 cbz r0, 11894 sect += csect; 1182e: 44ba add sl, r7 if (cc > 0) { /* Write maximum contiguous sectors directly */ 11830: f5b6 7f00 cmp.w r6, #512 ; 0x200 11834: d345 bcc.n 118c2 cc = btw / SS(fs); /* When remaining bytes >= sector size, */ 11836: 0a75 lsrs r5, r6, #9 if (csect + cc > fs->csize) { /* Clip at cluster boundary */ 11838: f8bb 300a ldrh.w r3, [fp, #10] 1183c: 197a adds r2, r7, r5 1183e: 429a cmp r2, r3 cc = fs->csize - csect; 11840: bf88 it hi 11842: 1bdd subhi r5, r3, r7 if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); 11844: 462b mov r3, r5 11846: 4652 mov r2, sl 11848: 4641 mov r1, r8 1184a: f89b 0001 ldrb.w r0, [fp, #1] 1184e: f7ff f9a7 bl 10ba0 11852: b318 cbz r0, 1189c 11854: 2301 movs r3, #1 11856: 7463 strb r3, [r4, #17] 11858: 9301 str r3, [sp, #4] } 1185a: 9801 ldr r0, [sp, #4] 1185c: b007 add sp, #28 1185e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} if (clst == 1) ABORT(fs, FR_INT_ERR); 11862: 2302 movs r3, #2 11864: 7463 strb r3, [r4, #17] 11866: 9301 str r3, [sp, #4] 11868: e7f7 b.n 1185a if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); 1186a: 2301 movs r3, #1 1186c: 7463 strb r3, [r4, #17] 1186e: 9301 str r3, [sp, #4] 11870: e7f3 b.n 1185a if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); 11872: 2301 movs r3, #1 11874: 69e2 ldr r2, [r4, #28] 11876: 9902 ldr r1, [sp, #8] 11878: 9805 ldr r0, [sp, #20] 1187a: 7840 ldrb r0, [r0, #1] 1187c: f7ff f990 bl 10ba0 11880: b920 cbnz r0, 1188c fp->flag &= (BYTE)~FA_DIRTY; 11882: 7c23 ldrb r3, [r4, #16] 11884: f003 037f and.w r3, r3, #127 ; 0x7f 11888: 7423 strb r3, [r4, #16] 1188a: e7c8 b.n 1181e if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); 1188c: 2301 movs r3, #1 1188e: 7463 strb r3, [r4, #17] 11890: 9301 str r3, [sp, #4] 11892: e7e2 b.n 1185a if (sect == 0) ABORT(fs, FR_INT_ERR); 11894: 2302 movs r3, #2 11896: 7463 strb r3, [r4, #17] 11898: 9301 str r3, [sp, #4] 1189a: e7de b.n 1185a if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ 1189c: 69e1 ldr r1, [r4, #28] 1189e: eba1 010a sub.w r1, r1, sl 118a2: 42a9 cmp r1, r5 118a4: d301 bcc.n 118aa wcnt = SS(fs) * cc; /* Number of bytes transferred */ 118a6: 026d lsls r5, r5, #9 continue; 118a8: e026 b.n 118f8 mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); 118aa: f44f 7200 mov.w r2, #512 ; 0x200 118ae: eb08 2141 add.w r1, r8, r1, lsl #9 118b2: 9802 ldr r0, [sp, #8] 118b4: f7ff f98d bl 10bd2 fp->flag &= (BYTE)~FA_DIRTY; 118b8: 7c23 ldrb r3, [r4, #16] 118ba: f003 037f and.w r3, r3, #127 ; 0x7f 118be: 7423 strb r3, [r4, #16] 118c0: e7f1 b.n 118a6 if (fp->sect != sect && /* Fill sector cache with file data */ 118c2: 69e3 ldr r3, [r4, #28] 118c4: 4553 cmp r3, sl 118c6: d003 beq.n 118d0 118c8: 6962 ldr r2, [r4, #20] 118ca: 68e3 ldr r3, [r4, #12] 118cc: 429a cmp r2, r3 118ce: d33b bcc.n 11948 fp->sect = sect; 118d0: f8c4 a01c str.w sl, [r4, #28] wcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes remains in the sector */ 118d4: 6960 ldr r0, [r4, #20] 118d6: f3c0 0008 ubfx r0, r0, #0, #9 118da: f5c0 7500 rsb r5, r0, #512 ; 0x200 if (wcnt > btw) wcnt = btw; /* Clip it by btw if needed */ 118de: 42b5 cmp r5, r6 118e0: bf28 it cs 118e2: 4635 movcs r5, r6 mem_cpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ 118e4: 462a mov r2, r5 118e6: 4641 mov r1, r8 118e8: 9b02 ldr r3, [sp, #8] 118ea: 4418 add r0, r3 118ec: f7ff f971 bl 10bd2 fp->flag |= FA_DIRTY; 118f0: 7c23 ldrb r3, [r4, #16] 118f2: f063 037f orn r3, r3, #127 ; 0x7f 118f6: 7423 strb r3, [r4, #16] btw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize) { 118f8: f8d9 3000 ldr.w r3, [r9] 118fc: 442b add r3, r5 118fe: f8c9 3000 str.w r3, [r9] 11902: 44a8 add r8, r5 11904: 6963 ldr r3, [r4, #20] 11906: 442b add r3, r5 11908: 6163 str r3, [r4, #20] 1190a: 68e2 ldr r2, [r4, #12] 1190c: 4293 cmp r3, r2 1190e: bf38 it cc 11910: 4613 movcc r3, r2 11912: 60e3 str r3, [r4, #12] for ( ; btw; /* Repeat until all data written */ 11914: 1b76 subs r6, r6, r5 11916: d024 beq.n 11962 if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ 11918: 6963 ldr r3, [r4, #20] 1191a: f3c3 0208 ubfx r2, r3, #0, #9 1191e: 2a00 cmp r2, #0 11920: d1d8 bne.n 118d4 csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ 11922: 9a05 ldr r2, [sp, #20] 11924: 8957 ldrh r7, [r2, #10] 11926: 3f01 subs r7, #1 if (csect == 0) { /* On the cluster boundary? */ 11928: ea17 2753 ands.w r7, r7, r3, lsr #9 1192c: f47f af73 bne.w 11816 if (fp->fptr == 0) { /* On the top of the file? */ 11930: 2b00 cmp r3, #0 11932: f47f af60 bne.w 117f6 clst = fp->obj.sclust; /* Follow from the origin */ 11936: 68a0 ldr r0, [r4, #8] if (clst == 0) { /* If no cluster is allocated, */ 11938: 2800 cmp r0, #0 1193a: f47f af63 bne.w 11804 clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ 1193e: 2100 movs r1, #0 11940: 9803 ldr r0, [sp, #12] 11942: f7ff fcbb bl 112bc 11946: e75a b.n 117fe disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { 11948: 2301 movs r3, #1 1194a: 4652 mov r2, sl 1194c: 9902 ldr r1, [sp, #8] 1194e: f89b 0001 ldrb.w r0, [fp, #1] 11952: f7ff f91e bl 10b92 fp->fptr < fp->obj.objsize && 11956: 2800 cmp r0, #0 11958: d0ba beq.n 118d0 ABORT(fs, FR_DISK_ERR); 1195a: 2301 movs r3, #1 1195c: 7463 strb r3, [r4, #17] 1195e: 9301 str r3, [sp, #4] 11960: e77b b.n 1185a fp->flag |= FA_MODIFIED; /* Set file change flag */ 11962: 7c23 ldrb r3, [r4, #16] 11964: f043 0340 orr.w r3, r3, #64 ; 0x40 11968: 7423 strb r3, [r4, #16] LEAVE_FF(fs, FR_OK); 1196a: e776 b.n 1185a if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ 1196c: 2307 movs r3, #7 1196e: 9301 str r3, [sp, #4] 11970: e773 b.n 1185a 00011972 : i = pb->idx; /* Write index of pb->buf[] */ 11972: 6843 ldr r3, [r0, #4] if (i < 0) return; 11974: 2b00 cmp r3, #0 11976: db1a blt.n 119ae { 11978: b570 push {r4, r5, r6, lr} 1197a: b082 sub sp, #8 1197c: 4604 mov r4, r0 nc = pb->nchr; /* Write unit counter */ 1197e: 6885 ldr r5, [r0, #8] pb->buf[i++] = (BYTE)c; 11980: 1c5e adds r6, r3, #1 11982: 4403 add r3, r0 11984: 7319 strb r1, [r3, #12] if (i >= (int)(sizeof pb->buf) - 4) { /* Write buffered characters to the file */ 11986: 2e3b cmp r6, #59 ; 0x3b 11988: dc04 bgt.n 11994 pb->idx = i; 1198a: 6066 str r6, [r4, #4] pb->nchr = nc + 1; 1198c: 3501 adds r5, #1 1198e: 60a5 str r5, [r4, #8] } 11990: b002 add sp, #8 11992: bd70 pop {r4, r5, r6, pc} f_write(pb->fp, pb->buf, (UINT)i, &n); 11994: 4601 mov r1, r0 11996: f851 0b0c ldr.w r0, [r1], #12 1199a: ab01 add r3, sp, #4 1199c: 4632 mov r2, r6 1199e: f7ff ff05 bl 117ac i = (n == (UINT)i) ? 0 : -1; 119a2: 9b01 ldr r3, [sp, #4] 119a4: 1b9e subs r6, r3, r6 119a6: bf18 it ne 119a8: f04f 36ff movne.w r6, #4294967295 ; 0xffffffff 119ac: e7ed b.n 1198a 119ae: 4770 bx lr 000119b0 : if ( pb->idx >= 0 /* Flush buffered characters to the file */ 119b0: 6842 ldr r2, [r0, #4] 119b2: 2a00 cmp r2, #0 119b4: db10 blt.n 119d8 { 119b6: b510 push {r4, lr} 119b8: b082 sub sp, #8 119ba: 4604 mov r4, r0 && f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK 119bc: 4601 mov r1, r0 119be: f851 0b0c ldr.w r0, [r1], #12 119c2: ab01 add r3, sp, #4 119c4: f7ff fef2 bl 117ac 119c8: b948 cbnz r0, 119de && (UINT)pb->idx == nw) return pb->nchr; 119ca: 6862 ldr r2, [r4, #4] 119cc: 9b01 ldr r3, [sp, #4] 119ce: 429a cmp r2, r3 119d0: d108 bne.n 119e4 119d2: 68a0 ldr r0, [r4, #8] } 119d4: b002 add sp, #8 119d6: bd10 pop {r4, pc} return EOF; 119d8: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff } 119dc: 4770 bx lr return EOF; 119de: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 119e2: e7f7 b.n 119d4 119e4: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 119e8: e7f4 b.n 119d4 000119ea : { 119ea: b530 push {r4, r5, lr} 119ec: b083 sub sp, #12 119ee: 4604 mov r4, r0 res = validate(&fp->obj, &fs); /* Check validity of the file object */ 119f0: a901 add r1, sp, #4 119f2: f7ff f942 bl 10c7a if (res == FR_OK) { 119f6: 4603 mov r3, r0 119f8: b960 cbnz r0, 11a14 if (fp->flag & FA_MODIFIED) { /* Is there any change to the file? */ 119fa: 7c22 ldrb r2, [r4, #16] 119fc: f012 0340 ands.w r3, r2, #64 ; 0x40 11a00: d008 beq.n 11a14 if (fp->flag & FA_DIRTY) { /* Write-back cached data if needed */ 11a02: f012 0f80 tst.w r2, #128 ; 0x80 11a06: d108 bne.n 11a1a res = move_window(fs, fp->dir_sect); 11a08: 6a21 ldr r1, [r4, #32] 11a0a: 9801 ldr r0, [sp, #4] 11a0c: f7ff f97c bl 10d08 if (res == FR_OK) { 11a10: 4603 mov r3, r0 11a12: b180 cbz r0, 11a36 } 11a14: 4618 mov r0, r3 11a16: b003 add sp, #12 11a18: bd30 pop {r4, r5, pc} if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR); 11a1a: 2301 movs r3, #1 11a1c: 69e2 ldr r2, [r4, #28] 11a1e: f104 0128 add.w r1, r4, #40 ; 0x28 11a22: 9801 ldr r0, [sp, #4] 11a24: 7840 ldrb r0, [r0, #1] 11a26: f7ff f8bb bl 10ba0 11a2a: bb58 cbnz r0, 11a84 fp->flag &= (BYTE)~FA_DIRTY; 11a2c: 7c23 ldrb r3, [r4, #16] 11a2e: f003 037f and.w r3, r3, #127 ; 0x7f 11a32: 7423 strb r3, [r4, #16] 11a34: e7e8 b.n 11a08 dir = fp->dir_ptr; 11a36: 6a65 ldr r5, [r4, #36] ; 0x24 dir[DIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ 11a38: 7aeb ldrb r3, [r5, #11] 11a3a: f043 0320 orr.w r3, r3, #32 11a3e: 72eb strb r3, [r5, #11] st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation information */ 11a40: 68a2 ldr r2, [r4, #8] 11a42: 4629 mov r1, r5 11a44: 6820 ldr r0, [r4, #0] 11a46: f7ff faba bl 10fbe st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ 11a4a: 68e3 ldr r3, [r4, #12] *ptr++ = (BYTE)val; val >>= 8; 11a4c: 772b strb r3, [r5, #28] 11a4e: 0a1a lsrs r2, r3, #8 *ptr++ = (BYTE)val; val >>= 8; 11a50: 776a strb r2, [r5, #29] 11a52: 0c1a lsrs r2, r3, #16 *ptr++ = (BYTE)val; val >>= 8; 11a54: 77aa strb r2, [r5, #30] 11a56: 0e1b lsrs r3, r3, #24 *ptr++ = (BYTE)val; 11a58: 77eb strb r3, [r5, #31] *ptr++ = (BYTE)val; val >>= 8; 11a5a: 2300 movs r3, #0 11a5c: 75ab strb r3, [r5, #22] *ptr++ = (BYTE)val; val >>= 8; 11a5e: 75eb strb r3, [r5, #23] *ptr++ = (BYTE)val; val >>= 8; 11a60: 2284 movs r2, #132 ; 0x84 11a62: 762a strb r2, [r5, #24] *ptr++ = (BYTE)val; 11a64: 2250 movs r2, #80 ; 0x50 11a66: 766a strb r2, [r5, #25] *ptr++ = (BYTE)val; val >>= 8; 11a68: 74ab strb r3, [r5, #18] *ptr++ = (BYTE)val; 11a6a: 74eb strb r3, [r5, #19] fs->wflag = 1; 11a6c: 9b01 ldr r3, [sp, #4] 11a6e: 2201 movs r2, #1 11a70: 70da strb r2, [r3, #3] res = sync_fs(fs); /* Restore it to the directory */ 11a72: 9801 ldr r0, [sp, #4] 11a74: f7ff f9a8 bl 10dc8 11a78: 4603 mov r3, r0 fp->flag &= (BYTE)~FA_MODIFIED; 11a7a: 7c22 ldrb r2, [r4, #16] 11a7c: f022 0240 bic.w r2, r2, #64 ; 0x40 11a80: 7422 strb r2, [r4, #16] 11a82: e7c7 b.n 11a14 if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR); 11a84: 2301 movs r3, #1 11a86: e7c5 b.n 11a14 00011a88 : { 11a88: b510 push {r4, lr} 11a8a: b082 sub sp, #8 11a8c: 4604 mov r4, r0 res = f_sync(fp); /* Flush cached data */ 11a8e: f7ff ffac bl 119ea if (res == FR_OK) 11a92: 4603 mov r3, r0 11a94: b110 cbz r0, 11a9c } 11a96: 4618 mov r0, r3 11a98: b002 add sp, #8 11a9a: bd10 pop {r4, pc} res = validate(&fp->obj, &fs); /* Lock volume */ 11a9c: a901 add r1, sp, #4 11a9e: 4620 mov r0, r4 11aa0: f7ff f8eb bl 10c7a if (res == FR_OK) { 11aa4: 4603 mov r3, r0 11aa6: 2800 cmp r0, #0 11aa8: d1f5 bne.n 11a96 fp->obj.fs = 0; /* Invalidate file object */ 11aaa: 2200 movs r2, #0 11aac: 6022 str r2, [r4, #0] 11aae: e7f2 b.n 11a96 00011ab0 : { 11ab0: b510 push {r4, lr} 11ab2: b084 sub sp, #16 11ab4: 9101 str r1, [sp, #4] if (!dp) return FR_INVALID_OBJECT; 11ab6: 2800 cmp r0, #0 11ab8: d032 beq.n 11b20 11aba: 4604 mov r4, r0 res = mount_volume(&path, &fs, 0); 11abc: 2200 movs r2, #0 11abe: a903 add r1, sp, #12 11ac0: a801 add r0, sp, #4 11ac2: f7f8 fd73 bl a5ac if (res == FR_OK) { 11ac6: 4603 mov r3, r0 11ac8: b120 cbz r0, 11ad4 if (res != FR_OK) dp->obj.fs = 0; /* Invalidate the directory object if function faild */ 11aca: 2200 movs r2, #0 11acc: 6022 str r2, [r4, #0] } 11ace: 4618 mov r0, r3 11ad0: b004 add sp, #16 11ad2: bd10 pop {r4, pc} dp->obj.fs = fs; 11ad4: 9b03 ldr r3, [sp, #12] 11ad6: 6023 str r3, [r4, #0] res = follow_path(dp, path); /* Follow the path to the directory */ 11ad8: 9901 ldr r1, [sp, #4] 11ada: 4620 mov r0, r4 11adc: f7f8 ffb0 bl aa40 if (res == FR_OK) { /* Follow completed */ 11ae0: 4603 mov r3, r0 11ae2: b9a0 cbnz r0, 11b0e if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ 11ae4: f994 302b ldrsb.w r3, [r4, #43] ; 0x2b 11ae8: 2b00 cmp r3, #0 11aea: db08 blt.n 11afe if (dp->obj.attr & AM_DIR) { /* This object is a sub-directory */ 11aec: 79a3 ldrb r3, [r4, #6] 11aee: f013 0f10 tst.w r3, #16 11af2: d011 beq.n 11b18 dp->obj.sclust = ld_clust(fs, dp->dir); /* Get object allocation info */ 11af4: 69e1 ldr r1, [r4, #28] 11af6: 9803 ldr r0, [sp, #12] 11af8: f7ff fd47 bl 1158a 11afc: 60a0 str r0, [r4, #8] dp->obj.id = fs->id; 11afe: 9b03 ldr r3, [sp, #12] 11b00: 88db ldrh r3, [r3, #6] 11b02: 80a3 strh r3, [r4, #4] res = dir_sdi(dp, 0); /* Rewind directory */ 11b04: 2100 movs r1, #0 11b06: 4620 mov r0, r4 11b08: f7ff fb80 bl 1120c 11b0c: 4603 mov r3, r0 if (res == FR_NO_FILE) res = FR_NO_PATH; 11b0e: 2b04 cmp r3, #4 11b10: d004 beq.n 11b1c if (res != FR_OK) dp->obj.fs = 0; /* Invalidate the directory object if function faild */ 11b12: 2b00 cmp r3, #0 11b14: d0db beq.n 11ace 11b16: e7d8 b.n 11aca res = FR_NO_PATH; 11b18: 2305 movs r3, #5 11b1a: e7d6 b.n 11aca if (res == FR_NO_FILE) res = FR_NO_PATH; 11b1c: 2305 movs r3, #5 11b1e: e7d4 b.n 11aca if (!dp) return FR_INVALID_OBJECT; 11b20: 2309 movs r3, #9 11b22: e7d4 b.n 11ace 00011b24 : { 11b24: b570 push {r4, r5, r6, lr} 11b26: b082 sub sp, #8 11b28: 4604 mov r4, r0 11b2a: 460d mov r5, r1 res = validate(&dp->obj, &fs); /* Check validity of the directory object */ 11b2c: a901 add r1, sp, #4 11b2e: f7ff f8a4 bl 10c7a if (res == FR_OK) { 11b32: 4603 mov r3, r0 11b34: b9a0 cbnz r0, 11b60 if (!fno) { 11b36: b1b5 cbz r5, 11b66 res = DIR_READ_FILE(dp); /* Read an item */ 11b38: 2100 movs r1, #0 11b3a: 4620 mov r0, r4 11b3c: f7f8 fee4 bl a908 11b40: 4603 mov r3, r0 if (res == FR_OK) { /* A valid entry is found */ 11b42: f010 06fb ands.w r6, r0, #251 ; 0xfb 11b46: d10b bne.n 11b60 get_fileinfo(dp, fno); /* Get the object information */ 11b48: 4629 mov r1, r5 11b4a: 4620 mov r0, r4 11b4c: f7ff fa44 bl 10fd8 res = dir_next(dp, 0); /* Increment index for next */ 11b50: 2100 movs r1, #0 11b52: 4620 mov r0, r4 11b54: f7ff fc8b bl 1146e 11b58: 4603 mov r3, r0 if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ 11b5a: 2804 cmp r0, #4 11b5c: bf08 it eq 11b5e: 4633 moveq r3, r6 } 11b60: 4618 mov r0, r3 11b62: b002 add sp, #8 11b64: bd70 pop {r4, r5, r6, pc} res = dir_sdi(dp, 0); /* Rewind the directory object */ 11b66: 2100 movs r1, #0 11b68: 4620 mov r0, r4 11b6a: f7ff fb4f bl 1120c 11b6e: 4603 mov r3, r0 11b70: e7f6 b.n 11b60 00011b72 : { 11b72: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 11b76: b088 sub sp, #32 11b78: 9001 str r0, [sp, #4] 11b7a: 4689 mov r9, r1 11b7c: 4614 mov r4, r2 res = mount_volume(&path, &fs, 0); 11b7e: 2200 movs r2, #0 11b80: a907 add r1, sp, #28 11b82: a801 add r0, sp, #4 11b84: f7f8 fd12 bl a5ac if (res == FR_OK) { 11b88: 4680 mov r8, r0 11b8a: b940 cbnz r0, 11b9e *fatfs = fs; /* Return ptr to the fs object */ 11b8c: 9b07 ldr r3, [sp, #28] 11b8e: 6023 str r3, [r4, #0] if (fs->free_clst <= fs->n_fatent - 2) { 11b90: 695a ldr r2, [r3, #20] 11b92: 699d ldr r5, [r3, #24] 11b94: 1ea9 subs r1, r5, #2 11b96: 428a cmp r2, r1 11b98: d805 bhi.n 11ba6 *nclst = fs->free_clst; 11b9a: f8c9 2000 str.w r2, [r9] } 11b9e: 4640 mov r0, r8 11ba0: b008 add sp, #32 11ba2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} if (fs->fs_type == FS_FAT12) { /* FAT12: Scan bit field FAT entries */ 11ba6: 781f ldrb r7, [r3, #0] 11ba8: 2f01 cmp r7, #1 11baa: d003 beq.n 11bb4 sect = fs->fatbase; /* Top of the FAT */ 11bac: 6a5f ldr r7, [r3, #36] ; 0x24 i = 0; /* Offset in the sector */ 11bae: 2400 movs r4, #0 nfree = 0; 11bb0: 4626 mov r6, r4 11bb2: e02b b.n 11c0c clst = 2; obj.fs = fs; 11bb4: 9303 str r3, [sp, #12] 11bb6: 2402 movs r4, #2 nfree = 0; 11bb8: 2600 movs r6, #0 11bba: e004 b.n 11bc6 } while (++clst < fs->n_fatent); 11bbc: 3401 adds r4, #1 11bbe: 9b07 ldr r3, [sp, #28] 11bc0: 699b ldr r3, [r3, #24] 11bc2: 42a3 cmp r3, r4 11bc4: d938 bls.n 11c38 stat = get_fat(&obj, clst); 11bc6: 4621 mov r1, r4 11bc8: a803 add r0, sp, #12 11bca: f7ff fab7 bl 1113c if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } 11bce: f1b0 3fff cmp.w r0, #4294967295 ; 0xffffffff 11bd2: d02b beq.n 11c2c if (stat == 1) { res = FR_INT_ERR; break; } 11bd4: 2801 cmp r0, #1 11bd6: d02b beq.n 11c30 if (stat == 0) nfree++; 11bd8: 2800 cmp r0, #0 11bda: d1ef bne.n 11bbc 11bdc: 3601 adds r6, #1 11bde: e7ed b.n 11bbc res = move_window(fs, sect++); 11be0: f107 0a01 add.w sl, r7, #1 11be4: 4639 mov r1, r7 11be6: 9807 ldr r0, [sp, #28] 11be8: f7ff f88e bl 10d08 if (res != FR_OK) break; 11bec: bb18 cbnz r0, 11c36 res = move_window(fs, sect++); 11bee: 4657 mov r7, sl 11bf0: e00e b.n 11c10 if ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) nfree++; 11bf2: 3034 adds r0, #52 ; 0x34 11bf4: 4420 add r0, r4 11bf6: f7fe ffe1 bl 10bbc 11bfa: f030 4370 bics.w r3, r0, #4026531840 ; 0xf0000000 11bfe: bf08 it eq 11c00: 3601 addeq r6, #1 i += 4; 11c02: 3404 adds r4, #4 i %= SS(fs); 11c04: f3c4 0408 ubfx r4, r4, #0, #9 } while (--clst); 11c08: 3d01 subs r5, #1 11c0a: d015 beq.n 11c38 if (i == 0) { 11c0c: 2c00 cmp r4, #0 11c0e: d0e7 beq.n 11be0 if (fs->fs_type == FS_FAT16) { 11c10: 9807 ldr r0, [sp, #28] 11c12: 7803 ldrb r3, [r0, #0] 11c14: 2b02 cmp r3, #2 11c16: d1ec bne.n 11bf2 if (ld_word(fs->win + i) == 0) nfree++; 11c18: 3034 adds r0, #52 ; 0x34 11c1a: 1903 adds r3, r0, r4 rv = rv << 8 | ptr[0]; 11c1c: 785a ldrb r2, [r3, #1] 11c1e: 5d03 ldrb r3, [r0, r4] if (ld_word(fs->win + i) == 0) nfree++; 11c20: ea53 2302 orrs.w r3, r3, r2, lsl #8 11c24: bf08 it eq 11c26: 3601 addeq r6, #1 i += 2; 11c28: 3402 adds r4, #2 11c2a: e7eb b.n 11c04 if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } 11c2c: 46b8 mov r8, r7 11c2e: e003 b.n 11c38 if (stat == 1) { res = FR_INT_ERR; break; } 11c30: f04f 0802 mov.w r8, #2 11c34: e000 b.n 11c38 res = move_window(fs, sect++); 11c36: 4680 mov r8, r0 *nclst = nfree; /* Return the free clusters */ 11c38: f8c9 6000 str.w r6, [r9] fs->free_clst = nfree; /* Now free_clst is valid */ 11c3c: 9b07 ldr r3, [sp, #28] 11c3e: 615e str r6, [r3, #20] fs->fsi_flag |= 1; /* FAT32: FSInfo is to be updated */ 11c40: 791a ldrb r2, [r3, #4] 11c42: f042 0201 orr.w r2, r2, #1 11c46: 711a strb r2, [r3, #4] 11c48: e7a9 b.n 11b9e 00011c4a : // Allow handler to be removed by setting a define (via command line) #if !defined (__SEMIHOST_HARDFAULT_DISABLE) __attribute__((naked)) void HardFault_Handler(void){ __asm( ".syntax unified\n" 11c4a: 2004 movs r0, #4 11c4c: 4671 mov r1, lr 11c4e: 4208 tst r0, r1 11c50: d002 beq.n 11c58 <_MSP> 11c52: f3ef 8009 mrs r0, PSP 11c56: e001 b.n 11c5c <_process> 00011c58 <_MSP>: 11c58: f3ef 8008 mrs r0, MSP 00011c5c <_process>: 11c5c: 6981 ldr r1, [r0, #24] 11c5e: 880a ldrh r2, [r1, #0] 11c60: f64b 63ab movw r3, #48811 ; 0xbeab 11c64: 429a cmp r2, r3 11c66: d000 beq.n 11c6a <_semihost_return> 11c68: e7fe b.n 11c68 <_process+0xc> 00011c6a <_semihost_return>: 11c6a: 3102 adds r1, #2 11c6c: 6181 str r1, [r0, #24] 11c6e: 2120 movs r1, #32 11c70: 6001 str r1, [r0, #0] 11c72: 4770 bx lr 00011c74 : { 11c74: b508 push {r3, lr} 11c76: 4608 mov r0, r1 11c78: 4611 mov r1, r2 if (kStatus_Success != SPIFLASH_WriteBlocks(buff, sector, count)) 11c7a: 461a mov r2, r3 11c7c: f7fa fcf2 bl c664 } 11c80: 3000 adds r0, #0 11c82: bf18 it ne 11c84: 2001 movne r0, #1 11c86: bd08 pop {r3, pc} 00011c88 : { 11c88: b508 push {r3, lr} 11c8a: 4608 mov r0, r1 11c8c: 4611 mov r1, r2 if (kStatus_Success != SPIFLASH_ReadBlocks(buff, sector, count)) 11c8e: 461a mov r2, r3 11c90: f7fa fd4c bl c72c } 11c94: 3000 adds r0, #0 11c96: bf18 it ne 11c98: 2001 movne r0, #1 11c9a: bd08 pop {r3, pc} 00011c9c : if (0U != (base->SC2 & ADC_SC2_ADACT_MASK)) 11c9c: 6a03 ldr r3, [r0, #32] 11c9e: f003 0380 and.w r3, r3, #128 ; 0x80 if (0U != (base->SC3 & ADC_SC3_CALF_MASK)) 11ca2: 6a42 ldr r2, [r0, #36] ; 0x24 11ca4: f012 0f40 tst.w r2, #64 ; 0x40 ret |= kADC16_CalibrationFailedFlag; 11ca8: bf18 it ne 11caa: f043 0340 orrne.w r3, r3, #64 ; 0x40 } 11cae: 4618 mov r0, r3 11cb0: 4770 bx lr 00011cb2 : { 11cb2: b570 push {r4, r5, r6, lr} 11cb4: b082 sub sp, #8 11cb6: 4604 mov r4, r0 if (0U != (ADC_SC2_ADTRG_MASK & base->SC2)) 11cb8: 6a03 ldr r3, [r0, #32] 11cba: f013 0f40 tst.w r3, #64 ; 0x40 11cbe: d009 beq.n 11cd4 base->SC2 &= ~ADC_SC2_ADTRG_MASK; 11cc0: 6a03 ldr r3, [r0, #32] 11cc2: f023 0340 bic.w r3, r3, #64 ; 0x40 11cc6: 6203 str r3, [r0, #32] bHWTrigger = true; 11cc8: 2501 movs r5, #1 base->SC3 |= ADC_SC3_CAL_MASK | ADC_SC3_CALF_MASK; 11cca: 6a63 ldr r3, [r4, #36] ; 0x24 11ccc: f043 03c0 orr.w r3, r3, #192 ; 0xc0 11cd0: 6263 str r3, [r4, #36] ; 0x24 while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(base, 0U))) 11cd2: e03f b.n 11d54 bool bHWTrigger = false; 11cd4: 2500 movs r5, #0 11cd6: e7f8 b.n 11cca status_t status = kStatus_Success; 11cd8: 2500 movs r5, #0 base->SC2 |= ADC_SC2_ADTRG_MASK; 11cda: 6a23 ldr r3, [r4, #32] 11cdc: f043 0340 orr.w r3, r3, #64 ; 0x40 11ce0: 6223 str r3, [r4, #32] if (0U != (kADC16_CalibrationFailedFlag & ADC16_GetStatusFlags(base))) 11ce2: 4620 mov r0, r4 11ce4: f7ff ffda bl 11c9c 11ce8: f000 0040 and.w r0, r0, #64 ; 0x40 11cec: ea50 0305 orrs.w r3, r0, r5 11cf0: d128 bne.n 11d44 tmp32 = base->CLP0 + base->CLP1 + base->CLP2 + base->CLP3 + base->CLP4 + base->CLPS; 11cf2: 6ce3 ldr r3, [r4, #76] ; 0x4c 11cf4: 6ca6 ldr r6, [r4, #72] ; 0x48 11cf6: 6c65 ldr r5, [r4, #68] ; 0x44 11cf8: 6c20 ldr r0, [r4, #64] ; 0x40 11cfa: 6be1 ldr r1, [r4, #60] ; 0x3c 11cfc: 6ba2 ldr r2, [r4, #56] ; 0x38 11cfe: 4433 add r3, r6 11d00: 442b add r3, r5 11d02: 4403 add r3, r0 11d04: 440b add r3, r1 11d06: 4413 add r3, r2 11d08: 9301 str r3, [sp, #4] tmp32 = 0x8000U | (tmp32 >> 1U); 11d0a: 9b01 ldr r3, [sp, #4] 11d0c: 085b lsrs r3, r3, #1 11d0e: f443 4300 orr.w r3, r3, #32768 ; 0x8000 11d12: 9301 str r3, [sp, #4] base->PG = tmp32; 11d14: 9b01 ldr r3, [sp, #4] 11d16: 62e3 str r3, [r4, #44] ; 0x2c tmp32 = base->CLM0 + base->CLM1 + base->CLM2 + base->CLM3 + base->CLM4 + base->CLMS; 11d18: 6ee3 ldr r3, [r4, #108] ; 0x6c 11d1a: 6ea6 ldr r6, [r4, #104] ; 0x68 11d1c: 6e65 ldr r5, [r4, #100] ; 0x64 11d1e: 6e20 ldr r0, [r4, #96] ; 0x60 11d20: 6de1 ldr r1, [r4, #92] ; 0x5c 11d22: 6da2 ldr r2, [r4, #88] ; 0x58 11d24: 4433 add r3, r6 11d26: 442b add r3, r5 11d28: 4403 add r3, r0 11d2a: 440b add r3, r1 11d2c: 4413 add r3, r2 11d2e: 9301 str r3, [sp, #4] tmp32 = 0x8000U | (tmp32 >> 1U); 11d30: 9b01 ldr r3, [sp, #4] 11d32: 085b lsrs r3, r3, #1 11d34: f443 4300 orr.w r3, r3, #32768 ; 0x8000 11d38: 9301 str r3, [sp, #4] base->MG = tmp32; 11d3a: 9b01 ldr r3, [sp, #4] 11d3c: 6323 str r3, [r4, #48] ; 0x30 return kStatus_Success; 11d3e: 2000 movs r0, #0 } 11d40: b002 add sp, #8 11d42: bd70 pop {r4, r5, r6, pc} status = kStatus_Fail; 11d44: 2001 movs r0, #1 11d46: e7fb b.n 11d40 if (0U != (kADC16_CalibrationFailedFlag & ADC16_GetStatusFlags(base))) 11d48: 4620 mov r0, r4 11d4a: f7ff ffa7 bl 11c9c 11d4e: f010 0f40 tst.w r0, #64 ; 0x40 11d52: d10e bne.n 11d72 if (0U != (base->SC1[channelGroup] & ADC_SC1_COCO_MASK)) 11d54: 6823 ldr r3, [r4, #0] 11d56: f013 0f80 tst.w r3, #128 ; 0x80 11d5a: d0f5 beq.n 11d48 tmp32 = base->R[0]; /* Dummy read to clear COCO caused by calibration. */ 11d5c: 6923 ldr r3, [r4, #16] 11d5e: 9301 str r3, [sp, #4] if (bHWTrigger) 11d60: 2d00 cmp r5, #0 11d62: d1b9 bne.n 11cd8 status_t status = kStatus_Success; 11d64: 2500 movs r5, #0 11d66: e7bc b.n 11ce2 if (0U != (kADC16_CalibrationFailedFlag & ADC16_GetStatusFlags(base))) 11d68: 4620 mov r0, r4 11d6a: f7ff ff97 bl 11c9c status = kStatus_Fail; 11d6e: 2001 movs r0, #1 11d70: e7e6 b.n 11d40 tmp32 = base->R[0]; /* Dummy read to clear COCO caused by calibration. */ 11d72: 6923 ldr r3, [r4, #16] 11d74: 9301 str r3, [sp, #4] if (bHWTrigger) 11d76: 2d00 cmp r5, #0 11d78: d0f6 beq.n 11d68 status = kStatus_Fail; 11d7a: 2501 movs r5, #1 11d7c: e7ad b.n 11cda 00011d7e : { 11d7e: b430 push {r4, r5} 11d80: f89d 4008 ldrb.w r4, [sp, #8] return (bool)((base->MCR) & SPI_MCR_MSTR_MASK); 11d84: 6805 ldr r5, [r0, #0] if (DSPI_IsMaster(base)) 11d86: 2d00 cmp r5, #0 11d88: db01 blt.n 11d8e } 11d8a: bc30 pop {r4, r5} 11d8c: 4770 bx lr switch (whichDelay) 11d8e: 2c02 cmp r4, #2 11d90: d013 beq.n 11dba 11d92: 2c03 cmp r4, #3 11d94: d022 beq.n 11ddc 11d96: 2c01 cmp r4, #1 11d98: d1f7 bne.n 11d8a base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PCSSCK_MASK) & (~SPI_CTAR_CSSCK_MASK)) | 11d9a: eb00 0081 add.w r0, r0, r1, lsl #2 11d9e: 68c1 ldr r1, [r0, #12] SPI_CTAR_PCSSCK(prescaler) | SPI_CTAR_CSSCK(scaler); 11da0: 0592 lsls r2, r2, #22 11da2: f402 0240 and.w r2, r2, #12582912 ; 0xc00000 11da6: 031b lsls r3, r3, #12 11da8: b29b uxth r3, r3 11daa: 431a orrs r2, r3 base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PCSSCK_MASK) & (~SPI_CTAR_CSSCK_MASK)) | 11dac: f421 0340 bic.w r3, r1, #12582912 ; 0xc00000 11db0: f423 4370 bic.w r3, r3, #61440 ; 0xf000 SPI_CTAR_PCSSCK(prescaler) | SPI_CTAR_CSSCK(scaler); 11db4: 431a orrs r2, r3 base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PCSSCK_MASK) & (~SPI_CTAR_CSSCK_MASK)) | 11db6: 60c2 str r2, [r0, #12] break; 11db8: e7e7 b.n 11d8a base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PASC_MASK) & (~SPI_CTAR_ASC_MASK)) | 11dba: eb00 0081 add.w r0, r0, r1, lsl #2 11dbe: 68c1 ldr r1, [r0, #12] SPI_CTAR_PASC(prescaler) | SPI_CTAR_ASC(scaler); 11dc0: 0512 lsls r2, r2, #20 11dc2: f402 1240 and.w r2, r2, #3145728 ; 0x300000 11dc6: 021b lsls r3, r3, #8 11dc8: f403 6370 and.w r3, r3, #3840 ; 0xf00 11dcc: 431a orrs r2, r3 base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PASC_MASK) & (~SPI_CTAR_ASC_MASK)) | 11dce: f421 1340 bic.w r3, r1, #3145728 ; 0x300000 11dd2: f423 6370 bic.w r3, r3, #3840 ; 0xf00 SPI_CTAR_PASC(prescaler) | SPI_CTAR_ASC(scaler); 11dd6: 431a orrs r2, r3 base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PASC_MASK) & (~SPI_CTAR_ASC_MASK)) | 11dd8: 60c2 str r2, [r0, #12] break; 11dda: e7d6 b.n 11d8a base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PDT_MASK) & (~SPI_CTAR_DT_MASK)) | 11ddc: eb00 0081 add.w r0, r0, r1, lsl #2 11de0: 68c1 ldr r1, [r0, #12] SPI_CTAR_PDT(prescaler) | SPI_CTAR_DT(scaler); 11de2: 0492 lsls r2, r2, #18 11de4: f402 2240 and.w r2, r2, #786432 ; 0xc0000 11de8: 011b lsls r3, r3, #4 11dea: b2db uxtb r3, r3 11dec: 431a orrs r2, r3 base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PDT_MASK) & (~SPI_CTAR_DT_MASK)) | 11dee: f421 2340 bic.w r3, r1, #786432 ; 0xc0000 11df2: f023 03f0 bic.w r3, r3, #240 ; 0xf0 SPI_CTAR_PDT(prescaler) | SPI_CTAR_DT(scaler); 11df6: 431a orrs r2, r3 base->CTAR[whichCtar] = (base->CTAR[whichCtar] & (~SPI_CTAR_PDT_MASK) & (~SPI_CTAR_DT_MASK)) | 11df8: 60c2 str r2, [r0, #12] } 11dfa: e7c6 b.n 11d8a 00011dfc <__main>: 11dfc: b508 push {r3, lr} 11dfe: f7fb ff67 bl dcd0 <_initio> 11e02: e8bd 4008 ldmia.w sp!, {r3, lr} 11e06: f7fa b813 b.w be30
00011e0a : 11e0a: f000 ba86 b.w 1231a <__aeabi_memcpy> 00011e0e : 11e0e: f000 ba9e b.w 1234e <__aeabi_lowlevel_memset> 00011e12 <_deferredlazyseek>: 11e12: 68c3 ldr r3, [r0, #12] 11e14: 6982 ldr r2, [r0, #24] 11e16: f023 0320 bic.w r3, r3, #32 11e1a: b510 push {r4, lr} 11e1c: 60c3 str r3, [r0, #12] 11e1e: 6a83 ldr r3, [r0, #40] ; 0x28 11e20: 429a cmp r2, r3 11e22: 4604 mov r4, r0 11e24: d00e beq.n 11e44 <_deferredlazyseek+0x32> 11e26: f000 f8b4 bl 11f92 <_fflush> 11e2a: 68e3 ldr r3, [r4, #12] 11e2c: f423 5340 bic.w r3, r3, #12288 ; 0x3000 11e30: f023 0310 bic.w r3, r3, #16 11e34: f043 0310 orr.w r3, r3, #16 11e38: 60e3 str r3, [r4, #12] 11e3a: 6aa3 ldr r3, [r4, #40] ; 0x28 11e3c: 61a3 str r3, [r4, #24] 11e3e: 6923 ldr r3, [r4, #16] 11e40: 62e3 str r3, [r4, #44] ; 0x2c 11e42: 6023 str r3, [r4, #0] 11e44: 68e3 ldr r3, [r4, #12] 11e46: f423 4380 bic.w r3, r3, #16384 ; 0x4000 11e4a: f023 0340 bic.w r3, r3, #64 ; 0x40 11e4e: 60e3 str r3, [r4, #12] 11e50: bd10 pop {r4, pc} 00011e52 <__flsbuf>: 11e52: 68cb ldr r3, [r1, #12] 11e54: f423 2200 bic.w r2, r3, #524288 ; 0x80000 11e58: b570 push {r4, r5, r6, lr} 11e5a: 460c mov r4, r1 11e5c: 60ca str r2, [r1, #12] 11e5e: 0699 lsls r1, r3, #26 11e60: 4605 mov r5, r0 11e62: d502 bpl.n 11e6a <__flsbuf+0x18> 11e64: 4620 mov r0, r4 11e66: f7ff ffd4 bl 11e12 <_deferredlazyseek> 11e6a: e9d4 3602 ldrd r3, r6, [r4, #8] 11e6e: 1c5a adds r2, r3, #1 11e70: da10 bge.n 11e94 <__flsbuf+0x42> 11e72: 05b0 lsls r0, r6, #22 11e74: d40e bmi.n 11e94 <__flsbuf+0x42> 11e76: f1c3 23ff rsb r3, r3, #4278255360 ; 0xff00ff00 11e7a: f503 037f add.w r3, r3, #16711680 ; 0xff0000 11e7e: 33fe adds r3, #254 ; 0xfe 11e80: 60a3 str r3, [r4, #8] 11e82: 6823 ldr r3, [r4, #0] 11e84: f446 3690 orr.w r6, r6, #73728 ; 0x12000 11e88: 1c5a adds r2, r3, #1 11e8a: 60e6 str r6, [r4, #12] 11e8c: 6022 str r2, [r4, #0] 11e8e: 701d strb r5, [r3, #0] 11e90: b2e8 uxtb r0, r5 11e92: bd70 pop {r4, r5, r6, pc} 11e94: f241 028a movw r2, #4234 ; 0x108a 11e98: 4032 ands r2, r6 11e9a: 2a02 cmp r2, #2 11e9c: d007 beq.n 11eae <__flsbuf+0x5c> 11e9e: 2300 movs r3, #0 11ea0: f046 0680 orr.w r6, r6, #128 ; 0x80 11ea4: 60a3 str r3, [r4, #8] 11ea6: 60e6 str r6, [r4, #12] 11ea8: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 11eac: e7f1 b.n 11e92 <__flsbuf+0x40> 11eae: f24a 0310 movw r3, #40976 ; 0xa010 11eb2: 4033 ands r3, r6 11eb4: f5b3 4f00 cmp.w r3, #32768 ; 0x8000 11eb8: d10a bne.n 11ed0 <__flsbuf+0x7e> 11eba: 2100 movs r1, #0 11ebc: 4620 mov r0, r4 11ebe: f7fb fe63 bl db88 11ec2: 68e3 ldr r3, [r4, #12] 11ec4: 0699 lsls r1, r3, #26 11ec6: d502 bpl.n 11ece <__flsbuf+0x7c> 11ec8: 4620 mov r0, r4 11eca: f7ff ffa2 bl 11e12 <_deferredlazyseek> 11ece: 68e6 ldr r6, [r4, #12] 11ed0: f446 3390 orr.w r3, r6, #73728 ; 0x12000 11ed4: f416 6f70 tst.w r6, #3840 ; 0xf00 11ed8: 60e3 str r3, [r4, #12] 11eda: d10e bne.n 11efa <__flsbuf+0xa8> 11edc: 6960 ldr r0, [r4, #20] 11ede: f000 fa5b bl 12398 <__sys_istty> 11ee2: b300 cbz r0, 11f26 <__flsbuf+0xd4> 11ee4: 0572 lsls r2, r6, #21 11ee6: d51e bpl.n 11f26 <__flsbuf+0xd4> 11ee8: f104 0324 add.w r3, r4, #36 ; 0x24 11eec: 6123 str r3, [r4, #16] 11eee: 6023 str r3, [r4, #0] 11ef0: 2301 movs r3, #1 11ef2: 61e3 str r3, [r4, #28] 11ef4: f446 3392 orr.w r3, r6, #74752 ; 0x12400 11ef8: 60e3 str r3, [r4, #12] 11efa: f413 6f10 tst.w r3, #2304 ; 0x900 11efe: 6821 ldr r1, [r4, #0] 11f00: 6926 ldr r6, [r4, #16] 11f02: d026 beq.n 11f52 <__flsbuf+0x100> 11f04: 6ae3 ldr r3, [r4, #44] ; 0x2c 11f06: 4299 cmp r1, r3 11f08: bf2c ite cs 11f0a: ebc6 0101 rsbcs r1, r6, r1 11f0e: ebc6 0103 rsbcc r1, r6, r3 11f12: b9b9 cbnz r1, 11f44 <__flsbuf+0xf2> 11f14: 1c73 adds r3, r6, #1 11f16: 62e3 str r3, [r4, #44] ; 0x2c 11f18: 6023 str r3, [r4, #0] 11f1a: 69e3 ldr r3, [r4, #28] 11f1c: 6323 str r3, [r4, #48] ; 0x30 11f1e: 1e5a subs r2, r3, #1 11f20: 60a2 str r2, [r4, #8] 11f22: 7035 strb r5, [r6, #0] 11f24: e7b4 b.n 11e90 <__flsbuf+0x3e> 11f26: f44f 7080 mov.w r0, #256 ; 0x100 11f2a: f7fb fe1d bl db68 <_Csys_alloc> 11f2e: f44f 7380 mov.w r3, #256 ; 0x100 11f32: 68e2 ldr r2, [r4, #12] 11f34: 61e3 str r3, [r4, #28] 11f36: f446 3394 orr.w r3, r6, #75776 ; 0x12800 11f3a: 431a orrs r2, r3 11f3c: 6120 str r0, [r4, #16] 11f3e: 6020 str r0, [r4, #0] 11f40: 60e2 str r2, [r4, #12] 11f42: e7da b.n 11efa <__flsbuf+0xa8> 11f44: 4622 mov r2, r4 11f46: 4630 mov r0, r6 11f48: f7fb fd74 bl da34 <_Cwritebuf> 11f4c: 2800 cmp r0, #0 11f4e: d0e1 beq.n 11f14 <__flsbuf+0xc2> 11f50: e7aa b.n 11ea8 <__flsbuf+0x56> 11f52: 1c4a adds r2, r1, #1 11f54: b2ed uxtb r5, r5 11f56: 6022 str r2, [r4, #0] 11f58: 700d strb r5, [r1, #0] 11f5a: 6ae2 ldr r2, [r4, #44] ; 0x2c 11f5c: 6821 ldr r1, [r4, #0] 11f5e: 4291 cmp r1, r2 11f60: bf2c ite cs 11f62: ebc6 0101 rsbcs r1, r6, r1 11f66: ebc6 0102 rsbcc r1, r6, r2 11f6a: 69e2 ldr r2, [r4, #28] 11f6c: 6322 str r2, [r4, #48] ; 0x30 11f6e: 055b lsls r3, r3, #21 11f70: d403 bmi.n 11f7a <__flsbuf+0x128> 11f72: 2d0a cmp r5, #10 11f74: d001 beq.n 11f7a <__flsbuf+0x128> 11f76: 428a cmp r2, r1 11f78: dc09 bgt.n 11f8e <__flsbuf+0x13c> 11f7a: 2300 movs r3, #0 11f7c: 62e6 str r6, [r4, #44] ; 0x2c 11f7e: 6026 str r6, [r4, #0] 11f80: 60a3 str r3, [r4, #8] 11f82: 4622 mov r2, r4 11f84: 4630 mov r0, r6 11f86: f7fb fd55 bl da34 <_Cwritebuf> 11f8a: 2800 cmp r0, #0 11f8c: d18c bne.n 11ea8 <__flsbuf+0x56> 11f8e: 4628 mov r0, r5 11f90: e77f b.n 11e92 <__flsbuf+0x40> 00011f92 <_fflush>: 11f92: b538 push {r3, r4, r5, lr} 11f94: 6801 ldr r1, [r0, #0] 11f96: 6905 ldr r5, [r0, #16] 11f98: 6ac3 ldr r3, [r0, #44] ; 0x2c 11f9a: 4604 mov r4, r0 11f9c: 68c0 ldr r0, [r0, #12] 11f9e: f420 2200 bic.w r2, r0, #524288 ; 0x80000 11fa2: 60e2 str r2, [r4, #12] 11fa4: f000 0282 and.w r2, r0, #130 ; 0x82 11fa8: 2a02 cmp r2, #2 11faa: d002 beq.n 11fb2 <_fflush+0x20> 11fac: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 11fb0: bd38 pop {r3, r4, r5, pc} 11fb2: f410 3080 ands.w r0, r0, #65536 ; 0x10000 11fb6: d0fb beq.n 11fb0 <_fflush+0x1e> 11fb8: 4299 cmp r1, r3 11fba: bf38 it cc 11fbc: 4619 movcc r1, r3 11fbe: 428d cmp r5, r1 11fc0: d108 bne.n 11fd4 <_fflush+0x42> 11fc2: 68e3 ldr r3, [r4, #12] 11fc4: 62e5 str r5, [r4, #44] ; 0x2c 11fc6: 2000 movs r0, #0 11fc8: f423 3380 bic.w r3, r3, #65536 ; 0x10000 11fcc: 6025 str r5, [r4, #0] 11fce: 60a0 str r0, [r4, #8] 11fd0: 60e3 str r3, [r4, #12] 11fd2: e7ed b.n 11fb0 <_fflush+0x1e> 11fd4: 4622 mov r2, r4 11fd6: 1b49 subs r1, r1, r5 11fd8: 4628 mov r0, r5 11fda: f7fb fd2b bl da34 <_Cwritebuf> 11fde: 2800 cmp r0, #0 11fe0: d0ef beq.n 11fc2 <_fflush+0x30> 11fe2: e7e3 b.n 11fac <_fflush+0x1a> 00011fe4 : 11fe4: b1a8 cbz r0, 12012 11fe6: f04f 5380 mov.w r3, #268435456 ; 0x10000000 11fea: f840 3c0c str.w r3, [r0, #-12] 11fee: f850 2c04 ldr.w r2, [r0, #-4] 11ff2: b172 cbz r2, 12012 11ff4: 6813 ldr r3, [r2, #0] 11ff6: f1b3 5f80 cmp.w r3, #268435456 ; 0x10000000 11ffa: d10a bne.n 12012 11ffc: f850 3c08 ldr.w r3, [r0, #-8] 12000: 6851 ldr r1, [r2, #4] 12002: 3303 adds r3, #3 12004: 440b add r3, r1 12006: f840 3c08 str.w r3, [r0, #-8] 1200a: 6893 ldr r3, [r2, #8] 1200c: f840 3c04 str.w r3, [r0, #-4] 12010: e7ed b.n 11fee 12012: 4770 bx lr 00012014 : 12014: b538 push {r3, r4, r5, lr} 12016: 4605 mov r5, r0 12018: 460c mov r4, r1 1201a: f815 0b01 ldrb.w r0, [r5], #1 1201e: b170 cbz r0, 1203e 12020: 68a3 ldr r3, [r4, #8] 12022: 3b01 subs r3, #1 12024: 2b00 cmp r3, #0 12026: 60a3 str r3, [r4, #8] 12028: db04 blt.n 12034 1202a: 6823 ldr r3, [r4, #0] 1202c: 1c5a adds r2, r3, #1 1202e: 6022 str r2, [r4, #0] 12030: 7018 strb r0, [r3, #0] 12032: e7f2 b.n 1201a 12034: 4621 mov r1, r4 12036: f7ff ff0c bl 11e52 <__flsbuf> 1203a: 1c43 adds r3, r0, #1 1203c: d1ed bne.n 1201a 1203e: bd38 pop {r3, r4, r5, pc} 00012040 : 12040: 2000 movs r0, #0 12042: 4770 bx lr 00012044 : 12044: b510 push {r4, lr} 12046: 1c42 adds r2, r0, #1 12048: 0783 lsls r3, r0, #30 1204a: 4604 mov r4, r0 1204c: d116 bne.n 1207c 1204e: 4623 mov r3, r4 12050: f854 1b04 ldr.w r1, [r4], #4 12054: f1a1 3001 sub.w r0, r1, #16843009 ; 0x1010101 12058: ea20 0001 bic.w r0, r0, r1 1205c: f010 3f80 tst.w r0, #2155905152 ; 0x80808080 12060: d0f5 beq.n 1204e 12062: f011 0fff tst.w r1, #255 ; 0xff 12066: d011 beq.n 1208c 12068: f411 4f7f tst.w r1, #65280 ; 0xff00 1206c: d00c beq.n 12088 1206e: f411 0f7f tst.w r1, #16711680 ; 0xff0000 12072: bf14 ite ne 12074: 4623 movne r3, r4 12076: 3303 addeq r3, #3 12078: 1a98 subs r0, r3, r2 1207a: e004 b.n 12086 1207c: f810 3b01 ldrb.w r3, [r0], #1 12080: 2b00 cmp r3, #0 12082: d1e1 bne.n 12048 12084: 1a80 subs r0, r0, r2 12086: bd10 pop {r4, pc} 12088: 3302 adds r3, #2 1208a: e7f5 b.n 12078 1208c: 3301 adds r3, #1 1208e: e7f3 b.n 12078 00012090 <_fdopen>: 12090: b570 push {r4, r5, r6, lr} 12092: 460d mov r5, r1 12094: 4606 mov r6, r0 12096: 4610 mov r0, r2 12098: 4614 mov r4, r2 1209a: f000 f82d bl 120f8 1209e: 782b ldrb r3, [r5, #0] 120a0: 2b72 cmp r3, #114 ; 0x72 120a2: d017 beq.n 120d4 <_fdopen+0x44> 120a4: 2b77 cmp r3, #119 ; 0x77 120a6: d018 beq.n 120da <_fdopen+0x4a> 120a8: 2b61 cmp r3, #97 ; 0x61 120aa: d123 bne.n 120f4 <_fdopen+0x64> 120ac: 2308 movs r3, #8 120ae: f248 0202 movw r2, #32770 ; 0x8002 120b2: f815 1f01 ldrb.w r1, [r5, #1]! 120b6: 292b cmp r1, #43 ; 0x2b 120b8: d012 beq.n 120e0 <_fdopen+0x50> 120ba: 2962 cmp r1, #98 ; 0x62 120bc: d015 beq.n 120ea <_fdopen+0x5a> 120be: 071b lsls r3, r3, #28 120c0: 60e2 str r2, [r4, #12] 120c2: 6166 str r6, [r4, #20] 120c4: d504 bpl.n 120d0 <_fdopen+0x40> 120c6: 2202 movs r2, #2 120c8: 2100 movs r1, #0 120ca: 4620 mov r0, r4 120cc: f7fb fd5c bl db88 120d0: 4620 mov r0, r4 120d2: bd70 pop {r4, r5, r6, pc} 120d4: 2300 movs r3, #0 120d6: 2201 movs r2, #1 120d8: e7eb b.n 120b2 <_fdopen+0x22> 120da: 2304 movs r3, #4 120dc: 2202 movs r2, #2 120de: e7e8 b.n 120b2 <_fdopen+0x22> 120e0: f042 0203 orr.w r2, r2, #3 120e4: f043 0302 orr.w r3, r3, #2 120e8: e7e3 b.n 120b2 <_fdopen+0x22> 120ea: f042 0204 orr.w r2, r2, #4 120ee: f043 0301 orr.w r3, r3, #1 120f2: e7de b.n 120b2 <_fdopen+0x22> 120f4: 2400 movs r4, #0 120f6: e7eb b.n 120d0 <_fdopen+0x40> 000120f8 : 120f8: b5f0 push {r4, r5, r6, r7, lr} 120fa: 68c4 ldr r4, [r0, #12] 120fc: 07a1 lsls r1, r4, #30 120fe: b089 sub sp, #36 ; 0x24 12100: 4605 mov r5, r0 12102: d022 beq.n 1214a 12104: 0722 lsls r2, r4, #28 12106: d418 bmi.n 1213a 12108: e9d0 6704 ldrd r6, r7, [r0, #16] 1210c: f7fc fca8 bl ea60 12110: 4638 mov r0, r7 12112: f000 f935 bl 12380 <__sys_close> 12116: 0523 lsls r3, r4, #20 12118: d502 bpl.n 12120 1211a: 4630 mov r0, r6 1211c: f7ff ff62 bl 11fe4 12120: 0da4 lsrs r4, r4, #22 12122: 05a4 lsls r4, r4, #22 12124: f114 4fa5 cmn.w r4, #1384120320 ; 0x52800000 12128: d107 bne.n 1213a 1212a: 2220 movs r2, #32 1212c: 6a29 ldr r1, [r5, #32] 1212e: 4668 mov r0, sp 12130: f000 f944 bl 123bc <__sys_tmpnam> 12134: 4668 mov r0, sp 12136: f000 f80b bl 12150 1213a: 223c movs r2, #60 ; 0x3c 1213c: 2100 movs r1, #0 1213e: 4628 mov r0, r5 12140: f7ff fe65 bl 11e0e 12144: 2000 movs r0, #0 12146: b009 add sp, #36 ; 0x24 12148: bdf0 pop {r4, r5, r6, r7, pc} 1214a: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff 1214e: e7fa b.n 12146 00012150 : 12150: b510 push {r4, lr} 12152: 4604 mov r4, r0 12154: f7ff ff76 bl 12044 12158: 4601 mov r1, r0 1215a: 4620 mov r0, r4 1215c: e8bd 4010 ldmia.w sp!, {r4, lr} 12160: f000 b920 b.w 123a4 <__sys_remove> 00012164 <_do_fflush>: 12164: 68c3 ldr r3, [r0, #12] 12166: b570 push {r4, r5, r6, lr} 12168: f013 0603 ands.w r6, r3, #3 1216c: 4604 mov r4, r0 1216e: d011 beq.n 12194 <_do_fflush+0x30> 12170: 069b lsls r3, r3, #26 12172: d511 bpl.n 12198 <_do_fflush+0x34> 12174: 6a85 ldr r5, [r0, #40] ; 0x28 12176: f7ff fe4c bl 11e12 <_deferredlazyseek> 1217a: 68e3 ldr r3, [r4, #12] 1217c: f423 5340 bic.w r3, r3, #12288 ; 0x3000 12180: 60e3 str r3, [r4, #12] 12182: 4620 mov r0, r4 12184: f7ff ff05 bl 11f92 <_fflush> 12188: 2200 movs r2, #0 1218a: 4606 mov r6, r0 1218c: 4629 mov r1, r5 1218e: 4620 mov r0, r4 12190: f7fb fcfa bl db88 12194: 4630 mov r0, r6 12196: bd70 pop {r4, r5, r6, pc} 12198: 6983 ldr r3, [r0, #24] 1219a: 6805 ldr r5, [r0, #0] 1219c: 441d add r5, r3 1219e: 6903 ldr r3, [r0, #16] 121a0: 1aed subs r5, r5, r3 121a2: e7ea b.n 1217a <_do_fflush+0x16> 000121a4 <__aeabi_uldivmod>: 121a4: f05f 0c00 movs.w ip, #0 000121a8 <__bhs_ldivmod1>: 121a8: b530 push {r4, r5, lr} 121aa: 001c movs r4, r3 121ac: d122 bne.n 121f4 121ae: 0012 movs r2, r2 121b0: d06f beq.n 12292 121b2: 4291 cmp r1, r2 121b4: d306 bcc.n 121c4 121b6: 4605 mov r5, r0 121b8: 4608 mov r0, r1 121ba: 2100 movs r1, #0 121bc: f000 f86f bl 1229e 121c0: 4604 mov r4, r0 121c2: 4628 mov r0, r5 000121c4 : 121c4: f000 f86b bl 1229e 121c8: 460a mov r2, r1 121ca: 4621 mov r1, r4 000121cc : 121cc: e8bd 4030 ldmia.w sp!, {r4, r5, lr} 121d0: f01c 4f40 tst.w ip, #3221225472 ; 0xc0000000 121d4: bf08 it eq 121d6: 4770 bxeq lr 121d8: d503 bpl.n 121e2 121da: 4249 negs r1, r1 121dc: 4240 negs r0, r0 121de: f161 0100 sbc.w r1, r1, #0 000121e2 : 121e2: ea5f 0c8c movs.w ip, ip, lsl #2 121e6: bf38 it cc 121e8: 4770 bxcc lr 121ea: 425b negs r3, r3 121ec: 4252 negs r2, r2 121ee: f163 0300 sbc.w r3, r3, #0 121f2: 4770 bx lr 000121f4 : 121f4: d442 bmi.n 1227c 121f6: 0c1c lsrs r4, r3, #16 121f8: bf04 itt eq 121fa: 041b lsleq r3, r3, #16 121fc: f10c 0c10 addeq.w ip, ip, #16 12200: f013 4f7f tst.w r3, #4278190080 ; 0xff000000 12204: bf04 itt eq 12206: 021b lsleq r3, r3, #8 12208: f10c 0c08 addeq.w ip, ip, #8 1220c: f013 4f70 tst.w r3, #4026531840 ; 0xf0000000 12210: bf04 itt eq 12212: 011b lsleq r3, r3, #4 12214: f10c 0c04 addeq.w ip, ip, #4 12218: f013 4f40 tst.w r3, #3221225472 ; 0xc0000000 1221c: bf04 itt eq 1221e: f10c 0c02 addeq.w ip, ip, #2 12222: ea5f 0383 movseq.w r3, r3, lsl #2 12226: bf5c itt pl 12228: f10c 0c01 addpl.w ip, ip, #1 1222c: 005b lslpl r3, r3, #1 1222e: f1cc 0e20 rsb lr, ip, #32 12232: fa22 f40e lsr.w r4, r2, lr 12236: 4323 orrs r3, r4 12238: fa02 f20c lsl.w r2, r2, ip 1223c: fa00 f50c lsl.w r5, r0, ip 12240: fa20 f00e lsr.w r0, r0, lr 12244: fa01 f40c lsl.w r4, r1, ip 12248: 4320 orrs r0, r4 1224a: fa21 f10e lsr.w r1, r1, lr 1224e: 4614 mov r4, r2 12250: 461a mov r2, r3 12252: f000 f824 bl 1229e 12256: fba4 2300 umull r2, r3, r4, r0 1225a: 1aaa subs r2, r5, r2 1225c: eb71 0303 sbcs.w r3, r1, r3 12260: bf3c itt cc 12262: 191b addcc r3, r3, r4 12264: 3801 subcc r0, #1 12266: f1cc 0e20 rsb lr, ip, #32 1226a: fa22 f20c lsr.w r2, r2, ip 1226e: fa03 f40e lsl.w r4, r3, lr 12272: 4322 orrs r2, r4 12274: fa23 f30c lsr.w r3, r3, ip 12278: 2100 movs r1, #0 1227a: e7a7 b.n 121cc 0001227c : 1227c: 1a82 subs r2, r0, r2 1227e: eb71 0303 sbcs.w r3, r1, r3 12282: bf3c itt cc 12284: 4602 movcc r2, r0 12286: 460b movcc r3, r1 12288: f04f 0100 mov.w r1, #0 1228c: f141 0000 adc.w r0, r1, #0 12290: e79c b.n 121cc 00012292 : 12292: 2000 movs r0, #0 12294: 2100 movs r1, #0 12296: e8bd 4030 ldmia.w sp!, {r4, r5, lr} 1229a: f000 b83d b.w 12318 <__aeabi_idiv0> 0001229e : 1229e: 2304 movs r3, #4 122a0: ebb1 2f12 cmp.w r1, r2, lsr #8 122a4: d209 bcs.n 122ba 000122a6 : 122a6: 0209 lsls r1, r1, #8 122a8: ea41 6110 orr.w r1, r1, r0, lsr #24 122ac: 0200 lsls r0, r0, #8 122ae: 3b01 subs r3, #1 122b0: bf08 it eq 122b2: 4770 bxeq lr 122b4: ebb1 2f12 cmp.w r1, r2, lsr #8 122b8: d3f5 bcc.n 122a6 000122ba : 122ba: 1800 adds r0, r0, r0 000122bc : 122bc: 4149 adcs r1, r1 122be: bf34 ite cc 122c0: 4291 cmpcc r1, r2 122c2: 1a89 subcs r1, r1, r2 122c4: 4140 adcs r0, r0 122c6: 4149 adcs r1, r1 122c8: bf34 ite cc 122ca: 4291 cmpcc r1, r2 122cc: 1a89 subcs r1, r1, r2 122ce: 4140 adcs r0, r0 122d0: 4149 adcs r1, r1 122d2: bf34 ite cc 122d4: 4291 cmpcc r1, r2 122d6: 1a89 subcs r1, r1, r2 122d8: 4140 adcs r0, r0 122da: 4149 adcs r1, r1 122dc: bf34 ite cc 122de: 4291 cmpcc r1, r2 122e0: 1a89 subcs r1, r1, r2 122e2: 4140 adcs r0, r0 122e4: 4149 adcs r1, r1 122e6: bf34 ite cc 122e8: 4291 cmpcc r1, r2 122ea: 1a89 subcs r1, r1, r2 122ec: 4140 adcs r0, r0 122ee: 4149 adcs r1, r1 122f0: bf34 ite cc 122f2: 4291 cmpcc r1, r2 122f4: 1a89 subcs r1, r1, r2 122f6: 4140 adcs r0, r0 122f8: 4149 adcs r1, r1 122fa: bf34 ite cc 122fc: 4291 cmpcc r1, r2 122fe: 1a89 subcs r1, r1, r2 12300: 4140 adcs r0, r0 12302: 4149 adcs r1, r1 12304: bf34 ite cc 12306: 4291 cmpcc r1, r2 12308: 1a89 subcs r1, r1, r2 1230a: 4140 adcs r0, r0 1230c: f1a3 0301 sub.w r3, r3, #1 12310: f013 0f0f tst.w r3, #15 12314: d1d2 bne.n 122bc 12316: 4770 bx lr 00012318 <__aeabi_idiv0>: 12318: 4770 bx lr 0001231a <__aeabi_memcpy>: 1231a: ea40 0301 orr.w r3, r0, r1 1231e: 07db lsls r3, r3, #31 12320: 4603 mov r3, r0 12322: d40c bmi.n 1233e 00012324 <__aeabi_memcpy4>: 12324: 4603 mov r3, r0 12326: 3a04 subs r2, #4 00012328 : 12328: bf22 ittt cs 1232a: f851 cb04 ldrcs.w ip, [r1], #4 1232e: f843 cb04 strcs.w ip, [r3], #4 12332: f1b2 0204 subscs.w r2, r2, #4 12336: d2f7 bcs.n 12328 12338: 3204 adds r2, #4 1233a: bf08 it eq 1233c: 4770 bxeq lr 0001233e : 1233e: 3a01 subs r2, #1 12340: bf24 itt cs 12342: f811 cb01 ldrbcs.w ip, [r1], #1 12346: f803 cb01 strbcs.w ip, [r3], #1 1234a: d8f8 bhi.n 1233e 1234c: 4770 bx lr 0001234e <__aeabi_lowlevel_memset>: 1234e: 4603 mov r3, r0 12350: f013 0f03 tst.w r3, #3 12354: d10e bne.n 12374 12356: f001 01ff and.w r1, r1, #255 ; 0xff 1235a: ea41 2101 orr.w r1, r1, r1, lsl #8 1235e: ea41 4101 orr.w r1, r1, r1, lsl #16 00012362 <__bhs_memset4>: 12362: 3a04 subs r2, #4 00012364 : 12364: bf24 itt cs 12366: f843 1b04 strcs.w r1, [r3], #4 1236a: f1b2 0204 subscs.w r2, r2, #4 1236e: d2f9 bcs.n 12364 00012370 : 12370: f102 0204 add.w r2, r2, #4 00012374 : 12374: 3a01 subs r2, #1 12376: bf24 itt cs 12378: f803 1b01 strbcs.w r1, [r3], #1 1237c: e7fa bcs.n 12374 1237e: 4770 bx lr 00012380 <__sys_close>: 12380: b403 push {r0, r1} 12382: 4669 mov r1, sp 12384: 2002 movs r0, #2 12386: beab bkpt 0x00ab 12388: b002 add sp, #8 1238a: 4770 bx lr 0001238c <__sys_flen>: 1238c: b403 push {r0, r1} 1238e: 4669 mov r1, sp 12390: 200c movs r0, #12 12392: beab bkpt 0x00ab 12394: b002 add sp, #8 12396: 4770 bx lr 00012398 <__sys_istty>: 12398: b403 push {r0, r1} 1239a: 4669 mov r1, sp 1239c: 2009 movs r0, #9 1239e: beab bkpt 0x00ab 123a0: b002 add sp, #8 123a2: 4770 bx lr 000123a4 <__sys_remove>: 123a4: b403 push {r0, r1} 123a6: 4669 mov r1, sp 123a8: 200e movs r0, #14 123aa: beab bkpt 0x00ab 123ac: b002 add sp, #8 123ae: 4770 bx lr 000123b0 <__sys_seek>: 123b0: b403 push {r0, r1} 123b2: 4669 mov r1, sp 123b4: 200a movs r0, #10 123b6: beab bkpt 0x00ab 123b8: b002 add sp, #8 123ba: 4770 bx lr 000123bc <__sys_tmpnam>: 123bc: b40f push {r0, r1, r2, r3} 123be: 4669 mov r1, sp 123c0: 200d movs r0, #13 123c2: beab bkpt 0x00ab 123c4: b004 add sp, #16 123c6: 4770 bx lr 000123c8 <__sys_write>: 123c8: b40f push {r0, r1, r2, r3} 123ca: 4669 mov r1, sp 123cc: 2005 movs r0, #5 123ce: beab bkpt 0x00ab 123d0: b004 add sp, #16 123d2: 4770 bx lr 000123d4 : 123d4: ed3f 0000 eff5 0000 0000 0000 eff5 0000 ?............... 123e4: 0000 0000 ef8b 0000 ee99 0000 0000 0000 ................ 123f4: ee5b 0000 ef21 0000 ee17 0000 edcd 0000 [...!........... 12404: ecfd 0000 .... 00012408 : 12408: 8b6d 0000 fdc5 0000 fde3 0000 0003 0000 m............... ... 00012428 : 12428: 89b1 0000 f55f 0000 f593 0000 f61f 0000 ...._........... 12438: f6cf 0000 f7ef 0000 ........ 00012440 : 12440: 4143 424e 5355 4c20 474f 5320 4154 5452 CANBUS LOG START 12450: 2020 ffff .. 00012454 : 12454: 4143 424e 5355 4c20 474f 4520 444e 2020 CANBUS LOG END 12464: 2020 ffff .. 00012468 : 12468: 4143 424e 5355 3140 3532 204b 2020 2020 CANBUS@125K 12478: 2020 ffff .. 0001247c : 1247c: 4143 424e 5355 3240 3035 204b 2020 2020 CANBUS@250K 1248c: 2020 ffff .. 00012490 : 12490: 4143 424e 5355 3540 4b30 2020 2020 2020 CANBUS@50K 124a0: 2020 ffff 4143 424e 5355 4f4c 2e47 7874 ..CANBUSLOG.tx 124b0: 0074 0000 3025 6c39 2075 4143 424e 5355 t...%09lu CANBUS 124c0: 4f4c 2047 4542 4947 0d4e 000a 3025 6c39 LOG BEGIN...%09l 124d0: 2075 4143 424e 5355 4f4c 2047 4e45 0d44 u CANBUSLOG END. 124e0: 0d0a 000a 3025 6c39 2075 3025 4c38 2f58 ....%09lu %08LX/ 124f0: 7525 2520 3830 584c 3025 4c38 0d58 000a %u %08LX%08LX... 12500: 3025 6c39 2075 3025 4c34 2f58 7525 2520 %09lu %04LX/%u % 12510: 3830 584c 3025 4c38 0d58 000a 3025 6c39 08LX%08LX...%09l 12520: 2075 5542 4f46 4656 0a0d 0000 3025 6c39 u BUFOVF....%09l 12530: 2075 5748 564f 0d46 000a ffff u HWOVF..... 0001253c : 1253c: 4544 5542 2047 5355 2042 4341 4954 4556 DEBUG USB ACTIVE 1254c: 2021 ffff ! .. 00012550 : 12550: 4544 5542 2047 5355 2042 4f47 454e 2021 DEBUG USB GONE! 12560: 2020 ffff .. 00012564 : 12564: 5453 5241 4954 474e 2e20 2e2e 2020 2020 STARTING ... 12574: 2020 ffff .. 00012578 : 12578: 4750 2054 5a45 4143 504c 4f52 4547 324e PGT EZCALPROGEN2 12588: 2020 ffff .. 0001258c : 1258c: 0207 0000 0000 0000 0700 ff00 ............ 00012598 : 12598: 2400 00f4 0400 0080 .$...... 000125a0 : 125a0: 0201 0000 0000 0011 ........ 000125a8 : 125a8: 9a80 4145 418e 808f 4545 4945 4949 8f8e ..EA.A..EEEIII.. 125b8: 9290 4f92 4f99 5555 9959 9b9a 9d9c 9f9e ...O.OUUY....... 125c8: 4941 554f a5a5 a7a6 a9a8 abaa adac afae AIOU............ 125d8: b1b0 b3b2 b5b4 b7b6 b9b8 bbba bdbc bfbe ................ 125e8: c1c0 c3c2 c5c4 c7c6 c9c8 cbca cdcc cfce ................ 125f8: d1d0 d3d2 d5d4 d7d6 d9d8 dbda dddc dfde ................ 12608: e1e0 e3e2 e5e4 e7e6 e9e8 ebea edec efee ................ 12618: f1f0 f3f2 f5f4 f7f6 f9f8 fbfa fdfc fffe ................ 00012628 : 12628: 0301 0705 0e09 1210 1614 1c18 ff1e ffff ................ 00012638 : 12638: 2e2b 3b2c 5b3d 2f5d 225c 3a2a 3e3c 7c3f +.,;=[]/\"*:<>?| 12648: 007f ffff 4146 3354 2032 2020 ff00 ffff ....FAT32 .... 00012658 : 12658: 0001 0004 0010 0040 0100 0200 0000 ffff ......@......... 00012668 : 12668: 0001 0002 0004 0008 0010 0020 0000 ffff .......... ..... 00012678 : 12678: 0007 0000 0000 0000 0000 0000 0000 0000 ................ 12688: feeb 4d90 4453 534f 2e35 0030 4f4e 4e20 ...MSDOS5.0.NO N 12698: 4d41 2045 2020 4620 5441 3233 2020 0020 AME FAT32 . 126a8: 4f4e 4e20 4d41 2045 2020 4620 5441 2020 NO NAME FAT 126b8: 2020 0020 2a22 3c3a 3f3e 7f7c 0000 0000 ."*:<>?|..... 126c8: 2c2b 3d3b 5d5b ff00 +,;=[].. 000126d0 : 126d0: 0061 031a 00e0 0317 00f8 0307 00ff 0001 a............... 126e0: 0178 0100 0130 0132 0106 0139 0110 014a x...0.2...9...J. 126f0: 012e 0179 0106 0180 004d 0243 0181 0182 ..y.....M.C..... 12700: 0182 0184 0184 0186 0187 0187 0189 018a ................ 12710: 018b 018b 018d 018e 018f 0190 0191 0191 ................ 12720: 0193 0194 01f6 0196 0197 0198 0198 023d ..............=. 12730: 019b 019c 019d 0220 019f 01a0 01a0 01a2 ...... ......... 12740: 01a2 01a4 01a4 01a6 01a7 01a7 01a9 01aa ................ 12750: 01ab 01ac 01ac 01ae 01af 01af 01b1 01b2 ................ 12760: 01b3 01b3 01b5 01b5 01b7 01b8 01b8 01ba ................ 12770: 01bb 01bc 01bc 01be 01f7 01c0 01c1 01c2 ................ 12780: 01c3 01c4 01c5 01c4 01c7 01c8 01c7 01ca ................ 12790: 01cb 01ca 01cd 0110 01dd 0001 018e 01de ................ 127a0: 0112 01f3 0003 01f1 01f4 01f4 01f8 0128 ..............(. 127b0: 0222 0112 023a 0009 2c65 023b 023b 023d "...:...e,;.;.=. 127c0: 2c66 023f 0240 0241 0241 0246 010a 0253 f,?.@.A.A.F...S. 127d0: 0040 0181 0186 0255 0189 018a 0258 018f @.....U.....X... 127e0: 025a 0190 025c 025d 025e 025f 0193 0261 Z...\.].^._...a. 127f0: 0262 0194 0264 0265 0266 0267 0197 0196 b...d.e.f.g..... 12800: 026a 2c62 026c 026d 026e 019c 0270 0271 j.b,l.m.n...p.q. 12810: 019d 0273 0274 019f 0276 0277 0278 0279 ..s.t...v.w.x.y. 12820: 027a 027b 027c 2c64 027e 027f 01a6 0281 z.{.|.d,~....... 12830: 0282 01a9 0284 0285 0286 0287 01ae 0244 ..............D. 12840: 01b1 01b2 0245 028d 028e 028f 0290 0291 ....E........... 12850: 01b7 037b 0003 03fd 03fe 03ff 03ac 0004 ..{............. 12860: 0386 0388 0389 038a 03b1 0311 03c2 0002 ................ 12870: 03a3 03a3 03c4 0308 03cc 0003 038c 038e ................ 12880: 038f 03d8 0118 03f2 000a 03f9 03f3 03f4 ................ 12890: 03f5 03f6 03f7 03f7 03f9 03fa 03fa 0430 ..............0. 128a0: 0320 0450 0710 0460 0122 048a 0136 04c1 .P...`."...6... 128b0: 010e 04cf 0001 04c0 04d0 0144 0561 0426 ..........D.a.&. 128c0: 0000 ffff .... 000128c4 : 128c4: 1d7d 0001 2c63 1e00 0196 1ea0 015a 1f00 }...c,......Z... 128d4: 0608 1f10 0606 1f20 0608 1f30 0608 1f40 ...... ...0...@. 128e4: 0606 1f51 0007 1f59 1f52 1f5b 1f54 1f5d ..Q...Y.R.[.T.]. 128f4: 1f56 1f5f 1f60 0608 1f70 000e 1fba 1fbb V._.`...p....... 12904: 1fc8 1fc9 1fca 1fcb 1fda 1fdb 1ff8 1ff9 ................ 12914: 1fea 1feb 1ffa 1ffb 1f80 0608 1f90 0608 ................ 12924: 1fa0 0608 1fb0 0004 1fb8 1fb9 1fb2 1fbc ................ 12934: 1fcc 0001 1fc3 1fd0 0602 1fe0 0602 1fe5 ................ 12944: 0001 1fec 1ff3 0001 1ffc 214e 0001 2132 ..........N!..2! 12954: 2170 0210 2184 0001 2183 24d0 051a 2c30 p!...!...!.$..0, 12964: 042f 2c60 0102 2c67 0106 2c75 0102 2c80 /.`,..g,..u,..., 12974: 0164 2d00 0826 ff41 031a 0000 d..-&.A..... 00012980 : 12980: 00c7 00fc 00e9 00e2 00e4 00e0 00e5 00e7 ................ 12990: 00ea 00eb 00e8 00ef 00ee 00ec 00c4 00c5 ................ 129a0: 00c9 00e6 00c6 00f4 00f6 00f2 00fb 00f9 ................ 129b0: 00ff 00d6 00dc 00a2 00a3 00a5 20a7 0192 ............. .. 129c0: 00e1 00ed 00f3 00fa 00f1 00d1 00aa 00ba ................ 129d0: 00bf 2310 00ac 00bd 00bc 00a1 00ab 00bb ...#............ 129e0: 2591 2592 2593 2502 2524 2561 2562 2556 .%.%.%.%$%a%b%V% 129f0: 2555 2563 2551 2557 255d 255c 255b 2510 U%c%Q%W%]%\%[%.% 12a00: 2514 2534 252c 251c 2500 253c 255e 255f .%4%,%.%.%<%^%_% 12a10: 255a 2554 2569 2566 2560 2550 256c 2567 Z%T%i%f%`%P%l%g% 12a20: 2568 2564 2565 2559 2558 2552 2553 256b h%d%e%Y%X%R%S%k% 12a30: 256a 2518 250c 2588 2584 258c 2590 2580 j%.%.%.%.%.%.%.% 12a40: 03b1 00df 0393 03c0 03a3 03c3 00b5 03c4 ................ 12a50: 03a6 0398 03a9 03b4 221e 03c6 03b5 2229 ........."....)" 12a60: 2261 00b1 2265 2264 2320 2321 00f7 2248 a"..e"d" #!#..H" 12a70: 00b0 2219 00b7 221a 207f 00b2 25a0 00a0 ..."...". ...%.. 00012a80 : 12a80: 002f ffff 5244 5649 2045 4544 4154 4c49 /...DRIVE DETAIL 12a90: 3a53 5320 5a49 3d45 6c25 2c75 4120 4156 S: SIZE=%lu, AVA 12aa0: 4c49 4241 454c 253d 756c 0a0d 0000 0000 ILABLE=%lu...... 12ab0: 4944 4552 5443 524f 3a59 0a0d 0000 0000 DIRECTORY:...... 12ac0: 7325 2f20 2520 2073 6428 7269 6365 6f74 %s / %s (directo 12ad0: 7972 2921 0a0d 0000 7325 2f20 2520 2073 ry!)....%s / %s 12ae0: 2528 2069 7962 6574 2973 0a0d ff00 ffff (%i bytes)...... 12af0: 5a45 4143 504c 4f52 0032 0000 6f53 656d EZCALPRO2...Some 12b00: 7320 726f 2074 666f 7320 6174 7472 7075 sort of startup 12b10: 6620 6961 756c 6572 202c 6f63 6564 253d failure, code=% 12b20: 756c 0d2e 000a ffff 5245 5341 4245 4f4c lu......ERASEBLO 12b30: 4b43 2520 0d69 000a 732e 6970 6c66 7361 CK %i....spiflas 12b40: 5f68 6964 6b73 632e 343a 3933 3a20 7420 h_disk.c:439 : t 12b50: 706d 3d3d 6c62 636f 6e6b 6d75 6562 0072 mp==blocknumber. 12b60: 4146 4654 5253 4145 2044 6925 252f 0d69 FATFSREAD %i/%i. 12b70: 000a 0000 732e 6970 6c66 7361 5f68 6964 .....spiflash_di 12b80: 6b73 632e 343a 3036 3a20 7420 706d 533c sk.c:460 : tmpsize<=M 12c90: 5841 4d49 4d55 4552 5551 5345 5354 5a49 AXIMUMREQUESTSIZ 12ca0: 0045 0000 752e 6273 645f 7369 696b 2e6f E....usb_diskio. 12cb0: 3a63 3531 2031 203a 626c 4461 7461 2d61 c:151 : lbaData- 12cc0: 623e 6675 6566 3d72 283d 6975 746e 5f38 >buffer==(uint8_ 12cd0: 2074 292a 6726 6d5f 6373 7257 7469 5265 t *)&g_mscWriteR 12ce0: 7165 6575 7473 7542 6666 7265 305b 005d equestBuffer[0]. 12cf0: 7257 7469 2065 7265 6f72 2072 203d 7830 Write error = 0x 12d00: 2578 3b78 6320 6568 6b63 7720 6972 6574 x%x; check write 12d10: 7220 7165 6575 7473 6220 6675 6566 2072 request buffer 12d20: 6973 657a 0a0d 0000 752e 6273 645f 7369 size.....usb_dis 12d30: 696b 2e6f 3a63 3631 2034 203a 626c 4461 kio.c:164 : lbaD 12d40: 7461 2d61 733e 7a69 3c65 4d3d 5841 4d49 ata->size<=MAXIM 12d50: 4d55 4552 5551 5345 5354 5a49 0045 0000 UMREQUESTSIZE... 12d60: 752e 6273 645f 7369 696b 2e6f 3a63 3631 .usb_diskio.c:16 12d70: 2039 203a 626c 4461 7461 2d61 733e 7a69 9 : lbaData->siz 12d80: 3c65 4d3d 5841 4d49 4d55 4552 5551 5345 e<=MAXIMUMREQUES 12d90: 5354 5a49 0045 0000 6552 6461 6520 7272 TSIZE...Read err 12da0: 726f 3d20 3020 7878 7825 203b 6863 6365 or = 0xx%x; chec 12db0: 206b 6572 6461 7220 7165 6575 7473 6220 k read request b 12dc0: 6675 6566 2072 6973 657a 0a0d ff00 ffff uffer size...... 12dd0: 662e 6c73 615f 6364 3631 632e 333a 3536 .fsl_adc16.c:365 12de0: 3a20 6320 6168 6e6e 6c65 7247 756f 2070 : channelGroup 12df0: 203c 4441 5f43 4353 5f31 4f43 4e55 0054 < ADC_SC1_COUNT. 12e00: 662e 6c73 615f 6364 3631 632e 313a 3534 .fsl_adc16.c:145 12e10: 3a20 4e20 4c55 204c 3d21 6320 6e6f 6966 : NULL != confi 12e20: 0067 ffff 662e 6c73 615f 6364 3631 632e g....fsl_adc16.c 12e30: 373a 2034 203a 6e69 7473 6e61 6563 3c20 :74 : instance < 12e40: 4120 5252 5941 535f 5a49 2845 5f73 6461 ARRAY_SIZE(s_ad 12e50: 3163 4236 7361 7365 0029 ffff 662e 6c73 c16Bases)....fsl 12e60: 615f 6364 3631 632e 383a 2031 203a 554e _adc16.c:81 : NU 12e70: 4c4c 2120 203d 6f63 666e 6769 ff00 ffff LL != config.... 12e80: 662e 6c73 615f 6364 3631 632e 333a 3334 .fsl_adc16.c:343 12e90: 3a20 6320 6168 6e6e 6c65 7247 756f 2070 : channelGroup 12ea0: 203c 4441 5f43 4353 5f31 4f43 4e55 0054 < ADC_SC1_COUNT. 12eb0: 662e 6c73 615f 6364 3631 632e 333a 3434 .fsl_adc16.c:344 12ec0: 3a20 4e20 4c55 204c 3d21 6320 6e6f 6966 : NULL != confi 12ed0: 0067 ffff g... 00012ed4 : 12ed4: 001b 103c 001b 1030 662e 6c73 635f 6f6c ..<...0..fsl_clo 12ee4: 6b63 632e 313a 3436 2038 203a 6f63 666e ck.c:1648 : conf 12ef4: 6769 ff00 662e 6c73 635f 6f6c 6b63 632e ig...fsl_clock.c 12f04: 383a 3632 3a20 6320 6e6f 6966 0067 ffff :826 : config... 12f14: 662e 6c73 635f 6f6c 6b63 632e 333a 3538 .fsl_clock.c:385 12f24: 3a20 6720 785f 6174 336c 4632 6572 0071 : g_xtal32Freq. 12f34: 662e 6c73 635f 6f6c 6b63 632e 323a 3633 .fsl_clock.c:236 12f44: 3a20 6720 785f 6174 306c 7246 7165 0000 : g_xtal0Freq.. 12f54: 662e 6c73 635f 6f6c 6b63 632e 323a 3134 .fsl_clock.c:241 12f64: 3a20 6720 785f 6174 336c 4632 6572 0071 : g_xtal32Freq. 12f74: 662e 6c73 635f 6f6c 6b63 632e 333a 3536 .fsl_clock.c:365 12f84: 3a20 6720 785f 6174 306c 7246 7165 ff00 : g_xtal0Freq.. 12f94: 662e 6c73 635f 6f6c 6b63 632e 363a 3433 .fsl_clock.c:634 12fa4: 3a20 6d20 6763 6c70 306c 6c63 006b ffff : mcgpll0clk... 12fb4: 662e 6c73 635f 6f6c 6b63 632e 313a 3734 .fsl_clock.c:147 12fc4: 2038 203a 6f63 666e 6769 ff00 8 : config.. 00012fd0 : 12fd0: 0280 02dc 0500 05b8 0780 0895 0a00 0b71 ..............q. 12fe0: 662e 6c73 645f 7073 2e69 3a63 3631 2032 .fsl_dspi.c:162 12ff0: 203a 6e69 7473 6e61 6563 3c20 4120 5252 : instance < ARR 13000: 5941 535f 5a49 2845 5f73 7364 6970 6142 AY_SIZE(s_dspiBa 13010: 6573 2973 ff00 ffff 662e 6c73 645f 7073 ses).....fsl_dsp 13020: 2e69 3a63 3232 2033 203a 616d 7473 7265 i.c:223 : master 13030: 6f43 666e 6769 ff00 662e 6c73 645f 7073 Config...fsl_dsp 13040: 2e69 3a63 3731 2035 203a 616d 7473 7265 i.c:175 : master 13050: 6f43 666e 6769 0000 662e 6c73 645f 7073 Config...fsl_dsp 13060: 2e69 3a63 3032 2030 203a 6166 736c 0065 i.c:200 : false. 13070: 662e 6c73 645f 7073 2e69 3a63 3731 3136 .fsl_dspi.c:1761 13080: 3a20 6720 645f 7073 4869 6e61 6c64 5b65 : g_dspiHandle[ 13090: 5d30 ff00 662e 6c73 645f 7073 2e69 3a63 0]...fsl_dspi.c: 130a0: 3731 3936 3a20 6720 645f 7073 4869 6e61 1769 : g_dspiHan 130b0: 6c64 5b65 5d31 ff00 dle[1].. 000130b8 : 130b8: 0002 0000 0003 0000 0005 0000 0007 0000 ................ 000130c8 : 130c8: 0002 0000 0004 0000 0006 0000 0008 0000 ................ 130d8: 0010 0000 0020 0000 0040 0000 0080 0000 .... ...@....... 130e8: 0100 0000 0200 0000 0400 0000 0800 0000 ................ 130f8: 1000 0000 2000 0000 4000 0000 8000 0000 ..... ...@...... 00013108 : 13108: 0001 0000 0003 0000 0005 0000 0007 0000 ................ 00013118 : 13118: 0002 0000 0004 0000 0008 0000 0010 0000 ................ 13128: 0020 0000 0040 0000 0080 0000 0100 0000 ...@........... 13138: 0200 0000 0400 0000 0800 0000 1000 0000 ................ 13148: 2000 0000 4000 0000 8000 0000 0000 0001 . ...@.......... 00013158 : 13158: 000c 103c 000d 103c 000c 1030 662e 6c73 ..<...<...0..fsl 13168: 705f 7469 632e 373a 2036 203a 6e69 7473 _pit.c:76 : inst 13178: 6e61 6563 3c20 4120 5252 5941 535f 5a49 ance < ARRAY_SIZ 13188: 2845 5f73 6970 4274 7361 7365 0029 ffff E(s_pitBases)... 13198: 662e 6c73 705f 7469 632e 383a 2033 203a .fsl_pit.c:83 : 131a8: 6f63 666e 6769 0000 config.. 000131b0 <__num_Ciob_streams>: 131b0: 0003 0000 2a2a 202a 7361 6573 7472 6620 ....*** assert f 131c0: 6961 656c 2064 203a 2a00 2a2a 5f20 7343 ailed : .*** _Cs 131d0: 7379 615f 6c6c 636f 6620 6961 656c 0a64 ys_alloc failed. 131e0: 7200 7700 2800 756e 6c6c 0029 5830 3000 .r.w.(null).0X.0 131f0: 0078 0030 002d 002b 3130 3332 3534 3736 x.0.-.+.01234567 13200: 3938 4241 4443 4645 3000 3231 3433 3635 89ABCDEF.0123456 13210: 3837 6139 6362 6564 0066 ffff 789abcdef...