C:\Users\decid\AppData\Local\arduino\sketches\63A9D0F3912B5BB39CEA52B09D4BDB6C/lettem_in.ino.elf: file format elf32-littlearm Disassembly of section .text.code: 60001400 : if (dest == dest_end) return; do { *dest++ = *src++; } while (dest < dest_end); #else asm volatile( 60001400: 4282 cmp r2, r0 60001402: d005 beq.n 60001410 60001404: f851 3b04 ldr.w r3, [r1], #4 60001408: f840 3b04 str.w r3, [r0], #4 6000140c: 4282 cmp r2, r0 6000140e: d8f9 bhi.n 60001404 " cmp %[end], %[dest] \n" " bhi.n 1b \n" "2: \n" : [dest] "+r" (dest), [src] "+r" (src) : [end] "r" (dest_end) : "r3", "memory"); #endif } 60001410: 4770 bx lr 60001412: bf00 nop 60001414 : #if 0 while (dest < dest_end) { *dest++ = 0; } #else asm volatile( 60001414: 4a04 ldr r2, [pc, #16] ; (60001428 ) 60001416: 4905 ldr r1, [pc, #20] ; (6000142c ) 60001418: f04f 0300 mov.w r3, #0 6000141c: f842 3b04 str.w r3, [r2], #4 60001420: 4291 cmp r1, r2 60001422: d8fb bhi.n 6000141c "1: str.w r3, [%[dest]], #4 \n" " cmp %[end], %[dest] \n" " bhi.n 1b \n" : [dest] "+r" (dest) : [end] "r" (dest_end) : "r3", "memory"); #endif } 60001424: 4770 bx lr 60001426: bf00 nop 60001428: 20001ac0 .word 0x20001ac0 6000142c: 20002e40 .word 0x20002e40 60001430 : { 60001430: b580 push {r7, lr} __asm__ volatile("dsb":::"memory"); 60001432: f3bf 8f4f dsb sy startup_early_hook(); // must be in FLASHMEM, as ITCM is not yet initialized! 60001436: f000 f9c7 bl 600017c8 CCM_ANALOG_PFD_480 = usb_pfd; 6000143a: 4c54 ldr r4, [pc, #336] ; (6000158c ) PMU_MISC0_SET = 1<<3; //Use bandgap-based bias currents for best performance (Page 1175) 6000143c: 4b54 ldr r3, [pc, #336] ; (60001590 ) 6000143e: 2008 movs r0, #8 CCM_ANALOG_PFD_528 = sys_pfd; 60001440: 4954 ldr r1, [pc, #336] ; (60001594 ) PMU_MISC0_SET = 1<<3; //Use bandgap-based bias currents for best performance (Page 1175) 60001442: f8c3 0154 str.w r0, [r3, #340] ; 0x154 memory_copy(&_stext, &_stextload, &_etext); 60001446: 4a54 ldr r2, [pc, #336] ; (60001598 ) CCM_ANALOG_PFD_528 = sys_pfd; 60001448: f8c3 1100 str.w r1, [r3, #256] ; 0x100 memory_copy(&_stext, &_stextload, &_etext); 6000144c: 4853 ldr r0, [pc, #332] ; (6000159c ) CCM_ANALOG_PFD_480 = usb_pfd; 6000144e: f8c3 40f0 str.w r4, [r3, #240] ; 0xf0 memory_copy(&_stext, &_stextload, &_etext); 60001452: 4953 ldr r1, [pc, #332] ; (600015a0 ) 60001454: f7ff ffd4 bl 60001400 memory_copy(&_sdata, &_sdataload, &_edata); 60001458: 4a52 ldr r2, [pc, #328] ; (600015a4 ) 6000145a: 4953 ldr r1, [pc, #332] ; (600015a8 ) 6000145c: 4853 ldr r0, [pc, #332] ; (600015ac ) 6000145e: f7ff ffcf bl 60001400 memory_clear(&_sbss, &_ebss); 60001462: 4c53 ldr r4, [pc, #332] ; (600015b0 ) 60001464: f7ff ffd6 bl 60001414 SCB_CPACR = 0x00F00000; 60001468: f44f 0070 mov.w r0, #15728640 ; 0xf00000 6000146c: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 for (i=0; i < NVIC_NUM_INTERRUPTS + 16; i++) _VectorsRam[i] = &unused_interrupt_vector; 60001470: 2300 movs r3, #0 60001472: 4a50 ldr r2, [pc, #320] ; (600015b4 ) SCB_CPACR = 0x00F00000; 60001474: f8c1 0d88 str.w r0, [r1, #3464] ; 0xd88 for (i=0; i < NVIC_NUM_INTERRUPTS + 16; i++) _VectorsRam[i] = &unused_interrupt_vector; 60001478: f844 2023 str.w r2, [r4, r3, lsl #2] 6000147c: 3301 adds r3, #1 6000147e: 2bb0 cmp r3, #176 ; 0xb0 60001480: d1fa bne.n 60001478 60001482: 4b4d ldr r3, [pc, #308] ; (600015b8 ) for (i=0; i < NVIC_NUM_INTERRUPTS; i++) NVIC_SET_PRIORITY(i, 128); 60001484: 2180 movs r1, #128 ; 0x80 60001486: 4a4d ldr r2, [pc, #308] ; (600015bc ) 60001488: f803 1b01 strb.w r1, [r3], #1 6000148c: 4293 cmp r3, r2 6000148e: d1fb bne.n 60001488 SCB_VTOR = (uint32_t)_VectorsRam; 60001490: f04f 25e0 mov.w r5, #3758153728 ; 0xe000e000 CCM_CSCMR1 = (CCM_CSCMR1 & ~CCM_CSCMR1_PERCLK_PODF(0x3F)) | CCM_CSCMR1_PERCLK_CLK_SEL; 60001494: 4f4a ldr r7, [pc, #296] ; (600015c0 ) IOMUXC_GPR_GPR26 = 0xFFFFFFFF; 60001496: 4a4b ldr r2, [pc, #300] ; (600015c4 ) 60001498: f04f 31ff mov.w r1, #4294967295 SCB_VTOR = (uint32_t)_VectorsRam; 6000149c: f8c5 4d08 str.w r4, [r5, #3336] ; 0xd08 SYST_CVR = 0; 600014a0: 2600 movs r6, #0 SCB_SHCSR |= SCB_SHCSR_MEMFAULTENA | SCB_SHCSR_BUSFAULTENA | SCB_SHCSR_USGFAULTENA; 600014a2: f8d5 3d24 ldr.w r3, [r5, #3364] ; 0xd24 600014a6: f443 23e0 orr.w r3, r3, #458752 ; 0x70000 600014aa: f8c5 3d24 str.w r3, [r5, #3364] ; 0xd24 CCM_CSCMR1 = (CCM_CSCMR1 & ~CCM_CSCMR1_PERCLK_PODF(0x3F)) | CCM_CSCMR1_PERCLK_CLK_SEL; 600014ae: 69fb ldr r3, [r7, #28] 600014b0: f023 037f bic.w r3, r3, #127 ; 0x7f 600014b4: f043 0340 orr.w r3, r3, #64 ; 0x40 600014b8: 61fb str r3, [r7, #28] CCM_CSCDR1 = (CCM_CSCDR1 & ~CCM_CSCDR1_UART_CLK_PODF(0x3F)) | CCM_CSCDR1_UART_CLK_SEL; 600014ba: 6a7b ldr r3, [r7, #36] ; 0x24 600014bc: f023 037f bic.w r3, r3, #127 ; 0x7f 600014c0: f043 0340 orr.w r3, r3, #64 ; 0x40 600014c4: 627b str r3, [r7, #36] ; 0x24 IOMUXC_GPR_GPR26 = 0xFFFFFFFF; 600014c6: 6691 str r1, [r2, #104] ; 0x68 IOMUXC_GPR_GPR27 = 0xFFFFFFFF; 600014c8: 66d1 str r1, [r2, #108] ; 0x6c IOMUXC_GPR_GPR28 = 0xFFFFFFFF; 600014ca: 6711 str r1, [r2, #112] ; 0x70 IOMUXC_GPR_GPR29 = 0xFFFFFFFF; 600014cc: 6751 str r1, [r2, #116] ; 0x74 configure_cache(); 600014ce: f000 f983 bl 600017d8 _VectorsRam[14] = pendablesrvreq_isr; 600014d2: 4b3d ldr r3, [pc, #244] ; (600015c8 ) SYST_RVR = (SYSTICK_EXT_FREQ / 1000) - 1; 600014d4: 2263 movs r2, #99 ; 0x63 systick_cycle_count = ARM_DWT_CYCCNT; // compiled 0, corrected w/1st systick 600014d6: 493d ldr r1, [pc, #244] ; (600015cc ) _VectorsRam[14] = pendablesrvreq_isr; 600014d8: 63a3 str r3, [r4, #56] ; 0x38 _VectorsRam[15] = systick_isr; 600014da: 4b3d ldr r3, [pc, #244] ; (600015d0 ) 600014dc: 63e3 str r3, [r4, #60] ; 0x3c SYST_CSR = SYST_CSR_TICKINT | SYST_CSR_ENABLE; 600014de: 2303 movs r3, #3 SYST_RVR = (SYSTICK_EXT_FREQ / 1000) - 1; 600014e0: 616a str r2, [r5, #20] SCB_SHPR3 = 0x20200000; // Systick, pendablesrvreq_isr = priority 32; 600014e2: 4a3c ldr r2, [pc, #240] ; (600015d4 ) SYST_CVR = 0; 600014e4: 61ae str r6, [r5, #24] SYST_CSR = SYST_CSR_TICKINT | SYST_CSR_ENABLE; 600014e6: 612b str r3, [r5, #16] SCB_SHPR3 = 0x20200000; // Systick, pendablesrvreq_isr = priority 32; 600014e8: f8c5 2d20 str.w r2, [r5, #3360] ; 0xd20 ARM_DEMCR |= ARM_DEMCR_TRCENA; 600014ec: f8d5 2dfc ldr.w r2, [r5, #3580] ; 0xdfc ARM_DWT_CTRL |= ARM_DWT_CTRL_CYCCNTENA; // turn on cycle counter 600014f0: 4b39 ldr r3, [pc, #228] ; (600015d8 ) ARM_DEMCR |= ARM_DEMCR_TRCENA; 600014f2: f042 7280 orr.w r2, r2, #16777216 ; 0x1000000 600014f6: f8c5 2dfc str.w r2, [r5, #3580] ; 0xdfc ARM_DWT_CTRL |= ARM_DWT_CTRL_CYCCNTENA; // turn on cycle counter 600014fa: 681a ldr r2, [r3, #0] 600014fc: f042 0201 orr.w r2, r2, #1 60001500: 601a str r2, [r3, #0] systick_cycle_count = ARM_DWT_CYCCNT; // compiled 0, corrected w/1st systick 60001502: 685b ldr r3, [r3, #4] 60001504: 600b str r3, [r1, #0] usb_pll_start(); 60001506: f000 fb2b bl 60001b60 set_arm_clock(F_CPU); 6000150a: 4834 ldr r0, [pc, #208] ; (600015dc ) 6000150c: f000 fcdc bl 60001ec8 <__set_arm_clock_veneer> CCM_CCGR1 |= CCM_CCGR1_PIT(CCM_CCGR_ON); 60001510: 6ef9 ldr r1, [r7, #108] ; 0x6c PIT_MCR = 0; 60001512: 4b33 ldr r3, [pc, #204] ; (600015e0 ) if (!(SNVS_LPCR & SNVS_LPCR_SRTC_ENV)) { 60001514: 4a33 ldr r2, [pc, #204] ; (600015e4 ) CCM_CCGR1 |= CCM_CCGR1_PIT(CCM_CCGR_ON); 60001516: f441 5140 orr.w r1, r1, #12288 ; 0x3000 6000151a: 66f9 str r1, [r7, #108] ; 0x6c PIT_MCR = 0; 6000151c: 601e str r6, [r3, #0] PIT_TCTRL0 = 0; 6000151e: f8c3 6108 str.w r6, [r3, #264] ; 0x108 PIT_TCTRL1 = 0; 60001522: f8c3 6118 str.w r6, [r3, #280] ; 0x118 PIT_TCTRL2 = 0; 60001526: f8c3 6128 str.w r6, [r3, #296] ; 0x128 PIT_TCTRL3 = 0; 6000152a: f8c3 6138 str.w r6, [r3, #312] ; 0x138 if (!(SNVS_LPCR & SNVS_LPCR_SRTC_ENV)) { 6000152e: 6b93 ldr r3, [r2, #56] ; 0x38 60001530: 07db lsls r3, r3, #31 60001532: d408 bmi.n 60001546 SNVS_LPSRTCMR = 1546300800u >> 17; 60001534: f642 6315 movw r3, #11797 ; 0x2e15 SNVS_LPSRTCLR = 1546300800u << 15; 60001538: 492b ldr r1, [pc, #172] ; (600015e8 ) 6000153a: 6551 str r1, [r2, #84] ; 0x54 SNVS_LPSRTCMR = 1546300800u >> 17; 6000153c: 6513 str r3, [r2, #80] ; 0x50 SNVS_LPCR |= SNVS_LPCR_SRTC_ENV; 6000153e: 6b93 ldr r3, [r2, #56] ; 0x38 60001540: f043 0301 orr.w r3, r3, #1 60001544: 6393 str r3, [r2, #56] ; 0x38 SNVS_HPCR |= SNVS_HPCR_RTC_EN | SNVS_HPCR_HP_TS; 60001546: 4a27 ldr r2, [pc, #156] ; (600015e4 ) 60001548: 4c28 ldr r4, [pc, #160] ; (600015ec ) 6000154a: 6893 ldr r3, [r2, #8] 6000154c: f043 1301 orr.w r3, r3, #65537 ; 0x10001 60001550: 6093 str r3, [r2, #8] configure_external_ram(); 60001552: f000 f9cb bl 600018ec analog_init(); 60001556: f000 fc67 bl 60001e28 pwm_init(); 6000155a: f000 fc9d bl 60001e98 <__pwm_init_veneer> tempmon_init(); 6000155e: f000 fb2d bl 60001bbc startup_middle_hook(); 60001562: f000 f933 bl 600017cc // Returns the number of milliseconds since your program started running. // This 32 bit number will roll back to zero after about 49.7 days. For a // simpler way to build delays or timeouts, consider using elapsedMillis. static inline uint32_t millis(void) { return systick_millis_count; 60001566: 6823 ldr r3, [r4, #0] while (millis() < TEENSY_INIT_USB_DELAY_BEFORE) ; // wait 60001568: 2b13 cmp r3, #19 6000156a: d9fc bls.n 60001566 usb_init(); 6000156c: f000 fbbe bl 60001cec 60001570: 6823 ldr r3, [r4, #0] while (millis() < TEENSY_INIT_USB_DELAY_AFTER + TEENSY_INIT_USB_DELAY_BEFORE) ; // wait 60001572: f5b3 7f96 cmp.w r3, #300 ; 0x12c 60001576: d3fb bcc.n 60001570 startup_debug_reset(); 60001578: f000 f92c bl 600017d4 startup_late_hook(); 6000157c: f000 f928 bl 600017d0 __libc_init_array(); 60001580: f000 fc9a bl 60001eb8 <____libc_init_array_veneer> main(); 60001584: f000 fca8 bl 60001ed8 <__main_veneer> while (1) asm("WFI"); 60001588: bf30 wfi 6000158a: e7fd b.n 60001588 6000158c: 13110d0c .word 0x13110d0c 60001590: 400d8000 .word 0x400d8000 60001594: 2018101b .word 0x2018101b 60001598: 0000e138 .word 0x0000e138 6000159c: 00000000 .word 0x00000000 600015a0: 60002254 .word 0x60002254 600015a4: 20001ac0 .word 0x20001ac0 600015a8: 60010390 .word 0x60010390 600015ac: 20000000 .word 0x20000000 600015b0: 20001800 .word 0x20001800 600015b4: 0000b6d1 .word 0x0000b6d1 600015b8: e000e400 .word 0xe000e400 600015bc: e000e4a0 .word 0xe000e4a0 600015c0: 400fc000 .word 0x400fc000 600015c4: 400ac000 .word 0x400ac000 600015c8: 0000aad5 .word 0x0000aad5 600015cc: 20002d8c .word 0x20002d8c 600015d0: 0000aad9 .word 0x0000aad9 600015d4: 20200000 .word 0x20200000 600015d8: e0001000 .word 0xe0001000 600015dc: 23c34600 .word 0x23c34600 600015e0: 40084000 .word 0x40084000 600015e4: 400d4000 .word 0x400d4000 600015e8: 56c00000 .word 0x56c00000 600015ec: 20002d90 .word 0x20002d90 600015f0 : IOMUXC_GPR_GPR17 = (uint32_t)&_flexram_bank_config; 600015f0: 4b05 ldr r3, [pc, #20] ; (60001608 ) IOMUXC_GPR_GPR14 = 0x00AA0000; 600015f2: f44f 012a mov.w r1, #11141120 ; 0xaa0000 IOMUXC_GPR_GPR17 = (uint32_t)&_flexram_bank_config; 600015f6: 4a05 ldr r2, [pc, #20] ; (6000160c ) IOMUXC_GPR_GPR16 = 0x00200007; 600015f8: 4805 ldr r0, [pc, #20] ; (60001610 ) IOMUXC_GPR_GPR17 = (uint32_t)&_flexram_bank_config; 600015fa: 645a str r2, [r3, #68] ; 0x44 IOMUXC_GPR_GPR16 = 0x00200007; 600015fc: 6418 str r0, [r3, #64] ; 0x40 __asm__ volatile("mov sp, %0" : : "r" ((uint32_t)&_estack) : "memory"); 600015fe: 4a05 ldr r2, [pc, #20] ; (60001614 ) IOMUXC_GPR_GPR14 = 0x00AA0000; 60001600: 6399 str r1, [r3, #56] ; 0x38 __asm__ volatile("mov sp, %0" : : "r" ((uint32_t)&_estack) : "memory"); 60001602: 4695 mov sp, r2 ResetHandler2(); 60001604: f7ff ff14 bl 60001430 60001608: 400ac000 .word 0x400ac000 6000160c: aaaaaaaf .word 0xaaaaaaaf 60001610: 00200007 .word 0x00200007 60001614: 20070000 .word 0x20070000 60001618 : unsigned int i; unsigned int maxnum = MAX_AUDIO_MEMORY / AUDIO_BLOCK_SAMPLES / 2; //Serial.println("AudioStream initialize_memory"); //delay(10); if (num > maxnum) num = maxnum; 60001618: f5b1 7f60 cmp.w r1, #896 ; 0x380 { 6000161c: b5f0 push {r4, r5, r6, r7, lr} 6000161e: 460e mov r6, r1 60001620: b08d sub sp, #52 ; 0x34 60001622: bf28 it cs 60001624: f44f 7660 movcs.w r6, #896 ; 0x380 60001628: 460f mov r7, r1 6000162a: 4605 mov r5, r0 __disable_irq(); 6000162c: b672 cpsid i memory_pool = data; 6000162e: 4b2e ldr r3, [pc, #184] ; (600016e8 ) memory_pool_first_mask = 0; 60001630: 2400 movs r4, #0 for (i=0; i < NUM_MASKS; i++) { memory_pool_available_mask[i] = 0; 60001632: 2270 movs r2, #112 ; 0x70 memory_pool = data; 60001634: 6018 str r0, [r3, #0] memory_pool_available_mask[i] = 0; 60001636: 4621 mov r1, r4 memory_pool_first_mask = 0; 60001638: 4b2c ldr r3, [pc, #176] ; (600016ec ) memory_pool_available_mask[i] = 0; 6000163a: 482d ldr r0, [pc, #180] ; (600016f0 ) memory_pool_first_mask = 0; 6000163c: 801c strh r4, [r3, #0] memory_pool_available_mask[i] = 0; 6000163e: f000 fc23 bl 60001e88 <__memset_veneer> } for (i=0; i < num; i++) { 60001642: b1cf cbz r7, 60001678 60001644: 4621 mov r1, r4 60001646: 482a ldr r0, [pc, #168] ; (600016f0 ) memory_pool_available_mask[i >> 5] |= (1 << (i & 0x1F)); 60001648: f04f 0c01 mov.w ip, #1 6000164c: 094a lsrs r2, r1, #5 6000164e: f001 031f and.w r3, r1, #31 for (i=0; i < num; i++) { 60001652: 3101 adds r1, #1 memory_pool_available_mask[i >> 5] |= (1 << (i & 0x1F)); 60001654: f850 4022 ldr.w r4, [r0, r2, lsl #2] 60001658: fa0c f303 lsl.w r3, ip, r3 for (i=0; i < num; i++) { 6000165c: 428e cmp r6, r1 memory_pool_available_mask[i >> 5] |= (1 << (i & 0x1F)); 6000165e: ea43 0304 orr.w r3, r3, r4 60001662: f840 3022 str.w r3, [r0, r2, lsl #2] for (i=0; i < num; i++) { 60001666: d8f1 bhi.n 6000164c 60001668: 4628 mov r0, r5 6000166a: 2300 movs r3, #0 } for (i=0; i < num; i++) { data[i].memory_pool_index = i; 6000166c: 8043 strh r3, [r0, #2] for (i=0; i < num; i++) { 6000166e: 3301 adds r3, #1 60001670: f500 7082 add.w r0, r0, #260 ; 0x104 60001674: 429e cmp r6, r3 60001676: d8f9 bhi.n 6000166c } if (update_scheduled == false) { 60001678: 4c1e ldr r4, [pc, #120] ; (600016f4 ) 6000167a: 7825 ldrb r5, [r4, #0] 6000167c: b115 cbz r5, 60001684 float usec = 1e6 * AUDIO_BLOCK_SAMPLES / AUDIO_SAMPLE_RATE_EXACT; timer->begin(update_all, usec); update_setup(); } } __enable_irq(); 6000167e: b662 cpsie i } 60001680: b00d add sp, #52 ; 0x34 60001682: bdf0 pop {r4, r5, r6, r7, pc} IntervalTimer *timer = new IntervalTimer(); 60001684: 2008 movs r0, #8 60001686: f000 fc13 bl 60001eb0 <___Znwj_veneer> static_assert(Alignment % alignof(C) == 0, "inplace_function cannot be constructed from object with this (large) alignment" ); static const vtable_t vt{inplace_function_detail::wrapper{}}; vtable_ptr_ = std::addressof(vt); 6000168a: 4b1b ldr r3, [pc, #108] ; (600016f8 ) // instances may be in use by libraries. class IntervalTimer { private: static const int32_t MAX_PERIOD = UINT32_MAX / (24000000 / 1000000); // need to change to int32_t to avoid warnings public: constexpr IntervalTimer() { 6000168c: 2280 movs r2, #128 ; 0x80 6000168e: 4606 mov r6, r0 60001690: 9300 str r3, [sp, #0] {} inplace_function(const inplace_function& other) : vtable_ptr_{other.vtable_ptr_} { vtable_ptr_->copy_ptr( 60001692: a902 add r1, sp, #8 vtable_ptr_{other.vtable_ptr_} 60001694: 9306 str r3, [sp, #24] ::new (std::addressof(storage_)) C{std::forward(closure)}; 60001696: 4b19 ldr r3, [pc, #100] ; (600016fc ) 60001698: 7102 strb r2, [r0, #4] 6000169a: 6005 str r5, [r0, #0] vtable_ptr_->copy_ptr( 6000169c: a808 add r0, sp, #32 ::new (std::addressof(storage_)) C{std::forward(closure)}; 6000169e: 9302 str r3, [sp, #8] vtable_ptr_->copy_ptr( 600016a0: f000 fc02 bl 60001ea8 <___ZZN6teensy23inplace_function_detail6vtableIvJEEC4IPFvvEEENS0_7wrapperIT_EEENUlPvS9_E0_4_FUNES9_S9__veneer> // for precise timing. Returns true is sucessful, or false if // all hardware timers are already in use. template bool begin(callback_t funct, period_t period) { uint32_t cycles = cyclesFromPeriod(period); return cycles >= 17 ? beginCycles(funct, cycles) : false; 600016a4: a906 add r1, sp, #24 600016a6: 4a16 ldr r2, [pc, #88] ; (60001700 ) 600016a8: 4630 mov r0, r6 600016aa: f000 fc09 bl 60001ec0 <___ZN13IntervalTimer11beginCyclesEN6teensy16inplace_functionIFvvELj16ELj8EEEm_veneer> return *this; } ~inplace_function() { vtable_ptr_->destructor_ptr(std::addressof(storage_)); 600016ae: 9b06 ldr r3, [sp, #24] 600016b0: a808 add r0, sp, #32 600016b2: 68db ldr r3, [r3, #12] 600016b4: 4798 blx r3 600016b6: 9b00 ldr r3, [sp, #0] 600016b8: a802 add r0, sp, #8 600016ba: 68db ldr r3, [r3, #12] 600016bc: 4798 blx r3 // their constructors. bool AudioStream::update_scheduled = false; bool AudioStream::update_setup(void) { if (update_scheduled) return false; 600016be: 7823 ldrb r3, [r4, #0] 600016c0: 2b00 cmp r3, #0 600016c2: d1dc bne.n 6000167e #ifdef __cplusplus extern "C" void (* volatile _VectorsRam[NVIC_NUM_INTERRUPTS+16])(void); static inline void attachInterruptVector(IRQ_NUMBER_t irq, void (*function)(void)) __attribute__((always_inline, unused)); static inline void attachInterruptVector(IRQ_NUMBER_t irq, void (*function)(void)) { _VectorsRam[irq + 16] = function; asm volatile("": : :"memory"); } 600016c4: 4b0f ldr r3, [pc, #60] ; (60001704 ) 600016c6: 4a10 ldr r2, [pc, #64] ; (60001708 ) 600016c8: f8c3 2158 str.w r2, [r3, #344] ; 0x158 attachInterruptVector(IRQ_SOFTWARE, software_isr); NVIC_SET_PRIORITY(IRQ_SOFTWARE, 208); // 255 = lowest priority 600016cc: 490f ldr r1, [pc, #60] ; (6000170c ) 600016ce: 20d0 movs r0, #208 ; 0xd0 NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 600016d0: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 600016d4: 2240 movs r2, #64 ; 0x40 NVIC_SET_PRIORITY(IRQ_SOFTWARE, 208); // 255 = lowest priority 600016d6: f881 0046 strb.w r0, [r1, #70] ; 0x46 NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 600016da: f8c3 2108 str.w r2, [r3, #264] ; 0x108 update_scheduled = true; 600016de: 2301 movs r3, #1 600016e0: 7023 strb r3, [r4, #0] __enable_irq(); 600016e2: b662 cpsie i } 600016e4: b00d add sp, #52 ; 0x34 600016e6: bdf0 pop {r4, r5, r6, r7, pc} 600016e8: 20002454 .word 0x20002454 600016ec: 20002dde .word 0x20002dde 600016f0: 2000245c .word 0x2000245c 600016f4: 20002df7 .word 0x20002df7 600016f8: 20000b24 .word 0x20000b24 600016fc: 0000a5dd .word 0x0000a5dd 60001700: 0001101b .word 0x0001101b 60001704: 20001800 .word 0x20001800 60001708: 0000a5e9 .word 0x0000a5e9 6000170c: e000e400 .word 0xe000e400 60001710 : FLEXSPI2_IPCR0 = addr; 60001710: 4a2b ldr r2, [pc, #172] ; (600017c0 ) FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001712: 2100 movs r1, #0 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 60001714: 2301 movs r3, #1 { 60001716: b410 push {r4} FLEXSPI2_IPCR0 = addr; 60001718: f8c2 00a0 str.w r0, [r2, #160] ; 0xa0 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 6000171c: f8c2 10a4 str.w r1, [r2, #164] ; 0xa4 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 60001720: f8c2 30b0 str.w r3, [r2, #176] ; 0xb0 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001724: 6953 ldr r3, [r2, #20] 60001726: 07db lsls r3, r3, #31 60001728: d5fc bpl.n 60001724 FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 6000172a: 2301 movs r3, #1 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 6000172c: f44f 3480 mov.w r4, #65536 ; 0x10000 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001730: 4923 ldr r1, [pc, #140] ; (600017c0 ) FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 60001732: 6153 str r3, [r2, #20] FLEXSPI2_IPCR0 = addr; 60001734: f8c2 00a0 str.w r0, [r2, #160] ; 0xa0 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001738: f8c2 40a4 str.w r4, [r2, #164] ; 0xa4 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 6000173c: f8c2 30b0 str.w r3, [r2, #176] ; 0xb0 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001740: 694b ldr r3, [r1, #20] 60001742: 07dc lsls r4, r3, #31 60001744: d5fc bpl.n 60001740 FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 60001746: 2301 movs r3, #1 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001748: f44f 3400 mov.w r4, #131072 ; 0x20000 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 6000174c: 4a1c ldr r2, [pc, #112] ; (600017c0 ) FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 6000174e: 614b str r3, [r1, #20] FLEXSPI2_IPCR0 = addr; 60001750: f8c1 00a0 str.w r0, [r1, #160] ; 0xa0 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001754: f8c1 40a4 str.w r4, [r1, #164] ; 0xa4 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 60001758: f8c1 30b0 str.w r3, [r1, #176] ; 0xb0 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 6000175c: 6953 ldr r3, [r2, #20] 6000175e: 07d9 lsls r1, r3, #31 60001760: d5fc bpl.n 6000175c FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 60001762: 2301 movs r3, #1 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(3) | FLEXSPI_IPCR1_IDATSZ(4); 60001764: 4c17 ldr r4, [pc, #92] ; (600017c4 ) while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001766: 4916 ldr r1, [pc, #88] ; (600017c0 ) FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 60001768: 6153 str r3, [r2, #20] FLEXSPI2_IPCR0 = addr; 6000176a: f8c2 00a0 str.w r0, [r2, #160] ; 0xa0 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(3) | FLEXSPI_IPCR1_IDATSZ(4); 6000176e: f8c2 40a4 str.w r4, [r2, #164] ; 0xa4 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 60001772: f8c2 30b0 str.w r3, [r2, #176] ; 0xb0 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001776: 694b ldr r3, [r1, #20] 60001778: 07db lsls r3, r3, #31 6000177a: d5fc bpl.n 60001776 uint32_t id = FLEXSPI2_RFDR0; 6000177c: f8d1 3100 ldr.w r3, [r1, #256] ; 0x100 switch (id & 0xFFFF) 60001780: f645 500d movw r0, #23821 ; 0x5d0d FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE | FLEXSPI_INTR_IPRXWA; 60001784: 2421 movs r4, #33 ; 0x21 switch (id & 0xFFFF) 60001786: b29a uxth r2, r3 FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE | FLEXSPI_INTR_IPRXWA; 60001788: 614c str r4, [r1, #20] switch (id & 0xFFFF) 6000178a: 4282 cmp r2, r0 6000178c: d014 beq.n 600017b8 6000178e: f645 519d movw r1, #23965 ; 0x5d9d 60001792: 428a cmp r2, r1 60001794: d10c bne.n 600017b0 switch ((id >> 21) & 0x7) // get size (Datasheet Table 6.2) 60001796: f3c3 5342 ubfx r3, r3, #21, #3 6000179a: 2b03 cmp r3, #3 6000179c: d00c beq.n 600017b8 6000179e: f1a3 0304 sub.w r3, r3, #4 } 600017a2: f85d 4b04 ldr.w r4, [sp], #4 600017a6: fab3 f383 clz r3, r3 600017aa: 095b lsrs r3, r3, #5 600017ac: 0118 lsls r0, r3, #4 600017ae: 4770 bx lr switch (id & 0xFFFF) 600017b0: 2000 movs r0, #0 } 600017b2: f85d 4b04 ldr.w r4, [sp], #4 600017b6: 4770 bx lr result = 8; 600017b8: 2008 movs r0, #8 } 600017ba: f85d 4b04 ldr.w r4, [sp], #4 600017be: 4770 bx lr 600017c0: 402a4000 .word 0x402a4000 600017c4: 00030004 .word 0x00030004 600017c8 : FLASHMEM void startup_default_early_hook(void) {} 600017c8: 4770 bx lr 600017ca: bf00 nop 600017cc : 600017cc: 4770 bx lr 600017ce: bf00 nop 600017d0 : 600017d0: 4770 bx lr 600017d2: bf00 nop 600017d4 : FLASHMEM void startup_debug_reset(void) { __asm__ volatile("nop"); } 600017d4: bf00 nop 600017d6: 4770 bx lr 600017d8 : { 600017d8: b410 push {r4} SCB_MPU_CTRL = 0; // turn off MPU 600017da: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 600017de: 2100 movs r1, #0 SCB_MPU_RBAR = 0x00000000 | REGION(i++); //https://developer.arm.com/docs/146793866/10/why-does-the-cortex-m7-initiate-axim-read-accesses-to-memory-addresses-that-do-not-fall-under-a-defined-mpu-region 600017e0: 2410 movs r4, #16 SCB_MPU_RASR = SCB_MPU_RASR_TEX(0) | NOACCESS | NOEXEC | SIZE_4G; 600017e2: 4832 ldr r0, [pc, #200] ; (600018ac ) SCB_MPU_CTRL = 0; // turn off MPU 600017e4: f8c3 1d94 str.w r1, [r3, #3476] ; 0xd94 SCB_MPU_RBAR = 0x00000000 | REGION(i++); //https://developer.arm.com/docs/146793866/10/why-does-the-cortex-m7-initiate-axim-read-accesses-to-memory-addresses-that-do-not-fall-under-a-defined-mpu-region 600017e8: f8c3 4d9c str.w r4, [r3, #3484] ; 0xd9c SCB_MPU_RBAR = 0x00000000 | REGION(i++); // ITCM 600017ec: 2411 movs r4, #17 SCB_MPU_RASR = SCB_MPU_RASR_TEX(0) | NOACCESS | NOEXEC | SIZE_4G; 600017ee: f8c3 0da0 str.w r0, [r3, #3488] ; 0xda0 SCB_MPU_RASR = MEM_NOCACHE | READONLY | SIZE_512K; 600017f2: 482f ldr r0, [pc, #188] ; (600018b0 ) SCB_MPU_RBAR = 0x00000000 | REGION(i++); // ITCM 600017f4: f8c3 4d9c str.w r4, [r3, #3484] ; 0xd9c SCB_MPU_RBAR = 0x00000000 | REGION(i++); // trap NULL pointer deref 600017f8: 2412 movs r4, #18 SCB_MPU_RASR = MEM_NOCACHE | READONLY | SIZE_512K; 600017fa: f8c3 0da0 str.w r0, [r3, #3488] ; 0xda0 SCB_MPU_RASR = DEV_NOCACHE | NOACCESS | SIZE_32B; 600017fe: 482d ldr r0, [pc, #180] ; (600018b4 ) SCB_MPU_RBAR = 0x00000000 | REGION(i++); // trap NULL pointer deref 60001800: f8c3 4d9c str.w r4, [r3, #3484] ; 0xd9c SCB_MPU_RBAR = ((uint32_t)&_ebss) | REGION(i++); // trap stack overflow 60001804: 4a2c ldr r2, [pc, #176] ; (600018b8 ) SCB_MPU_RASR = DEV_NOCACHE | NOACCESS | SIZE_32B; 60001806: f8c3 0da0 str.w r0, [r3, #3488] ; 0xda0 SCB_MPU_RBAR = 0x00200000 | REGION(i++); // Boot ROM 6000180a: 4c2c ldr r4, [pc, #176] ; (600018bc ) SCB_MPU_RBAR = ((uint32_t)&_ebss) | REGION(i++); // trap stack overflow 6000180c: f042 0215 orr.w r2, r2, #21 SCB_MPU_RASR = MEM_CACHE_WT | READONLY | SIZE_128K; 60001810: 482b ldr r0, [pc, #172] ; (600018c0 ) SCB_MPU_RBAR = 0x00200000 | REGION(i++); // Boot ROM 60001812: f8c3 4d9c str.w r4, [r3, #3484] ; 0xd9c SCB_MPU_RASR = MEM_CACHE_WT | READONLY | SIZE_128K; 60001816: f8c3 0da0 str.w r0, [r3, #3488] ; 0xda0 SCB_MPU_RBAR = 0x20000000 | REGION(i++); // DTCM 6000181a: 4c2a ldr r4, [pc, #168] ; (600018c4 ) SCB_MPU_RASR = MEM_NOCACHE | READWRITE | NOEXEC | SIZE_512K; 6000181c: 482a ldr r0, [pc, #168] ; (600018c8 ) SCB_MPU_RBAR = 0x20000000 | REGION(i++); // DTCM 6000181e: f8c3 4d9c str.w r4, [r3, #3484] ; 0xd9c SCB_MPU_RASR = MEM_NOCACHE | READWRITE | NOEXEC | SIZE_512K; 60001822: f8c3 0da0 str.w r0, [r3, #3488] ; 0xda0 SCB_MPU_RASR = SCB_MPU_RASR_TEX(0) | NOACCESS | NOEXEC | SIZE_32B; 60001826: 4c29 ldr r4, [pc, #164] ; (600018cc ) SCB_MPU_RBAR = ((uint32_t)&_ebss) | REGION(i++); // trap stack overflow 60001828: f8c3 2d9c str.w r2, [r3, #3484] ; 0xd9c SCB_MPU_RBAR = 0x20200000 | REGION(i++); // RAM (AXI bus) 6000182c: 4828 ldr r0, [pc, #160] ; (600018d0 ) SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_1M; 6000182e: 4a29 ldr r2, [pc, #164] ; (600018d4 ) SCB_MPU_RASR = SCB_MPU_RASR_TEX(0) | NOACCESS | NOEXEC | SIZE_32B; 60001830: f8c3 4da0 str.w r4, [r3, #3488] ; 0xda0 SCB_MPU_RBAR = 0x20200000 | REGION(i++); // RAM (AXI bus) 60001834: f8c3 0d9c str.w r0, [r3, #3484] ; 0xd9c SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_1M; 60001838: f8c3 2da0 str.w r2, [r3, #3488] ; 0xda0 SCB_MPU_RASR = DEV_NOCACHE | READWRITE | NOEXEC | SIZE_64M; 6000183c: f502 22a0 add.w r2, r2, #327680 ; 0x50000 SCB_MPU_RBAR = 0x40000000 | REGION(i++); // Peripherals 60001840: 4c25 ldr r4, [pc, #148] ; (600018d8 ) SCB_MPU_RASR = DEV_NOCACHE | READWRITE | NOEXEC | SIZE_64M; 60001842: 320c adds r2, #12 SCB_MPU_RBAR = 0x60000000 | REGION(i++); // QSPI Flash 60001844: 4825 ldr r0, [pc, #148] ; (600018dc ) SCB_MPU_RBAR = 0x40000000 | REGION(i++); // Peripherals 60001846: f8c3 4d9c str.w r4, [r3, #3484] ; 0xd9c SCB_MPU_RASR = DEV_NOCACHE | READWRITE | NOEXEC | SIZE_64M; 6000184a: f8c3 2da0 str.w r2, [r3, #3488] ; 0xda0 SCB_MPU_RASR = MEM_CACHE_WBWA | READONLY | SIZE_16M; 6000184e: 4a24 ldr r2, [pc, #144] ; (600018e0 ) SCB_MPU_RBAR = 0x60000000 | REGION(i++); // QSPI Flash 60001850: f8c3 0d9c str.w r0, [r3, #3484] ; 0xd9c SCB_MPU_RASR = MEM_CACHE_WBWA | READONLY | SIZE_16M; 60001854: f8c3 2da0 str.w r2, [r3, #3488] ; 0xda0 SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_32M; 60001858: f102 6240 add.w r2, r2, #201326592 ; 0xc000000 SCB_MPU_RBAR = 0x70000000 | REGION(i++); // FlexSPI2 6000185c: 4c21 ldr r4, [pc, #132] ; (600018e4 ) SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_32M; 6000185e: 3202 adds r2, #2 SCB_MPU_RBAR = 0x80000000 | REGION(i++); // SEMC: SDRAM, NAND, SRAM, etc 60001860: 4821 ldr r0, [pc, #132] ; (600018e8 ) SCB_MPU_RBAR = 0x70000000 | REGION(i++); // FlexSPI2 60001862: f8c3 4d9c str.w r4, [r3, #3484] ; 0xd9c SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_32M; 60001866: f8c3 2da0 str.w r2, [r3, #3488] ; 0xda0 SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_1G; 6000186a: 320a adds r2, #10 SCB_MPU_RBAR = 0x80000000 | REGION(i++); // SEMC: SDRAM, NAND, SRAM, etc 6000186c: f8c3 0d9c str.w r0, [r3, #3484] ; 0xd9c SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_1G; 60001870: f8c3 2da0 str.w r2, [r3, #3488] ; 0xda0 asm("nop"); // allow a few cycles for bus writes before enable MPU 60001874: bf00 nop asm("nop"); 60001876: bf00 nop asm("nop"); 60001878: bf00 nop asm("nop"); 6000187a: bf00 nop asm("nop"); 6000187c: bf00 nop SCB_MPU_CTRL = SCB_MPU_CTRL_ENABLE; 6000187e: 2201 movs r2, #1 60001880: f8c3 2d94 str.w r2, [r3, #3476] ; 0xd94 asm("dsb"); 60001884: f3bf 8f4f dsb sy asm("isb"); 60001888: f3bf 8f6f isb sy SCB_CACHE_ICIALLU = 0; 6000188c: f8c3 1f50 str.w r1, [r3, #3920] ; 0xf50 asm("dsb"); 60001890: f3bf 8f4f dsb sy asm("isb"); 60001894: f3bf 8f6f isb sy SCB_CCR |= (SCB_CCR_IC | SCB_CCR_DC); 60001898: f8d3 2d14 ldr.w r2, [r3, #3348] ; 0xd14 } 6000189c: f85d 4b04 ldr.w r4, [sp], #4 SCB_CCR |= (SCB_CCR_IC | SCB_CCR_DC); 600018a0: f442 3240 orr.w r2, r2, #196608 ; 0x30000 600018a4: f8c3 2d14 str.w r2, [r3, #3348] ; 0xd14 } 600018a8: 4770 bx lr 600018aa: bf00 nop 600018ac: 1000003f .word 0x1000003f 600018b0: 07080025 .word 0x07080025 600018b4: 00100009 .word 0x00100009 600018b8: 20002e40 .word 0x20002e40 600018bc: 00200013 .word 0x00200013 600018c0: 07020021 .word 0x07020021 600018c4: 20000014 .word 0x20000014 600018c8: 13080025 .word 0x13080025 600018cc: 10000009 .word 0x10000009 600018d0: 20200016 .word 0x20200016 600018d4: 130b0027 .word 0x130b0027 600018d8: 40000017 .word 0x40000017 600018dc: 60000018 .word 0x60000018 600018e0: 070b002f .word 0x070b002f 600018e4: 70000019 .word 0x70000019 600018e8: 8000001a .word 0x8000001a 600018ec : { 600018ec: b5f0 push {r4, r5, r6, r7, lr} IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_22 = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst 600018ee: 4b82 ldr r3, [pc, #520] ; (60001af8 ) IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_22 = 8 | 0x10; // ALT1 = FLEXSPI2_A_SS1_B (Flash) 600018f0: 2218 movs r2, #24 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_22 = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst 600018f2: 4d82 ldr r5, [pc, #520] ; (60001afc ) IOMUXC_FLEXSPI2_IPP_IND_DQS_FA_SELECT_INPUT = 1; // GPIO_EMC_23 for Mode: ALT8, pg 986 600018f4: 2001 movs r0, #1 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_23 = 0x110F9; // keeper, strong drive, max speed, hyst 600018f6: 4f82 ldr r7, [pc, #520] ; (60001b00 ) { 600018f8: b083 sub sp, #12 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_22 = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst 600018fa: f8c3 525c str.w r5, [r3, #604] ; 0x25c IOMUXC_FLEXSPI2_IPP_IND_DQS_FA_SELECT_INPUT = 1; // GPIO_EMC_23 for Mode: ALT8, pg 986 600018fe: 4981 ldr r1, [pc, #516] ; (60001b04 ) IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_23 = 0x110F9; // keeper, strong drive, max speed, hyst 60001900: f8c3 7260 str.w r7, [r3, #608] ; 0x260 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_26 = 0x170F9; // 47K pullup, strong drive, max speed, hyst 60001904: 4c80 ldr r4, [pc, #512] ; (60001b08 ) IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_24 = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst 60001906: f8c3 5264 str.w r5, [r3, #612] ; 0x264 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_25 = 0x100F9; // strong drive, max speed, hyst 6000190a: f5a5 4530 sub.w r5, r5, #45056 ; 0xb000 CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_FLEXSPI2_PODF_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK)) 6000190e: 4e7f ldr r6, [pc, #508] ; (60001b0c ) IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_25 = 0x100F9; // strong drive, max speed, hyst 60001910: f8c3 5268 str.w r5, [r3, #616] ; 0x268 | FLEXSPI_MCR0_RXCLKSRC(1) | FLEXSPI_MCR0_MDIS; 60001914: f248 750c movw r5, #34572 ; 0x870c IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_26 = 0x170F9; // 47K pullup, strong drive, max speed, hyst 60001918: f8c3 426c str.w r4, [r3, #620] ; 0x26c IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_27 = 0x170F9; // 47K pullup, strong drive, max speed, hyst 6000191c: f8c3 4270 str.w r4, [r3, #624] ; 0x270 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_28 = 0x170F9; // 47K pullup, strong drive, max speed, hyst 60001920: f8c3 4274 str.w r4, [r3, #628] ; 0x274 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_29 = 0x170F9; // 47K pullup, strong drive, max speed, hyst 60001924: f8c3 4278 str.w r4, [r3, #632] ; 0x278 FLEXSPI2_MCR1 = FLEXSPI_MCR1_SEQWAIT(0xFFFF) | FLEXSPI_MCR1_AHBBUSWAIT(0xFFFF); 60001928: f04f 34ff mov.w r4, #4294967295 IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_22 = 8 | 0x10; // ALT1 = FLEXSPI2_A_SS1_B (Flash) 6000192c: 66da str r2, [r3, #108] ; 0x6c IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_23 = 8 | 0x10; // ALT1 = FLEXSPI2_A_DQS 6000192e: 671a str r2, [r3, #112] ; 0x70 IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_24 = 8 | 0x10; // ALT1 = FLEXSPI2_A_SS0_B (RAM) 60001930: 675a str r2, [r3, #116] ; 0x74 IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_25 = 8 | 0x10; // ALT1 = FLEXSPI2_A_SCLK 60001932: 679a str r2, [r3, #120] ; 0x78 IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_26 = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA0 60001934: 67da str r2, [r3, #124] ; 0x7c IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_27 = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA1 60001936: f8c3 2080 str.w r2, [r3, #128] ; 0x80 IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_28 = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA2 6000193a: f8c3 2084 str.w r2, [r3, #132] ; 0x84 IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_29 = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA3 6000193e: f8c3 2088 str.w r2, [r3, #136] ; 0x88 IOMUXC_FLEXSPI2_IPP_IND_DQS_FA_SELECT_INPUT = 1; // GPIO_EMC_23 for Mode: ALT8, pg 986 60001942: f8c1 032c str.w r0, [r1, #812] ; 0x32c CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_FLEXSPI2_PODF_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK)) 60001946: 4a72 ldr r2, [pc, #456] ; (60001b10 ) IOMUXC_FLEXSPI2_IPP_IND_IO_FA_BIT0_SELECT_INPUT = 1; // GPIO_EMC_26 for Mode: ALT8 60001948: f8c1 0330 str.w r0, [r1, #816] ; 0x330 IOMUXC_FLEXSPI2_IPP_IND_IO_FA_BIT1_SELECT_INPUT = 1; // GPIO_EMC_27 for Mode: ALT8 6000194c: f8c1 0334 str.w r0, [r1, #820] ; 0x334 IOMUXC_FLEXSPI2_IPP_IND_IO_FA_BIT2_SELECT_INPUT = 1; // GPIO_EMC_28 for Mode: ALT8 60001950: f8c1 0338 str.w r0, [r1, #824] ; 0x338 IOMUXC_FLEXSPI2_IPP_IND_IO_FA_BIT3_SELECT_INPUT = 1; // GPIO_EMC_29 for Mode: ALT8 60001954: f8c1 033c str.w r0, [r1, #828] ; 0x33c IOMUXC_FLEXSPI2_IPP_IND_SCK_FA_SELECT_INPUT = 1; // GPIO_EMC_25 for Mode: ALT8 60001958: f8c1 0350 str.w r0, [r1, #848] ; 0x350 CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_FLEXSPI2_PODF_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK)) 6000195c: 69b1 ldr r1, [r6, #24] | CCM_CBCMR_FLEXSPI2_PODF(4) | CCM_CBCMR_FLEXSPI2_CLK_SEL(3); // 105.6 MHz 6000195e: 4b6d ldr r3, [pc, #436] ; (60001b14 ) CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_FLEXSPI2_PODF_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK)) 60001960: 400a ands r2, r1 FLEXSPI2_MCR0 |= FLEXSPI_MCR0_MDIS; 60001962: 486d ldr r0, [pc, #436] ; (60001b18 ) FLEXSPI2_MCR2 = (FLEXSPI_MCR2 & ~(FLEXSPI_MCR2_RESUMEWAIT_MASK 60001964: 496d ldr r1, [pc, #436] ; (60001b1c ) | CCM_CBCMR_FLEXSPI2_PODF(4) | CCM_CBCMR_FLEXSPI2_CLK_SEL(3); // 105.6 MHz 60001966: 4313 orrs r3, r2 | FLEXSPI_MCR0_RXCLKSRC(1) | FLEXSPI_MCR0_MDIS; 60001968: 4a6d ldr r2, [pc, #436] ; (60001b20 ) CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_FLEXSPI2_PODF_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK)) 6000196a: 61b3 str r3, [r6, #24] CCM_CCGR7 |= CCM_CCGR7_FLEXSPI2(CCM_CCGR_ON); 6000196c: f8d6 3084 ldr.w r3, [r6, #132] ; 0x84 60001970: f043 030c orr.w r3, r3, #12 60001974: f8c6 3084 str.w r3, [r6, #132] ; 0x84 FLEXSPI2_MCR0 |= FLEXSPI_MCR0_MDIS; 60001978: 6803 ldr r3, [r0, #0] 6000197a: f043 0302 orr.w r3, r3, #2 6000197e: 6003 str r3, [r0, #0] FLEXSPI2_MCR0 = (FLEXSPI2_MCR0 & ~(FLEXSPI_MCR0_AHBGRANTWAIT_MASK 60001980: 6803 ldr r3, [r0, #0] | FLEXSPI_MCR0_RXCLKSRC(1) | FLEXSPI_MCR0_MDIS; 60001982: 402b ands r3, r5 FLEXSPI2_FLSHA1CR1 = FLEXSPI_FLSHCR1_CSINTERVAL(0) 60001984: 2521 movs r5, #33 ; 0x21 | FLEXSPI_MCR0_RXCLKSRC(1) | FLEXSPI_MCR0_MDIS; 60001986: 431a orrs r2, r3 FLEXSPI2_MCR2 = (FLEXSPI_MCR2 & ~(FLEXSPI_MCR2_RESUMEWAIT_MASK 60001988: 4b66 ldr r3, [pc, #408] ; (60001b24 ) FLEXSPI2_MCR0 = (FLEXSPI2_MCR0 & ~(FLEXSPI_MCR0_AHBGRANTWAIT_MASK 6000198a: 6002 str r2, [r0, #0] FLEXSPI2_MCR1 = FLEXSPI_MCR1_SEQWAIT(0xFFFF) | FLEXSPI_MCR1_AHBBUSWAIT(0xFFFF); 6000198c: 6044 str r4, [r0, #4] FLEXSPI2_MCR2 = (FLEXSPI_MCR2 & ~(FLEXSPI_MCR2_RESUMEWAIT_MASK 6000198e: 688a ldr r2, [r1, #8] | FLEXSPI_AHBRXBUFCR0_PREFETCHEN | FLEXSPI_AHBRXBUFCR0_BUFSZ(64); 60001990: 4c65 ldr r4, [pc, #404] ; (60001b28 ) FLEXSPI2_MCR2 = (FLEXSPI_MCR2 & ~(FLEXSPI_MCR2_RESUMEWAIT_MASK 60001992: 4013 ands r3, r2 FLEXSPI2_AHBRXBUF0CR0 = (FLEXSPI2_AHBRXBUF0CR0 & ~mask) 60001994: 4a65 ldr r2, [pc, #404] ; (60001b2c ) | FLEXSPI_MCR2_RESUMEWAIT(0x20) /*| FLEXSPI_MCR2_SAMEDEVICEEN*/; 60001996: f043 5300 orr.w r3, r3, #536870912 ; 0x20000000 FLEXSPI2_MCR2 = (FLEXSPI_MCR2 & ~(FLEXSPI_MCR2_RESUMEWAIT_MASK 6000199a: 6083 str r3, [r0, #8] FLEXSPI2_AHBCR = FLEXSPI2_AHBCR & ~(FLEXSPI_AHBCR_READADDROPT | FLEXSPI_AHBCR_PREFETCHEN 6000199c: 68c3 ldr r3, [r0, #12] 6000199e: f023 0378 bic.w r3, r3, #120 ; 0x78 600019a2: 60c3 str r3, [r0, #12] FLEXSPI2_AHBRXBUF0CR0 = (FLEXSPI2_AHBRXBUF0CR0 & ~mask) 600019a4: 6a03 ldr r3, [r0, #32] 600019a6: 4013 ands r3, r2 | FLEXSPI_AHBRXBUFCR0_PREFETCHEN | FLEXSPI_AHBRXBUFCR0_BUFSZ(64); 600019a8: 4323 orrs r3, r4 FLEXSPI2_AHBRXBUF0CR0 = (FLEXSPI2_AHBRXBUF0CR0 & ~mask) 600019aa: 6203 str r3, [r0, #32] FLEXSPI2_AHBRXBUF1CR0 = (FLEXSPI2_AHBRXBUF0CR0 & ~mask) 600019ac: 6a03 ldr r3, [r0, #32] 600019ae: 4013 ands r3, r2 FLEXSPI2_AHBRXBUF2CR0 = mask; 600019b0: 4a5f ldr r2, [pc, #380] ; (60001b30 ) | FLEXSPI_AHBRXBUFCR0_PREFETCHEN | FLEXSPI_AHBRXBUFCR0_BUFSZ(64); 600019b2: 4323 orrs r3, r4 FLEXSPI2_FLSHA1CR2 = FLEXSPI_FLSHCR2_AWRSEQID(6) | FLEXSPI_FLSHCR2_AWRSEQNUM(0) 600019b4: f240 6405 movw r4, #1541 ; 0x605 FLEXSPI2_AHBRXBUF1CR0 = (FLEXSPI2_AHBRXBUF0CR0 & ~mask) 600019b8: 6243 str r3, [r0, #36] ; 0x24 FLEXSPI2_AHBRXBUF2CR0 = mask; 600019ba: 6282 str r2, [r0, #40] ; 0x28 FLEXSPI2_AHBRXBUF3CR0 = mask; 600019bc: 62c2 str r2, [r0, #44] ; 0x2c FLEXSPI2_INTEN = 0; 600019be: 2200 movs r2, #0 FLEXSPI2_IPRXFCR = (FLEXSPI_IPRXFCR & 0xFFFFFFC0) | FLEXSPI_IPRXFCR_CLRIPRXF; 600019c0: f8d1 30b8 ldr.w r3, [r1, #184] ; 0xb8 600019c4: f023 033f bic.w r3, r3, #63 ; 0x3f 600019c8: f043 0301 orr.w r3, r3, #1 600019cc: f8c0 30b8 str.w r3, [r0, #184] ; 0xb8 FLEXSPI2_IPTXFCR = (FLEXSPI_IPTXFCR & 0xFFFFFFC0) | FLEXSPI_IPTXFCR_CLRIPTXF; 600019d0: f8d1 30bc ldr.w r3, [r1, #188] ; 0xbc FLEXSPI2_LUTKEY = FLEXSPI_LUTKEY_VALUE; 600019d4: 4957 ldr r1, [pc, #348] ; (60001b34 ) FLEXSPI2_IPTXFCR = (FLEXSPI_IPTXFCR & 0xFFFFFFC0) | FLEXSPI_IPTXFCR_CLRIPTXF; 600019d6: f023 033f bic.w r3, r3, #63 ; 0x3f 600019da: f043 0301 orr.w r3, r3, #1 600019de: f8c0 30bc str.w r3, [r0, #188] ; 0xbc FLEXSPI2_INTEN = 0; 600019e2: 6102 str r2, [r0, #16] FLEXSPI2_FLSHA1CR1 = FLEXSPI_FLSHCR1_CSINTERVAL(0) 600019e4: 6705 str r5, [r0, #112] ; 0x70 FLEXSPI2_FLSHA1CR2 = FLEXSPI_FLSHCR2_AWRSEQID(6) | FLEXSPI_FLSHCR2_AWRSEQNUM(0) 600019e6: f8c0 4080 str.w r4, [r0, #128] ; 0x80 FLEXSPI2_FLSHA2CR1 = FLEXSPI_FLSHCR1_CSINTERVAL(0) 600019ea: 6745 str r5, [r0, #116] ; 0x74 FLEXSPI2_FLSHA2CR2 = FLEXSPI_FLSHCR2_AWRSEQID(6) | FLEXSPI_FLSHCR2_AWRSEQNUM(0) 600019ec: f8c0 4084 str.w r4, [r0, #132] ; 0x84 FLEXSPI2_LUTCR = FLEXSPI_LUTCR_UNLOCK; 600019f0: 2402 movs r4, #2 FLEXSPI2_MCR0 &= ~FLEXSPI_MCR0_MDIS; 600019f2: 6803 ldr r3, [r0, #0] 600019f4: f023 0302 bic.w r3, r3, #2 600019f8: 6003 str r3, [r0, #0] FLEXSPI2_LUTKEY = FLEXSPI_LUTKEY_VALUE; 600019fa: 6181 str r1, [r0, #24] FLEXSPI2_LUTCR = FLEXSPI_LUTCR_UNLOCK; 600019fc: 4b4e ldr r3, [pc, #312] ; (60001b38 ) for (int i=0; i < 64; i++) luttable[i] = 0; 600019fe: 494f ldr r1, [pc, #316] ; (60001b3c ) FLEXSPI2_LUTCR = FLEXSPI_LUTCR_UNLOCK; 60001a00: 61c4 str r4, [r0, #28] for (int i=0; i < 64; i++) luttable[i] = 0; 60001a02: f843 2b04 str.w r2, [r3], #4 60001a06: 428b cmp r3, r1 60001a08: d1fb bne.n 60001a02 FLEXSPI2_MCR0 |= FLEXSPI_MCR0_SWRESET; 60001a0a: 4d43 ldr r5, [pc, #268] ; (60001b18 ) 60001a0c: 682b ldr r3, [r5, #0] 60001a0e: f043 0301 orr.w r3, r3, #1 60001a12: 602b str r3, [r5, #0] while (FLEXSPI2_MCR0 & FLEXSPI_MCR0_SWRESET) ; // wait 60001a14: 682c ldr r4, [r5, #0] 60001a16: f014 0401 ands.w r4, r4, #1 60001a1a: d1fb bne.n 60001a14 FLEXSPI2_LUTKEY = FLEXSPI_LUTKEY_VALUE; 60001a1c: 4945 ldr r1, [pc, #276] ; (60001b34 ) FLEXSPI2_LUTCR = FLEXSPI_LUTCR_UNLOCK; 60001a1e: 2302 movs r3, #2 FLEXSPI2_LUT0 = LUT0(CMD_SDR, PINS4, 0xF5); 60001a20: f240 62f5 movw r2, #1781 ; 0x6f5 uint8_t size1 = flexspi2_psram_size(0); 60001a24: 4620 mov r0, r4 FLEXSPI2_LUTKEY = FLEXSPI_LUTKEY_VALUE; 60001a26: 61a9 str r1, [r5, #24] FLEXSPI2_LUT8 = LUT0(CMD_SDR, PINS1, 0x99); 60001a28: f240 4199 movw r1, #1177 ; 0x499 FLEXSPI2_LUTCR = FLEXSPI_LUTCR_UNLOCK; 60001a2c: 61eb str r3, [r5, #28] FLEXSPI2_LUT4 = LUT0(CMD_SDR, PINS1, 0x66); 60001a2e: f240 4366 movw r3, #1126 ; 0x466 FLEXSPI2_LUT0 = LUT0(CMD_SDR, PINS4, 0xF5); 60001a32: f8c5 2200 str.w r2, [r5, #512] ; 0x200 FLEXSPI2_LUT13 = LUT0(READ_SDR, PINS1, 1); 60001a36: f242 4201 movw r2, #9217 ; 0x2401 FLEXSPI2_LUT4 = LUT0(CMD_SDR, PINS1, 0x66); 60001a3a: f8c5 3210 str.w r3, [r5, #528] ; 0x210 FLEXSPI2_LUT12 = LUT0(CMD_SDR, PINS1, 0x9F) | LUT1(DUMMY_SDR, PINS1, 24); 60001a3e: 4b40 ldr r3, [pc, #256] ; (60001b40 ) FLEXSPI2_LUT8 = LUT0(CMD_SDR, PINS1, 0x99); 60001a40: f8c5 1220 str.w r1, [r5, #544] ; 0x220 FLEXSPI2_LUT12 = LUT0(CMD_SDR, PINS1, 0x9F) | LUT1(DUMMY_SDR, PINS1, 24); 60001a44: f8c5 3230 str.w r3, [r5, #560] ; 0x230 FLEXSPI2_LUT16 = LUT0(CMD_SDR, PINS1, 0x35); 60001a48: f240 4335 movw r3, #1077 ; 0x435 FLEXSPI2_LUT13 = LUT0(READ_SDR, PINS1, 1); 60001a4c: f8c5 2234 str.w r2, [r5, #564] ; 0x234 FLEXSPI2_LUT20 = LUT0(CMD_SDR, PINS4, 0xEB) | LUT1(ADDR_SDR, PINS4, 24); 60001a50: 493c ldr r1, [pc, #240] ; (60001b44 ) FLEXSPI2_LUT16 = LUT0(CMD_SDR, PINS1, 0x35); 60001a52: f8c5 3240 str.w r3, [r5, #576] ; 0x240 FLEXSPI2_LUT21 = LUT0(DUMMY_SDR, PINS4, 6) | LUT1(READ_SDR, PINS4, 1); 60001a56: 4b3c ldr r3, [pc, #240] ; (60001b48 ) FLEXSPI2_LUT20 = LUT0(CMD_SDR, PINS4, 0xEB) | LUT1(ADDR_SDR, PINS4, 24); 60001a58: f8c5 1250 str.w r1, [r5, #592] ; 0x250 FLEXSPI2_LUT24 = LUT0(CMD_SDR, PINS4, 0x38) | LUT1(ADDR_SDR, PINS4, 24); 60001a5c: 4a3b ldr r2, [pc, #236] ; (60001b4c ) FLEXSPI2_LUT21 = LUT0(DUMMY_SDR, PINS4, 6) | LUT1(READ_SDR, PINS4, 1); 60001a5e: f8c5 3254 str.w r3, [r5, #596] ; 0x254 FLEXSPI2_LUT25 = LUT0(WRITE_SDR, PINS4, 1); 60001a62: f242 2301 movw r3, #8705 ; 0x2201 FLEXSPI2_LUT24 = LUT0(CMD_SDR, PINS4, 0x38) | LUT1(ADDR_SDR, PINS4, 24); 60001a66: f8c5 2260 str.w r2, [r5, #608] ; 0x260 FLEXSPI2_LUT25 = LUT0(WRITE_SDR, PINS4, 1); 60001a6a: f8c5 3264 str.w r3, [r5, #612] ; 0x264 uint8_t size1 = flexspi2_psram_size(0); 60001a6e: f7ff fe4f bl 60001710 if (size1 > 0) { 60001a72: 4606 mov r6, r0 60001a74: 2800 cmp r0, #0 60001a76: d036 beq.n 60001ae6 FLEXSPI2_FLSHA1CR0 = size1 << 10; 60001a78: 0283 lsls r3, r0, #10 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001a7a: f44f 2280 mov.w r2, #262144 ; 0x40000 FLEXSPI2_FLSHA1CR0 = size1 << 10; 60001a7e: 662b str r3, [r5, #96] ; 0x60 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 60001a80: 2301 movs r3, #1 FLEXSPI2_IPCR0 = addr; 60001a82: f8c5 40a0 str.w r4, [r5, #160] ; 0xa0 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001a86: 4c24 ldr r4, [pc, #144] ; (60001b18 ) FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001a88: f8c5 20a4 str.w r2, [r5, #164] ; 0xa4 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 60001a8c: f8c5 30b0 str.w r3, [r5, #176] ; 0xb0 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001a90: 6963 ldr r3, [r4, #20] 60001a92: 07da lsls r2, r3, #31 60001a94: d5fc bpl.n 60001a90 FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 60001a96: 2501 movs r5, #1 uint8_t size2 = flexspi2_psram_size(size1 << 20); 60001a98: 0537 lsls r7, r6, #20 FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 60001a9a: 6165 str r5, [r4, #20] uint8_t size2 = flexspi2_psram_size(size1 << 20); 60001a9c: 4638 mov r0, r7 60001a9e: f7ff fe37 bl 60001710 external_psram_size = size1 + size2; 60001aa2: 1832 adds r2, r6, r0 60001aa4: 4b2a ldr r3, [pc, #168] ; (60001b50 ) 60001aa6: b2d2 uxtb r2, r2 60001aa8: 701a strb r2, [r3, #0] if (size2 > 0) { 60001aaa: b178 cbz r0, 60001acc FLEXSPI2_FLSHA2CR0 = size2 << 10; 60001aac: 0280 lsls r0, r0, #10 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001aae: f44f 2380 mov.w r3, #262144 ; 0x40000 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001ab2: 4919 ldr r1, [pc, #100] ; (60001b18 ) FLEXSPI2_FLSHA2CR0 = size2 << 10; 60001ab4: 6660 str r0, [r4, #100] ; 0x64 FLEXSPI2_IPCR0 = addr; 60001ab6: f8c4 70a0 str.w r7, [r4, #160] ; 0xa0 FLEXSPI2_IPCR1 = FLEXSPI_IPCR1_ISEQID(index); 60001aba: f8c4 30a4 str.w r3, [r4, #164] ; 0xa4 FLEXSPI2_IPCMD = FLEXSPI_IPCMD_TRG; 60001abe: f8c4 50b0 str.w r5, [r4, #176] ; 0xb0 while (!(FLEXSPI2_INTR & FLEXSPI_INTR_IPCMDDONE)); // wait 60001ac2: 694b ldr r3, [r1, #20] 60001ac4: 07db lsls r3, r3, #31 60001ac6: d5fc bpl.n 60001ac2 FLEXSPI2_INTR = FLEXSPI_INTR_IPCMDDONE; 60001ac8: 2301 movs r3, #1 60001aca: 614b str r3, [r1, #20] external_psram_size * 0x100000 - 60001acc: 4921 ldr r1, [pc, #132] ; (60001b54 ) sm_set_pool(&extmem_smalloc_pool, &_extram_end, 60001ace: 2400 movs r4, #0 external_psram_size * 0x100000 - 60001ad0: 4821 ldr r0, [pc, #132] ; (60001b58 ) sm_set_pool(&extmem_smalloc_pool, &_extram_end, 60001ad2: 2301 movs r3, #1 60001ad4: 9400 str r4, [sp, #0] external_psram_size * 0x100000 - 60001ad6: 1a40 subs r0, r0, r1 sm_set_pool(&extmem_smalloc_pool, &_extram_end, 60001ad8: eb00 5202 add.w r2, r0, r2, lsl #20 60001adc: 481f ldr r0, [pc, #124] ; (60001b5c ) 60001ade: f000 f9df bl 60001ea0 <__sm_set_pool_veneer> } 60001ae2: b003 add sp, #12 60001ae4: bdf0 pop {r4, r5, r6, r7, pc} memset(&extmem_smalloc_pool, 0, sizeof(extmem_smalloc_pool)); 60001ae6: 4b1d ldr r3, [pc, #116] ; (60001b5c ) external_psram_size = 0; 60001ae8: 4a19 ldr r2, [pc, #100] ; (60001b50 ) memset(&extmem_smalloc_pool, 0, sizeof(extmem_smalloc_pool)); 60001aea: 6018 str r0, [r3, #0] external_psram_size = 0; 60001aec: 7010 strb r0, [r2, #0] memset(&extmem_smalloc_pool, 0, sizeof(extmem_smalloc_pool)); 60001aee: 60d8 str r0, [r3, #12] 60001af0: e9c3 0001 strd r0, r0, [r3, #4] } 60001af4: b003 add sp, #12 60001af6: bdf0 pop {r4, r5, r6, r7, pc} 60001af8: 401f8000 .word 0x401f8000 60001afc: 0001b0f9 .word 0x0001b0f9 60001b00: 000110f9 .word 0x000110f9 60001b04: 401f8400 .word 0x401f8400 60001b08: 000170f9 .word 0x000170f9 60001b0c: 400fc000 .word 0x400fc000 60001b10: 1ffffcff .word 0x1ffffcff 60001b14: 80000300 .word 0x80000300 60001b18: 402a4000 .word 0x402a4000 60001b1c: 402a8000 .word 0x402a8000 60001b20: ffff0012 .word 0xffff0012 60001b24: 00f737ff .word 0x00f737ff 60001b28: 80000040 .word 0x80000040 60001b2c: 7cf0ff00 .word 0x7cf0ff00 60001b30: 830f00ff .word 0x830f00ff 60001b34: 5af05af0 .word 0x5af05af0 60001b38: 402a4200 .word 0x402a4200 60001b3c: 402a4300 .word 0x402a4300 60001b40: 3018049f .word 0x3018049f 60001b44: 0a1806eb .word 0x0a1806eb 60001b48: 26013206 .word 0x26013206 60001b4c: 0a180638 .word 0x0a180638 60001b50: 20002e00 .word 0x20002e00 60001b54: 70000000 .word 0x70000000 60001b58: 70000000 .word 0x70000000 60001b5c: 20002968 .word 0x20002968 60001b60 : { 60001b60: b4f0 push {r4, r5, r6, r7} uint32_t n = CCM_ANALOG_PLL_USB1; // pg 759 60001b62: 4a15 ldr r2, [pc, #84] ; (60001bb8 ) CCM_ANALOG_PLL_USB1_SET = CCM_ANALOG_PLL_USB1_EN_USB_CLKS; 60001b64: 2740 movs r7, #64 ; 0x40 CCM_ANALOG_PLL_USB1_CLR = CCM_ANALOG_PLL_USB1_BYPASS; 60001b66: f44f 3180 mov.w r1, #65536 ; 0x10000 CCM_ANALOG_PLL_USB1_SET = CCM_ANALOG_PLL_USB1_POWER; 60001b6a: f44f 5680 mov.w r6, #4096 ; 0x1000 CCM_ANALOG_PLL_USB1_SET = CCM_ANALOG_PLL_USB1_ENABLE; 60001b6e: f44f 5500 mov.w r5, #8192 ; 0x2000 CCM_ANALOG_PLL_USB1_CLR = 0xC000; // bypass 24 MHz 60001b72: f44f 4440 mov.w r4, #49152 ; 0xc000 CCM_ANALOG_PLL_USB1_CLR = CCM_ANALOG_PLL_USB1_POWER | // power down 60001b76: f243 0042 movw r0, #12354 ; 0x3042 uint32_t n = CCM_ANALOG_PLL_USB1; // pg 759 60001b7a: 6913 ldr r3, [r2, #16] if (n & CCM_ANALOG_PLL_USB1_DIV_SELECT) { 60001b7c: f013 0f02 tst.w r3, #2 60001b80: d10e bne.n 60001ba0 if (!(n & CCM_ANALOG_PLL_USB1_ENABLE)) { 60001b82: f413 5f00 tst.w r3, #8192 ; 0x2000 60001b86: d00f beq.n 60001ba8 if (!(n & CCM_ANALOG_PLL_USB1_POWER)) { 60001b88: f413 5f80 tst.w r3, #4096 ; 0x1000 60001b8c: d00e beq.n 60001bac if (!(n & CCM_ANALOG_PLL_USB1_LOCK)) { 60001b8e: 2b00 cmp r3, #0 60001b90: daf3 bge.n 60001b7a if (n & CCM_ANALOG_PLL_USB1_BYPASS) { 60001b92: f413 3f80 tst.w r3, #65536 ; 0x10000 60001b96: d10b bne.n 60001bb0 if (!(n & CCM_ANALOG_PLL_USB1_EN_USB_CLKS)) { 60001b98: 065b lsls r3, r3, #25 60001b9a: d50b bpl.n 60001bb4 } 60001b9c: bcf0 pop {r4, r5, r6, r7} 60001b9e: 4770 bx lr CCM_ANALOG_PLL_USB1_CLR = 0xC000; // bypass 24 MHz 60001ba0: 6194 str r4, [r2, #24] CCM_ANALOG_PLL_USB1_SET = CCM_ANALOG_PLL_USB1_BYPASS; // bypass 60001ba2: 6151 str r1, [r2, #20] CCM_ANALOG_PLL_USB1_CLR = CCM_ANALOG_PLL_USB1_POWER | // power down 60001ba4: 6190 str r0, [r2, #24] continue; 60001ba6: e7e8 b.n 60001b7a CCM_ANALOG_PLL_USB1_SET = CCM_ANALOG_PLL_USB1_ENABLE; 60001ba8: 6155 str r5, [r2, #20] continue; 60001baa: e7e6 b.n 60001b7a CCM_ANALOG_PLL_USB1_SET = CCM_ANALOG_PLL_USB1_POWER; 60001bac: 6156 str r6, [r2, #20] continue; 60001bae: e7e4 b.n 60001b7a CCM_ANALOG_PLL_USB1_CLR = CCM_ANALOG_PLL_USB1_BYPASS; 60001bb0: 6191 str r1, [r2, #24] continue; 60001bb2: e7e2 b.n 60001b7a CCM_ANALOG_PLL_USB1_SET = CCM_ANALOG_PLL_USB1_EN_USB_CLKS; 60001bb4: 6157 str r7, [r2, #20] continue; 60001bb6: e7e0 b.n 60001b7a 60001bb8: 400d8000 .word 0x400d8000 60001bbc : uint32_t calibrationData; uint32_t roomCount; uint32_t tempCodeVal; //first power on the temperature sensor - no register change TEMPMON_TEMPSENSE0 &= ~0x1U; 60001bbc: 4a3f ldr r2, [pc, #252] ; (60001cbc ) //set monitoring frequency - no register change TEMPMON_TEMPSENSE1 = (((uint32_t)(((uint32_t)(frequency)) << 0U)) & 0xFFFFU); 60001bbe: 2003 movs r0, #3 //read calibration data - this works calibrationData = HW_OCOTP_ANA1; 60001bc0: 493f ldr r1, [pc, #252] ; (60001cc0 ) s_hotTemp = (uint32_t)(calibrationData & 0xFFU) >> 0x00U; s_hotCount = (uint32_t)(calibrationData & 0xFFF00U) >> 0X08U; roomCount = (uint32_t)(calibrationData & 0xFFF00000U) >> 0x14U; s_hot_ROOM = (float) (s_hotTemp) - 25.0f; 60001bc2: eef3 5a09 vmov.f32 s11, #57 ; 0x41c80000 25.0 TEMPMON_TEMPSENSE0 &= ~0x1U; 60001bc6: f8d2 3080 ldr.w r3, [r2, #128] ; 0x80 //Start temp monitoring TEMPMON_TEMPSENSE0 |= 0x2U; //starts temp monitoring //PANIC shutdown: NVIC_SET_PRIORITY(IRQ_TEMPERATURE_PANIC, 0); 60001bca: f04f 0c00 mov.w ip, #0 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - highAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001bce: ed9f 6a3d vldr s12, [pc, #244] ; 60001cc4 TEMPMON_TEMPSENSE0 &= ~0x1U; 60001bd2: f023 0301 bic.w r3, r3, #1 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - panicAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001bd6: ed9f 5a3c vldr s10, [pc, #240] ; 60001cc8 { 60001bda: b430 push {r4, r5} TEMPMON_TEMPSENSE0 &= ~0x1U; 60001bdc: f8c2 3080 str.w r3, [r2, #128] ; 0x80 TEMPMON_TEMPSENSE1 = (((uint32_t)(((uint32_t)(frequency)) << 0U)) & 0xFFFFU); 60001be0: f8c2 0090 str.w r0, [r2, #144] ; 0x90 calibrationData = HW_OCOTP_ANA1; 60001be4: f8d1 10e0 ldr.w r1, [r1, #224] ; 0xe0 s_hotTemp = (uint32_t)(calibrationData & 0xFFU) >> 0x00U; 60001be8: 4d38 ldr r5, [pc, #224] ; (60001ccc ) 60001bea: b2cb uxtb r3, r1 s_hotCount = (uint32_t)(calibrationData & 0xFFF00U) >> 0X08U; 60001bec: 4c38 ldr r4, [pc, #224] ; (60001cd0 ) s_hot_ROOM = (float) (s_hotTemp) - 25.0f; 60001bee: 4839 ldr r0, [pc, #228] ; (60001cd4 ) s_hotTemp = (uint32_t)(calibrationData & 0xFFU) >> 0x00U; 60001bf0: 602b str r3, [r5, #0] s_hot_ROOM = (float) (s_hotTemp) - 25.0f; 60001bf2: ee07 3a90 vmov s15, r3 roomCount = (uint32_t)(calibrationData & 0xFFF00000U) >> 0x14U; 60001bf6: 0d0b lsrs r3, r1, #20 s_hotCount = (uint32_t)(calibrationData & 0xFFF00U) >> 0X08U; 60001bf8: f3c1 210b ubfx r1, r1, #8, #12 s_hot_ROOM = (float) (s_hotTemp) - 25.0f; 60001bfc: eef8 7ae7 vcvt.f32.s32 s15, s15 roomCount = (uint32_t)(calibrationData & 0xFFF00000U) >> 0x14U; 60001c00: ee06 3a90 vmov s13, r3 s_roomC_hotC = (float) roomCount - (float) s_hotCount; 60001c04: ee07 1a10 vmov s14, r1 60001c08: 4b33 ldr r3, [pc, #204] ; (60001cd8 ) 60001c0a: eeb8 7ac7 vcvt.f32.s32 s14, s14 s_hotCount = (uint32_t)(calibrationData & 0xFFF00U) >> 0X08U; 60001c0e: 6021 str r1, [r4, #0] s_roomC_hotC = (float) roomCount - (float) s_hotCount; 60001c10: eef8 6ae6 vcvt.f32.s32 s13, s13 TEMPMON_TEMPSENSE2 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 16U)) & 0xFFF0000U); 60001c14: 4931 ldr r1, [pc, #196] ; (60001cdc ) tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - highAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c16: ee37 6ac6 vsub.f32 s12, s15, s12 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - panicAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c1a: ee37 5ac5 vsub.f32 s10, s15, s10 s_roomC_hotC = (float) roomCount - (float) s_hotCount; 60001c1e: ee76 6ac7 vsub.f32 s13, s13, s14 s_hot_ROOM = (float) (s_hotTemp) - 25.0f; 60001c22: ee77 7ae5 vsub.f32 s15, s15, s11 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - highAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c26: ee26 6a26 vmul.f32 s12, s12, s13 s_roomC_hotC = (float) roomCount - (float) s_hotCount; 60001c2a: edc3 6a00 vstr s13, [r3] tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - panicAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c2e: ee25 5a26 vmul.f32 s10, s10, s13 TEMPMON_TEMPSENSE0 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 20U)) & 0xFFF00000U); 60001c32: f8d2 3080 ldr.w r3, [r2, #128] ; 0x80 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - lowAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c36: ee67 4aa6 vmul.f32 s9, s15, s13 s_hot_ROOM = (float) (s_hotTemp) - 25.0f; 60001c3a: edc0 7a00 vstr s15, [r0] tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - highAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c3e: eec6 5a27 vdiv.f32 s11, s12, s15 NVIC_SET_PRIORITY(IRQ_TEMPERATURE_PANIC, 0); 60001c42: 4827 ldr r0, [pc, #156] ; (60001ce0 ) tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - panicAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c44: ee85 6a27 vdiv.f32 s12, s10, s15 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - lowAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c48: eec4 6aa7 vdiv.f32 s13, s9, s15 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - highAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c4c: ee75 5a87 vadd.f32 s11, s11, s14 60001c50: eefc 5ae5 vcvt.u32.f32 s11, s11 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - panicAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c54: ee36 6a07 vadd.f32 s12, s12, s14 TEMPMON_TEMPSENSE0 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 20U)) & 0xFFF00000U); 60001c58: ee15 4a90 vmov r4, s11 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - panicAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c5c: eebc 6ac6 vcvt.u32.f32 s12, s12 TEMPMON_TEMPSENSE0 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 20U)) & 0xFFF00000U); 60001c60: ea43 5304 orr.w r3, r3, r4, lsl #20 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - lowAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c64: ee76 7a87 vadd.f32 s15, s13, s14 TEMPMON_TEMPSENSE0 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 20U)) & 0xFFF00000U); 60001c68: f8c2 3080 str.w r3, [r2, #128] ; 0x80 TEMPMON_TEMPSENSE2 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 16U)) & 0xFFF0000U); 60001c6c: ee16 3a10 vmov r3, s12 60001c70: f8d2 4190 ldr.w r4, [r2, #400] ; 0x190 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - lowAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c74: eefc 7ae7 vcvt.u32.f32 s15, s15 TEMPMON_TEMPSENSE2 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 16U)) & 0xFFF0000U); 60001c78: ea01 4103 and.w r1, r1, r3, lsl #16 60001c7c: 4321 orrs r1, r4 tempCodeVal = ((float)s_hotCount + ((float)s_hotTemp - lowAlarmTemp) * s_roomC_hotC / s_hot_ROOM); 60001c7e: ee17 3a90 vmov r3, s15 TEMPMON_TEMPSENSE2 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 16U)) & 0xFFF0000U); 60001c82: f8c2 1190 str.w r1, [r2, #400] ; 0x190 TEMPMON_TEMPSENSE2 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 0U)) & 0xFFFU); 60001c86: f3c3 030b ubfx r3, r3, #0, #12 60001c8a: f8d2 1190 ldr.w r1, [r2, #400] ; 0x190 60001c8e: 430b orrs r3, r1 #else extern void (* volatile _VectorsRam[NVIC_NUM_INTERRUPTS+16])(void); static inline void attachInterruptVector(enum IRQ_NUMBER_t irq, void (*function)(void)) __attribute__((always_inline, unused)); static inline void attachInterruptVector(enum IRQ_NUMBER_t irq, void (*function)(void)) { _VectorsRam[irq + 16] = function; asm volatile("": : :"memory"); } 60001c90: 4914 ldr r1, [pc, #80] ; (60001ce4 ) 60001c92: f8c2 3190 str.w r3, [r2, #400] ; 0x190 TEMPMON_TEMPSENSE0 |= 0x2U; //starts temp monitoring 60001c96: f8d2 3080 ldr.w r3, [r2, #128] ; 0x80 60001c9a: f043 0302 orr.w r3, r3, #2 60001c9e: f8c2 3080 str.w r3, [r2, #128] ; 0x80 60001ca2: 4b11 ldr r3, [pc, #68] ; (60001ce8 ) NVIC_SET_PRIORITY(IRQ_TEMPERATURE_PANIC, 0); 60001ca4: f880 c040 strb.w ip, [r0, #64] ; 0x40 60001ca8: f8c1 3140 str.w r3, [r1, #320] ; 0x140 attachInterruptVector(IRQ_TEMPERATURE_PANIC, &Panic_Temp_isr); NVIC_ENABLE_IRQ(IRQ_TEMPERATURE_PANIC); 60001cac: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 60001cb0: 2201 movs r2, #1 } 60001cb2: bc30 pop {r4, r5} NVIC_ENABLE_IRQ(IRQ_TEMPERATURE_PANIC); 60001cb4: f8c3 2108 str.w r2, [r3, #264] ; 0x108 } 60001cb8: 4770 bx lr 60001cba: bf00 nop 60001cbc: 400d8100 .word 0x400d8100 60001cc0: 401f4400 .word 0x401f4400 60001cc4: 42aa0000 .word 0x42aa0000 60001cc8: 42b40000 .word 0x42b40000 60001ccc: 20002d78 .word 0x20002d78 60001cd0: 20002d74 .word 0x20002d74 60001cd4: 20002d7c .word 0x20002d7c 60001cd8: 20002d80 .word 0x20002d80 60001cdc: 0fff0000 .word 0x0fff0000 60001ce0: e000e400 .word 0xe000e400 60001ce4: 20001800 .word 0x20001800 60001ce8: 0000b895 .word 0x0000b895 60001cec : FLASHMEM void usb_init(void) { // TODO: only enable when VBUS detected // TODO: return to low power mode when VBUS removed // TODO: protect PMU access with MPU PMU_REG_3P0 = PMU_REG_3P0_OUTPUT_TRG(0x0F) | PMU_REG_3P0_BO_OFFSET(6) 60001cec: 4b31 ldr r3, [pc, #196] ; (60001db4 ) 60001cee: f640 7261 movw r2, #3937 ; 0xf61 { 60001cf2: b510 push {r4, lr} PMU_REG_3P0 = PMU_REG_3P0_OUTPUT_TRG(0x0F) | PMU_REG_3P0_BO_OFFSET(6) 60001cf4: f8c3 2120 str.w r2, [r3, #288] ; 0x120 CCM_CCGR6 |= CCM_CCGR6_USBOH3(CCM_CCGR_ON); // turn on clocks to USB peripheral printf("BURSTSIZE=%08lX\n", USB1_BURSTSIZE); //USB1_BURSTSIZE = USB_BURSTSIZE_TXPBURST(4) | USB_BURSTSIZE_RXPBURST(4); USB1_BURSTSIZE = 0x0404; 60001cf8: f240 4404 movw r4, #1028 ; 0x404 usb_init_serialnumber(); 60001cfc: f000 f8c8 bl 60001e90 <__usb_init_serialnumber_veneer> CCM_CCGR6 |= CCM_CCGR6_USBOH3(CCM_CCGR_ON); // turn on clocks to USB peripheral 60001d00: 4a2d ldr r2, [pc, #180] ; (60001db8 ) USB1_BURSTSIZE = 0x0404; 60001d02: 492e ldr r1, [pc, #184] ; (60001dbc ) CCM_CCGR6 |= CCM_CCGR6_USBOH3(CCM_CCGR_ON); // turn on clocks to USB peripheral 60001d04: f8d2 3080 ldr.w r3, [r2, #128] ; 0x80 //printf("USB1_USBMODE=%08lX\n", USB1_USBMODE); // turn on PLL3, wait for 480 MHz lock? // turn on CCM clock gates? CCGR6[CG0] #if 1 if ((USBPHY1_PWD & (USBPHY_PWD_RXPWDRX | USBPHY_PWD_RXPWDDIFF | USBPHY_PWD_RXPWD1PT1 60001d08: 482d ldr r0, [pc, #180] ; (60001dc0 ) CCM_CCGR6 |= CCM_CCGR6_USBOH3(CCM_CCGR_ON); // turn on clocks to USB peripheral 60001d0a: f043 0303 orr.w r3, r3, #3 60001d0e: f8c2 3080 str.w r3, [r2, #128] ; 0x80 if ((USBPHY1_PWD & (USBPHY_PWD_RXPWDRX | USBPHY_PWD_RXPWDDIFF | USBPHY_PWD_RXPWD1PT1 60001d12: 4b2c ldr r3, [pc, #176] ; (60001dc4 ) USB1_BURSTSIZE = 0x0404; 60001d14: f8c1 4160 str.w r4, [r1, #352] ; 0x160 if ((USBPHY1_PWD & (USBPHY_PWD_RXPWDRX | USBPHY_PWD_RXPWDDIFF | USBPHY_PWD_RXPWD1PT1 60001d18: 6802 ldr r2, [r0, #0] 60001d1a: 421a tst r2, r3 60001d1c: d103 bne.n 60001d26 | USBPHY_PWD_RXPWDENV | USBPHY_PWD_TXPWDV2I | USBPHY_PWD_TXPWDIBIAS | USBPHY_PWD_TXPWDFS)) || (USB1_USBMODE & USB_USBMODE_CM_MASK)) { 60001d1e: f8d1 31a8 ldr.w r3, [r1, #424] ; 0x1a8 60001d22: 079a lsls r2, r3, #30 60001d24: d01b beq.n 60001d5e // USB controller is turned on from previous use // reset needed to turn it off & start from clean slate USBPHY1_CTRL_SET = USBPHY_CTRL_SFTRST; // USBPHY1_CTRL page 3292 USB1_USBCMD |= USB_USBCMD_RST; // reset controller 60001d26: 4a25 ldr r2, [pc, #148] ; (60001dbc ) USBPHY1_CTRL_SET = USBPHY_CTRL_SFTRST; // USBPHY1_CTRL page 3292 60001d28: f04f 4100 mov.w r1, #2147483648 ; 0x80000000 60001d2c: 4b24 ldr r3, [pc, #144] ; (60001dc0 ) 60001d2e: 6359 str r1, [r3, #52] ; 0x34 USB1_USBCMD |= USB_USBCMD_RST; // reset controller 60001d30: f8d2 3140 ldr.w r3, [r2, #320] ; 0x140 60001d34: f043 0302 orr.w r3, r3, #2 60001d38: f8c2 3140 str.w r3, [r2, #320] ; 0x140 int count=0; while (USB1_USBCMD & USB_USBCMD_RST) count++; 60001d3c: f8d2 3140 ldr.w r3, [r2, #320] ; 0x140 60001d40: 079b lsls r3, r3, #30 60001d42: d4fb bmi.n 60001d3c NVIC_CLEAR_PENDING(IRQ_USB1); 60001d44: f44f 3000 mov.w r0, #131072 ; 0x20000 60001d48: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 USBPHY1_CTRL_CLR = USBPHY_CTRL_SFTRST; // reset PHY 60001d4c: 4b1c ldr r3, [pc, #112] ; (60001dc0 ) 60001d4e: f04f 4200 mov.w r2, #2147483648 ; 0x80000000 NVIC_CLEAR_PENDING(IRQ_USB1); 60001d52: f8c1 028c str.w r0, [r1, #652] ; 0x28c //printf("USBPHY1_PWD=%08lX\n", USBPHY1_PWD); //printf("USBPHY1_TX=%08lX\n", USBPHY1_TX); //printf("USBPHY1_RX=%08lX\n", USBPHY1_RX); //printf("USBPHY1_CTRL=%08lX\n", USBPHY1_CTRL); //printf("USB1_USBMODE=%08lX\n", USB1_USBMODE); delay(25); 60001d56: 2019 movs r0, #25 USBPHY1_CTRL_CLR = USBPHY_CTRL_SFTRST; // reset PHY 60001d58: 639a str r2, [r3, #56] ; 0x38 delay(25); 60001d5a: f000 f8b9 bl 60001ed0 <__delay_veneer> // ENDPTFLUSH pg 3247 // ENDPTSTAT pg 3247 // ENDPTCOMPLETE 3248 // ENDPTCTRL0 pg 3249 USBPHY1_CTRL_CLR = USBPHY_CTRL_CLKGATE; 60001d5e: 4a18 ldr r2, [pc, #96] ; (60001dc0 ) 60001d60: f04f 4080 mov.w r0, #1073741824 ; 0x40000000 USBPHY1_PWD = 0; //printf("USBPHY1_PWD=%08lX\n", USBPHY1_PWD); //printf("USBPHY1_CTRL=%08lX\n", USBPHY1_CTRL); USB1_USBMODE = USB_USBMODE_CM(2) | USB_USBMODE_SLOM; 60001d64: 4c15 ldr r4, [pc, #84] ; (60001dbc ) USBPHY1_PWD = 0; 60001d66: 2100 movs r1, #0 USBPHY1_CTRL_CLR = USBPHY_CTRL_CLKGATE; 60001d68: 6390 str r0, [r2, #56] ; 0x38 USB1_USBMODE = USB_USBMODE_CM(2) | USB_USBMODE_SLOM; 60001d6a: 200a movs r0, #10 memset(endpoint_queue_head, 0, sizeof(endpoint_queue_head)); 60001d6c: 4b16 ldr r3, [pc, #88] ; (60001dc8 ) USBPHY1_PWD = 0; 60001d6e: 6011 str r1, [r2, #0] memset(endpoint_queue_head, 0, sizeof(endpoint_queue_head)); 60001d70: f44f 7260 mov.w r2, #896 ; 0x380 USB1_USBMODE = USB_USBMODE_CM(2) | USB_USBMODE_SLOM; 60001d74: f8c4 01a8 str.w r0, [r4, #424] ; 0x1a8 memset(endpoint_queue_head, 0, sizeof(endpoint_queue_head)); 60001d78: 4618 mov r0, r3 60001d7a: f000 f885 bl 60001e88 <__memset_veneer> endpoint_queue_head[0].config = (64 << 16) | (1 << 15); endpoint_queue_head[1].config = (64 << 16); 60001d7e: f44f 0280 mov.w r2, #4194304 ; 0x400000 memset(endpoint_queue_head, 0, sizeof(endpoint_queue_head)); 60001d82: 4603 mov r3, r0 endpoint_queue_head[0].config = (64 << 16) | (1 << 15); 60001d84: f44f 0081 mov.w r0, #4227072 ; 0x408000 USB1_ENDPOINTLISTADDR = (uint32_t)&endpoint_queue_head; // Recommended: enable all device interrupts including: USBINT, USBERRINT, // Port Change Detect, USB Reset Received, DCSuspend. USB1_USBINTR = USB_USBINTR_UE | USB_USBINTR_UEE | /* USB_USBINTR_PCE | */ 60001d88: f240 1143 movw r1, #323 ; 0x143 endpoint_queue_head[0].config = (64 << 16) | (1 << 15); 60001d8c: 6018 str r0, [r3, #0] USB1_ENDPOINTLISTADDR = (uint32_t)&endpoint_queue_head; 60001d8e: f8c4 3158 str.w r3, [r4, #344] ; 0x158 endpoint_queue_head[1].config = (64 << 16); 60001d92: 641a str r2, [r3, #64] ; 0x40 60001d94: 4b0d ldr r3, [pc, #52] ; (60001dcc ) 60001d96: 4a0e ldr r2, [pc, #56] ; (60001dd0 ) USB1_USBINTR = USB_USBINTR_UE | USB_USBINTR_UEE | /* USB_USBINTR_PCE | */ 60001d98: f8c4 1148 str.w r1, [r4, #328] ; 0x148 60001d9c: f8c3 2204 str.w r2, [r3, #516] ; 0x204 USB_USBINTR_URE | USB_USBINTR_SLE; //_VectorsRam[IRQ_USB1+16] = &usb_isr; attachInterruptVector(IRQ_USB1, &usb_isr); NVIC_ENABLE_IRQ(IRQ_USB1); 60001da0: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 60001da4: f44f 3100 mov.w r1, #131072 ; 0x20000 //printf("USB1_ENDPTCTRL0=%08lX\n", USB1_ENDPTCTRL0); //printf("USB1_ENDPTCTRL1=%08lX\n", USB1_ENDPTCTRL1); //printf("USB1_ENDPTCTRL2=%08lX\n", USB1_ENDPTCTRL2); //printf("USB1_ENDPTCTRL3=%08lX\n", USB1_ENDPTCTRL3); USB1_USBCMD = USB_USBCMD_RS; 60001da8: 2301 movs r3, #1 NVIC_ENABLE_IRQ(IRQ_USB1); 60001daa: f8c2 110c str.w r1, [r2, #268] ; 0x10c USB1_USBCMD = USB_USBCMD_RS; 60001dae: f8c4 3140 str.w r3, [r4, #320] ; 0x140 //transfer_log_head = 0; //transfer_log_count = 0; //USB1_PORTSC1 |= USB_PORTSC1_PFSC; // force 12 Mbit/sec } 60001db2: bd10 pop {r4, pc} 60001db4: 400d8000 .word 0x400d8000 60001db8: 400fc000 .word 0x400fc000 60001dbc: 402e0000 .word 0x402e0000 60001dc0: 400d9000 .word 0x400d9000 60001dc4: 001e1c00 .word 0x001e1c00 60001dc8: 20000000 .word 0x20000000 60001dcc: 20001800 .word 0x20001800 60001dd0: 0000bb45 .word 0x0000bb45 60001dd4 <_reboot_Teensyduino_>: FLASHMEM __attribute__((noinline)) void _reboot_Teensyduino_(void) { 60001dd4: b508 push {r3, lr} if (!(HW_OCOTP_CFG5 & 0x02)) { 60001dd6: 4b0e ldr r3, [pc, #56] ; (60001e10 <_reboot_Teensyduino_+0x3c>) 60001dd8: 6e1b ldr r3, [r3, #96] ; 0x60 60001dda: 079b lsls r3, r3, #30 60001ddc: d400 bmi.n 60001de0 <_reboot_Teensyduino_+0xc> asm("bkpt #251"); // run bootloader 60001dde: befb bkpt 0x00fb } else { __disable_irq(); // secure mode NXP ROM reboot 60001de0: b672 cpsid i USB1_USBCMD = 0; 60001de2: 4b0c ldr r3, [pc, #48] ; (60001e14 <_reboot_Teensyduino_+0x40>) 60001de4: 2000 movs r0, #0 IOMUXC_GPR_GPR16 = 0x00200003; 60001de6: 4a0c ldr r2, [pc, #48] ; (60001e18 <_reboot_Teensyduino_+0x44>) USB1_USBCMD = 0; 60001de8: f8c3 0140 str.w r0, [r3, #320] ; 0x140 // TODO: wipe all RAM for security __asm__ volatile("mov sp, %0" : : "r" (0x20201000) : ); 60001dec: f103 4360 add.w r3, r3, #3758096384 ; 0xe0000000 IOMUXC_GPR_GPR16 = 0x00200003; 60001df0: 490a ldr r1, [pc, #40] ; (60001e1c <_reboot_Teensyduino_+0x48>) __asm__ volatile("mov sp, %0" : : "r" (0x20201000) : ); 60001df2: f5a3 235f sub.w r3, r3, #913408 ; 0xdf000 IOMUXC_GPR_GPR16 = 0x00200003; 60001df6: 6411 str r1, [r2, #64] ; 0x40 __asm__ volatile("mov sp, %0" : : "r" (0x20201000) : ); 60001df8: 469d mov sp, r3 __asm__ volatile("dsb":::"memory"); 60001dfa: f3bf 8f4f dsb sy volatile uint32_t * const p = (uint32_t *)0x20208000; *p = 0xEB120000; ((void (*)(volatile void *))(*(uint32_t *)(*(uint32_t *)0x0020001C + 8)))(p); 60001dfe: f44f 1300 mov.w r3, #2097152 ; 0x200000 *p = 0xEB120000; 60001e02: 4807 ldr r0, [pc, #28] ; (60001e20 <_reboot_Teensyduino_+0x4c>) 60001e04: 4a07 ldr r2, [pc, #28] ; (60001e24 <_reboot_Teensyduino_+0x50>) ((void (*)(volatile void *))(*(uint32_t *)(*(uint32_t *)0x0020001C + 8)))(p); 60001e06: 69db ldr r3, [r3, #28] *p = 0xEB120000; 60001e08: 6002 str r2, [r0, #0] ((void (*)(volatile void *))(*(uint32_t *)(*(uint32_t *)0x0020001C + 8)))(p); 60001e0a: 689b ldr r3, [r3, #8] 60001e0c: 4798 blx r3 } __builtin_unreachable(); 60001e0e: bf00 nop 60001e10: 401f4400 .word 0x401f4400 60001e14: 402e0000 .word 0x402e0000 60001e18: 400ac000 .word 0x400ac000 60001e1c: 00200003 .word 0x00200003 60001e20: 20208000 .word 0x20208000 60001e24: eb120000 .word 0xeb120000 60001e28 : { uint32_t mode, avg=0; printf("analogInit\n"); CCM_CCGR1 |= CCM_CCGR1_ADC1(CCM_CCGR_ON); 60001e28: 4b10 ldr r3, [pc, #64] ; (60001e6c ) mode |= ADC_CFG_ADIV(0) | ADC_CFG_ADICLK(0); // use IPG } #endif //ADC1 ADC1_CFG = mode | ADC_CFG_ADHSC; ADC1_GC = avg | ADC_GC_CAL; // begin cal 60001e2a: 20a0 movs r0, #160 ; 0xa0 ADC1_CFG = mode | ADC_CFG_ADHSC; 60001e2c: 4a10 ldr r2, [pc, #64] ; (60001e70 ) CCM_CCGR1 |= CCM_CCGR1_ADC1(CCM_CCGR_ON); 60001e2e: 6ed9 ldr r1, [r3, #108] ; 0x6c 60001e30: f441 3140 orr.w r1, r1, #196608 ; 0x30000 { 60001e34: b410 push {r4} CCM_CCGR1 |= CCM_CCGR1_ADC1(CCM_CCGR_ON); 60001e36: 66d9 str r1, [r3, #108] ; 0x6c ADC1_CFG = mode | ADC_CFG_ADHSC; 60001e38: f240 6437 movw r4, #1591 ; 0x637 CCM_CCGR1 |= CCM_CCGR1_ADC2(CCM_CCGR_ON); 60001e3c: 6ed9 ldr r1, [r3, #108] ; 0x6c 60001e3e: f441 7140 orr.w r1, r1, #768 ; 0x300 60001e42: 66d9 str r1, [r3, #108] ; 0x6c ADC1_CFG = mode | ADC_CFG_ADHSC; 60001e44: 6454 str r4, [r2, #68] ; 0x44 ADC1_GC = avg | ADC_GC_CAL; // begin cal 60001e46: 6490 str r0, [r2, #72] ; 0x48 calibrating = 1; while (ADC1_GC & ADC_GC_CAL) { 60001e48: 6c93 ldr r3, [r2, #72] ; 0x48 60001e4a: 061b lsls r3, r3, #24 60001e4c: d4fc bmi.n 60001e48 //yield(); } calibrating = 0; //ADC2 ADC2_CFG = mode | ADC_CFG_ADHSC; 60001e4e: 4a09 ldr r2, [pc, #36] ; (60001e74 ) 60001e50: f240 6137 movw r1, #1591 ; 0x637 ADC2_GC = avg | ADC_GC_CAL; // begin cal 60001e54: 23a0 movs r3, #160 ; 0xa0 ADC2_CFG = mode | ADC_CFG_ADHSC; 60001e56: 6451 str r1, [r2, #68] ; 0x44 ADC2_GC = avg | ADC_GC_CAL; // begin cal 60001e58: 6493 str r3, [r2, #72] ; 0x48 calibrating = 1; while (ADC2_GC & ADC_GC_CAL) { 60001e5a: 6c93 ldr r3, [r2, #72] ; 0x48 60001e5c: f013 0380 ands.w r3, r3, #128 ; 0x80 60001e60: d1fb bne.n 60001e5a //yield(); } calibrating = 0; 60001e62: 4a05 ldr r2, [pc, #20] ; (60001e78 ) 60001e64: 7013 strb r3, [r2, #0] } 60001e66: f85d 4b04 ldr.w r4, [sp], #4 60001e6a: 4770 bx lr 60001e6c: 400fc000 .word 0x400fc000 60001e70: 400c4000 .word 0x400c4000 60001e74: 400c8000 .word 0x400c8000 60001e78: 20002dfe .word 0x20002dfe 60001e7c <_init>: 60001e7c: b5f8 push {r3, r4, r5, r6, r7, lr} 60001e7e: bf00 nop 60001e80: bcf8 pop {r3, r4, r5, r6, r7} 60001e82: bc08 pop {r3} 60001e84: 469e mov lr, r3 60001e86: 4770 bx lr 60001e88 <__memset_veneer>: 60001e88: f85f f000 ldr.w pc, [pc] ; 60001e8c <__memset_veneer+0x4> 60001e8c: 0000db31 .word 0x0000db31 60001e90 <__usb_init_serialnumber_veneer>: 60001e90: f85f f000 ldr.w pc, [pc] ; 60001e94 <__usb_init_serialnumber_veneer+0x4> 60001e94: 0000cb51 .word 0x0000cb51 60001e98 <__pwm_init_veneer>: 60001e98: f85f f000 ldr.w pc, [pc] ; 60001e9c <__pwm_init_veneer+0x4> 60001e9c: 0000b5b9 .word 0x0000b5b9 60001ea0 <__sm_set_pool_veneer>: 60001ea0: f85f f000 ldr.w pc, [pc] ; 60001ea4 <__sm_set_pool_veneer+0x4> 60001ea4: 0000d49d .word 0x0000d49d 60001ea8 <___ZZN6teensy23inplace_function_detail6vtableIvJEEC4IPFvvEEENS0_7wrapperIT_EEENUlPvS9_E0_4_FUNES9_S9__veneer>: 60001ea8: f85f f000 ldr.w pc, [pc] ; 60001eac <___ZZN6teensy23inplace_function_detail6vtableIvJEEC4IPFvvEEENS0_7wrapperIT_EEENUlPvS9_E0_4_FUNES9_S9__veneer+0x4> 60001eac: 0000a651 .word 0x0000a651 60001eb0 <___Znwj_veneer>: 60001eb0: f85f f000 ldr.w pc, [pc] ; 60001eb4 <___Znwj_veneer+0x4> 60001eb4: 0000b4d1 .word 0x0000b4d1 60001eb8 <____libc_init_array_veneer>: 60001eb8: f85f f000 ldr.w pc, [pc] ; 60001ebc <____libc_init_array_veneer+0x4> 60001ebc: 0000dc91 .word 0x0000dc91 60001ec0 <___ZN13IntervalTimer11beginCyclesEN6teensy16inplace_functionIFvvELj16ELj8EEEm_veneer>: 60001ec0: f85f f000 ldr.w pc, [pc] ; 60001ec4 <___ZN13IntervalTimer11beginCyclesEN6teensy16inplace_functionIFvvELj16ELj8EEEm_veneer+0x4> 60001ec4: 0000abad .word 0x0000abad 60001ec8 <__set_arm_clock_veneer>: 60001ec8: f85f f000 ldr.w pc, [pc] ; 60001ecc <__set_arm_clock_veneer+0x4> 60001ecc: 0000ae8d .word 0x0000ae8d 60001ed0 <__delay_veneer>: 60001ed0: f85f f000 ldr.w pc, [pc] ; 60001ed4 <__delay_veneer+0x4> 60001ed4: 0000b1a9 .word 0x0000b1a9 60001ed8 <__main_veneer>: 60001ed8: f85f f000 ldr.w pc, [pc] ; 60001edc <__main_veneer+0x4> 60001edc: 0000b38d .word 0x0000b38d 60001ee0 <__frame_dummy_init_array_entry>: 60001ee0: 00000045 000016e9 00001935 00001a5d E.......5...]... 60001ef0: 00001a75 00001a8d 00001aa5 00001abd u............... 60001f00: 00001ad5 00001aed 00001b05 00001b1d ................ 60001f10: 00001b35 00001b4d 00001c55 00001c6d 5...M...U...m... 60001f20: 00001c85 00001c9d 00001cb5 00001ccd ................ 60001f30: 00001ce5 00001cfd 00001d31 00001d45 ........1...E... 60001f40: 00001d5d 00001d75 00001d8d 00001da5 ]...u........... 60001f50: 00003469 0000acb1 i4...... Disassembly of section .text.itcm: 00000000 <_stext>: ... 00000020 : // state is explicitly STATE_STOP if(state_play >= 8 || state == STATE_STOP) return; // toggle back and forth between state_play and STATE_PAUSED if(state == state_play) { state = STATE_PAUSED; 20: 4805 ldr r0, [pc, #20] ; (38 <_teensy_model_identifier+0x13>) 22: 4b06 ldr r3, [pc, #24] ; (3c <_teensy_model_identifier+0x17>) 24: 1a1b subs r3, r3, r0 /** Low surrogate for a code point. * \param{in} cp code point. * \return low surrogate. */ inline uint16_t lowSurrogate(uint32_t cp) { return (cp & 0X3FF) + 0XDC00; 26: 0fd9 lsrs r1, r3, #31 return (cp >> 10) + (0XD800 - (0X10000 >> 10)); 28: eb01 01a3 add.w r1, r1, r3, asr #2 return (cp & 0X3FF) + 0XDC00; 2c: 1049 asrs r1, r1, #1 2e: d002 beq.n 36 <_teensy_model_identifier+0x11> } if (cp <= 0XFFFF) { *hs = cp; *ls = 0; } else { *hs = highSurrogate(cp); 30: 4b03 ldr r3, [pc, #12] ; (40 <_teensy_model_identifier+0x1b>) *ls = lowSurrogate(cp); 32: b103 cbz r3, 36 <_teensy_model_identifier+0x11> } return ptr; } 34: 4718 bx r3 36: 4770 bx lr return true; } 38: 20001ac0 .word 0x20001ac0 3c: 20001ac0 .word 0x20001ac0 40: 00000000 .word 0x00000000 00000044 : // start the SRTC SNVS_LPCR |= SNVS_LPCR_SRTC_ENV; while (!(SNVS_LPCR & SNVS_LPCR_SRTC_ENV)); // wait // start the RTC and sync it to the SRTC SNVS_HPCR |= SNVS_HPCR_RTC_EN | SNVS_HPCR_HP_TS; } 44: b508 push {r3, lr} 46: 4b05 ldr r3, [pc, #20] ; (5c ) } m_vwd = dir; return true; fail: return false; 48: b11b cbz r3, 52 } 4a: 4905 ldr r1, [pc, #20] ; (60 ) 4c: 4805 ldr r0, [pc, #20] ; (64 ) 4e: f3af 8000 nop.w if (pin < NUM_DIGITAL_PINS) { cdPin_ = pin; pinMode(cdPin_, INPUT_PULLUP); } else { cdPin_ = 0xff; return false; 52: e8bd 4008 ldmia.w sp!, {r3, lr} 56: f7ff bfe3 b.w 20 5a: bf00 nop m_vwd = dir; return true; fail: return false; } 5c: 00000000 .word 0x00000000 dtmfTrailing = true; dtmfBurst = 0; dtmfOn(); state = DTMF_ON; stateClock = 0; } 60: 20002c60 .word 0x20002c60 64: 60012c00 .word 0x60012c00 00000068 : constexpr Print() : write_error(0) {} virtual size_t write(uint8_t b) = 0; size_t write(const char *str) { if (str == nullptr) return 0; return write((const uint8_t *)str, strlen(str)); } virtual size_t write(const uint8_t *buffer, size_t size); virtual int availableForWrite(void) { return 0; } 68: 2000 movs r0, #0 6a: 4770 bx lr 0000006c : virtual void flush() { } 6c: 4770 bx lr } NVIC_SET_PRIORITY(IRQ_PIT, top_priority); channel = 0; } #endif } 6e: bf00 nop 00000070 : bool isHidden() const { return m_fFile ? m_fFile->isHidden() : m_xFile ? m_xFile->isHidden() : false; } /** \return True if this is an open file/directory else false. */ bool isOpen() const {return m_fFile || m_xFile;} 70: 6d03 ldr r3, [r0, #80] ; 0x50 72: b10b cbz r3, 78 74: 2001 movs r0, #1 sdfatfile.close(); } } virtual bool isOpen() { return sdfatfile.isOpen(); } 76: 4770 bx lr 78: 6d40 ldr r0, [r0, #84] ; 0x54 7a: 3800 subs r0, #0 7c: bf18 it ne 7e: 2001 movne r0, #1 80: 4770 bx lr if (sep) { *--str = sep; } str = fmtBase10(str, n); if (n < 10) { *--str = '0'; 82: bf00 nop 00000084 : 84: 4b1c ldr r3, [pc, #112] ; (f8 ) if (tz & 0X80) { if (tz & 0X40) { sign = '-'; tz = -tz; } else { sign = '+'; 86: 781b ldrb r3, [r3, #0] 88: 3b23 subs r3, #35 ; 0x23 { MillisTimer *timer = listActive; while (timer) { if (timer->_ms > 0) { timer->_ms--; break; 8a: 2b15 cmp r3, #21 8c: d80c bhi.n a8 8e: e8df f003 tbb [pc, r3] 92: 0b12 .short 0x0b12 switch (digit) { 94: 0b0b0b0b .word 0x0b0b0b0b 98: 0b0b150b .word 0x0b0b150b 9c: 180b0b0b .word 0x180b0b0b a0: 1e1b2d30 .word 0x1e1b2d30 a4: 2a272421 .word 0x2a272421 case '9': return { 852, 1477 }; a8: 4814 ldr r0, [pc, #80] ; (fc ) aa: 4915 ldr r1, [pc, #84] ; (100 ) public: AudioSynthWaveformSine() : AudioStream(0, NULL), magnitude(16384) {} void frequency(float freq) { if (freq < 0.0f) freq = 0.0; else if (freq > AUDIO_SAMPLE_RATE_EXACT/2.0f) freq = AUDIO_SAMPLE_RATE_EXACT/2.0f; phase_increment = freq * (4294967296.0f / AUDIO_SAMPLE_RATE_EXACT); ac: 4a15 ldr r2, [pc, #84] ; (104 ) ae: 4b16 ldr r3, [pc, #88] ; (108 ) b0: 61d0 str r0, [r2, #28] b2: 61d9 str r1, [r3, #28] } b4: 4770 bx lr case '#': return { 941, 1477 }; b6: 4815 ldr r0, [pc, #84] ; (10c ) b8: 4911 ldr r1, [pc, #68] ; (100 ) ba: e7f7 b.n ac case '*': return { 941, 1209 }; bc: 4813 ldr r0, [pc, #76] ; (10c ) be: 4914 ldr r1, [pc, #80] ; (110 ) c0: e7f4 b.n ac case '0': return { 941, 1336 }; c2: 4812 ldr r0, [pc, #72] ; (10c ) c4: 4913 ldr r1, [pc, #76] ; (114 ) c6: e7f1 b.n ac case '3': return { 697, 1477 }; c8: 4813 ldr r0, [pc, #76] ; (118 ) ca: 490d ldr r1, [pc, #52] ; (100 ) cc: e7ee b.n ac case '4': return { 770, 1209 }; ce: 4813 ldr r0, [pc, #76] ; (11c ) d0: 490f ldr r1, [pc, #60] ; (110 ) d2: e7eb b.n ac case '5': return { 770, 1336 }; d4: 4811 ldr r0, [pc, #68] ; (11c ) d6: 490f ldr r1, [pc, #60] ; (114 ) d8: e7e8 b.n ac case '6': return { 770, 1477 }; da: 4810 ldr r0, [pc, #64] ; (11c ) dc: 4908 ldr r1, [pc, #32] ; (100 ) de: e7e5 b.n ac case '7': return { 852, 1209 }; e0: 4806 ldr r0, [pc, #24] ; (fc ) e2: 490b ldr r1, [pc, #44] ; (110 ) e4: e7e2 b.n ac case '8': return { 852, 1336 }; e6: 4805 ldr r0, [pc, #20] ; (fc ) e8: 490a ldr r1, [pc, #40] ; (114 ) ea: e7df b.n ac switch (digit) { ec: 480a ldr r0, [pc, #40] ; (118 ) ee: 4909 ldr r1, [pc, #36] ; (114 ) f0: e7dc b.n ac f2: 4809 ldr r0, [pc, #36] ; (118 ) f4: 4906 ldr r1, [pc, #24] ; (110 ) f6: e7d9 b.n ac f8: 2000153b .word 0x2000153b fc: 04f22340 .word 0x04f22340 100: 0892ef90 .word 0x0892ef90 104: 20002930 .word 0x20002930 108: 2000290c .word 0x2000290c 10c: 05766608 .word 0x05766608 110: 0704aad0 .word 0x0704aad0 114: 07c16620 .word 0x07c16620 118: 040bcbb8 .word 0x040bcbb8 11c: 04784780 .word 0x04784780 00000120 : virtual void close() { 120: b510 push {r4, lr} 122: 4604 mov r4, r0 if (filename) { 124: 6d80 ldr r0, [r0, #88] ; 0x58 126: b118 cbz r0, 130 free(filename); 128: f00d fa08 bl d53c filename = nullptr; 12c: 2300 movs r3, #0 12e: 65a3 str r3, [r4, #88] ; 0x58 130: 6d23 ldr r3, [r4, #80] ; 0x50 132: b12b cbz r3, 140 sdfatfile.close(); 134: f104 0018 add.w r0, r4, #24 } 138: e8bd 4010 ldmia.w sp!, {r4, lr} sdfatfile.close(); 13c: f007 be18 b.w 7d70 140: 6d63 ldr r3, [r4, #84] ; 0x54 142: 2b00 cmp r3, #0 144: d1f6 bne.n 134 } 146: bd10 pop {r4, pc} 00000148 : virtual const char * name() { 148: b510 push {r4, lr} 14a: 4604 mov r4, r0 if (!filename) { 14c: 6d80 ldr r0, [r0, #88] ; 0x58 14e: b100 cbz r0, 152 static char zeroterm = 0; filename = &zeroterm; } } return filename; } 150: bd10 pop {r4, pc} filename = (char *)malloc(MAX_FILENAME_LEN); 152: f44f 7080 mov.w r0, #256 ; 0x100 156: f00d f9e9 bl d52c 15a: 65a0 str r0, [r4, #88] ; 0x58 if (filename) { 15c: b1b0 cbz r0, 18c *name = 0; 15e: 2200 movs r2, #0 return m_fFile ? m_fFile->getName(name, len) : 160: 6d23 ldr r3, [r4, #80] ; 0x50 *name = 0; 162: 7002 strb r2, [r0, #0] return m_fFile ? m_fFile->getName(name, len) : 164: b13b cbz r3, 176 166: 4601 mov r1, r0 168: f44f 7280 mov.w r2, #256 ; 0x100 16c: 4618 mov r0, r3 16e: f007 fa4f bl 7610 return filename; 172: 6da0 ldr r0, [r4, #88] ; 0x58 } 174: bd10 pop {r4, pc} 176: 6d63 ldr r3, [r4, #84] ; 0x54 m_xFile ? m_xFile->getName(name, len) : 0; 178: 2b00 cmp r3, #0 17a: d0e9 beq.n 150 * \param[in] size The size of the array in characters. * \return the name length. */ size_t getName(char* name, size_t size) { #if USE_UTF8_LONG_NAMES return getName8(name, size); 17c: 4601 mov r1, r0 17e: f44f 7280 mov.w r2, #256 ; 0x100 182: 4618 mov r0, r3 184: f004 fef2 bl 4f6c return filename; 188: 6da0 ldr r0, [r4, #88] ; 0x58 } 18a: bd10 pop {r4, pc} filename = &zeroterm; 18c: 4b01 ldr r3, [pc, #4] ; (194 ) 18e: 4618 mov r0, r3 190: 65a3 str r3, [r4, #88] ; 0x58 } 192: bd10 pop {r4, pc} 194: 20002dfd .word 0x20002dfd 00000198 : virtual bool truncate(uint64_t size=0) { 198: b538 push {r3, r4, r5, lr} * \param[in] length The desired length for the file. * * \return true for success or false for failure. */ bool truncate(uint64_t length) { return m_fFile ? length < (1ULL << 32) && m_fFile->truncate(length) : 19a: 6d05 ldr r5, [r0, #80] ; 0x50 19c: b16d cbz r5, 1ba 19e: b10b cbz r3, 1a4 } 1a0: 2000 movs r0, #0 1a2: bd38 pop {r3, r4, r5, pc} * \param[in] length The desired length for the file. * * \return true for success or false for failure. */ bool truncate(uint32_t length) { return seekSet(length) && truncate(); 1a4: 4611 mov r1, r2 1a6: 4628 mov r0, r5 1a8: f005 ff6e bl 6088 1ac: 2800 cmp r0, #0 1ae: d0f7 beq.n 1a0 1b0: 4628 mov r0, r5 1b2: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} 1b6: f006 b909 b.w 63cc 1ba: 6d44 ldr r4, [r0, #84] ; 0x54 m_xFile ? m_xFile->truncate(length) : false; 1bc: 2c00 cmp r4, #0 1be: d0ef beq.n 1a0 * \param[in] length The desired length for the file. * * \return true for success or false for failure. */ bool truncate(uint64_t length) { return seekSet(length) && truncate(); 1c0: 4620 mov r0, r4 1c2: f003 fb25 bl 3810 1c6: 2800 cmp r0, #0 1c8: d0ea beq.n 1a0 1ca: 4620 mov r0, r4 1cc: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} 1d0: f004 b998 b.w 4504 000001d4 : if (tm.year < 80 || tm.year > 207) return false; return sdfatfile.timestamp(T_CREATE, tm.year + 1900, tm.mon + 1, tm.mday, tm.hour, tm.min, tm.sec); } virtual bool setModifyTime(const DateTimeFields &tm) { if (tm.year < 80 || tm.year > 207) return false; 1d4: 798a ldrb r2, [r1, #6] 1d6: f1a2 0350 sub.w r3, r2, #80 ; 0x50 1da: 061b lsls r3, r3, #24 1dc: d422 bmi.n 224 return sdfatfile.timestamp(T_WRITE, tm.year + 1900, tm.mon + 1, 1de: f202 726c addw r2, r2, #1900 ; 0x76c virtual bool setModifyTime(const DateTimeFields &tm) { 1e2: b5f0 push {r4, r5, r6, r7, lr} return sdfatfile.timestamp(T_WRITE, tm.year + 1900, tm.mon + 1, 1e4: 794b ldrb r3, [r1, #5] virtual bool setModifyTime(const DateTimeFields &tm) { 1e6: b085 sub sp, #20 return m_fFile ? 1e8: 6d04 ldr r4, [r0, #80] ; 0x50 return sdfatfile.timestamp(T_WRITE, tm.year + 1900, tm.mon + 1, 1ea: 3301 adds r3, #1 tm.mday, tm.hour, tm.min, tm.sec); 1ec: 790d ldrb r5, [r1, #4] 1ee: 788e ldrb r6, [r1, #2] 1f0: 784f ldrb r7, [r1, #1] return sdfatfile.timestamp(T_WRITE, tm.year + 1900, tm.mon + 1, 1f2: b2db uxtb r3, r3 tm.mday, tm.hour, tm.min, tm.sec); 1f4: 7809 ldrb r1, [r1, #0] 1f6: b14c cbz r4, 20c m_fFile->timestamp(flags, year, month, day, hour, minute, second) : 1f8: 4620 mov r0, r4 1fa: 9601 str r6, [sp, #4] 1fc: 9500 str r5, [sp, #0] 1fe: e9cd 7102 strd r7, r1, [sp, #8] 202: 2104 movs r1, #4 204: f006 f876 bl 62f4 } 208: b005 add sp, #20 20a: bdf0 pop {r4, r5, r6, r7, pc} 20c: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? 20e: 2800 cmp r0, #0 210: d0fa beq.n 208 m_xFile->timestamp(flags, year, month, day, hour, minute, second) : 212: 9601 str r6, [sp, #4] 214: 9500 str r5, [sp, #0] 216: e9cd 7102 strd r7, r1, [sp, #8] 21a: 2104 movs r1, #4 21c: f004 f8b6 bl 438c 220: b005 add sp, #20 222: bdf0 pop {r4, r5, r6, r7, pc} if (tm.year < 80 || tm.year > 207) return false; 224: 2000 movs r0, #0 } 226: 4770 bx lr 00000228 : virtual void rewindDirectory(void) { 228: b510 push {r4, lr} 22a: 4604 mov r4, r0 return m_fFile ? m_fFile->isDir() : 22c: 6d00 ldr r0, [r0, #80] ; 0x50 22e: b180 cbz r0, 252 int read() { return BaseFile::read(); } /** Rewind a file if it is a directory */ void rewindDirectory() { if (BaseFile::isDir()) { 230: 7803 ldrb r3, [r0, #0] 232: f013 0f70 tst.w r3, #112 ; 0x70 236: d100 bne.n 23a } 238: bd10 pop {r4, pc} seekSet(0); 23a: 2100 movs r1, #0 23c: f005 ff24 bl 6088 if (m_xFile) m_xFile->rewind(); 240: 6d60 ldr r0, [r4, #84] ; 0x54 242: 2800 cmp r0, #0 244: d0f8 beq.n 238 seekSet(0); 246: 2200 movs r2, #0 248: 2300 movs r3, #0 24a: e8bd 4010 ldmia.w sp!, {r4, lr} 24e: f003 badf b.w 3810 252: 6d60 ldr r0, [r4, #84] ; 0x54 m_xFile ? m_xFile->isDir() : false; 254: 2800 cmp r0, #0 256: d0ef beq.n 238 258: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 25c: f013 0f50 tst.w r3, #80 ; 0x50 260: d0ea beq.n 238 262: 2200 movs r2, #0 264: 2300 movs r3, #0 266: e8bd 4010 ldmia.w sp!, {r4, lr} 26a: f003 bad1 b.w 3810 //digitalWrite(4, LOW); } void HardwareSerialIMXRT::addToSerialEventsList() { for (uint8_t i = 0; i < s_count_serials_with_serial_events; i++) { 26e: bf00 nop 00000270 : return m_fFile ? m_fFile->getModifyDateTime(pdate, ptime) : 270: 6d03 ldr r3, [r0, #80] ; 0x50 virtual bool getModifyTime(DateTimeFields &tm) { 272: b510 push {r4, lr} 274: 460c mov r4, r1 276: b082 sub sp, #8 278: b32b cbz r3, 2c6 27a: f10d 0206 add.w r2, sp, #6 27e: a901 add r1, sp, #4 280: 4618 mov r0, r3 282: f005 faa7 bl 57d4 if (!sdfatfile.getModifyDateTime(&fat_date, &fat_time)) return false; 286: b338 cbz r0, 2d8 if ((fat_date == 0) && (fat_time == 0)) return false; 288: f8bd 3004 ldrh.w r3, [sp, #4] 28c: f8bd 2006 ldrh.w r2, [sp, #6] 290: ea53 0102 orrs.w r1, r3, r2 294: d020 beq.n 2d8 * \param[in] fatTime Time in packed dir format. * * \return Extracted minute [0,59] */ static inline uint8_t FS_MINUTE(uint16_t fatTime) { return (fatTime >> 5) & 0X3F; 296: f3c2 1c45 ubfx ip, r2, #5, #6 * \param[in] fatTime Time in packed dir format. * * \return Extracted second [0,58] */ static inline uint8_t FS_SECOND(uint16_t fatTime) { return 2*(fatTime & 0X1F); 29a: f002 001f and.w r0, r2, #31 return fatTime >> 11; 29e: 0ad2 lsrs r2, r2, #11 return (fatDate >> 5) & 0XF; 2a0: f3c3 1143 ubfx r1, r3, #5, #4 return 2*(fatTime & 0X1F); 2a4: 0040 lsls r0, r0, #1 tm.min = FS_MINUTE(fat_time); 2a6: f884 c001 strb.w ip, [r4, #1] return fatTime >> 11; 2aa: 70a2 strb r2, [r4, #2] return 1980 + (fatDate >> 9); 2ac: 0a5a lsrs r2, r3, #9 tm.mon = FS_MONTH(fat_date) - 1; 2ae: 3901 subs r1, #1 return fatDate & 0X1F; 2b0: f003 031f and.w r3, r3, #31 tm.year = FS_YEAR(fat_date) - 1900; 2b4: f502 62ea add.w r2, r2, #1872 ; 0x750 tm.sec = FS_SECOND(fat_time); 2b8: 7020 strb r0, [r4, #0] return true; 2ba: 2001 movs r0, #1 tm.mon = FS_MONTH(fat_date) - 1; 2bc: 7161 strb r1, [r4, #5] tm.mday = FS_DAY(fat_date); 2be: 7123 strb r3, [r4, #4] tm.year = FS_YEAR(fat_date) - 1900; 2c0: 71a2 strb r2, [r4, #6] } 2c2: b002 add sp, #8 2c4: bd10 pop {r4, pc} 2c6: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->getModifyDateTime(pdate, ptime) : false; 2c8: b130 cbz r0, 2d8 2ca: f10d 0206 add.w r2, sp, #6 2ce: a901 add r1, sp, #4 2d0: f003 f944 bl 355c 2d4: 2800 cmp r0, #0 2d6: d1d7 bne.n 288 if (!sdfatfile.getModifyDateTime(&fat_date, &fat_time)) return false; 2d8: 2000 movs r0, #0 } 2da: b002 add sp, #8 2dc: bd10 pop {r4, pc} } uint16_t transfer16(uint16_t data) { uint32_t tcr = port().TCR; port().TCR = (tcr & 0xfffff000) | LPSPI_TCR_FRAMESZ(15); // turn on 16 bit mode port().TDR = data; // output 16 bit data. while ((port().RSR & LPSPI_RSR_RXEMPTY)) ; // wait while the RSR fifo is empty... 2de: bf00 nop 000002e0 : return m_fFile ? m_fFile->getCreateDateTime(pdate, ptime) : 2e0: 6d03 ldr r3, [r0, #80] ; 0x50 virtual bool getCreateTime(DateTimeFields &tm) { 2e2: b510 push {r4, lr} 2e4: 460c mov r4, r1 2e6: b082 sub sp, #8 2e8: b32b cbz r3, 336 2ea: f10d 0206 add.w r2, sp, #6 2ee: a901 add r1, sp, #4 2f0: 4618 mov r0, r3 2f2: f005 fa5f bl 57b4 if (!sdfatfile.getCreateDateTime(&fat_date, &fat_time)) return false; 2f6: b338 cbz r0, 348 if ((fat_date == 0) && (fat_time == 0)) return false; 2f8: f8bd 3004 ldrh.w r3, [sp, #4] 2fc: f8bd 2006 ldrh.w r2, [sp, #6] 300: ea53 0102 orrs.w r1, r3, r2 304: d020 beq.n 348 return (fatTime >> 5) & 0X3F; 306: f3c2 1c45 ubfx ip, r2, #5, #6 return 2*(fatTime & 0X1F); 30a: f002 001f and.w r0, r2, #31 return fatTime >> 11; 30e: 0ad2 lsrs r2, r2, #11 return (fatDate >> 5) & 0XF; 310: f3c3 1143 ubfx r1, r3, #5, #4 return 2*(fatTime & 0X1F); 314: 0040 lsls r0, r0, #1 tm.min = FS_MINUTE(fat_time); 316: f884 c001 strb.w ip, [r4, #1] return fatTime >> 11; 31a: 70a2 strb r2, [r4, #2] return 1980 + (fatDate >> 9); 31c: 0a5a lsrs r2, r3, #9 tm.mon = FS_MONTH(fat_date) - 1; 31e: 3901 subs r1, #1 return fatDate & 0X1F; 320: f003 031f and.w r3, r3, #31 tm.year = FS_YEAR(fat_date) - 1900; 324: f502 62ea add.w r2, r2, #1872 ; 0x750 tm.sec = FS_SECOND(fat_time); 328: 7020 strb r0, [r4, #0] return true; 32a: 2001 movs r0, #1 tm.mon = FS_MONTH(fat_date) - 1; 32c: 7161 strb r1, [r4, #5] tm.mday = FS_DAY(fat_date); 32e: 7123 strb r3, [r4, #4] tm.year = FS_YEAR(fat_date) - 1900; 330: 71a2 strb r2, [r4, #6] } 332: b002 add sp, #8 334: bd10 pop {r4, pc} 336: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->getCreateDateTime(pdate, ptime) : false; 338: b130 cbz r0, 348 33a: f10d 0206 add.w r2, sp, #6 33e: a901 add r1, sp, #4 340: f003 f8fa bl 3538 344: 2800 cmp r0, #0 346: d1d7 bne.n 2f8 if (!sdfatfile.getCreateDateTime(&fat_date, &fat_time)) return false; 348: 2000 movs r0, #0 } 34a: b002 add sp, #8 34c: bd10 pop {r4, pc} ch4_offset = AUDIO_BLOCK_SAMPLES/2; } else { ch4_offset = 0; release(block_ch4_1st); block_ch4_1st = block_ch4_2nd; block_ch4_2nd = NULL; 34e: bf00 nop 00000350 : return (f) ? f->read(buf, nbyte) : 0; } // Write bytes to a file virtual size_t write(const uint8_t *buf, size_t size) { // override print version return (f) ? f->write((void*)buf, size) : 0; 350: 6903 ldr r3, [r0, #16] 352: b1d3 cbz r3, 38a 354: 480e ldr r0, [pc, #56] ; (390 ) virtual size_t write(const uint8_t *buf, size_t size) { 356: b410 push {r4} return (f) ? f->write((void*)buf, size) : 0; 358: 681c ldr r4, [r3, #0] 35a: 68e4 ldr r4, [r4, #12] 35c: 4284 cmp r4, r0 35e: d10f bne.n 380 * * \return For success write() returns the number of bytes written, always * \a nbyte. If an error occurs, write() returns zero and writeError is set. */ size_t write(const void* buf, size_t count) { return m_fFile ? m_fFile->write(buf, count) : 360: 6d18 ldr r0, [r3, #80] ; 0x50 362: b118 cbz r0, 36c } 364: f85d 4b04 ldr.w r4, [sp], #4 368: f006 b86a b.w 6440 36c: 6d58 ldr r0, [r3, #84] ; 0x54 m_xFile ? m_xFile->write(buf, count) : 0; 36e: b118 cbz r0, 378 370: f85d 4b04 ldr.w r4, [sp], #4 374: f004 b938 b.w 45e8 378: 2000 movs r0, #0 37a: f85d 4b04 ldr.w r4, [sp], #4 37e: 4770 bx lr return (f) ? f->write((void*)buf, size) : 0; 380: 4618 mov r0, r3 382: 4623 mov r3, r4 } 384: f85d 4b04 ldr.w r4, [sp], #4 return (f) ? f->write((void*)buf, size) : 0; 388: 4718 bx r3 } 38a: 2000 movs r0, #0 38c: 4770 bx lr 38e: bf00 nop 390: 0000066d .word 0x0000066d 00000394 : size_t write(const void *buf, size_t size) { return (f) ? f->write(buf, size) : 0; } // Returns the number of bytes which may be read from a file int available() { return (f) ? f->available() : 0; 394: 6900 ldr r0, [r0, #16] 396: b190 cbz r0, 3be 398: 6803 ldr r3, [r0, #0] 39a: 4a15 ldr r2, [pc, #84] ; (3f0 ) 39c: 691b ldr r3, [r3, #16] 39e: 4293 cmp r3, r2 3a0: d125 bne.n 3ee return m_fFile ? m_fFile->available() : 3a2: 6d03 ldr r3, [r0, #80] ; 0x50 3a4: b163 cbz r3, 3c0 return isFile() ? fileSize() - curPosition() : 0; 3a6: 7818 ldrb r0, [r3, #0] 3a8: f010 0008 ands.w r0, r0, #8 3ac: d007 beq.n 3be 3ae: 69d8 ldr r0, [r3, #28] 3b0: 695b ldr r3, [r3, #20] return n > INT_MAX ? INT_MAX : n; 3b2: 1ac0 subs r0, r0, r3 3b4: bf48 it mi 3b6: f06f 4000 mvnmi.w r0, #2147483648 ; 0x80000000 3ba: 4770 bx lr 3bc: 4618 mov r0, r3 } 3be: 4770 bx lr 3c0: 6d43 ldr r3, [r0, #84] ; 0x54 m_xFile ? m_xFile->available() : 0; 3c2: 2b00 cmp r3, #0 3c4: d0fa beq.n 3bc return isFile() ? fileSize() - curPosition() : 0; 3c6: f893 0031 ldrb.w r0, [r3, #49] ; 0x31 3ca: f010 0008 ands.w r0, r0, #8 3ce: d0f6 beq.n 3be 3d0: 6918 ldr r0, [r3, #16] 3d2: 6819 ldr r1, [r3, #0] 3d4: 695a ldr r2, [r3, #20] 3d6: 1a40 subs r0, r0, r1 3d8: 685b ldr r3, [r3, #4] 3da: eb62 0303 sbc.w r3, r2, r3 return n > INT_MAX ? INT_MAX : n; 3de: f1b0 4f00 cmp.w r0, #2147483648 ; 0x80000000 3e2: f173 0300 sbcs.w r3, r3, #0 3e6: d3ea bcc.n 3be 3e8: f06f 4000 mvn.w r0, #2147483648 ; 0x80000000 3ec: 4770 bx lr return (f) ? f->available() : 0; 3ee: 4718 bx r3 3f0: 00000755 .word 0x00000755 000003f4 : } bool seek(uint64_t pos) { return seek(pos, SeekSet); } int read() { if (!f) return -1; 3f4: 6903 ldr r3, [r0, #16] 3f6: b323 cbz r3, 442 unsigned char b; if (f->read(&b, 1) < 1) return -1; 3f8: 6819 ldr r1, [r3, #0] 3fa: 4a13 ldr r2, [pc, #76] ; (448 ) int read() { 3fc: b510 push {r4, lr} if (f->read(&b, 1) < 1) return -1; 3fe: 688c ldr r4, [r1, #8] int read() { 400: b082 sub sp, #8 402: 4294 cmp r4, r2 404: d114 bne.n 430 return m_fFile ? m_fFile->read(buf, count) : 406: 6d18 ldr r0, [r3, #80] ; 0x50 408: b148 cbz r0, 41e 40a: 2201 movs r2, #1 40c: f10d 0107 add.w r1, sp, #7 410: f005 fbf2 bl 5bf8 if (f->read(&b, 1) < 1) return -1; 414: b190 cbz r0, 43c return b; 416: f89d 0007 ldrb.w r0, [sp, #7] } 41a: b002 add sp, #8 41c: bd10 pop {r4, pc} 41e: 6d58 ldr r0, [r3, #84] ; 0x54 m_xFile ? m_xFile->read(buf, count) : -1; 420: 2800 cmp r0, #0 422: d0f8 beq.n 416 424: 2201 movs r2, #1 426: f10d 0107 add.w r1, sp, #7 42a: f003 f90b bl 3644 42e: e7f1 b.n 414 if (f->read(&b, 1) < 1) return -1; 430: 2201 movs r2, #1 432: f10d 0107 add.w r1, sp, #7 436: 4618 mov r0, r3 438: 47a0 blx r4 43a: e7eb b.n 414 if (!f) return -1; 43c: f04f 30ff mov.w r0, #4294967295 440: e7eb b.n 41a 442: f04f 30ff mov.w r0, #4294967295 } 446: 4770 bx lr 448: 000005e1 .word 0x000005e1 0000044c : if (f) f->flush(); 44c: 6903 ldr r3, [r0, #16] 44e: b163 cbz r3, 46a 450: 681a ldr r2, [r3, #0] 452: 4907 ldr r1, [pc, #28] ; (470 ) 454: 6992 ldr r2, [r2, #24] 456: 428a cmp r2, r1 458: d108 bne.n 46c return m_fFile ? m_fFile->sync() : 45a: 6d18 ldr r0, [r3, #80] ; 0x50 45c: b108 cbz r0, 462 45e: f005 bf43 b.w 62e8 462: 6d58 ldr r0, [r3, #84] ; 0x54 m_xFile ? m_xFile->sync() : false; 464: b108 cbz r0, 46a 466: f003 be1b b.w 40a0 } 46a: 4770 bx lr if (f) f->flush(); 46c: 4618 mov r0, r3 46e: 4710 bx r2 470: 00000645 .word 0x00000645 00000474 : return (f) ? f->peek() : -1; 474: 6903 ldr r3, [r0, #16] 476: b173 cbz r3, 496 478: 681a ldr r2, [r3, #0] 47a: 4908 ldr r1, [pc, #32] ; (49c ) 47c: 6952 ldr r2, [r2, #20] 47e: 428a cmp r2, r1 480: d107 bne.n 492 return m_fFile ? m_fFile->peek() : 482: 6d18 ldr r0, [r3, #80] ; 0x50 484: b108 cbz r0, 48a 486: f005 bc8b b.w 5da0 48a: 6d58 ldr r0, [r3, #84] ; 0x54 m_xFile ? m_xFile->peek() : -1; 48c: b118 cbz r0, 496 48e: f003 b9a9 b.w 37e4 492: 4618 mov r0, r3 494: 4710 bx r2 } 496: f04f 30ff mov.w r0, #4294967295 49a: 4770 bx lr 49c: 00000589 .word 0x00000589 000004a0 : return m_fFile ? m_fFile->curPosition() : 4a0: 6d03 ldr r3, [r0, #80] ; 0x50 4a2: b113 cbz r3, 4aa 4a4: 6958 ldr r0, [r3, #20] 4a6: 2100 movs r1, #0 4a8: 4770 bx lr 4aa: 6d43 ldr r3, [r0, #84] ; 0x54 m_xFile ? m_xFile->curPosition() : 0; 4ac: b113 cbz r3, 4b4 uint64_t curPosition() const {return m_curPosition;} 4ae: e9d3 0100 ldrd r0, r1, [r3] 4b2: 4770 bx lr 4b4: 4618 mov r0, r3 4b6: 4619 mov r1, r3 } 4b8: 4770 bx lr for (int j = 0; j < 4; j++) { int32_t integrateR[3]; static int32_t integrateROld[3] = {0}; integrateR[0] = ( (j==0) ? (combR[2]) : (0) ) + integrateROld[0]; integrateR[1] = integrateR[0] + integrateROld[1]; 4ba: bf00 nop 000004bc : return m_fFile ? m_fFile->fileSize() : 4bc: 6d03 ldr r3, [r0, #80] ; 0x50 4be: b113 cbz r3, 4c6 4c0: 69d8 ldr r0, [r3, #28] 4c2: 2100 movs r1, #0 4c4: 4770 bx lr 4c6: 6d43 ldr r3, [r0, #84] ; 0x54 m_xFile ? m_xFile->fileSize() : 0; 4c8: b113 cbz r3, 4d0 uint64_t fileSize() const {return m_validLength;} 4ca: e9d3 0104 ldrd r0, r1, [r3, #16] 4ce: 4770 bx lr 4d0: 4618 mov r0, r3 4d2: 4619 mov r1, r3 } 4d4: 4770 bx lr integrateR[2] = integrateR[1] + integrateROld[2]; // integrateR[2] now holds j'th upsampled value *(dest+j*2+1) = integrateR[2] >> 4; 4d6: bf00 nop 000004d8 : virtual File openNextFile(uint8_t mode=0) { 4d8: b5f0 push {r4, r5, r6, r7, lr} 4da: b095 sub sp, #84 ; 0x54 constexpr Print() : write_error(0) {} 4dc: 2200 movs r2, #0 enum LookaheadMode {SKIP_ALL, SKIP_NONE, SKIP_WHITESPACE}; class Stream : public Print { public: constexpr Stream() : _timeout(1000), read_error(0) {} 4de: f44f 747a mov.w r4, #1000 ; 0x3e8 }; /** * \class FsFile * \brief FsBaseFile file with Arduino Stream. */ class FsFile : public StreamFile { 4e2: 4f24 ldr r7, [pc, #144] ; (574 ) * \param[in] oflag open flags. * \return a FatStream object. */ FsFile openNextFile(oflag_t oflag = O_RDONLY) { FsFile tmpFile; tmpFile.openNext(this, oflag); 4e4: 3118 adds r1, #24 4e6: 4605 mov r5, r0 4e8: a804 add r0, sp, #16 4ea: f88d 200c strb.w r2, [sp, #12] class FsFile : public StreamFile { 4ee: 9700 str r7, [sp, #0] 4f0: e9cd 2401 strd r2, r4, [sp, #4] FsBaseFile() {} 4f4: e9cd 2212 strd r2, r2, [sp, #72] ; 0x48 tmpFile.openNext(this, oflag); 4f8: f007 fca6 bl 7e48 bool isOpen() const {return m_fFile || m_xFile;} 4fc: 9b12 ldr r3, [sp, #72] ; 0x48 4fe: 2b00 cmp r3, #0 500: d02d beq.n 55e if (file) return File(new SDFile(file)); 502: 205c movs r0, #92 ; 0x5c class FileImpl { 504: 2600 movs r6, #0 506: f00a ffe3 bl b4d0 class Print 50a: 9b01 ldr r3, [sp, #4] 50c: 4604 mov r4, r0 50e: 6046 str r6, [r0, #4] 510: 60c3 str r3, [r0, #12] class StreamFile : public stream_t, public BaseFile { 512: a904 add r1, sp, #16 class Stream : public Print 514: 9b02 ldr r3, [sp, #8] 516: 3018 adds r0, #24 518: f840 3c08 str.w r3, [r0, #-8] 51c: f89d 300c ldrb.w r3, [sp, #12] 520: f800 3c04 strb.w r3, [r0, #-4] SDFile(const SDFAT_FILE &file) : sdfatfile(file), filename(nullptr) { } 524: 4b14 ldr r3, [pc, #80] ; (578 ) 526: f840 3c18 str.w r3, [r0, #-24] 52a: 4b14 ldr r3, [pc, #80] ; (57c ) 52c: f840 3c10 str.w r3, [r0, #-16] 530: f007 fbdc bl 7cec File(FileImpl *file) { 534: 4b12 ldr r3, [pc, #72] ; (580 ) constexpr Stream() : _timeout(1000), read_error(0) {} 536: f44f 727a mov.w r2, #1000 ; 0x3e8 class FsFile : public StreamFile { 53a: 60a7 str r7, [r4, #8] 53c: 602b str r3, [r5, #0] if (f) f->refcount++; 53e: 6863 ldr r3, [r4, #4] 540: 65a6 str r6, [r4, #88] ; 0x58 542: 3301 adds r3, #1 constexpr Print() : write_error(0) {} 544: 606e str r6, [r5, #4] 546: 732e strb r6, [r5, #12] 548: 60aa str r2, [r5, #8] f = file; 54a: 612c str r4, [r5, #16] if (f) f->refcount++; 54c: 6063 str r3, [r4, #4] 54e: 4b0d ldr r3, [pc, #52] ; (584 ) ~FsBaseFile() {close();} 550: a804 add r0, sp, #16 552: 9300 str r3, [sp, #0] 554: f007 fc0c bl 7d70 } 558: 4628 mov r0, r5 55a: b015 add sp, #84 ; 0x54 55c: bdf0 pop {r4, r5, r6, r7, pc} bool isOpen() const {return m_fFile || m_xFile;} 55e: 9b13 ldr r3, [sp, #76] ; 0x4c 560: 2b00 cmp r3, #0 562: d1ce bne.n 502 constexpr File() : f(nullptr) { } 564: 4a06 ldr r2, [pc, #24] ; (580 ) 566: 732b strb r3, [r5, #12] 568: 602a str r2, [r5, #0] 56a: 612b str r3, [r5, #16] 56c: e9c5 3401 strd r3, r4, [r5, #4] 570: e7ed b.n 54e 572: bf00 nop 574: 200009dc .word 0x200009dc 578: 20000a00 .word 0x20000a00 57c: 20000a5c .word 0x20000a5c 580: 200009b0 .word 0x200009b0 584: 200008e0 .word 0x200008e0 00000588 : return m_fFile ? m_fFile->peek() : 588: 6d03 ldr r3, [r0, #80] ; 0x50 58a: b113 cbz r3, 592 58c: 4618 mov r0, r3 58e: f005 bc07 b.w 5da0 592: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->peek() : -1; 594: b108 cbz r0, 59a 596: f003 b925 b.w 37e4 } 59a: f04f 30ff mov.w r0, #4294967295 59e: 4770 bx lr 000005a0 ::peek()>: return m_fFile ? m_fFile->peek() : 5a0: 6c83 ldr r3, [r0, #72] ; 0x48 5a2: b113 cbz r3, 5aa ::peek()+0xa> 5a4: 4618 mov r0, r3 5a6: f005 bbfb b.w 5da0 5aa: 6cc0 ldr r0, [r0, #76] ; 0x4c m_xFile ? m_xFile->peek() : -1; 5ac: b108 cbz r0, 5b2 ::peek()+0x12> 5ae: f003 b919 b.w 37e4 } 5b2: f04f 30ff mov.w r0, #4294967295 5b6: 4770 bx lr 000005b8 : return m_fFile ? m_fFile->isDir() : 5b8: 6d03 ldr r3, [r0, #80] ; 0x50 5ba: b133 cbz r3, 5ca bool isDir() const {return m_attributes & FILE_ATTR_DIR;} 5bc: 781b ldrb r3, [r3, #0] 5be: f013 0f70 tst.w r3, #112 ; 0x70 5c2: bf14 ite ne 5c4: 2001 movne r0, #1 5c6: 2000 moveq r0, #0 5c8: 4770 bx lr 5ca: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->isDir() : false; 5cc: b130 cbz r0, 5dc 5ce: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 5d2: f013 0f50 tst.w r3, #80 ; 0x50 5d6: bf14 ite ne 5d8: 2001 movne r0, #1 5da: 2000 moveq r0, #0 } 5dc: 4770 bx lr 5de: bf00 nop 000005e0 : return m_fFile ? m_fFile->read(buf, count) : 5e0: 6d03 ldr r3, [r0, #80] ; 0x50 5e2: b113 cbz r3, 5ea 5e4: 4618 mov r0, r3 5e6: f005 bb07 b.w 5bf8 5ea: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->read(buf, count) : -1; 5ec: b108 cbz r0, 5f2 5ee: f003 b829 b.w 3644 } 5f2: f04f 30ff mov.w r0, #4294967295 5f6: 4770 bx lr 000005f8 ::read()>: return m_fFile ? m_fFile->read(buf, count) : 5f8: 6c83 ldr r3, [r0, #72] ; 0x48 int read() { 5fa: b500 push {lr} 5fc: b083 sub sp, #12 5fe: b163 cbz r3, 61a ::read()+0x22> 600: 2201 movs r2, #1 602: f10d 0107 add.w r1, sp, #7 606: 4618 mov r0, r3 608: f005 faf6 bl 5bf8 return read(&b, 1) == 1 ? b : -1; 60c: 2801 cmp r0, #1 60e: d10c bne.n 62a ::read()+0x32> 610: f89d 0007 ldrb.w r0, [sp, #7] } 614: b003 add sp, #12 616: f85d fb04 ldr.w pc, [sp], #4 61a: 6cc0 ldr r0, [r0, #76] ; 0x4c m_xFile ? m_xFile->read(buf, count) : -1; 61c: b128 cbz r0, 62a ::read()+0x32> 61e: 2201 movs r2, #1 620: f10d 0107 add.w r1, sp, #7 624: f003 f80e bl 3644 628: e7f0 b.n 60c ::read()+0x14> return read(&b, 1) == 1 ? b : -1; 62a: f04f 30ff mov.w r0, #4294967295 62e: e7f1 b.n 614 ::read()+0x1c> 00000630 ::flush()>: return m_fFile ? m_fFile->sync() : 630: 6c83 ldr r3, [r0, #72] ; 0x48 632: b113 cbz r3, 63a ::flush()+0xa> 634: 4618 mov r0, r3 636: f005 be57 b.w 62e8 63a: 6cc0 ldr r0, [r0, #76] ; 0x4c m_xFile ? m_xFile->sync() : false; 63c: b108 cbz r0, 642 ::flush()+0x12> 63e: f003 bd2f b.w 40a0 } 642: 4770 bx lr 00000644 : return m_fFile ? m_fFile->sync() : 644: 6d03 ldr r3, [r0, #80] ; 0x50 646: b113 cbz r3, 64e 648: 4618 mov r0, r3 64a: f005 be4d b.w 62e8 64e: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->sync() : false; 650: b108 cbz r0, 656 652: f003 bd25 b.w 40a0 } 656: 4770 bx lr 00000658 ::write(unsigned char const*, unsigned int)>: return m_fFile ? m_fFile->write(buf, count) : 658: 6c83 ldr r3, [r0, #72] ; 0x48 65a: b113 cbz r3, 662 ::write(unsigned char const*, unsigned int)+0xa> 65c: 4618 mov r0, r3 65e: f005 beef b.w 6440 662: 6cc0 ldr r0, [r0, #76] ; 0x4c m_xFile ? m_xFile->write(buf, count) : 0; 664: b108 cbz r0, 66a ::write(unsigned char const*, unsigned int)+0x12> 666: f003 bfbf b.w 45e8 * \return For success write() returns the number of bytes written, always * \a size. */ size_t write(const uint8_t* buffer, size_t size) { return BaseFile::write(buffer, size); } 66a: 4770 bx lr 0000066c : return m_fFile ? m_fFile->write(buf, count) : 66c: 6d03 ldr r3, [r0, #80] ; 0x50 66e: b113 cbz r3, 676 670: 4618 mov r0, r3 672: f005 bee5 b.w 6440 676: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->write(buf, count) : 0; 678: b108 cbz r0, 67e 67a: f003 bfb5 b.w 45e8 } 67e: 4770 bx lr 00000680 ::write(unsigned char)>: size_t write(uint8_t b) { 680: b500 push {lr} return m_fFile ? m_fFile->write(buf, count) : 682: 6c83 ldr r3, [r0, #72] ; 0x48 684: b083 sub sp, #12 686: f88d 1007 strb.w r1, [sp, #7] 68a: b143 cbz r3, 69e ::write(unsigned char)+0x1e> 68c: 2201 movs r2, #1 68e: f10d 0107 add.w r1, sp, #7 692: 4618 mov r0, r3 694: f005 fed4 bl 6440 } 698: b003 add sp, #12 69a: f85d fb04 ldr.w pc, [sp], #4 69e: 6cc0 ldr r0, [r0, #76] ; 0x4c m_xFile ? m_xFile->write(buf, count) : 0; 6a0: 2800 cmp r0, #0 6a2: d0f9 beq.n 698 ::write(unsigned char)+0x18> 6a4: 2201 movs r2, #1 6a6: f10d 0107 add.w r1, sp, #7 6aa: f003 ff9d bl 45e8 6ae: b003 add sp, #12 6b0: f85d fb04 ldr.w pc, [sp], #4 000006b4 : if (tm.year < 80 || tm.year > 207) return false; 6b4: 798a ldrb r2, [r1, #6] 6b6: f1a2 0350 sub.w r3, r2, #80 ; 0x50 6ba: 061b lsls r3, r3, #24 6bc: d422 bmi.n 704 return sdfatfile.timestamp(T_CREATE, tm.year + 1900, tm.mon + 1, 6be: f202 726c addw r2, r2, #1900 ; 0x76c virtual bool setCreateTime(const DateTimeFields &tm) { 6c2: b5f0 push {r4, r5, r6, r7, lr} return sdfatfile.timestamp(T_CREATE, tm.year + 1900, tm.mon + 1, 6c4: 794b ldrb r3, [r1, #5] virtual bool setCreateTime(const DateTimeFields &tm) { 6c6: b085 sub sp, #20 return m_fFile ? 6c8: 6d04 ldr r4, [r0, #80] ; 0x50 return sdfatfile.timestamp(T_CREATE, tm.year + 1900, tm.mon + 1, 6ca: 3301 adds r3, #1 tm.mday, tm.hour, tm.min, tm.sec); 6cc: 790d ldrb r5, [r1, #4] 6ce: 788e ldrb r6, [r1, #2] 6d0: 784f ldrb r7, [r1, #1] return sdfatfile.timestamp(T_CREATE, tm.year + 1900, tm.mon + 1, 6d2: b2db uxtb r3, r3 tm.mday, tm.hour, tm.min, tm.sec); 6d4: 7809 ldrb r1, [r1, #0] 6d6: b14c cbz r4, 6ec m_fFile->timestamp(flags, year, month, day, hour, minute, second) : 6d8: 4620 mov r0, r4 6da: 9601 str r6, [sp, #4] 6dc: 9500 str r5, [sp, #0] 6de: e9cd 7102 strd r7, r1, [sp, #8] 6e2: 2102 movs r1, #2 6e4: f005 fe06 bl 62f4 } 6e8: b005 add sp, #20 6ea: bdf0 pop {r4, r5, r6, r7, pc} 6ec: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? 6ee: 2800 cmp r0, #0 6f0: d0fa beq.n 6e8 m_xFile->timestamp(flags, year, month, day, hour, minute, second) : 6f2: 9601 str r6, [sp, #4] 6f4: 9500 str r5, [sp, #0] 6f6: e9cd 7102 strd r7, r1, [sp, #8] 6fa: 2102 movs r1, #2 6fc: f003 fe46 bl 438c 700: b005 add sp, #20 702: bdf0 pop {r4, r5, r6, r7, pc} if (tm.year < 80 || tm.year > 207) return false; 704: 2000 movs r0, #0 } 706: 4770 bx lr 00000708 ::available()>: return m_fFile ? m_fFile->available() : 708: 6c83 ldr r3, [r0, #72] ; 0x48 70a: b153 cbz r3, 722 ::available()+0x1a> return isFile() ? fileSize() - curPosition() : 0; 70c: 7818 ldrb r0, [r3, #0] 70e: f010 0008 ands.w r0, r0, #8 712: d00d beq.n 730 ::available()+0x28> 714: 69d8 ldr r0, [r3, #28] 716: 695b ldr r3, [r3, #20] return n > INT_MAX ? INT_MAX : n; 718: 1ac0 subs r0, r0, r3 71a: bf48 it mi 71c: f06f 4000 mvnmi.w r0, #2147483648 ; 0x80000000 720: 4770 bx lr 722: 6cc3 ldr r3, [r0, #76] ; 0x4c m_xFile ? m_xFile->available() : 0; 724: b1a3 cbz r3, 750 ::available()+0x48> return isFile() ? fileSize() - curPosition() : 0; 726: f893 0031 ldrb.w r0, [r3, #49] ; 0x31 72a: f010 0008 ands.w r0, r0, #8 72e: d100 bne.n 732 ::available()+0x2a> } 730: 4770 bx lr 732: 6918 ldr r0, [r3, #16] 734: 6819 ldr r1, [r3, #0] 736: 695a ldr r2, [r3, #20] 738: 1a40 subs r0, r0, r1 73a: 685b ldr r3, [r3, #4] 73c: eb62 0303 sbc.w r3, r2, r3 return n > INT_MAX ? INT_MAX : n; 740: f1b0 4f00 cmp.w r0, #2147483648 ; 0x80000000 744: f173 0300 sbcs.w r3, r3, #0 748: d3f2 bcc.n 730 ::available()+0x28> 74a: f06f 4000 mvn.w r0, #2147483648 ; 0x80000000 74e: 4770 bx lr 750: 4618 mov r0, r3 return BaseFile::available(); 752: e7ed b.n 730 ::available()+0x28> 00000754 : return m_fFile ? m_fFile->available() : 754: 6d03 ldr r3, [r0, #80] ; 0x50 756: b153 cbz r3, 76e return isFile() ? fileSize() - curPosition() : 0; 758: 7818 ldrb r0, [r3, #0] 75a: f010 0008 ands.w r0, r0, #8 75e: d00d beq.n 77c 760: 69d8 ldr r0, [r3, #28] 762: 695b ldr r3, [r3, #20] return n > INT_MAX ? INT_MAX : n; 764: 1ac0 subs r0, r0, r3 766: bf48 it mi 768: f06f 4000 mvnmi.w r0, #2147483648 ; 0x80000000 76c: 4770 bx lr 76e: 6d43 ldr r3, [r0, #84] ; 0x54 m_xFile ? m_xFile->available() : 0; 770: b1a3 cbz r3, 79c return isFile() ? fileSize() - curPosition() : 0; 772: f893 0031 ldrb.w r0, [r3, #49] ; 0x31 776: f010 0008 ands.w r0, r0, #8 77a: d100 bne.n 77e } 77c: 4770 bx lr 77e: 6918 ldr r0, [r3, #16] 780: 6819 ldr r1, [r3, #0] 782: 695a ldr r2, [r3, #20] 784: 1a40 subs r0, r0, r1 786: 685b ldr r3, [r3, #4] 788: eb62 0303 sbc.w r3, r2, r3 return n > INT_MAX ? INT_MAX : n; 78c: f1b0 4f00 cmp.w r0, #2147483648 ; 0x80000000 790: f173 0300 sbcs.w r3, r3, #0 794: d3f2 bcc.n 77c 796: f06f 4000 mvn.w r0, #2147483648 ; 0x80000000 79a: 4770 bx lr 79c: 4618 mov r0, r3 return sdfatfile.available(); 79e: e7ed b.n 77c 000007a0 : size_t write(uint8_t b) { 7a0: b500 push {lr} return (f) ? f->write(&b, 1) : 0; 7a2: 6900 ldr r0, [r0, #16] size_t write(uint8_t b) { 7a4: b083 sub sp, #12 7a6: f88d 1007 strb.w r1, [sp, #7] return (f) ? f->write(&b, 1) : 0; 7aa: b160 cbz r0, 7c6 7ac: 6803 ldr r3, [r0, #0] 7ae: 4a10 ldr r2, [pc, #64] ; (7f0 ) 7b0: 68db ldr r3, [r3, #12] 7b2: 4293 cmp r3, r2 7b4: d115 bne.n 7e2 return m_fFile ? m_fFile->write(buf, count) : 7b6: 6d03 ldr r3, [r0, #80] ; 0x50 7b8: b143 cbz r3, 7cc 7ba: 2201 movs r2, #1 7bc: f10d 0107 add.w r1, sp, #7 7c0: 4618 mov r0, r3 7c2: f005 fe3d bl 6440 } 7c6: b003 add sp, #12 7c8: f85d fb04 ldr.w pc, [sp], #4 7cc: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->write(buf, count) : 0; 7ce: 2800 cmp r0, #0 7d0: d0f9 beq.n 7c6 7d2: 2201 movs r2, #1 7d4: f10d 0107 add.w r1, sp, #7 7d8: f003 ff06 bl 45e8 7dc: b003 add sp, #12 7de: f85d fb04 ldr.w pc, [sp], #4 return (f) ? f->write(&b, 1) : 0; 7e2: 2201 movs r2, #1 7e4: f10d 0107 add.w r1, sp, #7 7e8: 4798 blx r3 } 7ea: b003 add sp, #12 7ec: f85d fb04 ldr.w pc, [sp], #4 7f0: 0000066d .word 0x0000066d 000007f4 : virtual ~SDFile(void) { 7f4: b538 push {r3, r4, r5, lr} 7f6: 4604 mov r4, r0 7f8: 4b0c ldr r3, [pc, #48] ; (82c ) if (filename) { 7fa: 6d80 ldr r0, [r0, #88] ; 0x58 virtual ~SDFile(void) { 7fc: 6023 str r3, [r4, #0] if (filename) { 7fe: b118 cbz r0, 808 free(filename); 800: f00c fe9c bl d53c filename = nullptr; 804: 2300 movs r3, #0 806: 65a3 str r3, [r4, #88] ; 0x58 bool isOpen() const {return m_fFile || m_xFile;} 808: 6d23 ldr r3, [r4, #80] ; 0x50 sdfatfile.close(); 80a: f104 0518 add.w r5, r4, #24 80e: b14b cbz r3, 824 810: 4628 mov r0, r5 812: f007 faad bl 7d70 class StreamFile : public stream_t, public BaseFile { 816: 4b06 ldr r3, [pc, #24] ; (830 ) ~FsBaseFile() {close();} 818: 4628 mov r0, r5 81a: 60a3 str r3, [r4, #8] 81c: f007 faa8 bl 7d70 } 820: 4620 mov r0, r4 822: bd38 pop {r3, r4, r5, pc} bool isOpen() const {return m_fFile || m_xFile;} 824: 6d63 ldr r3, [r4, #84] ; 0x54 826: 2b00 cmp r3, #0 828: d1f2 bne.n 810 82a: e7f4 b.n 816 82c: 20000a00 .word 0x20000a00 830: 200008e0 .word 0x200008e0 00000834 : virtual ~SDFile(void) { 834: b538 push {r3, r4, r5, lr} 836: 4604 mov r4, r0 838: 4b0e ldr r3, [pc, #56] ; (874 ) if (filename) { 83a: 6d80 ldr r0, [r0, #88] ; 0x58 virtual ~SDFile(void) { 83c: 6023 str r3, [r4, #0] if (filename) { 83e: b118 cbz r0, 848 free(filename); 840: f00c fe7c bl d53c filename = nullptr; 844: 2300 movs r3, #0 846: 65a3 str r3, [r4, #88] ; 0x58 848: 6d23 ldr r3, [r4, #80] ; 0x50 sdfatfile.close(); 84a: f104 0518 add.w r5, r4, #24 84e: b16b cbz r3, 86c 850: 4628 mov r0, r5 852: f007 fa8d bl 7d70 856: 4b08 ldr r3, [pc, #32] ; (878 ) ~FsBaseFile() {close();} 858: 4628 mov r0, r5 85a: 60a3 str r3, [r4, #8] 85c: f007 fa88 bl 7d70 } 860: 4620 mov r0, r4 862: 215c movs r1, #92 ; 0x5c 864: f00a fe36 bl b4d4 868: 4620 mov r0, r4 86a: bd38 pop {r3, r4, r5, pc} bool isOpen() const {return m_fFile || m_xFile;} 86c: 6d63 ldr r3, [r4, #84] ; 0x54 86e: 2b00 cmp r3, #0 870: d1ee bne.n 850 872: e7f0 b.n 856 874: 20000a00 .word 0x20000a00 878: 200008e0 .word 0x200008e0 0000087c : virtual bool seek(uint64_t pos, int mode = SeekSet) { 87c: b430 push {r4, r5} 87e: 9c02 ldr r4, [sp, #8] 880: 4611 mov r1, r2 882: 469c mov ip, r3 if (mode == SeekSet) return sdfatfile.seekSet(pos); 884: b134 cbz r4, 894 if (mode == SeekCur) return sdfatfile.seekCur(pos); 886: 2c01 cmp r4, #1 888: d01c beq.n 8c4 if (mode == SeekEnd) return sdfatfile.seekEnd(pos); 88a: 2c02 cmp r4, #2 88c: d00e beq.n 8ac } 88e: 2000 movs r0, #0 890: bc30 pop {r4, r5} 892: 4770 bx lr return m_fFile ? pos < (1ULL << 32) && m_fFile->seekSet(pos) : 894: 6d05 ldr r5, [r0, #80] ; 0x50 896: b1f5 cbz r5, 8d6 898: f04f 33ff mov.w r3, #4294967295 89c: 4293 cmp r3, r2 89e: eb74 040c sbcs.w r4, r4, ip 8a2: d3f4 bcc.n 88e 8a4: 4628 mov r0, r5 8a6: bc30 pop {r4, r5} 8a8: f005 bbee b.w 6088 return m_fFile ? m_fFile->fileSize() : 8ac: 6d02 ldr r2, [r0, #80] ; 0x50 8ae: b30a cbz r2, 8f4 8b0: 69d3 ldr r3, [r2, #28] return seekSet(fileSize() + offset); 8b2: 1859 adds r1, r3, r1 8b4: f14c 0300 adc.w r3, ip, #0 return m_fFile ? pos < (1ULL << 32) && m_fFile->seekSet(pos) : 8b8: 2b00 cmp r3, #0 8ba: d1e8 bne.n 88e 8bc: 4610 mov r0, r2 8be: bc30 pop {r4, r5} 8c0: f005 bbe2 b.w 6088 return m_fFile ? m_fFile->curPosition() : 8c4: 6d02 ldr r2, [r0, #80] ; 0x50 8c6: b162 cbz r2, 8e2 8c8: 6953 ldr r3, [r2, #20] return seekSet(curPosition() + offset); 8ca: 1859 adds r1, r3, r1 8cc: f14c 0300 adc.w r3, ip, #0 return m_fFile ? pos < (1ULL << 32) && m_fFile->seekSet(pos) : 8d0: 2b00 cmp r3, #0 8d2: d1dc bne.n 88e 8d4: e7f2 b.n 8bc 8d6: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->seekSet(pos) : false; 8d8: 2800 cmp r0, #0 8da: d0d8 beq.n 88e 8dc: bc30 pop {r4, r5} 8de: f002 bf97 b.w 3810 8e2: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->curPosition() : 0; 8e4: 2800 cmp r0, #0 8e6: d0d2 beq.n 88e return seekSet(curPosition() + offset); 8e8: e9d0 2300 ldrd r2, r3, [r0] 8ec: 188a adds r2, r1, r2 m_xFile ? m_xFile->seekSet(pos) : false; 8ee: eb4c 0303 adc.w r3, ip, r3 8f2: e7f3 b.n 8dc 8f4: 6d40 ldr r0, [r0, #84] ; 0x54 m_xFile ? m_xFile->fileSize() : 0; 8f6: 2800 cmp r0, #0 8f8: d0c9 beq.n 88e return seekSet(fileSize() + offset); 8fa: e9d0 2304 ldrd r2, r3, [r0, #16] 8fe: bc30 pop {r4, r5} 900: 188a adds r2, r1, r2 m_xFile ? m_xFile->seekSet(pos) : false; 902: eb4c 0303 adc.w r3, ip, r3 906: f002 bf83 b.w 3810 90a: bf00 nop 0000090c : virtual ~File() { 90c: b570 push {r4, r5, r6, lr} 90e: 4b24 ldr r3, [pc, #144] ; (9a0 ) 910: 4604 mov r4, r0 if (f) dec_refcount(); 912: 6905 ldr r5, [r0, #16] virtual ~File() { 914: 6003 str r3, [r0, #0] if (f) dec_refcount(); 916: 2d00 cmp r5, #0 918: d032 beq.n 980 size_t write(unsigned int n) { return write((uint8_t)n); } size_t write(int n) { return write((uint8_t)n); } using Print::write; private: void dec_refcount() { if (--(f->refcount) == 0) { 91a: 686e ldr r6, [r5, #4] 91c: 3e01 subs r6, #1 91e: 606e str r6, [r5, #4] 920: bb76 cbnz r6, 980 f->close(); 922: 682b ldr r3, [r5, #0] 924: 4a1f ldr r2, [pc, #124] ; (9a4 ) 926: 6adb ldr r3, [r3, #44] ; 0x2c 928: 4293 cmp r3, r2 92a: d12f bne.n 98c if (filename) { 92c: 6da8 ldr r0, [r5, #88] ; 0x58 92e: b110 cbz r0, 936 free(filename); 930: f00c fe04 bl d53c filename = nullptr; 934: 65ae str r6, [r5, #88] ; 0x58 bool isOpen() const {return m_fFile || m_xFile;} 936: 6d2b ldr r3, [r5, #80] ; 0x50 938: b323 cbz r3, 984 sdfatfile.close(); 93a: f105 0018 add.w r0, r5, #24 93e: f007 fa17 bl 7d70 delete f; 942: 6925 ldr r5, [r4, #16] 944: b1e5 cbz r5, 980 946: 682b ldr r3, [r5, #0] 948: 4a17 ldr r2, [pc, #92] ; (9a8 ) 94a: 685b ldr r3, [r3, #4] 94c: 4293 cmp r3, r2 94e: d124 bne.n 99a virtual ~SDFile(void) { 950: 4b16 ldr r3, [pc, #88] ; (9ac ) if (filename) { 952: 6da8 ldr r0, [r5, #88] ; 0x58 virtual ~SDFile(void) { 954: 602b str r3, [r5, #0] if (filename) { 956: b118 cbz r0, 960 free(filename); 958: f00c fdf0 bl d53c filename = nullptr; 95c: 2300 movs r3, #0 95e: 65ab str r3, [r5, #88] ; 0x58 960: 6d2b ldr r3, [r5, #80] ; 0x50 sdfatfile.close(); 962: f105 0618 add.w r6, r5, #24 966: b1a3 cbz r3, 992 968: 4630 mov r0, r6 96a: f007 fa01 bl 7d70 96e: 4b10 ldr r3, [pc, #64] ; (9b0 ) ~FsBaseFile() {close();} 970: 4630 mov r0, r6 972: 60ab str r3, [r5, #8] 974: f007 f9fc bl 7d70 } 978: 215c movs r1, #92 ; 0x5c 97a: 4628 mov r0, r5 97c: f00a fdaa bl b4d4 } 980: 4620 mov r0, r4 982: bd70 pop {r4, r5, r6, pc} bool isOpen() const {return m_fFile || m_xFile;} 984: 6d6b ldr r3, [r5, #84] ; 0x54 986: 2b00 cmp r3, #0 988: d1d7 bne.n 93a 98a: e7da b.n 942 f->close(); 98c: 4628 mov r0, r5 98e: 4798 blx r3 990: e7d7 b.n 942 992: 6d6b ldr r3, [r5, #84] ; 0x54 994: 2b00 cmp r3, #0 996: d1e7 bne.n 968 998: e7e9 b.n 96e delete f; 99a: 4628 mov r0, r5 99c: 4798 blx r3 99e: e7ef b.n 980 9a0: 200009b0 .word 0x200009b0 9a4: 00000121 .word 0x00000121 9a8: 00000835 .word 0x00000835 9ac: 20000a00 .word 0x20000a00 9b0: 200008e0 .word 0x200008e0 000009b4 : #include // github.com/PaulStoffregen/cores/blob/master/teensy4/Arduino.h #include // github.com/PaulStoffregen/cores/blob/master/teensy4/AudioStream.h #include // github.com/PaulStoffregen/SD/blob/Juse_Use_SdFat/src/SD.h class AudioPlaySdWav : public AudioStream 9b4: b570 push {r4, r5, r6, lr} 9b6: 4a25 ldr r2, [pc, #148] ; (a4c ) 9b8: 4604 mov r4, r0 virtual ~File() { 9ba: 4b25 ldr r3, [pc, #148] ; (a50 ) if (f) dec_refcount(); 9bc: 6a85 ldr r5, [r0, #40] ; 0x28 9be: 6002 str r2, [r0, #0] virtual ~File() { 9c0: 6183 str r3, [r0, #24] if (f) dec_refcount(); 9c2: 2d00 cmp r5, #0 9c4: d032 beq.n a2c if (--(f->refcount) == 0) { 9c6: 686e ldr r6, [r5, #4] 9c8: 3e01 subs r6, #1 9ca: 606e str r6, [r5, #4] 9cc: bb76 cbnz r6, a2c f->close(); 9ce: 682b ldr r3, [r5, #0] 9d0: 4a20 ldr r2, [pc, #128] ; (a54 ) 9d2: 6adb ldr r3, [r3, #44] ; 0x2c 9d4: 4293 cmp r3, r2 9d6: d12f bne.n a38 if (filename) { 9d8: 6da8 ldr r0, [r5, #88] ; 0x58 9da: b110 cbz r0, 9e2 free(filename); 9dc: f00c fdae bl d53c filename = nullptr; 9e0: 65ae str r6, [r5, #88] ; 0x58 9e2: 6d2b ldr r3, [r5, #80] ; 0x50 9e4: b323 cbz r3, a30 sdfatfile.close(); 9e6: f105 0018 add.w r0, r5, #24 9ea: f007 f9c1 bl 7d70 delete f; 9ee: 6aa5 ldr r5, [r4, #40] ; 0x28 9f0: b1e5 cbz r5, a2c 9f2: 682b ldr r3, [r5, #0] 9f4: 4a18 ldr r2, [pc, #96] ; (a58 ) 9f6: 685b ldr r3, [r3, #4] 9f8: 4293 cmp r3, r2 9fa: d124 bne.n a46 virtual ~SDFile(void) { 9fc: 4b17 ldr r3, [pc, #92] ; (a5c ) if (filename) { 9fe: 6da8 ldr r0, [r5, #88] ; 0x58 virtual ~SDFile(void) { a00: 602b str r3, [r5, #0] if (filename) { a02: b118 cbz r0, a0c free(filename); a04: f00c fd9a bl d53c filename = nullptr; a08: 2300 movs r3, #0 a0a: 65ab str r3, [r5, #88] ; 0x58 a0c: 6d2b ldr r3, [r5, #80] ; 0x50 sdfatfile.close(); a0e: f105 0618 add.w r6, r5, #24 a12: b1a3 cbz r3, a3e a14: 4630 mov r0, r6 a16: f007 f9ab bl 7d70 a1a: 4b11 ldr r3, [pc, #68] ; (a60 ) ~FsBaseFile() {close();} a1c: 4630 mov r0, r6 a1e: 60ab str r3, [r5, #8] a20: f007 f9a6 bl 7d70 } a24: 215c movs r1, #92 ; 0x5c a26: 4628 mov r0, r5 a28: f00a fd54 bl b4d4 a2c: 4620 mov r0, r4 a2e: bd70 pop {r4, r5, r6, pc} bool isOpen() const {return m_fFile || m_xFile;} a30: 6d6b ldr r3, [r5, #84] ; 0x54 a32: 2b00 cmp r3, #0 a34: d1d7 bne.n 9e6 a36: e7da b.n 9ee f->close(); a38: 4628 mov r0, r5 a3a: 4798 blx r3 a3c: e7d7 b.n 9ee a3e: 6d6b ldr r3, [r5, #84] ; 0x54 a40: 2b00 cmp r3, #0 a42: d1e7 bne.n a14 a44: e7e9 b.n a1a delete f; a46: 4628 mov r0, r5 a48: 4798 blx r3 a4a: e7ef b.n a2c a4c: 20000928 .word 0x20000928 a50: 200009b0 .word 0x200009b0 a54: 00000121 .word 0x00000121 a58: 00000835 .word 0x00000835 a5c: 20000a00 .word 0x20000a00 a60: 200008e0 .word 0x200008e0 00000a64 : virtual ~File() { a64: b570 push {r4, r5, r6, lr} a66: 4b26 ldr r3, [pc, #152] ; (b00 ) a68: 4604 mov r4, r0 if (f) dec_refcount(); a6a: 6905 ldr r5, [r0, #16] virtual ~File() { a6c: 6003 str r3, [r0, #0] if (f) dec_refcount(); a6e: 2d00 cmp r5, #0 a70: d032 beq.n ad8 if (--(f->refcount) == 0) { a72: 686e ldr r6, [r5, #4] a74: 3e01 subs r6, #1 a76: 606e str r6, [r5, #4] a78: bb76 cbnz r6, ad8 f->close(); a7a: 682b ldr r3, [r5, #0] a7c: 4a21 ldr r2, [pc, #132] ; (b04 ) a7e: 6adb ldr r3, [r3, #44] ; 0x2c a80: 4293 cmp r3, r2 a82: d133 bne.n aec if (filename) { a84: 6da8 ldr r0, [r5, #88] ; 0x58 a86: b110 cbz r0, a8e free(filename); a88: f00c fd58 bl d53c filename = nullptr; a8c: 65ae str r6, [r5, #88] ; 0x58 a8e: 6d2b ldr r3, [r5, #80] ; 0x50 a90: b343 cbz r3, ae4 sdfatfile.close(); a92: f105 0018 add.w r0, r5, #24 a96: f007 f96b bl 7d70 delete f; a9a: 6925 ldr r5, [r4, #16] a9c: b1e5 cbz r5, ad8 a9e: 682b ldr r3, [r5, #0] aa0: 4a19 ldr r2, [pc, #100] ; (b08 ) aa2: 685b ldr r3, [r3, #4] aa4: 4293 cmp r3, r2 aa6: d128 bne.n afa virtual ~SDFile(void) { aa8: 4b18 ldr r3, [pc, #96] ; (b0c ) if (filename) { aaa: 6da8 ldr r0, [r5, #88] ; 0x58 virtual ~SDFile(void) { aac: 602b str r3, [r5, #0] if (filename) { aae: b118 cbz r0, ab8 free(filename); ab0: f00c fd44 bl d53c filename = nullptr; ab4: 2300 movs r3, #0 ab6: 65ab str r3, [r5, #88] ; 0x58 ab8: 6d2b ldr r3, [r5, #80] ; 0x50 sdfatfile.close(); aba: f105 0618 add.w r6, r5, #24 abe: b1c3 cbz r3, af2 ac0: 4630 mov r0, r6 ac2: f007 f955 bl 7d70 ac6: 4b12 ldr r3, [pc, #72] ; (b10 ) ~FsBaseFile() {close();} ac8: 4630 mov r0, r6 aca: 60ab str r3, [r5, #8] acc: f007 f950 bl 7d70 } ad0: 215c movs r1, #92 ; 0x5c ad2: 4628 mov r0, r5 ad4: f00a fcfe bl b4d4 } ad8: 4620 mov r0, r4 ada: 2114 movs r1, #20 adc: f00a fcfa bl b4d4 ae0: 4620 mov r0, r4 ae2: bd70 pop {r4, r5, r6, pc} bool isOpen() const {return m_fFile || m_xFile;} ae4: 6d6b ldr r3, [r5, #84] ; 0x54 ae6: 2b00 cmp r3, #0 ae8: d1d3 bne.n a92 aea: e7d6 b.n a9a f->close(); aec: 4628 mov r0, r5 aee: 4798 blx r3 af0: e7d3 b.n a9a af2: 6d6b ldr r3, [r5, #84] ; 0x54 af4: 2b00 cmp r3, #0 af6: d1e3 bne.n ac0 af8: e7e5 b.n ac6 delete f; afa: 4628 mov r0, r5 afc: 4798 blx r3 afe: e7eb b.n ad8 b00: 200009b0 .word 0x200009b0 b04: 00000121 .word 0x00000121 b08: 00000835 .word 0x00000835 b0c: 20000a00 .word 0x20000a00 b10: 200008e0 .word 0x200008e0 00000b14 : #define AudioMemoryUsageMaxReset() (AudioStream::memory_used_max = AudioStream::memory_used) class AudioStream { public: AudioStream(unsigned char ninput, audio_block_t **iqueue) : b14: b510 push {r4, lr} num_inputs(ninput), inputQueue(iqueue) { active = false; b16: 2300 movs r3, #0 AudioStream(unsigned char ninput, audio_block_t **iqueue) : b18: 4604 mov r4, r0 b1a: 4610 mov r0, r2 num_inputs(ninput), inputQueue(iqueue) { b1c: 4a0d ldr r2, [pc, #52] ; (b54 ) b1e: 7261 strb r1, [r4, #9] active = false; b20: 7223 strb r3, [r4, #8] num_inputs(ninput), inputQueue(iqueue) { b22: 6022 str r2, [r4, #0] destination_list = NULL; b24: e9c4 3003 strd r3, r0, [r4, #12] for (int i=0; i < num_inputs; i++) { b28: b119 cbz r1, b32 inputQueue[i] = NULL; b2a: 008a lsls r2, r1, #2 b2c: 4619 mov r1, r3 b2e: f00c ffff bl db30 } // add to a simple list, for update_all // TODO: replace with a proper data flow analysis in update_all if (first_update == NULL) { b32: 4a09 ldr r2, [pc, #36] ; (b58 ) b34: 6813 ldr r3, [r2, #0] b36: b153 cbz r3, b4e first_update = this; } else { AudioStream *p; for (p=first_update; p->next_update; p = p->next_update) ; b38: 461a mov r2, r3 b3a: 695b ldr r3, [r3, #20] b3c: 2b00 cmp r3, #0 b3e: d1fb bne.n b38 p->next_update = this; b40: 6154 str r4, [r2, #20] } next_update = NULL; b42: 2300 movs r3, #0 cpu_cycles = 0; cpu_cycles_max = 0; numConnections = 0; } b44: 4620 mov r0, r4 next_update = NULL; b46: 6163 str r3, [r4, #20] cpu_cycles = 0; b48: 6063 str r3, [r4, #4] numConnections = 0; b4a: 72a3 strb r3, [r4, #10] } b4c: bd10 pop {r4, pc} first_update = this; b4e: 6014 str r4, [r2, #0] b50: e7f7 b.n b42 b52: bf00 nop b54: 20000910 .word 0x20000910 b58: 20002458 .word 0x20002458 00000b5c : destination_list = NULL; b5c: 2200 movs r2, #0 num_inputs(ninput), inputQueue(iqueue) { b5e: 4603 mov r3, r0 if (first_update == NULL) { b60: 4913 ldr r1, [pc, #76] ; (bb0 ) active = false; b62: f44f 6c80 mov.w ip, #1024 ; 0x400 class AudioMixer4 : public AudioStream { #if defined(__ARM_ARCH_7EM__) public: AudioMixer4(void) : AudioStream(4, inputQueueArray) { b66: b410 push {r4} num_inputs(ninput), inputQueue(iqueue) { b68: 4c12 ldr r4, [pc, #72] ; (bb4 ) b6a: f843 4b28 str.w r4, [r3], #40 active = false; b6e: f8a0 c008 strh.w ip, [r0, #8] destination_list = NULL; b72: e9c0 2303 strd r2, r3, [r0, #12] if (first_update == NULL) { b76: 680b ldr r3, [r1, #0] inputQueue[i] = NULL; b78: e9c0 220a strd r2, r2, [r0, #40] ; 0x28 b7c: e9c0 220c strd r2, r2, [r0, #48] ; 0x30 if (first_update == NULL) { b80: b19b cbz r3, baa for (p=first_update; p->next_update; p = p->next_update) ; b82: 461a mov r2, r3 b84: 695b ldr r3, [r3, #20] b86: 2b00 cmp r3, #0 b88: d1fb bne.n b82 p->next_update = this; b8a: 6150 str r0, [r2, #20] next_update = NULL; b8c: 2200 movs r2, #0 for (int i=0; i<4; i++) multiplier[i] = 65536; b8e: f44f 3380 mov.w r3, #65536 ; 0x10000 AudioMixer4(void) : AudioStream(4, inputQueueArray) { b92: 4909 ldr r1, [pc, #36] ; (bb8 ) } b94: f85d 4b04 ldr.w r4, [sp], #4 b98: 6142 str r2, [r0, #20] cpu_cycles = 0; b9a: 6042 str r2, [r0, #4] numConnections = 0; b9c: 7282 strb r2, [r0, #10] AudioMixer4(void) : AudioStream(4, inputQueueArray) { b9e: 6001 str r1, [r0, #0] for (int i=0; i<4; i++) multiplier[i] = 65536; ba0: e9c0 3306 strd r3, r3, [r0, #24] ba4: e9c0 3308 strd r3, r3, [r0, #32] } ba8: 4770 bx lr first_update = this; baa: 6008 str r0, [r1, #0] bac: e7ee b.n b8c bae: bf00 nop bb0: 20002458 .word 0x20002458 bb4: 20000910 .word 0x20000910 bb8: 20000904 .word 0x20000904 00000bbc : void startGreeting(bool withDtmf) { bbc: b530 push {r4, r5, lr} * \param[in] path Path of the file to be tested for. * * \return true if the file exists else false. */ bool exists(const char* path) { return m_fVol ? m_fVol->exists(path) : bbe: 4a18 ldr r2, [pc, #96] ; (c20 ) bc0: 4604 mov r4, r0 dtmfTrailing = withDtmf; bc2: 4d18 ldr r5, [pc, #96] ; (c24 ) dtmfBurst = 0; bc4: 2300 movs r3, #0 bc6: 4918 ldr r1, [pc, #96] ; (c28 ) void startGreeting(bool withDtmf) { bc8: b08f sub sp, #60 ; 0x3c dtmfTrailing = withDtmf; bca: 7028 strb r0, [r5, #0] bcc: f8d2 0484 ldr.w r0, [r2, #1156] ; 0x484 dtmfBurst = 0; bd0: 700b strb r3, [r1, #0] bd2: b190 cbz r0, bfa * * \return true if the file exists else false. */ bool exists(const char* path) { FatFile tmp; return tmp.open(this, path, O_RDONLY); bd4: 4601 mov r1, r0 bd6: 4a15 ldr r2, [pc, #84] ; (c2c ) bd8: 4668 mov r0, sp FatFile() {} bda: 9300 str r3, [sp, #0] bdc: f004 ffb8 bl 5b50 if (SD.exists(activeFile)) { be0: b9b8 cbnz r0, c12 state = withDtmf ? GAP : DONE; be2: 2c00 cmp r4, #0 be4: bf14 ite ne be6: 2302 movne r3, #2 be8: 2305 moveq r3, #5 bea: 4911 ldr r1, [pc, #68] ; (c30 ) state = PLAYING_GREETING; bec: 4811 ldr r0, [pc, #68] ; (c34 ) elapsedMillis(void) { ms = millis(); } elapsedMillis(unsigned long val) { ms = millis() - val; } elapsedMillis(const elapsedMillis &orig) { ms = orig.ms; } operator unsigned long () const { return millis() - ms; } elapsedMillis & operator = (const elapsedMillis &rhs) { ms = rhs.ms; return *this; } elapsedMillis & operator = (unsigned long val) { ms = millis() - val; return *this; } bee: 4a12 ldr r2, [pc, #72] ; (c38 ) bf0: 6809 ldr r1, [r1, #0] bf2: 7003 strb r3, [r0, #0] bf4: 6011 str r1, [r2, #0] } bf6: b00f add sp, #60 ; 0x3c bf8: bd30 pop {r4, r5, pc} bfa: f8d2 1488 ldr.w r1, [r2, #1160] ; 0x488 m_xVol ? m_xVol->exists(path) : false; bfe: 2900 cmp r1, #0 c00: d0ef beq.n be2 * * \return true if the file exists else false. */ bool exists(const char* path) { ExFatFile tmp; return tmp.open(this, path, O_RDONLY); c02: 4603 mov r3, r0 ExFatFile() {} c04: 900c str r0, [sp, #48] ; 0x30 c06: 4a09 ldr r2, [pc, #36] ; (c2c ) c08: 4668 mov r0, sp c0a: f003 f8bf bl 3d8c c0e: 2800 cmp r0, #0 c10: d0e7 beq.n be2 greeting.play(activeFile); c12: 4906 ldr r1, [pc, #24] ; (c2c ) c14: 4809 ldr r0, [pc, #36] ; (c3c ) c16: f001 f98f bl 1f38 state = PLAYING_GREETING; c1a: 2301 movs r3, #1 c1c: e7e5 b.n bea c1e: bf00 nop c20: 20001f40 .word 0x20001f40 c24: 2000153c .word 0x2000153c c28: 20002dff .word 0x20002dff c2c: 200014cc .word 0x200014cc c30: 20002d90 .word 0x20002d90 c34: 20002e06 .word 0x20002e06 c38: 20002d88 .word 0x20002d88 c3c: 2000297c .word 0x2000297c 00000c40 : dtmfOff(); state = IDLE; } // ---- File ops ---- void cmdSetActive() { c40: b5f0 push {r4, r5, r6, r7, lr} c42: 4c27 ldr r4, [pc, #156] ; (ce0 ) c44: b091 sub sp, #68 ; 0x44 size_t got = 0; c46: 2500 movs r5, #0 c48: 6826 ldr r6, [r4, #0] } } void end() { /* TODO: flush output and shut down USB port */ }; // Returns the number of bytes which have been received from your PC and // can be fetched using Serial.read() or Serial.readBytes(). virtual int available() { return usb_serial_available(); } c4a: f00c fb63 bl d314 if (Serial.available()) { c4e: b950 cbnz r0, c66 c50: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; c52: 1b9b subs r3, r3, r6 c54: f5b3 5ffa cmp.w r3, #8000 ; 0x1f40 c58: d9f7 bls.n c4a // the data across your USB cable. virtual void flush() { usb_serial_flush_output(); } // TODO: actually wait for data to leave USB... // Discard all received data which has not been read. virtual void clear(void) { usb_serial_flush_input(); } // Transmit a single byte to your PC virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } c5a: 2065 movs r0, #101 ; 0x65 uint8_t buf[64]; if (!readExact(buf, n)) { Serial.write('e'); return; } memcpy(activeFile, buf, n); activeFile[n] = '\0'; Serial.write('f'); } c5c: b011 add sp, #68 ; 0x44 c5e: e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} c62: f00c bb73 b.w d34c virtual int read() { return usb_serial_getchar(); } c66: f00c fb61 bl d32c if (c >= 0) buf[got++] = (uint8_t)c; c6a: f105 0340 add.w r3, r5, #64 ; 0x40 c6e: 2800 cmp r0, #0 c70: eb0d 0203 add.w r2, sp, r3 c74: f105 0301 add.w r3, r5, #1 c78: dbe7 blt.n c4a while (got < n) { c7a: 2d01 cmp r5, #1 if (c >= 0) buf[got++] = (uint8_t)c; c7c: f802 0c40 strb.w r0, [r2, #-64] c80: 461d mov r5, r3 while (got < n) { c82: d1e2 bne.n c4a return (uint16_t)b[0] | ((uint16_t)b[1] << 8); c84: f8bd 6000 ldrh.w r6, [sp] if (n == 0 || n >= sizeof(activeFile)) { c88: 1e73 subs r3, r6, #1 c8a: 2b3e cmp r3, #62 ; 0x3e c8c: d8e5 bhi.n c5a c8e: 6827 ldr r7, [r4, #0] size_t got = 0; c90: 2500 movs r5, #0 c92: e006 b.n ca2 c94: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; c96: 1bdb subs r3, r3, r7 c98: f5b3 5ffa cmp.w r3, #8000 ; 0x1f40 c9c: d8dd bhi.n c5a while (got < n) { c9e: 42ae cmp r6, r5 ca0: d90f bls.n cc2 virtual int available() { return usb_serial_available(); } ca2: f00c fb37 bl d314 if (Serial.available()) { ca6: 2800 cmp r0, #0 ca8: d0f4 beq.n c94 virtual int read() { return usb_serial_getchar(); } caa: f00c fb3f bl d32c if (c >= 0) buf[got++] = (uint8_t)c; cae: f105 0340 add.w r3, r5, #64 ; 0x40 cb2: 2800 cmp r0, #0 cb4: 446b add r3, sp cb6: dbf2 blt.n c9e cb8: 3501 adds r5, #1 cba: f803 0c40 strb.w r0, [r3, #-64] while (got < n) { cbe: 42ae cmp r6, r5 cc0: d8ef bhi.n ca2 memcpy(activeFile, buf, n); cc2: 4b08 ldr r3, [pc, #32] ; (ce4 ) cc4: 4632 mov r2, r6 cc6: 4669 mov r1, sp cc8: 4618 mov r0, r3 cca: f00a fb67 bl b39c activeFile[n] = '\0'; cce: 2200 movs r2, #0 memcpy(activeFile, buf, n); cd0: 4603 mov r3, r0 virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } cd2: 2066 movs r0, #102 ; 0x66 activeFile[n] = '\0'; cd4: 559a strb r2, [r3, r6] } cd6: b011 add sp, #68 ; 0x44 cd8: e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} cdc: f00c bb36 b.w d34c ce0: 20002d90 .word 0x20002d90 ce4: 200014cc .word 0x200014cc 00000ce8 : void cmdSetDigit() { ce8: b538 push {r3, r4, r5, lr} cea: 4c15 ldr r4, [pc, #84] ; (d40 ) cec: 6825 ldr r5, [r4, #0] virtual int available() { return usb_serial_available(); } cee: f00c fb11 bl d314 if (Serial.available()) { cf2: b940 cbnz r0, d06 cf4: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; cf6: 1b5b subs r3, r3, r5 cf8: f5b3 7f7a cmp.w r3, #1000 ; 0x3e8 cfc: d80d bhi.n d1a cfe: f00c fb09 bl d314 if (Serial.available()) { d02: 2800 cmp r0, #0 d04: d0f6 beq.n cf4 virtual int read() { return usb_serial_getchar(); } d06: f00c fb11 bl d32c if (c >= 0) buf[got++] = (uint8_t)c; d0a: 2800 cmp r0, #0 d0c: dbef blt.n cee d0e: b2c0 uxtb r0, r0 uint8_t b[1]; if (!readExact(b, 1, 1000)) { Serial.write('e'); return; } char d = (char)b[0]; bool ok = (d >= '0' && d <= '9') || d == '*' || d == '#'; d10: f1a0 0323 sub.w r3, r0, #35 ; 0x23 d14: b2db uxtb r3, r3 d16: 2b16 cmp r3, #22 d18: d904 bls.n d24 virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } d1a: 2065 movs r0, #101 ; 0x65 if (!ok) { Serial.write('e'); return; } activeDigit = d; applyActiveDigit(); Serial.write('d'); } d1c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} d20: f00c bb14 b.w d34c bool ok = (d >= '0' && d <= '9') || d == '*' || d == '#'; d24: 4a07 ldr r2, [pc, #28] ; (d44 ) d26: fa42 f303 asr.w r3, r2, r3 d2a: 07db lsls r3, r3, #31 d2c: d4f5 bmi.n d1a activeDigit = d; d2e: 4b06 ldr r3, [pc, #24] ; (d48 ) d30: 7018 strb r0, [r3, #0] applyActiveDigit(); d32: f7ff f9a7 bl 84 d36: 2064 movs r0, #100 ; 0x64 } d38: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} d3c: f00c bb06 b.w d34c d40: 20002d90 .word 0x20002d90 d44: ff801f7e .word 0xff801f7e d48: 2000153b .word 0x2000153b 00000d4c : void cmdSetVolume() { d4c: b538 push {r3, r4, r5, lr} d4e: 4c22 ldr r4, [pc, #136] ; (dd8 ) d50: 6825 ldr r5, [r4, #0] virtual int available() { return usb_serial_available(); } d52: f00c fadf bl d314 if (Serial.available()) { d56: b948 cbnz r0, d6c d58: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; d5a: 1b5b subs r3, r3, r5 d5c: f5b3 7f7a cmp.w r3, #1000 ; 0x3e8 d60: d9f7 bls.n d52 virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } d62: 2065 movs r0, #101 ; 0x65 uint8_t b[1]; if (!readExact(b, 1, 1000)) { Serial.write('e'); return; } greetingVolume = (float)b[0] / 255.0f; applyGreetingVolume(); Serial.write('v'); } d64: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} d68: f00c baf0 b.w d34c virtual int read() { return usb_serial_getchar(); } d6c: f00c fade bl d32c if (c >= 0) buf[got++] = (uint8_t)c; d70: 2800 cmp r0, #0 d72: dbee blt.n d52 greetingVolume = (float)b[0] / 255.0f; d74: b2c0 uxtb r0, r0 d76: ed9f 6a19 vldr s12, [pc, #100] ; ddc virtual void update(void); void gain(unsigned int channel, float gain) { if (channel >= 4) return; if (gain > 32767.0f) gain = 32767.0f; d7a: eddf 6a19 vldr s13, [pc, #100] ; de0 d7e: ee07 0a90 vmov s15, r0 d82: eef8 7a67 vcvt.f32.u32 s15, s15 d86: ee87 7a86 vdiv.f32 s14, s15, s12 d8a: eeb4 7ae6 vcmpe.f32 s14, s13 d8e: eef1 fa10 vmrs APSR_nzcv, fpscr d92: dc09 bgt.n da8 else if (gain < -32767.0f) gain = -32767.0f; d94: eddf 7a13 vldr s15, [pc, #76] ; de4 d98: eeb4 7ae7 vcmpe.f32 s14, s15 d9c: eef1 fa10 vmrs APSR_nzcv, fpscr da0: d510 bpl.n dc4 da2: 4b11 ldr r3, [pc, #68] ; (de8 ) da4: 461a mov r2, r3 da6: e001 b.n dac da8: 4b10 ldr r3, [pc, #64] ; (dec ) daa: 461a mov r2, r3 dac: 4810 ldr r0, [pc, #64] ; (df0 ) multiplier[channel] = gain * 65536.0f; // TODO: proper roundoff? dae: 4c11 ldr r4, [pc, #68] ; (df4 ) db0: 4911 ldr r1, [pc, #68] ; (df8 ) db2: ed80 7a00 vstr s14, [r0] virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } db6: 2076 movs r0, #118 ; 0x76 db8: 61a3 str r3, [r4, #24] dba: 618a str r2, [r1, #24] } dbc: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} dc0: f00c bac4 b.w d34c dc4: eef0 7a47 vmov.f32 s15, s14 dc8: eefe 7ac8 vcvt.s32.f32 s15, s15, #16 dcc: ee17 3a90 vmov r3, s15 else if (gain < -32767.0f) gain = -32767.0f; dd0: d5eb bpl.n daa dd2: 4a05 ldr r2, [pc, #20] ; (de8 ) dd4: e7ea b.n dac dd6: bf00 nop dd8: 20002d90 .word 0x20002d90 ddc: 437f0000 .word 0x437f0000 de0: 46fffe00 .word 0x46fffe00 de4: c6fffe00 .word 0xc6fffe00 de8: 80010000 .word 0x80010000 dec: 7fff0000 .word 0x7fff0000 df0: 20001520 .word 0x20001520 df4: 20002bf0 .word 0x20002bf0 df8: 20002c28 .word 0x20002c28 00000dfc : void cmdWriteFile() { dfc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} e00: 4cc1 ldr r4, [pc, #772] ; (1108 ) size_t got = 0; e02: 2500 movs r5, #0 void cmdWriteFile() { e04: ed2d 8b02 vpush {d8} e08: f5ad 7d13 sub.w sp, sp, #588 ; 0x24c e0c: 6826 ldr r6, [r4, #0] if (c >= 0) buf[got++] = (uint8_t)c; e0e: f10d 0948 add.w r9, sp, #72 ; 0x48 virtual int available() { return usb_serial_available(); } e12: f00c fa7f bl d314 if (Serial.available()) { e16: b968 cbnz r0, e34 e18: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; e1a: 1b9b subs r3, r3, r6 e1c: f5b3 5ffa cmp.w r3, #8000 ; 0x1f40 e20: d9f7 bls.n e12 virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } e22: 2045 movs r0, #69 ; 0x45 e24: f00c fa92 bl d34c remaining -= take; if (millis() - start > 60000) { f.close(); Serial.write('E'); return; } } f.close(); Serial.write('D'); } e28: f50d 7d13 add.w sp, sp, #588 ; 0x24c e2c: ecbd 8b02 vpop {d8} e30: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} virtual int read() { return usb_serial_getchar(); } e34: f00c fa7a bl d32c if (c >= 0) buf[got++] = (uint8_t)c; e38: 2800 cmp r0, #0 e3a: f105 0301 add.w r3, r5, #1 e3e: dbe8 blt.n e12 while (got < n) { e40: 2d01 cmp r5, #1 if (c >= 0) buf[got++] = (uint8_t)c; e42: f809 0005 strb.w r0, [r9, r5] e46: 461d mov r5, r3 while (got < n) { e48: d1e3 bne.n e12 return (uint16_t)b[0] | ((uint16_t)b[1] << 8); e4a: f8b9 6000 ldrh.w r6, [r9] if (n == 0 || n >= 64) { Serial.write('E'); return; } e4e: 1e73 subs r3, r6, #1 e50: 2b3e cmp r3, #62 ; 0x3e e52: d8e6 bhi.n e22 e54: 6827 ldr r7, [r4, #0] size_t got = 0; e56: 2500 movs r5, #0 e58: e006 b.n e68 e5a: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; e5c: 1bdb subs r3, r3, r7 e5e: f5b3 5ffa cmp.w r3, #8000 ; 0x1f40 e62: d8de bhi.n e22 while (got < n) { e64: 42ae cmp r6, r5 e66: d90c bls.n e82 virtual int available() { return usb_serial_available(); } e68: f00c fa54 bl d314 if (Serial.available()) { e6c: 2800 cmp r0, #0 e6e: d0f4 beq.n e5a virtual int read() { return usb_serial_getchar(); } e70: f00c fa5c bl d32c if (c >= 0) buf[got++] = (uint8_t)c; e74: 2800 cmp r0, #0 e76: dbf5 blt.n e64 e78: ab02 add r3, sp, #8 e7a: 5558 strb r0, [r3, r5] e7c: 3501 adds r5, #1 while (got < n) { e7e: 42ae cmp r6, r5 e80: d8f2 bhi.n e68 nameBuf[n] = '\0'; e82: 2500 movs r5, #0 e84: ab02 add r3, sp, #8 e86: 559d strb r5, [r3, r6] e88: 6826 ldr r6, [r4, #0] while (got < n) { e8a: e006 b.n e9a e8c: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; e8e: 1b9b subs r3, r3, r6 e90: f5b3 5ffa cmp.w r3, #8000 ; 0x1f40 e94: d8c5 bhi.n e22 while (got < n) { e96: 2d04 cmp r5, #4 e98: d00c beq.n eb4 virtual int available() { return usb_serial_available(); } e9a: f00c fa3b bl d314 if (Serial.available()) { e9e: 2800 cmp r0, #0 ea0: d0f4 beq.n e8c virtual int read() { return usb_serial_getchar(); } ea2: f00c fa43 bl d32c if (c >= 0) buf[got++] = (uint8_t)c; ea6: 2800 cmp r0, #0 ea8: dbf5 blt.n e96 eaa: f809 0005 strb.w r0, [r9, r5] eae: 3501 adds r5, #1 while (got < n) { eb0: 2d04 cmp r5, #4 eb2: d1f2 bne.n e9a | ((uint32_t)b[3] << 24); eb4: f8d9 b000 ldr.w fp, [r9] if (size == 0 || size > 16UL * 1024UL * 1024UL) { // 16 MB cap eb8: f10b 33ff add.w r3, fp, #4294967295 ebc: f1b3 7f80 cmp.w r3, #16777216 ; 0x1000000 ec0: d2af bcs.n e22 return m_fVol ? m_fVol->exists(path) : ec2: 4d92 ldr r5, [pc, #584] ; (110c ) ec4: f8d5 3484 ldr.w r3, [r5, #1156] ; 0x484 ec8: 2b00 cmp r3, #0 eca: f000 80f1 beq.w 10b0 ece: 4619 mov r1, r3 ed0: 2300 movs r3, #0 ed2: aa02 add r2, sp, #8 ed4: 4648 mov r0, r9 ed6: f8c9 3000 str.w r3, [r9] eda: f004 fe39 bl 5b50 if (SD.exists((char*)nameBuf)) SD.remove((char*)nameBuf); ede: 2800 cmp r0, #0 ee0: f040 80f4 bne.w 10cc bool begin(uint8_t csPin = 10); File open(const char *filepath, uint8_t mode = FILE_READ) { oflag_t flags = O_READ; if (mode == FILE_WRITE) flags = O_RDWR | O_CREAT | O_AT_END; else if (mode == FILE_WRITE_BEGIN) flags = O_RDWR | O_CREAT; SDFAT_FILE file = sdfs.open(filepath, flags); ee4: f244 2302 movw r3, #16898 ; 0x4202 ee8: aa02 add r2, sp, #8 eea: 4989 ldr r1, [pc, #548] ; (1110 ) eec: 4648 mov r0, r9 eee: f007 f859 bl 7fa4 ef2: f8d9 3048 ldr.w r3, [r9, #72] ; 0x48 ef6: 2b00 cmp r3, #0 ef8: f000 8121 beq.w 113e if (file) return File(new SDFile(file)); efc: 205c movs r0, #92 ; 0x5c class FileImpl { efe: 2500 movs r5, #0 f00: f00a fae6 bl b4d0 class Print f04: f8d9 3004 ldr.w r3, [r9, #4] f08: 4682 mov sl, r0 f0a: 6045 str r5, [r0, #4] f0c: 3018 adds r0, #24 f0e: a916 add r1, sp, #88 ; 0x58 f10: f8ca 300c str.w r3, [sl, #12] class Stream : public Print f14: f8d9 3008 ldr.w r3, [r9, #8] f18: ee08 0a10 vmov s16, r0 f1c: f8ca 3010 str.w r3, [sl, #16] f20: f899 300c ldrb.w r3, [r9, #12] f24: f88a 3014 strb.w r3, [sl, #20] SDFile(const SDFAT_FILE &file) : sdfatfile(file), filename(nullptr) { } f28: 4b7a ldr r3, [pc, #488] ; (1114 ) f2a: f8ca 3000 str.w r3, [sl] f2e: 4b7a ldr r3, [pc, #488] ; (1118 ) f30: f8ca 3008 str.w r3, [sl, #8] f34: f006 feda bl 7cec if (f) f->refcount++; f38: f8da 3004 ldr.w r3, [sl, #4] ~FsBaseFile() {close();} f3c: a816 add r0, sp, #88 ; 0x58 f3e: f8ca 5058 str.w r5, [sl, #88] ; 0x58 f42: 3301 adds r3, #1 f44: f8ca 3004 str.w r3, [sl, #4] class FsFile : public StreamFile { f48: 4b74 ldr r3, [pc, #464] ; (111c ) f4a: f8ca 3008 str.w r3, [sl, #8] f4e: 4b74 ldr r3, [pc, #464] ; (1120 ) f50: f8c9 3000 str.w r3, [r9] ~FsBaseFile() {close();} f54: f006 ff0c bl 7d70 return (f) ? f->isOpen() : false; f58: f8da 3000 ldr.w r3, [sl] f5c: 4a71 ldr r2, [pc, #452] ; (1124 ) f5e: 6b1b ldr r3, [r3, #48] ; 0x30 f60: 4293 cmp r3, r2 f62: f040 815a bne.w 121a bool isOpen() const {return m_fFile || m_xFile;} f66: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 f6a: 2b00 cmp r3, #0 f6c: f000 80f3 beq.w 1156 f70: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; f72: f643 2898 movw r8, #15000 ; 0x3a98 f76: 9301 str r3, [sp, #4] uint32_t take = remaining > sizeof(chunk) ? sizeof(chunk) : remaining; f78: f5bb 7f00 cmp.w fp, #512 ; 0x200 f7c: 465e mov r6, fp f7e: 6827 ldr r7, [r4, #0] size_t got = 0; f80: f04f 0500 mov.w r5, #0 uint32_t take = remaining > sizeof(chunk) ? sizeof(chunk) : remaining; f84: bf28 it cs f86: f44f 7600 movcs.w r6, #512 ; 0x200 while (got < n) { f8a: e006 b.n f9a f8c: 6823 ldr r3, [r4, #0] if (millis() - start > timeoutMs) return false; f8e: 1bdb subs r3, r3, r7 f90: 4543 cmp r3, r8 f92: f200 819e bhi.w 12d2 while (got < n) { f96: 42ae cmp r6, r5 f98: d90c bls.n fb4 virtual int available() { return usb_serial_available(); } f9a: f00c f9bb bl d314 if (Serial.available()) { f9e: 2800 cmp r0, #0 fa0: d0f4 beq.n f8c virtual int read() { return usb_serial_getchar(); } fa2: f00c f9c3 bl d32c if (c >= 0) buf[got++] = (uint8_t)c; fa6: 2800 cmp r0, #0 fa8: dbf5 blt.n f96 faa: f809 0005 strb.w r0, [r9, r5] fae: 3501 adds r5, #1 while (got < n) { fb0: 42ae cmp r6, r5 fb2: d8f2 bhi.n f9a return (f) ? f->write((void*)buf, size) : 0; fb4: f8da 2000 ldr.w r2, [sl] fb8: 495b ldr r1, [pc, #364] ; (1128 ) fba: 68d3 ldr r3, [r2, #12] fbc: 428b cmp r3, r1 fbe: f040 80b9 bne.w 1134 return m_fFile ? m_fFile->write(buf, count) : fc2: f8da 0050 ldr.w r0, [sl, #80] ; 0x50 fc6: 2800 cmp r0, #0 fc8: f000 8094 beq.w 10f4 fcc: 4632 mov r2, r6 fce: 4649 mov r1, r9 fd0: f005 fa36 bl 6440 if (f.write(chunk, take) != (int)take) { f.close(); Serial.write('E'); return; } fd4: 4286 cmp r6, r0 fd6: f040 8125 bne.w 1224 if (millis() - start > 60000) { f.close(); Serial.write('E'); return; } fda: 9a01 ldr r2, [sp, #4] remaining -= take; fdc: ebab 0b06 sub.w fp, fp, r6 fe0: 6823 ldr r3, [r4, #0] if (millis() - start > 60000) { f.close(); Serial.write('E'); return; } fe2: 1a9b subs r3, r3, r2 fe4: f64e 2260 movw r2, #60000 ; 0xea60 fe8: 4293 cmp r3, r2 fea: f200 8183 bhi.w 12f4 while (remaining > 0) { fee: f1bb 0f00 cmp.w fp, #0 ff2: d1c1 bne.n f78 f->close(); ff4: f8da 3000 ldr.w r3, [sl] ff8: 4c4c ldr r4, [pc, #304] ; (112c ) ffa: 6adb ldr r3, [r3, #44] ; 0x2c ffc: 42a3 cmp r3, r4 ffe: f040 819e bne.w 133e if (filename) { 1002: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 1006: b118 cbz r0, 1010 free(filename); 1008: f00c fa98 bl d53c filename = nullptr; 100c: f8ca b058 str.w fp, [sl, #88] ; 0x58 bool isOpen() const {return m_fFile || m_xFile;} 1010: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 1014: 2b00 cmp r3, #0 1016: f000 818c beq.w 1332 sdfatfile.close(); 101a: ee18 0a10 vmov r0, s16 101e: f006 fea7 bl 7d70 if (--(f->refcount) == 0) { 1022: f8da 5004 ldr.w r5, [sl, #4] 1026: 3d01 subs r5, #1 1028: f8ca 5004 str.w r5, [sl, #4] 102c: 2d00 cmp r5, #0 102e: d13b bne.n 10a8 f->close(); 1030: f8da 3000 ldr.w r3, [sl] 1034: 6adb ldr r3, [r3, #44] ; 0x2c 1036: 42a3 cmp r3, r4 1038: f040 819e bne.w 1378 if (filename) { 103c: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 1040: b118 cbz r0, 104a free(filename); 1042: f00c fa7b bl d53c filename = nullptr; 1046: f8ca 5058 str.w r5, [sl, #88] ; 0x58 104a: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 104e: 2b00 cmp r3, #0 1050: f000 818c beq.w 136c sdfatfile.close(); 1054: ee18 0a10 vmov r0, s16 1058: f006 fe8a bl 7d70 delete f; 105c: f8da 3000 ldr.w r3, [sl] 1060: 4a33 ldr r2, [pc, #204] ; (1130 ) 1062: 685b ldr r3, [r3, #4] 1064: 4293 cmp r3, r2 1066: f040 8190 bne.w 138a virtual ~SDFile(void) { 106a: 4b2a ldr r3, [pc, #168] ; (1114 ) if (filename) { 106c: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 virtual ~SDFile(void) { 1070: f8ca 3000 str.w r3, [sl] if (filename) { 1074: b120 cbz r0, 1080 free(filename); 1076: f00c fa61 bl d53c filename = nullptr; 107a: 2300 movs r3, #0 107c: f8ca 3058 str.w r3, [sl, #88] ; 0x58 1080: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 1084: 2b00 cmp r3, #0 1086: f000 817a beq.w 137e sdfatfile.close(); 108a: ee18 0a10 vmov r0, s16 108e: f006 fe6f bl 7d70 1092: 4b23 ldr r3, [pc, #140] ; (1120 ) ~FsBaseFile() {close();} 1094: ee18 0a10 vmov r0, s16 1098: f8ca 3008 str.w r3, [sl, #8] 109c: f006 fe68 bl 7d70 } 10a0: 215c movs r1, #92 ; 0x5c 10a2: 4650 mov r0, sl 10a4: f00a fa16 bl b4d4 virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } 10a8: 2044 movs r0, #68 ; 0x44 10aa: f00c f94f bl d34c if (f) dec_refcount(); 10ae: e6bb b.n e28 10b0: f8d5 1488 ldr.w r1, [r5, #1160] ; 0x488 m_xVol ? m_xVol->exists(path) : false; 10b4: 2900 cmp r1, #0 10b6: f43f af15 beq.w ee4 10ba: aa02 add r2, sp, #8 10bc: 4648 mov r0, r9 10be: f8c9 3030 str.w r3, [r9, #48] ; 0x30 10c2: f002 fe63 bl 3d8c 10c6: 2800 cmp r0, #0 10c8: f43f af0c beq.w ee4 * \param[in] path A path with a valid 8.3 DOS name for the file. * * \return true for success or false for failure. */ bool remove(const char *path) { return m_fVol ? m_fVol->remove(path) : 10cc: f8d5 1484 ldr.w r1, [r5, #1156] ; 0x484 10d0: 2900 cmp r1, #0 10d2: f000 808e beq.w 11f2 10d6: 2300 movs r3, #0 * * \return true for success or false for failure. */ bool remove(const char* path) { FatFile tmp; return tmp.open(this, path, O_WRONLY) && tmp.remove(); 10d8: aa02 add r2, sp, #8 10da: 4648 mov r0, r9 10dc: f8c9 3000 str.w r3, [r9] 10e0: 2301 movs r3, #1 10e2: f004 fd35 bl 5b50 10e6: 2800 cmp r0, #0 10e8: f43f aefc beq.w ee4 10ec: 4648 mov r0, r9 10ee: f005 fe35 bl 6d5c 10f2: e6f7 b.n ee4 10f4: f8da 0054 ldr.w r0, [sl, #84] ; 0x54 m_xFile ? m_xFile->write(buf, count) : 0; 10f8: 2800 cmp r0, #0 10fa: f000 8095 beq.w 1228 10fe: 4632 mov r2, r6 1100: 4649 mov r1, r9 1102: f003 fa71 bl 45e8 1106: e765 b.n fd4 1108: 20002d90 .word 0x20002d90 110c: 20001f40 .word 0x20001f40 1110: 20001f44 .word 0x20001f44 1114: 20000a00 .word 0x20000a00 1118: 20000a5c .word 0x20000a5c 111c: 200009dc .word 0x200009dc 1120: 200008e0 .word 0x200008e0 1124: 00000071 .word 0x00000071 1128: 0000066d .word 0x0000066d 112c: 00000121 .word 0x00000121 1130: 00000835 .word 0x00000835 return (f) ? f->write((void*)buf, size) : 0; 1134: 4632 mov r2, r6 1136: 4649 mov r1, r9 1138: 4650 mov r0, sl 113a: 4798 blx r3 113c: e74a b.n fd4 bool isOpen() const {return m_fFile || m_xFile;} 113e: f8d9 304c ldr.w r3, [r9, #76] ; 0x4c 1142: 2b00 cmp r3, #0 1144: f47f aeda bne.w efc 1148: 4b91 ldr r3, [pc, #580] ; (1390 ) ~FsBaseFile() {close();} 114a: a816 add r0, sp, #88 ; 0x58 114c: f8c9 3000 str.w r3, [r9] 1150: f006 fe0e bl 7d70 1154: e665 b.n e22 bool isOpen() const {return m_fFile || m_xFile;} 1156: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 115a: 2b00 cmp r3, #0 115c: f47f af08 bne.w f70 1160: 2045 movs r0, #69 ; 0x45 1162: f00c f8f3 bl d34c if (--(f->refcount) == 0) { 1166: f8da 4004 ldr.w r4, [sl, #4] 116a: 3c01 subs r4, #1 116c: f8ca 4004 str.w r4, [sl, #4] 1170: 2c00 cmp r4, #0 1172: f47f ae59 bne.w e28 f->close(); 1176: f8da 3000 ldr.w r3, [sl] 117a: 4a86 ldr r2, [pc, #536] ; (1394 ) 117c: 6adb ldr r3, [r3, #44] ; 0x2c 117e: 4293 cmp r3, r2 1180: f040 80d4 bne.w 132c if (filename) { 1184: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 1188: b118 cbz r0, 1192 free(filename); 118a: f00c f9d7 bl d53c filename = nullptr; 118e: f8ca 4058 str.w r4, [sl, #88] ; 0x58 1192: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 1196: 2b00 cmp r3, #0 1198: f000 80bf beq.w 131a sdfatfile.close(); 119c: ee18 0a10 vmov r0, s16 11a0: f006 fde6 bl 7d70 delete f; 11a4: f8da 3000 ldr.w r3, [sl] 11a8: 4a7b ldr r2, [pc, #492] ; (1398 ) 11aa: 685b ldr r3, [r3, #4] 11ac: 4293 cmp r3, r2 11ae: f040 80cc bne.w 134a virtual ~SDFile(void) { 11b2: 4b7a ldr r3, [pc, #488] ; (139c ) if (filename) { 11b4: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 virtual ~SDFile(void) { 11b8: f8ca 3000 str.w r3, [sl] if (filename) { 11bc: b120 cbz r0, 11c8 free(filename); 11be: f00c f9bd bl d53c filename = nullptr; 11c2: 2300 movs r3, #0 11c4: f8ca 3058 str.w r3, [sl, #88] ; 0x58 11c8: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 11cc: 2b00 cmp r3, #0 11ce: f000 80bf beq.w 1350 sdfatfile.close(); 11d2: ee18 0a10 vmov r0, s16 11d6: f006 fdcb bl 7d70 11da: 4b6d ldr r3, [pc, #436] ; (1390 ) ~FsBaseFile() {close();} 11dc: ee18 0a10 vmov r0, s16 11e0: f8ca 3008 str.w r3, [sl, #8] 11e4: f006 fdc4 bl 7d70 } 11e8: 215c movs r1, #92 ; 0x5c 11ea: 4650 mov r0, sl 11ec: f00a f972 bl b4d4 11f0: e61a b.n e28 11f2: f8d5 3488 ldr.w r3, [r5, #1160] ; 0x488 m_xVol ? m_xVol->remove(path) : false; 11f6: 2b00 cmp r3, #0 11f8: f43f ae74 beq.w ee4 11fc: f8c9 1030 str.w r1, [r9, #48] ; 0x30 * * \return true for success or false for failure. */ bool remove(const char* path) { ExFatFile tmp; return tmp.open(this, path, O_WRONLY) && tmp.remove(); 1200: aa02 add r2, sp, #8 1202: 4619 mov r1, r3 1204: 4648 mov r0, r9 1206: 2301 movs r3, #1 1208: f002 fdc0 bl 3d8c 120c: 2800 cmp r0, #0 120e: f43f ae69 beq.w ee4 1212: 4648 mov r0, r9 1214: f002 fe1e bl 3e54 1218: e664 b.n ee4 return (f) ? f->isOpen() : false; 121a: 4650 mov r0, sl 121c: 4798 blx r3 121e: 2800 cmp r0, #0 1220: d09e beq.n 1160 1222: e6a5 b.n f70 f->close(); 1224: f8da 2000 ldr.w r2, [sl] 1228: 6ad3 ldr r3, [r2, #44] ; 0x2c 122a: 4c5a ldr r4, [pc, #360] ; (1394 ) 122c: 42a3 cmp r3, r4 122e: d167 bne.n 1300 if (filename) { 1230: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 1234: b120 cbz r0, 1240 free(filename); 1236: f00c f981 bl d53c filename = nullptr; 123a: 2300 movs r3, #0 123c: f8ca 3058 str.w r3, [sl, #88] ; 0x58 bool isOpen() const {return m_fFile || m_xFile;} 1240: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 1244: 2b00 cmp r3, #0 1246: d05e beq.n 1306 sdfatfile.close(); 1248: ee18 0a10 vmov r0, s16 124c: f006 fd90 bl 7d70 if (--(f->refcount) == 0) { 1250: f8da 5004 ldr.w r5, [sl, #4] 1254: 3d01 subs r5, #1 1256: f8ca 5004 str.w r5, [sl, #4] 125a: 2d00 cmp r5, #0 125c: f47f ade1 bne.w e22 f->close(); 1260: f8da 3000 ldr.w r3, [sl] 1264: 6adb ldr r3, [r3, #44] ; 0x2c 1266: 42a3 cmp r3, r4 1268: d15d bne.n 1326 if (filename) { 126a: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 126e: b118 cbz r0, 1278 free(filename); 1270: f00c f964 bl d53c filename = nullptr; 1274: f8ca 5058 str.w r5, [sl, #88] ; 0x58 1278: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 127c: 2b00 cmp r3, #0 127e: d047 beq.n 1310 sdfatfile.close(); 1280: ee18 0a10 vmov r0, s16 1284: f006 fd74 bl 7d70 delete f; 1288: f8da 3000 ldr.w r3, [sl] 128c: 4a42 ldr r2, [pc, #264] ; (1398 ) 128e: 685b ldr r3, [r3, #4] 1290: 4293 cmp r3, r2 1292: d157 bne.n 1344 virtual ~SDFile(void) { 1294: 4b41 ldr r3, [pc, #260] ; (139c ) if (filename) { 1296: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 virtual ~SDFile(void) { 129a: f8ca 3000 str.w r3, [sl] if (filename) { 129e: b120 cbz r0, 12aa free(filename); 12a0: f00c f94c bl d53c filename = nullptr; 12a4: 2300 movs r3, #0 12a6: f8ca 3058 str.w r3, [sl, #88] ; 0x58 12aa: f8da 3050 ldr.w r3, [sl, #80] ; 0x50 12ae: 2b00 cmp r3, #0 12b0: d054 beq.n 135c sdfatfile.close(); 12b2: ee18 0a10 vmov r0, s16 12b6: f006 fd5b bl 7d70 12ba: 4b35 ldr r3, [pc, #212] ; (1390 ) ~FsBaseFile() {close();} 12bc: ee18 0a10 vmov r0, s16 12c0: f8ca 3008 str.w r3, [sl, #8] 12c4: f006 fd54 bl 7d70 } 12c8: 215c movs r1, #92 ; 0x5c 12ca: 4650 mov r0, sl 12cc: f00a f902 bl b4d4 12d0: e5a7 b.n e22 f->close(); 12d2: f8da 2000 ldr.w r2, [sl] 12d6: 4c2f ldr r4, [pc, #188] ; (1394 ) 12d8: 6ad2 ldr r2, [r2, #44] ; 0x2c 12da: 9001 str r0, [sp, #4] 12dc: 42a2 cmp r2, r4 12de: d142 bne.n 1366 if (filename) { 12e0: f8da 0058 ldr.w r0, [sl, #88] ; 0x58 12e4: 2800 cmp r0, #0 12e6: d0ab beq.n 1240 free(filename); 12e8: f00c f928 bl d53c filename = nullptr; 12ec: 9b01 ldr r3, [sp, #4] 12ee: f8ca 3058 str.w r3, [sl, #88] ; 0x58 12f2: e7a5 b.n 1240 12f4: f8da 3000 ldr.w r3, [sl] 12f8: 4c26 ldr r4, [pc, #152] ; (1394 ) 12fa: 6adb ldr r3, [r3, #44] ; 0x2c 12fc: 42a3 cmp r3, r4 12fe: d097 beq.n 1230 1300: 4650 mov r0, sl 1302: 4798 blx r3 1304: e7a4 b.n 1250 bool isOpen() const {return m_fFile || m_xFile;} 1306: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 130a: 2b00 cmp r3, #0 130c: d19c bne.n 1248 130e: e79f b.n 1250 1310: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 1314: 2b00 cmp r3, #0 1316: d1b3 bne.n 1280 1318: e7b6 b.n 1288 131a: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 131e: 2b00 cmp r3, #0 1320: f47f af3c bne.w 119c 1324: e73e b.n 11a4 f->close(); 1326: 4650 mov r0, sl 1328: 4798 blx r3 132a: e7ad b.n 1288 132c: 4650 mov r0, sl 132e: 4798 blx r3 1330: e738 b.n 11a4 1332: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 1336: 2b00 cmp r3, #0 1338: f47f ae6f bne.w 101a 133c: e671 b.n 1022 f->close(); 133e: 4650 mov r0, sl 1340: 4798 blx r3 1342: e66e b.n 1022 delete f; 1344: 4650 mov r0, sl 1346: 4798 blx r3 1348: e56b b.n e22 134a: 4650 mov r0, sl 134c: 4798 blx r3 } 134e: e56b b.n e28 1350: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 1354: 2b00 cmp r3, #0 1356: f47f af3c bne.w 11d2 135a: e73e b.n 11da 135c: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 1360: 2b00 cmp r3, #0 1362: d1a6 bne.n 12b2 1364: e7a9 b.n 12ba f->close(); 1366: 4650 mov r0, sl 1368: 4790 blx r2 136a: e771 b.n 1250 136c: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 1370: 2b00 cmp r3, #0 1372: f47f ae6f bne.w 1054 1376: e671 b.n 105c f->close(); 1378: 4650 mov r0, sl 137a: 4798 blx r3 137c: e66e b.n 105c 137e: f8da 3054 ldr.w r3, [sl, #84] ; 0x54 1382: 2b00 cmp r3, #0 1384: f47f ae81 bne.w 108a 1388: e683 b.n 1092 delete f; 138a: 4650 mov r0, sl 138c: 4798 blx r3 138e: e68b b.n 10a8 1390: 200008e0 .word 0x200008e0 1394: 00000121 .word 0x00000121 1398: 00000835 .word 0x00000835 139c: 20000a00 .word 0x20000a00 000013a0 : // ---- Serial dispatch ---- void handleSerial() { 13a0: b538 push {r3, r4, r5, lr} virtual int available() { return usb_serial_available(); } 13a2: f00b ffb7 bl d314 while (Serial.available()) { 13a6: 2800 cmp r0, #0 13a8: d055 beq.n 1456 virtual int read() { return usb_serial_getchar(); } 13aa: f00b ffbf bl d32c int c = Serial.read(); if (c < 0) return; 13ae: 2800 cmp r0, #0 switch (c) { 13b0: f1a0 0041 sub.w r0, r0, #65 ; 0x41 if (c < 0) return; 13b4: db4f blt.n 1456 switch (c) { 13b6: 2816 cmp r0, #22 13b8: d8f3 bhi.n 13a2 13ba: a301 add r3, pc, #4 ; (adr r3, 13c0 ) 13bc: f853 f020 ldr.w pc, [r3, r0, lsl #2] 13c0: 00001461 .word 0x00001461 13c4: 000013a3 .word 0x000013a3 13c8: 000013a3 .word 0x000013a3 13cc: 0000146b .word 0x0000146b 13d0: 000013a3 .word 0x000013a3 13d4: 00001473 .word 0x00001473 13d8: 0000147b .word 0x0000147b 13dc: 000013a3 .word 0x000013a3 13e0: 000013a3 .word 0x000013a3 13e4: 000013a3 .word 0x000013a3 13e8: 000013a3 .word 0x000013a3 13ec: 000013a3 .word 0x000013a3 13f0: 0000141d .word 0x0000141d 13f4: 000013a3 .word 0x000013a3 13f8: 000013a3 .word 0x000013a3 13fc: 00001485 .word 0x00001485 1400: 000013a3 .word 0x000013a3 1404: 000013a3 .word 0x000013a3 1408: 0000148d .word 0x0000148d 140c: 000013a3 .word 0x000013a3 1410: 000013a3 .word 0x000013a3 1414: 000014af .word 0x000014af 1418: 00001459 .word 0x00001459 dtmfTrailing = true; 141c: 4926 ldr r1, [pc, #152] ; (14b8 ) 141e: 2001 movs r0, #1 dtmfBurst = 0; 1420: 4b26 ldr r3, [pc, #152] ; (14bc ) 1422: 2200 movs r2, #0 dtmfTrailing = true; 1424: 7008 strb r0, [r1, #0] dtmfBurst = 0; 1426: 701a strb r2, [r3, #0] applyActiveDigit(); 1428: f7fe fe2c bl 84 multiplier[channel] = gain * 65536.0f; // TODO: proper roundoff? 142c: f44f 3380 mov.w r3, #65536 ; 0x10000 1430: 4823 ldr r0, [pc, #140] ; (14c0 ) 1432: 4924 ldr r1, [pc, #144] ; (14c4 ) phase_accumulator = angle * (float)(4294967296.0 / 360.0); } void amplitude(float n) { if (n < 0.0f) n = 0; else if (n > 1.0f) n = 1.0f; magnitude = n * 65536.0f; 1434: f44f 4200 mov.w r2, #32768 ; 0x8000 1438: 4c23 ldr r4, [pc, #140] ; (14c8 ) 143a: 4d24 ldr r5, [pc, #144] ; (14cc ) 143c: 6222 str r2, [r4, #32] state = DTMF_ON; 143e: 2403 movs r4, #3 1440: 622a str r2, [r5, #32] 1442: e9c0 3307 strd r3, r3, [r0, #28] 1446: e9c1 3307 strd r3, r3, [r1, #28] 144a: 4b21 ldr r3, [pc, #132] ; (14d0 ) 144c: 4821 ldr r0, [pc, #132] ; (14d4 ) 144e: 6819 ldr r1, [r3, #0] 1450: 4b21 ldr r3, [pc, #132] ; (14d8 ) 1452: 7004 strb r4, [r0, #0] 1454: 6019 str r1, [r3, #0] case 'V': cmdSetVolume(); return; case 'W': cmdWriteFile(); return; default: break; } } } 1456: bd38 pop {r3, r4, r5, pc} 1458: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} case 'W': cmdWriteFile(); return; 145c: f7ff bcce b.w dfc case 'A': startGreeting(false); return; 1460: 2000 movs r0, #0 } 1462: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} case 'A': startGreeting(false); return; 1466: f7ff bba9 b.w bbc } 146a: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} case 'D': cmdSetDigit(); return; 146e: f7ff bc3b b.w ce8 } 1472: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} case 'F': cmdSetActive(); return; 1476: f7ff bbe3 b.w c40 case 'G': startGreeting(true); return; 147a: 2001 movs r0, #1 } 147c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} case 'G': startGreeting(true); return; 1480: f7ff bb9c b.w bbc virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } 1484: 2070 movs r0, #112 ; 0x70 1486: f00b ff61 bl d34c 148a: e78a b.n 13a2 greeting.stop(); 148c: 4813 ldr r0, [pc, #76] ; (14dc ) 148e: f000 fcab bl 1de8 1492: 2300 movs r3, #0 1494: 490a ldr r1, [pc, #40] ; (14c0 ) 1496: 4a0b ldr r2, [pc, #44] ; (14c4 ) 1498: 4c0b ldr r4, [pc, #44] ; (14c8 ) 149a: 480c ldr r0, [pc, #48] ; (14cc ) 149c: 6223 str r3, [r4, #32] 149e: 6203 str r3, [r0, #32] 14a0: e9c1 3307 strd r3, r3, [r1, #28] state = IDLE; 14a4: 490b ldr r1, [pc, #44] ; (14d4 ) 14a6: e9c2 3307 strd r3, r3, [r2, #28] 14aa: 700b strb r3, [r1, #0] } 14ac: bd38 pop {r3, r4, r5, pc} 14ae: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} case 'V': cmdSetVolume(); return; 14b2: f7ff bc4b b.w d4c 14b6: bf00 nop 14b8: 2000153c .word 0x2000153c 14bc: 20002dff .word 0x20002dff 14c0: 20002bf0 .word 0x20002bf0 14c4: 20002c28 .word 0x20002c28 14c8: 20002930 .word 0x20002930 14cc: 2000290c .word 0x2000290c 14d0: 20002d90 .word 0x20002d90 14d4: 20002e06 .word 0x20002e06 14d8: 20002d88 .word 0x20002d88 14dc: 2000297c .word 0x2000297c 000014e0 : // ---- Setup / loop ---- void setup() { AudioMemory(24); 14e0: 2118 movs r1, #24 14e2: 4831 ldr r0, [pc, #196] ; (15a8 ) void setup() { 14e4: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} AudioMemory(24); 14e8: f00c fe12 bl e110 <___ZN11AudioStream17initialize_memoryEP18audio_block_structj_veneer> mixL.gain(0, greetingVolume); 14ec: 482f ldr r0, [pc, #188] ; (15ac ) if (gain > 32767.0f) gain = 32767.0f; 14ee: ed9f 7a30 vldr s14, [pc, #192] ; 15b0 multiplier[channel] = gain * 65536.0f; // TODO: proper roundoff? 14f2: 2300 movs r3, #0 14f4: edd0 7a00 vldr s15, [r0] 14f8: 492e ldr r1, [pc, #184] ; (15b4 ) if (gain > 32767.0f) gain = 32767.0f; 14fa: eef4 7ac7 vcmpe.f32 s15, s14 multiplier[channel] = gain * 65536.0f; // TODO: proper roundoff? 14fe: 4a2e ldr r2, [pc, #184] ; (15b8 ) 1500: 624b str r3, [r1, #36] ; 0x24 1502: 6253 str r3, [r2, #36] ; 0x24 if (gain > 32767.0f) gain = 32767.0f; 1504: eef1 fa10 vmrs APSR_nzcv, fpscr multiplier[channel] = gain * 65536.0f; // TODO: proper roundoff? 1508: e9c1 3307 strd r3, r3, [r1, #28] 150c: e9c2 3307 strd r3, r3, [r2, #28] if (gain > 32767.0f) gain = 32767.0f; 1510: dc09 bgt.n 1526 else if (gain < -32767.0f) gain = -32767.0f; 1512: ed9f 7a2a vldr s14, [pc, #168] ; 15bc 1516: eef4 7ac7 vcmpe.f32 s15, s14 151a: eef1 fa10 vmrs APSR_nzcv, fpscr 151e: d53a bpl.n 1596 1520: 4b27 ldr r3, [pc, #156] ; (15c0 ) 1522: 461c mov r4, r3 1524: e001 b.n 152a 1526: 4b27 ldr r3, [pc, #156] ; (15c4 ) 1528: 461c mov r4, r3 152a: 2000 movs r0, #0 152c: 4d26 ldr r5, [pc, #152] ; (15c8 ) multiplier[channel] = gain * 65536.0f; // TODO: proper roundoff? 152e: 618b str r3, [r1, #24] if (elapsed > 750) break; 1530: f240 28ee movw r8, #750 ; 0x2ee 1534: 4b25 ldr r3, [pc, #148] ; (15cc ) 1536: 6228 str r0, [r5, #32] uint32_t millis_begin = systick_millis_count; 1538: 4d25 ldr r5, [pc, #148] ; (15d0 ) 153a: 6194 str r4, [r2, #24] 153c: 6218 str r0, [r3, #32] mixL.gain(1, 0); mixL.gain(2, 0); mixL.gain(3, 0); mixR.gain(1, 0); mixR.gain(2, 0); mixR.gain(3, 0); applyGreetingVolume(); dtmfRow.amplitude(0); dtmfCol.amplitude(0); applyActiveDigit(); 153e: f7fe fda1 bl 84 1542: 4c24 ldr r4, [pc, #144] ; (15d4 ) // Testing Serial as a boolean indicates whether USB is active and a program // running on your PC has raised the DTR signal, which typically means it has // opened the port and is ready to communicate. operator bool() { yield(); return usb_configuration && (usb_cdc_line_rtsdtr & USB_SERIAL_DTR) && 1544: 4f24 ldr r7, [pc, #144] ; (15d8 ) uint32_t millis_begin = systick_millis_count; 1546: 682e ldr r6, [r5, #0] ((uint32_t)(systick_millis_count - usb_cdc_line_rtsdtr_millis) >= 15); 1548: f8df 9094 ldr.w r9, [pc, #148] ; 15e0 yield(); 154c: f00b ff14 bl d378 return usb_configuration && (usb_cdc_line_rtsdtr & USB_SERIAL_DTR) && 1550: 7823 ldrb r3, [r4, #0] 1552: b173 cbz r3, 1572 1554: 783b ldrb r3, [r7, #0] 1556: 07db lsls r3, r3, #31 1558: d50b bpl.n 1572 ((uint32_t)(systick_millis_count - usb_cdc_line_rtsdtr_millis) >= 15); 155a: 682b ldr r3, [r5, #0] 155c: f8d9 2000 ldr.w r2, [r9] 1560: 1a9b subs r3, r3, r2 return usb_configuration && (usb_cdc_line_rtsdtr & USB_SERIAL_DTR) && 1562: 2b0e cmp r3, #14 1564: d905 bls.n 1572 Serial.begin(115200); SD.begin(BUILTIN_SDCARD); 1566: 21fe movs r1, #254 ; 0xfe 1568: 481c ldr r0, [pc, #112] ; (15dc ) } 156a: e8bd 43f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, lr} SD.begin(BUILTIN_SDCARD); 156e: f001 beff b.w 3370 uint32_t elapsed = systick_millis_count - millis_begin; 1572: 682b ldr r3, [r5, #0] if (usb_configuration) { 1574: 7822 ldrb r2, [r4, #0] uint32_t elapsed = systick_millis_count - millis_begin; 1576: 1b9b subs r3, r3, r6 if (usb_configuration) { 1578: b12a cbz r2, 1586 if (elapsed > 2000) break; 157a: f5b3 6ffa cmp.w r3, #2000 ; 0x7d0 157e: d8f2 bhi.n 1566 yield(); 1580: f00b fefa bl d378 1584: e7e2 b.n 154c if (elapsed > 750) break; 1586: 4543 cmp r3, r8 1588: d9fa bls.n 1580 158a: 21fe movs r1, #254 ; 0xfe 158c: 4813 ldr r0, [pc, #76] ; (15dc ) } 158e: e8bd 43f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, lr} SD.begin(BUILTIN_SDCARD); 1592: f001 beed b.w 3370 1596: eeb0 7a67 vmov.f32 s14, s15 159a: eebe 7ac8 vcvt.s32.f32 s14, s14, #16 159e: ee17 3a10 vmov r3, s14 else if (gain < -32767.0f) gain = -32767.0f; 15a2: d5c1 bpl.n 1528 15a4: 4c06 ldr r4, [pc, #24] ; (15c0 ) 15a6: e7c0 b.n 152a 15a8: 20200000 .word 0x20200000 15ac: 20001520 .word 0x20001520 15b0: 46fffe00 .word 0x46fffe00 15b4: 20002bf0 .word 0x20002bf0 15b8: 20002c28 .word 0x20002c28 15bc: c6fffe00 .word 0xc6fffe00 15c0: 80010000 .word 0x80010000 15c4: 7fff0000 .word 0x7fff0000 15c8: 20002930 .word 0x20002930 15cc: 2000290c .word 0x2000290c 15d0: 20002d90 .word 0x20002d90 15d4: 20002e12 .word 0x20002e12 15d8: 20002e11 .word 0x20002e11 15dc: 20001f40 .word 0x20001f40 15e0: 20002dc8 .word 0x20002dc8 000015e4 : void loop() { 15e4: b570 push {r4, r5, r6, lr} handleSerial(); switch (state) { 15e6: 4c36 ldr r4, [pc, #216] ; (16c0 ) handleSerial(); 15e8: f7ff feda bl 13a0 switch (state) { 15ec: 7823 ldrb r3, [r4, #0] 15ee: 3b01 subs r3, #1 15f0: 2b04 cmp r3, #4 15f2: d806 bhi.n 1602 15f4: e8df f003 tbb [pc, r3] 15f8: 56391c06 .word 0x56391c06 15fc: 03 .byte 0x03 15fd: 00 .byte 0x00 break; case DTMF_OFF: if (stateClock >= DTMF_OFF_MS) { dtmfOn(); state = DTMF_ON; stateClock = 0; } break; case DONE: state = IDLE; 15fe: 2300 movs r3, #0 1600: 7023 strb r3, [r4, #0] break; case IDLE: default: break; } } 1602: bd70 pop {r4, r5, r6, pc} if (!greeting.isPlaying() && stateClock > 100) { 1604: 482f ldr r0, [pc, #188] ; (16c4 ) 1606: f001 f92b bl 2860 160a: 2800 cmp r0, #0 160c: d1f9 bne.n 1602 160e: 492e ldr r1, [pc, #184] ; (16c8 ) operator unsigned long () const { return millis() - ms; } 1610: 4a2e ldr r2, [pc, #184] ; (16cc ) 1612: 680b ldr r3, [r1, #0] 1614: 6810 ldr r0, [r2, #0] 1616: 1a1b subs r3, r3, r0 1618: 2b64 cmp r3, #100 ; 0x64 161a: d9f2 bls.n 1602 state = dtmfTrailing ? GAP : DONE; 161c: 4b2c ldr r3, [pc, #176] ; (16d0 ) 161e: 6809 ldr r1, [r1, #0] 1620: 781b ldrb r3, [r3, #0] elapsedMillis & operator = (unsigned long val) { ms = millis() - val; return *this; } 1622: 6011 str r1, [r2, #0] 1624: 2b00 cmp r3, #0 1626: bf14 ite ne 1628: 2302 movne r3, #2 162a: 2305 moveq r3, #5 162c: 7023 strb r3, [r4, #0] } 162e: bd70 pop {r4, r5, r6, pc} 1630: 4e25 ldr r6, [pc, #148] ; (16c8 ) operator unsigned long () const { return millis() - ms; } 1632: 4d26 ldr r5, [pc, #152] ; (16cc ) 1634: 6833 ldr r3, [r6, #0] 1636: 682a ldr r2, [r5, #0] 1638: 1a9b subs r3, r3, r2 if (stateClock >= GAP_MS) { dtmfOn(); state = DTMF_ON; stateClock = 0; } 163a: f5b3 7f7a cmp.w r3, #1000 ; 0x3e8 163e: d3e0 bcc.n 1602 applyActiveDigit(); 1640: f7fe fd20 bl 84 1644: 6831 ldr r1, [r6, #0] multiplier[channel] = gain * 65536.0f; // TODO: proper roundoff? 1646: f44f 3380 mov.w r3, #65536 ; 0x10000 164a: 4a22 ldr r2, [pc, #136] ; (16d4 ) elapsedMillis & operator = (unsigned long val) { ms = millis() - val; return *this; } 164c: 6029 str r1, [r5, #0] 164e: 4922 ldr r1, [pc, #136] ; (16d8 ) 1650: 4822 ldr r0, [pc, #136] ; (16dc ) 1652: e9c1 3307 strd r3, r3, [r1, #28] 1656: e9c2 3307 strd r3, r3, [r2, #28] 165a: 4921 ldr r1, [pc, #132] ; (16e0 ) 165c: f44f 4200 mov.w r2, #32768 ; 0x8000 if (stateClock >= DTMF_OFF_MS) { dtmfOn(); state = DTMF_ON; stateClock = 0; } 1660: 2303 movs r3, #3 1662: 6202 str r2, [r0, #32] 1664: 620a str r2, [r1, #32] 1666: 7023 strb r3, [r4, #0] } 1668: bd70 pop {r4, r5, r6, pc} 166a: 4917 ldr r1, [pc, #92] ; (16c8 ) operator unsigned long () const { return millis() - ms; } 166c: 4a17 ldr r2, [pc, #92] ; (16cc ) 166e: 680b ldr r3, [r1, #0] 1670: 6810 ldr r0, [r2, #0] 1672: 1a1b subs r3, r3, r0 if (stateClock >= DTMF_ON_MS) { 1674: f5b3 7f16 cmp.w r3, #600 ; 0x258 1678: d3c3 bcc.n 1602 167a: 2300 movs r3, #0 167c: 4817 ldr r0, [pc, #92] ; (16dc ) 167e: 6203 str r3, [r0, #32] 1680: 4817 ldr r0, [pc, #92] ; (16e0 ) 1682: 6203 str r3, [r0, #32] 1684: 4813 ldr r0, [pc, #76] ; (16d4 ) 1686: e9c0 3307 strd r3, r3, [r0, #28] 168a: 4813 ldr r0, [pc, #76] ; (16d8 ) 168c: e9c0 3307 strd r3, r3, [r0, #28] dtmfBurst++; 1690: 4814 ldr r0, [pc, #80] ; (16e4 ) 1692: 7803 ldrb r3, [r0, #0] 1694: 3301 adds r3, #1 1696: b2db uxtb r3, r3 if (dtmfBurst >= DTMF_BURSTS) state = DONE; 1698: 2b02 cmp r3, #2 dtmfBurst++; 169a: 7003 strb r3, [r0, #0] if (dtmfBurst >= DTMF_BURSTS) state = DONE; 169c: d90a bls.n 16b4 169e: 2305 movs r3, #5 16a0: 7023 strb r3, [r4, #0] } 16a2: bd70 pop {r4, r5, r6, pc} 16a4: 4e08 ldr r6, [pc, #32] ; (16c8 ) 16a6: 4d09 ldr r5, [pc, #36] ; (16cc ) 16a8: 6833 ldr r3, [r6, #0] 16aa: 682a ldr r2, [r5, #0] 16ac: 1a9b subs r3, r3, r2 if (stateClock >= DTMF_OFF_MS) { dtmfOn(); state = DTMF_ON; stateClock = 0; } 16ae: 2b77 cmp r3, #119 ; 0x77 16b0: d8c6 bhi.n 1640 } 16b2: bd70 pop {r4, r5, r6, pc} else { state = DTMF_OFF; stateClock = 0; } 16b4: 2004 movs r0, #4 16b6: 680b ldr r3, [r1, #0] 16b8: 7020 strb r0, [r4, #0] elapsedMillis & operator = (unsigned long val) { ms = millis() - val; return *this; } 16ba: 6013 str r3, [r2, #0] } 16bc: bd70 pop {r4, r5, r6, pc} 16be: bf00 nop 16c0: 20002e06 .word 0x20002e06 16c4: 2000297c .word 0x2000297c 16c8: 20002d90 .word 0x20002d90 16cc: 20002d88 .word 0x20002d88 16d0: 2000153c .word 0x2000153c 16d4: 20002bf0 .word 0x20002bf0 16d8: 20002c28 .word 0x20002c28 16dc: 20002930 .word 0x20002930 16e0: 2000290c .word 0x2000290c 16e4: 20002dff .word 0x20002dff 000016e8 <_GLOBAL__sub_I_greeting>: 16e8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} if (first_update == NULL) { 16ec: 4d75 ldr r5, [pc, #468] ; (18c4 <_GLOBAL__sub_I_greeting+0x1dc>) num_inputs(ninput), inputQueue(iqueue) { 16ee: 2100 movs r1, #0 16f0: 4a75 ldr r2, [pc, #468] ; (18c8 <_GLOBAL__sub_I_greeting+0x1e0>) 16f2: b082 sub sp, #8 16f4: 4e75 ldr r6, [pc, #468] ; (18cc <_GLOBAL__sub_I_greeting+0x1e4>) if (first_update == NULL) { 16f6: 682b ldr r3, [r5, #0] num_inputs(ninput), inputQueue(iqueue) { 16f8: 6016 str r6, [r2, #0] 16fa: 6111 str r1, [r2, #16] active = false; 16fc: 8111 strh r1, [r2, #8] destination_list = NULL; 16fe: 60d1 str r1, [r2, #12] if (first_update == NULL) { 1700: 2b00 cmp r3, #0 1702: f000 80db beq.w 18bc <_GLOBAL__sub_I_greeting+0x1d4> for (p=first_update; p->next_update; p = p->next_update) ; 1706: 4619 mov r1, r3 1708: 695b ldr r3, [r3, #20] 170a: 2b00 cmp r3, #0 170c: d1fb bne.n 1706 <_GLOBAL__sub_I_greeting+0x1e> p->next_update = this; 170e: 614a str r2, [r1, #20] { public: AudioPlaySdWav(void) : AudioStream(0, NULL), block_left(NULL), block_right(NULL) { begin(); } 1710: 4b6f ldr r3, [pc, #444] ; (18d0 <_GLOBAL__sub_I_greeting+0x1e8>) next_update = NULL; 1712: 2400 movs r4, #0 AudioSynthWaveformSine() : AudioStream(0, NULL), magnitude(16384) {} 1714: f8df 81ec ldr.w r8, [pc, #492] ; 1904 <_GLOBAL__sub_I_greeting+0x21c> 1718: f44f 4980 mov.w r9, #16384 ; 0x4000 171c: 6013 str r3, [r2, #0] constexpr Stream() : _timeout(1000), read_error(0) {} 171e: f44f 737a mov.w r3, #1000 ; 0x3e8 1722: 4869 ldr r0, [pc, #420] ; (18c8 <_GLOBAL__sub_I_greeting+0x1e0>) 1724: 6213 str r3, [r2, #32] constexpr File() : f(nullptr) { } 1726: 4b6b ldr r3, [pc, #428] ; (18d4 <_GLOBAL__sub_I_greeting+0x1ec>) 1728: 6154 str r4, [r2, #20] 172a: 6193 str r3, [r2, #24] cpu_cycles = 0; 172c: 6054 str r4, [r2, #4] numConnections = 0; 172e: 7294 strb r4, [r2, #10] constexpr Print() : write_error(0) {} 1730: 61d4 str r4, [r2, #28] 1732: f882 4024 strb.w r4, [r2, #36] ; 0x24 1736: 6294 str r4, [r2, #40] ; 0x28 1738: 4f67 ldr r7, [pc, #412] ; (18d8 <_GLOBAL__sub_I_greeting+0x1f0>) 173a: f8df a1e8 ldr.w sl, [pc, #488] ; 1924 <_GLOBAL__sub_I_greeting+0x23c> 173e: e9c2 4418 strd r4, r4, [r2, #96] ; 0x60 1742: f000 fb3b bl 1dbc AudioPlaySdWav greeting; 1746: 4a65 ldr r2, [pc, #404] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 1748: 4965 ldr r1, [pc, #404] ; (18e0 <_GLOBAL__sub_I_greeting+0x1f8>) 174a: 485f ldr r0, [pc, #380] ; (18c8 <_GLOBAL__sub_I_greeting+0x1e0>) 174c: f00b fee8 bl d520 <__aeabi_atexit> 1750: 4622 mov r2, r4 1752: 4621 mov r1, r4 1754: 4640 mov r0, r8 1756: f7ff f9dd bl b14 175a: 4622 mov r2, r4 175c: 4621 mov r1, r4 175e: 4638 mov r0, r7 1760: f8c8 a000 str.w sl, [r8] 1764: f8c8 9020 str.w r9, [r8, #32] 1768: f7ff f9d4 bl b14 AudioMixer4 mixL; 176c: 485d ldr r0, [pc, #372] ; (18e4 <_GLOBAL__sub_I_greeting+0x1fc>) 176e: f8c7 a000 str.w sl, [r7] 1772: f8c7 9020 str.w r9, [r7, #32] 1776: f7ff f9f1 bl b5c AudioMixer4 mixR; 177a: 485b ldr r0, [pc, #364] ; (18e8 <_GLOBAL__sub_I_greeting+0x200>) 177c: f7ff f9ee bl b5c num_inputs(ninput), inputQueue(iqueue) { 1780: 4a5a ldr r2, [pc, #360] ; (18ec <_GLOBAL__sub_I_greeting+0x204>) active = false; 1782: f44f 7000 mov.w r0, #512 ; 0x200 if (first_update == NULL) { 1786: 682b ldr r3, [r5, #0] num_inputs(ninput), inputQueue(iqueue) { 1788: 4611 mov r1, r2 destination_list = NULL; 178a: 60d4 str r4, [r2, #12] active = false; 178c: 8110 strh r0, [r2, #8] num_inputs(ninput), inputQueue(iqueue) { 178e: f841 6b18 str.w r6, [r1], #24 1792: 6111 str r1, [r2, #16] inputQueue[i] = NULL; 1794: e9c2 4406 strd r4, r4, [r2, #24] if (first_update == NULL) { 1798: 2b00 cmp r3, #0 179a: f000 8091 beq.w 18c0 <_GLOBAL__sub_I_greeting+0x1d8> for (p=first_update; p->next_update; p = p->next_update) ; 179e: 4619 mov r1, r3 17a0: 695b ldr r3, [r3, #20] 17a2: 2b00 cmp r3, #0 17a4: d1fb bne.n 179e <_GLOBAL__sub_I_greeting+0xb6> p->next_update = this; 17a6: 614a str r2, [r1, #20] next_update = NULL; 17a8: 2400 movs r4, #0 }; class AudioOutputUSB : public AudioStream { public: AudioOutputUSB(void) : AudioStream(2, inputQueueArray) { begin(); } 17aa: 4b51 ldr r3, [pc, #324] ; (18f0 <_GLOBAL__sub_I_greeting+0x208>) 17ac: 484f ldr r0, [pc, #316] ; (18ec <_GLOBAL__sub_I_greeting+0x204>) : AudioConnection() { connect(source,sourceOutput, destination,destinationInput); } 17ae: 2501 movs r5, #1 next_update = NULL; 17b0: 6154 str r4, [r2, #20] : AudioConnection() { connect(source,sourceOutput, destination,destinationInput); } 17b2: 2602 movs r6, #2 cpu_cycles = 0; 17b4: 6054 str r4, [r2, #4] numConnections = 0; 17b6: 7294 strb r4, [r2, #10] 17b8: 6013 str r3, [r2, #0] 17ba: f00b f845 bl c848 : AudioConnection() { connect(source,sourceOutput, destination,destinationInput); } 17be: 484d ldr r0, [pc, #308] ; (18f4 <_GLOBAL__sub_I_greeting+0x20c>) 17c0: f009 f822 bl a808 17c4: 4b47 ldr r3, [pc, #284] ; (18e4 <_GLOBAL__sub_I_greeting+0x1fc>) 17c6: 4622 mov r2, r4 17c8: 493f ldr r1, [pc, #252] ; (18c8 <_GLOBAL__sub_I_greeting+0x1e0>) 17ca: 9400 str r4, [sp, #0] 17cc: 4849 ldr r0, [pc, #292] ; (18f4 <_GLOBAL__sub_I_greeting+0x20c>) 17ce: f009 f88f bl a8f0 AudioConnection patchGreetL(greeting, 0, mixL, 0); 17d2: 4a42 ldr r2, [pc, #264] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 17d4: 4948 ldr r1, [pc, #288] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 17d6: 4847 ldr r0, [pc, #284] ; (18f4 <_GLOBAL__sub_I_greeting+0x20c>) 17d8: f00b fea2 bl d520 <__aeabi_atexit> 17dc: 4847 ldr r0, [pc, #284] ; (18fc <_GLOBAL__sub_I_greeting+0x214>) 17de: f009 f813 bl a808 17e2: 4b41 ldr r3, [pc, #260] ; (18e8 <_GLOBAL__sub_I_greeting+0x200>) 17e4: 2201 movs r2, #1 17e6: 4938 ldr r1, [pc, #224] ; (18c8 <_GLOBAL__sub_I_greeting+0x1e0>) 17e8: 9400 str r4, [sp, #0] 17ea: 4844 ldr r0, [pc, #272] ; (18fc <_GLOBAL__sub_I_greeting+0x214>) 17ec: f009 f880 bl a8f0 AudioConnection patchGreetR(greeting, 1, mixR, 0); 17f0: 4a3a ldr r2, [pc, #232] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 17f2: 4941 ldr r1, [pc, #260] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 17f4: 4841 ldr r0, [pc, #260] ; (18fc <_GLOBAL__sub_I_greeting+0x214>) 17f6: f00b fe93 bl d520 <__aeabi_atexit> 17fa: 4841 ldr r0, [pc, #260] ; (1900 <_GLOBAL__sub_I_greeting+0x218>) 17fc: f009 f804 bl a808 1800: 4b38 ldr r3, [pc, #224] ; (18e4 <_GLOBAL__sub_I_greeting+0x1fc>) 1802: 4622 mov r2, r4 1804: 493f ldr r1, [pc, #252] ; (1904 <_GLOBAL__sub_I_greeting+0x21c>) 1806: 9500 str r5, [sp, #0] 1808: 483d ldr r0, [pc, #244] ; (1900 <_GLOBAL__sub_I_greeting+0x218>) 180a: f009 f871 bl a8f0 AudioConnection patchRowL (dtmfRow, 0, mixL, 1); 180e: 4a33 ldr r2, [pc, #204] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 1810: 4939 ldr r1, [pc, #228] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 1812: 483b ldr r0, [pc, #236] ; (1900 <_GLOBAL__sub_I_greeting+0x218>) 1814: f00b fe84 bl d520 <__aeabi_atexit> 1818: 483b ldr r0, [pc, #236] ; (1908 <_GLOBAL__sub_I_greeting+0x220>) 181a: f008 fff5 bl a808 181e: 4b32 ldr r3, [pc, #200] ; (18e8 <_GLOBAL__sub_I_greeting+0x200>) 1820: 4622 mov r2, r4 1822: 4938 ldr r1, [pc, #224] ; (1904 <_GLOBAL__sub_I_greeting+0x21c>) 1824: 9500 str r5, [sp, #0] 1826: 4838 ldr r0, [pc, #224] ; (1908 <_GLOBAL__sub_I_greeting+0x220>) 1828: f009 f862 bl a8f0 AudioConnection patchRowR (dtmfRow, 0, mixR, 1); 182c: 4a2b ldr r2, [pc, #172] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 182e: 4932 ldr r1, [pc, #200] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 1830: 4835 ldr r0, [pc, #212] ; (1908 <_GLOBAL__sub_I_greeting+0x220>) 1832: f00b fe75 bl d520 <__aeabi_atexit> 1836: 4835 ldr r0, [pc, #212] ; (190c <_GLOBAL__sub_I_greeting+0x224>) 1838: f008 ffe6 bl a808 183c: 4b29 ldr r3, [pc, #164] ; (18e4 <_GLOBAL__sub_I_greeting+0x1fc>) 183e: 4622 mov r2, r4 1840: 4925 ldr r1, [pc, #148] ; (18d8 <_GLOBAL__sub_I_greeting+0x1f0>) 1842: 9600 str r6, [sp, #0] 1844: 4831 ldr r0, [pc, #196] ; (190c <_GLOBAL__sub_I_greeting+0x224>) 1846: f009 f853 bl a8f0 AudioConnection patchColL (dtmfCol, 0, mixL, 2); 184a: 4a24 ldr r2, [pc, #144] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 184c: 492a ldr r1, [pc, #168] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 184e: 482f ldr r0, [pc, #188] ; (190c <_GLOBAL__sub_I_greeting+0x224>) 1850: f00b fe66 bl d520 <__aeabi_atexit> 1854: 482e ldr r0, [pc, #184] ; (1910 <_GLOBAL__sub_I_greeting+0x228>) 1856: f008 ffd7 bl a808 185a: 4b23 ldr r3, [pc, #140] ; (18e8 <_GLOBAL__sub_I_greeting+0x200>) 185c: 4622 mov r2, r4 185e: 491e ldr r1, [pc, #120] ; (18d8 <_GLOBAL__sub_I_greeting+0x1f0>) 1860: 9600 str r6, [sp, #0] 1862: 482b ldr r0, [pc, #172] ; (1910 <_GLOBAL__sub_I_greeting+0x228>) 1864: f009 f844 bl a8f0 AudioConnection patchColR (dtmfCol, 0, mixR, 2); 1868: 4a1c ldr r2, [pc, #112] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 186a: 4923 ldr r1, [pc, #140] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 186c: 4828 ldr r0, [pc, #160] ; (1910 <_GLOBAL__sub_I_greeting+0x228>) 186e: f00b fe57 bl d520 <__aeabi_atexit> 1872: 4828 ldr r0, [pc, #160] ; (1914 <_GLOBAL__sub_I_greeting+0x22c>) 1874: f008 ffc8 bl a808 1878: 4b1c ldr r3, [pc, #112] ; (18ec <_GLOBAL__sub_I_greeting+0x204>) 187a: 4622 mov r2, r4 187c: 4919 ldr r1, [pc, #100] ; (18e4 <_GLOBAL__sub_I_greeting+0x1fc>) 187e: 9400 str r4, [sp, #0] 1880: 4824 ldr r0, [pc, #144] ; (1914 <_GLOBAL__sub_I_greeting+0x22c>) 1882: f009 f835 bl a8f0 AudioConnection patchOutL (mixL, 0, usbOut, 0); 1886: 4a15 ldr r2, [pc, #84] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 1888: 491b ldr r1, [pc, #108] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 188a: 4822 ldr r0, [pc, #136] ; (1914 <_GLOBAL__sub_I_greeting+0x22c>) 188c: f00b fe48 bl d520 <__aeabi_atexit> 1890: 4821 ldr r0, [pc, #132] ; (1918 <_GLOBAL__sub_I_greeting+0x230>) 1892: f008 ffb9 bl a808 1896: 4b15 ldr r3, [pc, #84] ; (18ec <_GLOBAL__sub_I_greeting+0x204>) 1898: 4622 mov r2, r4 189a: 4913 ldr r1, [pc, #76] ; (18e8 <_GLOBAL__sub_I_greeting+0x200>) 189c: 9500 str r5, [sp, #0] 189e: 481e ldr r0, [pc, #120] ; (1918 <_GLOBAL__sub_I_greeting+0x230>) 18a0: f009 f826 bl a8f0 AudioConnection patchOutR (mixR, 0, usbOut, 1); 18a4: 4a0d ldr r2, [pc, #52] ; (18dc <_GLOBAL__sub_I_greeting+0x1f4>) 18a6: 4914 ldr r1, [pc, #80] ; (18f8 <_GLOBAL__sub_I_greeting+0x210>) 18a8: 481b ldr r0, [pc, #108] ; (1918 <_GLOBAL__sub_I_greeting+0x230>) 18aa: f00b fe39 bl d520 <__aeabi_atexit> 18ae: 4a1b ldr r2, [pc, #108] ; (191c <_GLOBAL__sub_I_greeting+0x234>) elapsedMillis(void) { ms = millis(); } 18b0: 4b1b ldr r3, [pc, #108] ; (1920 <_GLOBAL__sub_I_greeting+0x238>) 18b2: 6812 ldr r2, [r2, #0] 18b4: 601a str r2, [r3, #0] } 18b6: b002 add sp, #8 18b8: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} first_update = this; 18bc: 602a str r2, [r5, #0] 18be: e727 b.n 1710 <_GLOBAL__sub_I_greeting+0x28> 18c0: 602a str r2, [r5, #0] 18c2: e771 b.n 17a8 <_GLOBAL__sub_I_greeting+0xc0> 18c4: 20002458 .word 0x20002458 18c8: 2000297c .word 0x2000297c 18cc: 20000910 .word 0x20000910 18d0: 20000928 .word 0x20000928 18d4: 200009b0 .word 0x200009b0 18d8: 2000290c .word 0x2000290c 18dc: 200010b4 .word 0x200010b4 18e0: 000009b5 .word 0x000009b5 18e4: 20002bf0 .word 0x20002bf0 18e8: 20002c28 .word 0x20002c28 18ec: 20002d98 .word 0x20002d98 18f0: 2000091c .word 0x2000091c 18f4: 20002ca0 .word 0x20002ca0 18f8: 0000a9a5 .word 0x0000a9a5 18fc: 20002cb4 .word 0x20002cb4 1900: 20002cf0 .word 0x20002cf0 1904: 20002930 .word 0x20002930 1908: 20002d04 .word 0x20002d04 190c: 20002c78 .word 0x20002c78 1910: 20002c8c .word 0x20002c8c 1914: 20002cc8 .word 0x20002cc8 1918: 20002cdc .word 0x20002cdc 191c: 20002d90 .word 0x20002d90 1920: 20002d88 .word 0x20002d88 1924: 200009a4 .word 0x200009a4 00001928 : } DMAChannel & operator = (const DMASetting &rhs) { copy_tcd(TCD, rhs.TCD); return *this; } ~DMAChannel() { 1928: b510 push {r4, lr} 192a: 4604 mov r4, r0 release(); 192c: f009 f854 bl a9d8 } 1930: 4620 mov r0, r4 1932: bd10 pop {r4, pc} 00001934 <_GLOBAL__sub_I__ZN21AsyncAudioInputSPDIF310microsLastE>: static float bufferL[bufferLength]; volatile int32_t AsyncAudioInputSPDIF3::buffer_offset = 0; // read by resample/ written in spdif input isr -> copied at the beginning of 'resmaple' protected by __disable_irq() in resample int32_t AsyncAudioInputSPDIF3::resample_offset = 0; // read/written by resample/ read in spdif input isr -> no protection needed? DMAChannel AsyncAudioInputSPDIF3::dma(false); 1934: 4a02 ldr r2, [pc, #8] ; (1940 <_GLOBAL__sub_I__ZN21AsyncAudioInputSPDIF310microsLastE+0xc>) 1936: 4903 ldr r1, [pc, #12] ; (1944 <_GLOBAL__sub_I__ZN21AsyncAudioInputSPDIF310microsLastE+0x10>) 1938: 4803 ldr r0, [pc, #12] ; (1948 <_GLOBAL__sub_I__ZN21AsyncAudioInputSPDIF310microsLastE+0x14>) 193a: f00b bdf1 b.w d520 <__aeabi_atexit> 193e: bf00 nop 1940: 200010b4 .word 0x200010b4 1944: 00001929 .word 0x00001929 1948: 200025f4 .word 0x200025f4 0000194c : void beginTransaction(SPISettings settings) { 194c: b430 push {r4, r5} 194e: b082 sub sp, #8 1950: 460c mov r4, r1 1952: ab02 add r3, sp, #8 1954: e903 0006 stmdb r3, {r1, r2} if (interruptMasksUsed) { 1958: 7cc3 ldrb r3, [r0, #19] 195a: 2b00 cmp r3, #0 195c: d030 beq.n 19c0 __disable_irq(); 195e: b672 cpsid i if (interruptMasksUsed & 0x01) { 1960: 7cc3 ldrb r3, [r0, #19] 1962: 07da lsls r2, r3, #31 1964: d508 bpl.n 1978 interruptSave[0] = NVIC_ICER0 & interruptMask[0]; 1966: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 196a: 6945 ldr r5, [r0, #20] 196c: f8d1 2180 ldr.w r2, [r1, #384] ; 0x180 1970: 402a ands r2, r5 1972: 6282 str r2, [r0, #40] ; 0x28 NVIC_ICER0 = interruptSave[0]; 1974: f8c1 2180 str.w r2, [r1, #384] ; 0x180 if (interruptMasksUsed & 0x02) { 1978: 079d lsls r5, r3, #30 197a: d508 bpl.n 198e interruptSave[1] = NVIC_ICER1 & interruptMask[1]; 197c: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 1980: 6985 ldr r5, [r0, #24] 1982: f8d1 2184 ldr.w r2, [r1, #388] ; 0x184 1986: 402a ands r2, r5 1988: 62c2 str r2, [r0, #44] ; 0x2c NVIC_ICER1 = interruptSave[1]; 198a: f8c1 2184 str.w r2, [r1, #388] ; 0x184 if (interruptMasksUsed & 0x04) { 198e: 0759 lsls r1, r3, #29 1990: d508 bpl.n 19a4 interruptSave[2] = NVIC_ICER2 & interruptMask[2]; 1992: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 1996: 69c5 ldr r5, [r0, #28] 1998: f8d1 2188 ldr.w r2, [r1, #392] ; 0x188 199c: 402a ands r2, r5 199e: 6302 str r2, [r0, #48] ; 0x30 NVIC_ICER2 = interruptSave[2]; 19a0: f8c1 2188 str.w r2, [r1, #392] ; 0x188 if (interruptMasksUsed & 0x08) { 19a4: 071a lsls r2, r3, #28 19a6: d508 bpl.n 19ba interruptSave[3] = NVIC_ICER3 & interruptMask[3]; 19a8: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 19ac: 6a05 ldr r5, [r0, #32] 19ae: f8d1 218c ldr.w r2, [r1, #396] ; 0x18c 19b2: 402a ands r2, r5 19b4: 6342 str r2, [r0, #52] ; 0x34 NVIC_ICER3 = interruptSave[3]; 19b6: f8c1 218c str.w r2, [r1, #396] ; 0x18c if (interruptMasksUsed & 0x10) { 19ba: 06db lsls r3, r3, #27 19bc: d42f bmi.n 1a1e __enable_irq(); 19be: b662 cpsie i if (settings.clock() != _clock) { 19c0: 6883 ldr r3, [r0, #8] 19c2: 429c cmp r4, r3 19c4: d035 beq.n 1a32 uint32_t cbcmr = CCM_CBCMR; 19c6: 4b22 ldr r3, [pc, #136] ; (1a50 ) _clock = settings.clock(); 19c8: 6084 str r4, [r0, #8] uint32_t cbcmr = CCM_CBCMR; 19ca: 699b ldr r3, [r3, #24] uint32_t clkhz = clk_sel[(cbcmr >> 4) & 0x03] / (((cbcmr >> 26 ) & 0x07 ) + 1); // LPSPI peripheral clock 19cc: 4a21 ldr r2, [pc, #132] ; (1a54 ) 19ce: f3c3 1101 ubfx r1, r3, #4, #2 19d2: f3c3 6382 ubfx r3, r3, #26, #3 19d6: f852 1021 ldr.w r1, [r2, r1, lsl #2] 19da: 3301 adds r3, #1 19dc: fbb1 f2f3 udiv r2, r1, r3 d = _clock ? clkhz/_clock : clkhz; 19e0: b1cc cbz r4, 1a16 if (d && clkhz/d > _clock) d++; 19e2: 4294 cmp r4, r2 19e4: d827 bhi.n 1a36 d = _clock ? clkhz/_clock : clkhz; 19e6: fbb2 f3f4 udiv r3, r2, r4 if (d && clkhz/d > _clock) d++; 19ea: fbb2 f2f3 udiv r2, r2, r3 19ee: 4294 cmp r4, r2 19f0: d32c bcc.n 1a4c if (d > 257) d= 257; // max div 19f2: f5b3 7f81 cmp.w r3, #258 ; 0x102 19f6: d320 bcc.n 1a3a 19f8: 4c17 ldr r4, [pc, #92] ; (1a58 ) _ccr = LPSPI_CCR_SCKDIV(div) | LPSPI_CCR_DBT(div/2) | LPSPI_CCR_PCSSCK(div/2); 19fa: 60c4 str r4, [r0, #12] // programs/sketches. See the ILI3941_t3 library for an example. uint8_t setCS(uint8_t pin); private: private: IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } 19fc: 6803 ldr r3, [r0, #0] port().CFGR1 = LPSPI_CFGR1_MASTER | LPSPI_CFGR1_SAMPLE; 19fe: 2203 movs r2, #3 port().CR = 0; 1a00: 2000 movs r0, #0 port().TCR = settings.tcr; 1a02: 9901 ldr r1, [sp, #4] port().CR = 0; 1a04: 6118 str r0, [r3, #16] port().CFGR1 = LPSPI_CFGR1_MASTER | LPSPI_CFGR1_SAMPLE; 1a06: 625a str r2, [r3, #36] ; 0x24 port().CR = LPSPI_CR_MEN; 1a08: 2201 movs r2, #1 port().CCR = _ccr; 1a0a: 641c str r4, [r3, #64] ; 0x40 port().TCR = settings.tcr; 1a0c: 6619 str r1, [r3, #96] ; 0x60 port().CR = LPSPI_CR_MEN; 1a0e: 611a str r2, [r3, #16] } 1a10: b002 add sp, #8 1a12: bc30 pop {r4, r5} 1a14: 4770 bx lr if (d && clkhz/d > _clock) d++; 1a16: 4299 cmp r1, r3 1a18: d3ef bcc.n 19fa 1a1a: 1c53 adds r3, r2, #1 1a1c: e7e9 b.n 19f2 interruptSave[4] = NVIC_ICER4 & interruptMask[4]; 1a1e: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 1a22: 6a41 ldr r1, [r0, #36] ; 0x24 1a24: f8d2 3190 ldr.w r3, [r2, #400] ; 0x190 1a28: 400b ands r3, r1 1a2a: 6383 str r3, [r0, #56] ; 0x38 NVIC_ICER4 = interruptSave[4]; 1a2c: f8c2 3190 str.w r3, [r2, #400] ; 0x190 1a30: e7c5 b.n 19be port().CCR = _ccr; 1a32: 68c4 ldr r4, [r0, #12] 1a34: e7e2 b.n 19fc 1a36: 2400 movs r4, #0 1a38: e7df b.n 19fa if (d > 2) { 1a3a: 2b02 cmp r3, #2 1a3c: d9fb bls.n 1a36 div = d-2; 1a3e: 3b02 subs r3, #2 _ccr = LPSPI_CCR_SCKDIV(div) | LPSPI_CCR_DBT(div/2) | LPSPI_CCR_PCSSCK(div/2); 1a40: 085a lsrs r2, r3, #1 1a42: 0214 lsls r4, r2, #8 1a44: ea44 4402 orr.w r4, r4, r2, lsl #16 1a48: 431c orrs r4, r3 1a4a: e7d6 b.n 19fa d = _clock ? clkhz/_clock : clkhz; 1a4c: 461a mov r2, r3 1a4e: e7e4 b.n 1a1a 1a50: 400fc000 .word 0x400fc000 1a54: 20000b34 .word 0x20000b34 1a58: 007f7fff .word 0x007f7fff 00001a5c <_GLOBAL__sub_I__ZN16AudioInputAnalog3dmaE>: #include #include "input_adc.h" extern "C" void xbar_connect(unsigned int input, unsigned int output); DMAChannel AudioInputAnalog::dma(false); 1a5c: 4a02 ldr r2, [pc, #8] ; (1a68 <_GLOBAL__sub_I__ZN16AudioInputAnalog3dmaE+0xc>) 1a5e: 4903 ldr r1, [pc, #12] ; (1a6c <_GLOBAL__sub_I__ZN16AudioInputAnalog3dmaE+0x10>) 1a60: 4803 ldr r0, [pc, #12] ; (1a70 <_GLOBAL__sub_I__ZN16AudioInputAnalog3dmaE+0x14>) 1a62: f00b bd5d b.w d520 <__aeabi_atexit> 1a66: bf00 nop 1a68: 200010b4 .word 0x200010b4 1a6c: 00001929 .word 0x00001929 1a70: 2000256c .word 0x2000256c 00001a74 <_GLOBAL__sub_I__ZN13AudioInputI2S10block_leftE>: DMAMEM __attribute__((aligned(32))) static uint32_t i2s_rx_buffer[AUDIO_BLOCK_SAMPLES]; audio_block_t * AudioInputI2S::block_left = NULL; audio_block_t * AudioInputI2S::block_right = NULL; uint16_t AudioInputI2S::block_offset = 0; bool AudioInputI2S::update_responsibility = false; DMAChannel AudioInputI2S::dma(false); 1a74: 4a02 ldr r2, [pc, #8] ; (1a80 <_GLOBAL__sub_I__ZN13AudioInputI2S10block_leftE+0xc>) 1a76: 4903 ldr r1, [pc, #12] ; (1a84 <_GLOBAL__sub_I__ZN13AudioInputI2S10block_leftE+0x10>) 1a78: 4803 ldr r0, [pc, #12] ; (1a88 <_GLOBAL__sub_I__ZN13AudioInputI2S10block_leftE+0x14>) 1a7a: f00b bd51 b.w d520 <__aeabi_atexit> 1a7e: bf00 nop 1a80: 200010b4 .word 0x200010b4 1a84: 00001929 .word 0x00001929 1a88: 200024d4 .word 0x200024d4 00001a8c <_GLOBAL__sub_I__ZN14AudioInputI2S210block_leftE>: DMAMEM __attribute__((aligned(32))) static uint32_t i2s2_rx_buffer[AUDIO_BLOCK_SAMPLES]; audio_block_t * AudioInputI2S2::block_left = NULL; audio_block_t * AudioInputI2S2::block_right = NULL; uint16_t AudioInputI2S2::block_offset = 0; bool AudioInputI2S2::update_responsibility = false; DMAChannel AudioInputI2S2::dma(false); 1a8c: 4a02 ldr r2, [pc, #8] ; (1a98 <_GLOBAL__sub_I__ZN14AudioInputI2S210block_leftE+0xc>) 1a8e: 4903 ldr r1, [pc, #12] ; (1a9c <_GLOBAL__sub_I__ZN14AudioInputI2S210block_leftE+0x10>) 1a90: 4803 ldr r0, [pc, #12] ; (1aa0 <_GLOBAL__sub_I__ZN14AudioInputI2S210block_leftE+0x14>) 1a92: f00b bd45 b.w d520 <__aeabi_atexit> 1a96: bf00 nop 1a98: 200010b4 .word 0x200010b4 1a9c: 00001929 .word 0x00001929 1aa0: 200024fc .word 0x200024fc 00001aa4 <_GLOBAL__sub_I__ZN16AudioInputI2SHex9block_ch1E>: audio_block_t * AudioInputI2SHex::block_ch4 = NULL; audio_block_t * AudioInputI2SHex::block_ch5 = NULL; audio_block_t * AudioInputI2SHex::block_ch6 = NULL; uint16_t AudioInputI2SHex::block_offset = 0; bool AudioInputI2SHex::update_responsibility = false; DMAChannel AudioInputI2SHex::dma(false); 1aa4: 4a02 ldr r2, [pc, #8] ; (1ab0 <_GLOBAL__sub_I__ZN16AudioInputI2SHex9block_ch1E+0xc>) 1aa6: 4903 ldr r1, [pc, #12] ; (1ab4 <_GLOBAL__sub_I__ZN16AudioInputI2SHex9block_ch1E+0x10>) 1aa8: 4803 ldr r0, [pc, #12] ; (1ab8 <_GLOBAL__sub_I__ZN16AudioInputI2SHex9block_ch1E+0x14>) 1aaa: f00b bd39 b.w d520 <__aeabi_atexit> 1aae: bf00 nop 1ab0: 200010b4 .word 0x200010b4 1ab4: 00001929 .word 0x00001929 1ab8: 20002574 .word 0x20002574 00001abc <_GLOBAL__sub_I__ZN16AudioInputI2SOct9block_ch1E>: audio_block_t * AudioInputI2SOct::block_ch6 = NULL; audio_block_t * AudioInputI2SOct::block_ch7 = NULL; audio_block_t * AudioInputI2SOct::block_ch8 = NULL; uint16_t AudioInputI2SOct::block_offset = 0; bool AudioInputI2SOct::update_responsibility = false; DMAChannel AudioInputI2SOct::dma(false); 1abc: 4a02 ldr r2, [pc, #8] ; (1ac8 <_GLOBAL__sub_I__ZN16AudioInputI2SOct9block_ch1E+0xc>) 1abe: 4903 ldr r1, [pc, #12] ; (1acc <_GLOBAL__sub_I__ZN16AudioInputI2SOct9block_ch1E+0x10>) 1ac0: 4803 ldr r0, [pc, #12] ; (1ad0 <_GLOBAL__sub_I__ZN16AudioInputI2SOct9block_ch1E+0x14>) 1ac2: f00b bd2d b.w d520 <__aeabi_atexit> 1ac6: bf00 nop 1ac8: 200010b4 .word 0x200010b4 1acc: 00001929 .word 0x00001929 1ad0: 2000257c .word 0x2000257c 00001ad4 <_GLOBAL__sub_I__ZN17AudioInputI2SQuad9block_ch1E>: audio_block_t * AudioInputI2SQuad::block_ch2 = NULL; audio_block_t * AudioInputI2SQuad::block_ch3 = NULL; audio_block_t * AudioInputI2SQuad::block_ch4 = NULL; uint16_t AudioInputI2SQuad::block_offset = 0; bool AudioInputI2SQuad::update_responsibility = false; DMAChannel AudioInputI2SQuad::dma(false); 1ad4: 4a02 ldr r2, [pc, #8] ; (1ae0 <_GLOBAL__sub_I__ZN17AudioInputI2SQuad9block_ch1E+0xc>) 1ad6: 4903 ldr r1, [pc, #12] ; (1ae4 <_GLOBAL__sub_I__ZN17AudioInputI2SQuad9block_ch1E+0x10>) 1ad8: 4803 ldr r0, [pc, #12] ; (1ae8 <_GLOBAL__sub_I__ZN17AudioInputI2SQuad9block_ch1E+0x14>) 1ada: f00b bd21 b.w d520 <__aeabi_atexit> 1ade: bf00 nop 1ae0: 200010b4 .word 0x200010b4 1ae4: 00001929 .word 0x00001929 1ae8: 20002594 .word 0x20002594 00001aec <_GLOBAL__sub_I__ZN13AudioInputPDM10block_leftE>: #if defined(__IMXRT1062__) || defined(KINETISK) DMAMEM __attribute__((aligned(32))) static uint32_t pdm_buffer[AUDIO_BLOCK_SAMPLES*4]; static uint32_t leftover[14]; audio_block_t * AudioInputPDM::block_left = NULL; bool AudioInputPDM::update_responsibility = false; DMAChannel AudioInputPDM::dma(false); 1aec: 4a02 ldr r2, [pc, #8] ; (1af8 <_GLOBAL__sub_I__ZN13AudioInputPDM10block_leftE+0xc>) 1aee: 4903 ldr r1, [pc, #12] ; (1afc <_GLOBAL__sub_I__ZN13AudioInputPDM10block_leftE+0x10>) 1af0: 4803 ldr r0, [pc, #12] ; (1b00 <_GLOBAL__sub_I__ZN13AudioInputPDM10block_leftE+0x14>) 1af2: f00b bd15 b.w d520 <__aeabi_atexit> 1af6: bf00 nop 1af8: 200010b4 .word 0x200010b4 1afc: 00001929 .word 0x00001929 1b00: 200024dc .word 0x200024dc 00001b04 <_GLOBAL__sub_I__ZN14AudioInputPDM210block_leftE>: DMAMEM __attribute__((aligned(32))) static uint32_t pdm_buffer[AUDIO_BLOCK_SAMPLES*4]; static uint32_t leftover[14]; audio_block_t * AudioInputPDM2::block_left = NULL; bool AudioInputPDM2::update_responsibility = false; DMAChannel AudioInputPDM2::dma(false); 1b04: 4a02 ldr r2, [pc, #8] ; (1b10 <_GLOBAL__sub_I__ZN14AudioInputPDM210block_leftE+0xc>) 1b06: 4903 ldr r1, [pc, #12] ; (1b14 <_GLOBAL__sub_I__ZN14AudioInputPDM210block_leftE+0x10>) 1b08: 4803 ldr r0, [pc, #12] ; (1b18 <_GLOBAL__sub_I__ZN14AudioInputPDM210block_leftE+0x14>) 1b0a: f00b bd09 b.w d520 <__aeabi_atexit> 1b0e: bf00 nop 1b10: 200010b4 .word 0x200010b4 1b14: 00001929 .word 0x00001929 1b18: 20002504 .word 0x20002504 00001b1c <_GLOBAL__sub_I__ZN16AudioInputSPDIF310block_leftE>: static uint32_t spdif_rx_buffer[AUDIO_BLOCK_SAMPLES * 4]; audio_block_t * AudioInputSPDIF3::block_left = NULL; audio_block_t * AudioInputSPDIF3::block_right = NULL; uint16_t AudioInputSPDIF3::block_offset = 0; bool AudioInputSPDIF3::update_responsibility = false; DMAChannel AudioInputSPDIF3::dma(false); 1b1c: 4a02 ldr r2, [pc, #8] ; (1b28 <_GLOBAL__sub_I__ZN16AudioInputSPDIF310block_leftE+0xc>) 1b1e: 4903 ldr r1, [pc, #12] ; (1b2c <_GLOBAL__sub_I__ZN16AudioInputSPDIF310block_leftE+0x10>) 1b20: 4803 ldr r0, [pc, #12] ; (1b30 <_GLOBAL__sub_I__ZN16AudioInputSPDIF310block_leftE+0x14>) 1b22: f00b bcfd b.w d520 <__aeabi_atexit> 1b26: bf00 nop 1b28: 200010b4 .word 0x200010b4 1b2c: 00001929 .word 0x00001929 1b30: 20002584 .word 0x20002584 00001b34 <_GLOBAL__sub_I__ZN13AudioInputTDM14block_incomingE>: audio_block_t * AudioInputTDM::block_incoming[16] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; bool AudioInputTDM::update_responsibility = false; DMAChannel AudioInputTDM::dma(false); 1b34: 4a02 ldr r2, [pc, #8] ; (1b40 <_GLOBAL__sub_I__ZN13AudioInputTDM14block_incomingE+0xc>) 1b36: 4903 ldr r1, [pc, #12] ; (1b44 <_GLOBAL__sub_I__ZN13AudioInputTDM14block_incomingE+0x10>) 1b38: 4803 ldr r0, [pc, #12] ; (1b48 <_GLOBAL__sub_I__ZN13AudioInputTDM14block_incomingE+0x14>) 1b3a: f00b bcf1 b.w d520 <__aeabi_atexit> 1b3e: bf00 nop 1b40: 200010b4 .word 0x200010b4 1b44: 00001929 .word 0x00001929 1b48: 200024e4 .word 0x200024e4 00001b4c <_GLOBAL__sub_I__ZN14AudioInputTDM214block_incomingE>: audio_block_t * AudioInputTDM2::block_incoming[16] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; bool AudioInputTDM2::update_responsibility = false; DMAChannel AudioInputTDM2::dma(false); 1b4c: 4a02 ldr r2, [pc, #8] ; (1b58 <_GLOBAL__sub_I__ZN14AudioInputTDM214block_incomingE+0xc>) 1b4e: 4903 ldr r1, [pc, #12] ; (1b5c <_GLOBAL__sub_I__ZN14AudioInputTDM214block_incomingE+0x10>) 1b50: 4803 ldr r0, [pc, #12] ; (1b60 <_GLOBAL__sub_I__ZN14AudioInputTDM214block_incomingE+0x14>) 1b52: f00b bce5 b.w d520 <__aeabi_atexit> 1b56: bf00 nop 1b58: 200010b4 .word 0x200010b4 1b5c: 00001929 .word 0x00001929 1b60: 2000250c .word 0x2000250c 00001b64 : } #endif void AudioMixer4::update(void) { 1b64: b5f8 push {r3, r4, r5, r6, r7, lr} audio_block_t *in, *out=NULL; unsigned int channel; for (channel=0; channel < 4; channel++) { 1b66: 2700 movs r7, #0 { 1b68: 4605 mov r5, r0 audio_block_t *in, *out=NULL; 1b6a: 463c mov r4, r7 if (!out) { 1b6c: b3b4 cbz r4, 1bdc if (out) { int32_t mult = multiplier[channel]; if (mult != MULTI_UNITYGAIN) applyGain(out->data, mult); } } else { in = receiveReadOnly(channel); 1b6e: 4639 mov r1, r7 1b70: 4628 mov r0, r5 1b72: f008 fe19 bl a7a8 if (in) { 1b76: b308 cbz r0, 1bbc applyGainThenAdd(out->data, in->data, multiplier[channel]); 1b78: 1dbb adds r3, r7, #6 1b7a: f104 0e04 add.w lr, r4, #4 1b7e: f100 0c04 add.w ip, r0, #4 1b82: f855 6023 ldr.w r6, [r5, r3, lsl #2] if (mult == MULTI_UNITYGAIN) { 1b86: f5b6 3f80 cmp.w r6, #65536 ; 0x10000 1b8a: d047 beq.n 1c1c 1b8c: f500 7182 add.w r1, r0, #260 ; 0x104 uint32_t tmp32 = *src++; // read 2 samples from *data 1b90: f85c 2b04 ldr.w r2, [ip], #4 static inline int32_t signed_multiply_32x16b(int32_t a, uint32_t b) __attribute__((always_inline, unused)); static inline int32_t signed_multiply_32x16b(int32_t a, uint32_t b) { #if defined (__ARM_ARCH_7EM__) int32_t out; asm volatile("smulwb %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); 1b94: fb36 f302 smulwb r3, r6, r2 static inline int32_t signed_multiply_32x16t(int32_t a, uint32_t b) __attribute__((always_inline, unused)); static inline int32_t signed_multiply_32x16t(int32_t a, uint32_t b) { #if defined (__ARM_ARCH_7EM__) int32_t out; asm volatile("smulwt %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); 1b98: fb36 f212 smulwt r2, r6, r2 asm volatile("ssat %0, %1, %2, asr %3" : "=r" (out) : "I" (bits), "r" (val), "I" (rshift)); 1b9c: f303 030f ssat r3, #16, r3 1ba0: f302 020f ssat r2, #16, r2 static inline uint32_t pack_16b_16b(int32_t a, int32_t b) __attribute__((always_inline, unused)); static inline uint32_t pack_16b_16b(int32_t a, int32_t b) { #if defined (__ARM_ARCH_7EM__) int32_t out; asm volatile("pkhbt %0, %1, %2, lsl #16" : "=r" (out) : "r" (b), "r" (a)); 1ba4: eac3 4302 pkhbt r3, r3, r2, lsl #16 // computes (((a[31:16] + b[31:16]) << 16) | (a[15:0 + b[15:0])) (saturates) static inline uint32_t signed_add_16_and_16(uint32_t a, uint32_t b) __attribute__((always_inline, unused)); static inline uint32_t signed_add_16_and_16(uint32_t a, uint32_t b) { int32_t out; asm volatile("qadd16 %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); 1ba8: f8de 2000 ldr.w r2, [lr] 1bac: fa93 f312 qadd16 r3, r3, r2 } while (dst < end); 1bb0: 458c cmp ip, r1 *dst++ = signed_add_16_and_16(tmp32, tmp32b); 1bb2: f84e 3b04 str.w r3, [lr], #4 } while (dst < end); 1bb6: d1eb bne.n 1b90 release(in); 1bb8: f008 fdaa bl a710 for (channel=0; channel < 4; channel++) { 1bbc: 3701 adds r7, #1 1bbe: 2f04 cmp r7, #4 1bc0: d1d4 bne.n 1b6c } } } if (out) { transmit(out); 1bc2: 4628 mov r0, r5 1bc4: 4621 mov r1, r4 1bc6: 2200 movs r2, #0 1bc8: f008 fdca bl a760 release(out); 1bcc: 4620 mov r0, r4 } } 1bce: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} release(out); 1bd2: f008 bd9d b.w a710 for (channel=0; channel < 4; channel++) { 1bd6: 3701 adds r7, #1 1bd8: 2f04 cmp r7, #4 1bda: d03a beq.n 1c52 out = receiveWritable(channel); 1bdc: 4639 mov r1, r7 1bde: 4628 mov r0, r5 1be0: f008 fdee bl a7c0 if (out) { 1be4: 4604 mov r4, r0 1be6: 2800 cmp r0, #0 1be8: d0f5 beq.n 1bd6 int32_t mult = multiplier[channel]; 1bea: 1dbb adds r3, r7, #6 1bec: f855 0023 ldr.w r0, [r5, r3, lsl #2] if (mult != MULTI_UNITYGAIN) applyGain(out->data, mult); 1bf0: f5b0 3f80 cmp.w r0, #65536 ; 0x10000 1bf4: d0e2 beq.n 1bbc 1bf6: 1d21 adds r1, r4, #4 const uint32_t *end = (uint32_t *)(data + AUDIO_BLOCK_SAMPLES); 1bf8: f504 7682 add.w r6, r4, #260 ; 0x104 uint32_t tmp32 = *p; // read 2 samples from *data 1bfc: 680b ldr r3, [r1, #0] asm volatile("smulwb %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); 1bfe: fb30 f203 smulwb r2, r0, r3 asm volatile("smulwt %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); 1c02: fb30 f313 smulwt r3, r0, r3 asm volatile("ssat %0, %1, %2, asr %3" : "=r" (out) : "I" (bits), "r" (val), "I" (rshift)); 1c06: f302 020f ssat r2, #16, r2 1c0a: f303 030f ssat r3, #16, r3 asm volatile("pkhbt %0, %1, %2, lsl #16" : "=r" (out) : "r" (b), "r" (a)); 1c0e: eac2 4303 pkhbt r3, r2, r3, lsl #16 *p++ = pack_16b_16b(val2, val1); 1c12: f841 3b04 str.w r3, [r1], #4 } while (p < end); 1c16: 42b1 cmp r1, r6 1c18: d1f0 bne.n 1bfc 1c1a: e7cf b.n 1bbc 1c1c: f100 020c add.w r2, r0, #12 1c20: f104 030c add.w r3, r4, #12 1c24: f500 7c86 add.w ip, r0, #268 ; 0x10c asm volatile("qadd16 %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); 1c28: f853 1c08 ldr.w r1, [r3, #-8] 1c2c: f852 6c08 ldr.w r6, [r2, #-8] 1c30: fa91 f116 qadd16 r1, r1, r6 *dst++ = signed_add_16_and_16(tmp32, *src++); 1c34: f843 1c08 str.w r1, [r3, #-8] 1c38: f853 1c04 ldr.w r1, [r3, #-4] 1c3c: f852 6c04 ldr.w r6, [r2, #-4] 1c40: fa91 f116 qadd16 r1, r1, r6 } while (dst < end); 1c44: 3208 adds r2, #8 *dst++ = signed_add_16_and_16(tmp32, *src++); 1c46: f843 1c04 str.w r1, [r3, #-4] } while (dst < end); 1c4a: 3308 adds r3, #8 1c4c: 4594 cmp ip, r2 1c4e: d1eb bne.n 1c28 1c50: e7b2 b.n 1bb8 } 1c52: bdf8 pop {r3, r4, r5, r6, r7, pc} 00001c54 <_GLOBAL__sub_I__ZN14AudioOutputI2S14block_left_1stE>: audio_block_t * AudioOutputI2S::block_left_2nd = NULL; audio_block_t * AudioOutputI2S::block_right_2nd = NULL; uint16_t AudioOutputI2S::block_left_offset = 0; uint16_t AudioOutputI2S::block_right_offset = 0; bool AudioOutputI2S::update_responsibility = false; DMAChannel AudioOutputI2S::dma(false); 1c54: 4a02 ldr r2, [pc, #8] ; (1c60 <_GLOBAL__sub_I__ZN14AudioOutputI2S14block_left_1stE+0xc>) 1c56: 4903 ldr r1, [pc, #12] ; (1c64 <_GLOBAL__sub_I__ZN14AudioOutputI2S14block_left_1stE+0x10>) 1c58: 4803 ldr r0, [pc, #12] ; (1c68 <_GLOBAL__sub_I__ZN14AudioOutputI2S14block_left_1stE+0x14>) 1c5a: f00b bc61 b.w d520 <__aeabi_atexit> 1c5e: bf00 nop 1c60: 200010b4 .word 0x200010b4 1c64: 00001929 .word 0x00001929 1c68: 20002514 .word 0x20002514 00001c6c <_GLOBAL__sub_I__ZN15AudioOutputI2S214block_left_1stE>: audio_block_t * AudioOutputI2S2::block_left_2nd = NULL; audio_block_t * AudioOutputI2S2::block_right_2nd = NULL; uint16_t AudioOutputI2S2::block_left_offset = 0; uint16_t AudioOutputI2S2::block_right_offset = 0; bool AudioOutputI2S2::update_responsibility = false; DMAChannel AudioOutputI2S2::dma(false); 1c6c: 4a02 ldr r2, [pc, #8] ; (1c78 <_GLOBAL__sub_I__ZN15AudioOutputI2S214block_left_1stE+0xc>) 1c6e: 4903 ldr r1, [pc, #12] ; (1c7c <_GLOBAL__sub_I__ZN15AudioOutputI2S214block_left_1stE+0x10>) 1c70: 4803 ldr r0, [pc, #12] ; (1c80 <_GLOBAL__sub_I__ZN15AudioOutputI2S214block_left_1stE+0x14>) 1c72: f00b bc55 b.w d520 <__aeabi_atexit> 1c76: bf00 nop 1c78: 200010b4 .word 0x200010b4 1c7c: 00001929 .word 0x00001929 1c80: 2000255c .word 0x2000255c 00001c84 <_GLOBAL__sub_I__ZN17AudioOutputI2SHex13block_ch1_1stE>: uint16_t AudioOutputI2SHex::ch4_offset = 0; uint16_t AudioOutputI2SHex::ch5_offset = 0; uint16_t AudioOutputI2SHex::ch6_offset = 0; bool AudioOutputI2SHex::update_responsibility = false; DMAMEM __attribute__((aligned(32))) static uint32_t i2s_tx_buffer[AUDIO_BLOCK_SAMPLES*3]; DMAChannel AudioOutputI2SHex::dma(false); 1c84: 4a02 ldr r2, [pc, #8] ; (1c90 <_GLOBAL__sub_I__ZN17AudioOutputI2SHex13block_ch1_1stE+0xc>) 1c86: 4903 ldr r1, [pc, #12] ; (1c94 <_GLOBAL__sub_I__ZN17AudioOutputI2SHex13block_ch1_1stE+0x10>) 1c88: 4803 ldr r0, [pc, #12] ; (1c98 <_GLOBAL__sub_I__ZN17AudioOutputI2SHex13block_ch1_1stE+0x14>) 1c8a: f00b bc49 b.w d520 <__aeabi_atexit> 1c8e: bf00 nop 1c90: 200010b4 .word 0x200010b4 1c94: 00001929 .word 0x00001929 1c98: 2000259c .word 0x2000259c 00001c9c <_GLOBAL__sub_I__ZN17AudioOutputI2SOct13block_ch1_1stE>: DMAChannel AudioOutputI2SOct::dma(false); 1c9c: 4a02 ldr r2, [pc, #8] ; (1ca8 <_GLOBAL__sub_I__ZN17AudioOutputI2SOct13block_ch1_1stE+0xc>) 1c9e: 4903 ldr r1, [pc, #12] ; (1cac <_GLOBAL__sub_I__ZN17AudioOutputI2SOct13block_ch1_1stE+0x10>) 1ca0: 4803 ldr r0, [pc, #12] ; (1cb0 <_GLOBAL__sub_I__ZN17AudioOutputI2SOct13block_ch1_1stE+0x14>) 1ca2: f00b bc3d b.w d520 <__aeabi_atexit> 1ca6: bf00 nop 1ca8: 200010b4 .word 0x200010b4 1cac: 00001929 .word 0x00001929 1cb0: 200025a4 .word 0x200025a4 00001cb4 <_GLOBAL__sub_I__ZN18AudioOutputI2SQuad13block_ch1_1stE>: uint16_t AudioOutputI2SQuad::ch2_offset = 0; uint16_t AudioOutputI2SQuad::ch3_offset = 0; uint16_t AudioOutputI2SQuad::ch4_offset = 0; bool AudioOutputI2SQuad::update_responsibility = false; DMAMEM __attribute__((aligned(32))) static uint32_t i2s_tx_buffer[AUDIO_BLOCK_SAMPLES*2]; DMAChannel AudioOutputI2SQuad::dma(false); 1cb4: 4a02 ldr r2, [pc, #8] ; (1cc0 <_GLOBAL__sub_I__ZN18AudioOutputI2SQuad13block_ch1_1stE+0xc>) 1cb6: 4903 ldr r1, [pc, #12] ; (1cc4 <_GLOBAL__sub_I__ZN18AudioOutputI2SQuad13block_ch1_1stE+0x10>) 1cb8: 4803 ldr r0, [pc, #12] ; (1cc8 <_GLOBAL__sub_I__ZN18AudioOutputI2SQuad13block_ch1_1stE+0x14>) 1cba: f00b bc31 b.w d520 <__aeabi_atexit> 1cbe: bf00 nop 1cc0: 200010b4 .word 0x200010b4 1cc4: 00001929 .word 0x00001929 1cc8: 200025c4 .word 0x200025c4 00001ccc <_GLOBAL__sub_I__ZN14AudioOutputMQS14block_left_1stE>: audio_block_t * AudioOutputMQS::block_left_2nd = NULL; audio_block_t * AudioOutputMQS::block_right_2nd = NULL; uint16_t AudioOutputMQS::block_left_offset = 0; uint16_t AudioOutputMQS::block_right_offset = 0; bool AudioOutputMQS::update_responsibility = false; DMAChannel AudioOutputMQS::dma(false); 1ccc: 4a02 ldr r2, [pc, #8] ; (1cd8 <_GLOBAL__sub_I__ZN14AudioOutputMQS14block_left_1stE+0xc>) 1cce: 4903 ldr r1, [pc, #12] ; (1cdc <_GLOBAL__sub_I__ZN14AudioOutputMQS14block_left_1stE+0x10>) 1cd0: 4803 ldr r0, [pc, #12] ; (1ce0 <_GLOBAL__sub_I__ZN14AudioOutputMQS14block_left_1stE+0x14>) 1cd2: f00b bc25 b.w d520 <__aeabi_atexit> 1cd6: bf00 nop 1cd8: 200010b4 .word 0x200010b4 1cdc: 00001929 .word 0x00001929 1ce0: 2000251c .word 0x2000251c 00001ce4 <_GLOBAL__sub_I__ZN17AudioOutputPT821114block_left_1stE>: #if defined(AUDIO_PT8211_OVERSAMPLING) DMAMEM __attribute__((aligned(32))) static uint32_t i2s_tx_buffer[AUDIO_BLOCK_SAMPLES*4]; #else DMAMEM __attribute__((aligned(32))) static uint32_t i2s_tx_buffer[AUDIO_BLOCK_SAMPLES]; #endif DMAChannel AudioOutputPT8211::dma(false); 1ce4: 4a02 ldr r2, [pc, #8] ; (1cf0 <_GLOBAL__sub_I__ZN17AudioOutputPT821114block_left_1stE+0xc>) 1ce6: 4903 ldr r1, [pc, #12] ; (1cf4 <_GLOBAL__sub_I__ZN17AudioOutputPT821114block_left_1stE+0x10>) 1ce8: 4803 ldr r0, [pc, #12] ; (1cf8 <_GLOBAL__sub_I__ZN17AudioOutputPT821114block_left_1stE+0x14>) 1cea: f00b bc19 b.w d520 <__aeabi_atexit> 1cee: bf00 nop 1cf0: 200010b4 .word 0x200010b4 1cf4: 00001929 .word 0x00001929 1cf8: 200025ac .word 0x200025ac 00001cfc <_GLOBAL__sub_I__ZN19AudioOutputPT8211_214block_left_1stE>: DMAChannel AudioOutputPT8211_2::dma(false); 1cfc: 4a02 ldr r2, [pc, #8] ; (1d08 <_GLOBAL__sub_I__ZN19AudioOutputPT8211_214block_left_1stE+0xc>) 1cfe: 4903 ldr r1, [pc, #12] ; (1d0c <_GLOBAL__sub_I__ZN19AudioOutputPT8211_214block_left_1stE+0x10>) 1d00: 4803 ldr r0, [pc, #12] ; (1d10 <_GLOBAL__sub_I__ZN19AudioOutputPT8211_214block_left_1stE+0x14>) 1d02: f00b bc0d b.w d520 <__aeabi_atexit> 1d06: bf00 nop 1d08: 200010b4 .word 0x200010b4 1d0c: 00001929 .word 0x00001929 1d10: 200025cc .word 0x200025cc 00001d14 <__tcf_0>: extern uint8_t analog_write_res; extern const struct _pwm_pin_info_struct pwm_pin_info[]; volatile audio_block_t * AudioOutputPWM::block = NULL; DMAMEM __attribute__((aligned(32))) static uint16_t pwm_tx_buffer[2][AUDIO_BLOCK_SAMPLES * 2]; DMAChannel AudioOutputPWM::dma[2]{{false},{false}}; 1d14: b510 push {r4, lr} release(); 1d16: 4c05 ldr r4, [pc, #20] ; (1d2c <__tcf_0+0x18>) 1d18: f104 0008 add.w r0, r4, #8 1d1c: f008 fe5c bl a9d8 1d20: 4620 mov r0, r4 1d22: e8bd 4010 ldmia.w sp!, {r4, lr} 1d26: f008 be57 b.w a9d8 1d2a: bf00 nop 1d2c: 20002524 .word 0x20002524 00001d30 <_GLOBAL__sub_I__ZN14AudioOutputPWM21update_responsibilityE>: 1d30: 4a02 ldr r2, [pc, #8] ; (1d3c <_GLOBAL__sub_I__ZN14AudioOutputPWM21update_responsibilityE+0xc>) 1d32: 2000 movs r0, #0 1d34: 4902 ldr r1, [pc, #8] ; (1d40 <_GLOBAL__sub_I__ZN14AudioOutputPWM21update_responsibilityE+0x10>) 1d36: f00b bbf3 b.w d520 <__aeabi_atexit> 1d3a: bf00 nop 1d3c: 200010b4 .word 0x200010b4 1d40: 00001d15 .word 0x00001d15 00001d44 <_GLOBAL__sub_I__ZN16AudioOutputSPDIF14block_left_1stE>: audio_block_t * AudioOutputSPDIF::block_left_2nd = NULL; audio_block_t * AudioOutputSPDIF::block_right_2nd = NULL; uint16_t AudioOutputSPDIF::block_left_offset = 0; uint16_t AudioOutputSPDIF::block_right_offset = 0; bool AudioOutputSPDIF::update_responsibility = false; DMAChannel AudioOutputSPDIF::dma(false); 1d44: 4a02 ldr r2, [pc, #8] ; (1d50 <_GLOBAL__sub_I__ZN16AudioOutputSPDIF14block_left_1stE+0xc>) 1d46: 4903 ldr r1, [pc, #12] ; (1d54 <_GLOBAL__sub_I__ZN16AudioOutputSPDIF14block_left_1stE+0x10>) 1d48: 4803 ldr r0, [pc, #12] ; (1d58 <_GLOBAL__sub_I__ZN16AudioOutputSPDIF14block_left_1stE+0x14>) 1d4a: f00b bbe9 b.w d520 <__aeabi_atexit> 1d4e: bf00 nop 1d50: 200010b4 .word 0x200010b4 1d54: 00001929 .word 0x00001929 1d58: 2000258c .word 0x2000258c 00001d5c <_GLOBAL__sub_I__ZN17AudioOutputSPDIF214block_left_1stE>: audio_block_t * AudioOutputSPDIF2::block_left_2nd = NULL; audio_block_t * AudioOutputSPDIF2::block_right_2nd = NULL; uint16_t AudioOutputSPDIF2::block_left_offset = 0; uint16_t AudioOutputSPDIF2::block_right_offset = 0; bool AudioOutputSPDIF2::update_responsibility = false; DMAChannel AudioOutputSPDIF2::dma(false); 1d5c: 4a02 ldr r2, [pc, #8] ; (1d68 <_GLOBAL__sub_I__ZN17AudioOutputSPDIF214block_left_1stE+0xc>) 1d5e: 4903 ldr r1, [pc, #12] ; (1d6c <_GLOBAL__sub_I__ZN17AudioOutputSPDIF214block_left_1stE+0x10>) 1d60: 4803 ldr r0, [pc, #12] ; (1d70 <_GLOBAL__sub_I__ZN17AudioOutputSPDIF214block_left_1stE+0x14>) 1d62: f00b bbdd b.w d520 <__aeabi_atexit> 1d66: bf00 nop 1d68: 200010b4 .word 0x200010b4 1d6c: 00001929 .word 0x00001929 1d70: 200025b4 .word 0x200025b4 00001d74 <_GLOBAL__sub_I__ZN17AudioOutputSPDIF314block_left_1stE>: audio_block_t * AudioOutputSPDIF3::block_left_1st = nullptr; audio_block_t * AudioOutputSPDIF3::block_right_1st = nullptr; audio_block_t * AudioOutputSPDIF3::block_left_2nd = nullptr; audio_block_t * AudioOutputSPDIF3::block_right_2nd = nullptr; bool AudioOutputSPDIF3::update_responsibility = false; DMAChannel AudioOutputSPDIF3::dma(false); 1d74: 4a02 ldr r2, [pc, #8] ; (1d80 <_GLOBAL__sub_I__ZN17AudioOutputSPDIF314block_left_1stE+0xc>) 1d76: 4903 ldr r1, [pc, #12] ; (1d84 <_GLOBAL__sub_I__ZN17AudioOutputSPDIF314block_left_1stE+0x10>) 1d78: 4803 ldr r0, [pc, #12] ; (1d88 <_GLOBAL__sub_I__ZN17AudioOutputSPDIF314block_left_1stE+0x14>) 1d7a: f00b bbd1 b.w d520 <__aeabi_atexit> 1d7e: bf00 nop 1d80: 200010b4 .word 0x200010b4 1d84: 00001929 .word 0x00001929 1d88: 200025bc .word 0x200025bc 00001d8c <_GLOBAL__sub_I__ZN14AudioOutputTDM11block_inputE>: audio_block_t * AudioOutputTDM::block_input[16] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; bool AudioOutputTDM::update_responsibility = false; DMAChannel AudioOutputTDM::dma(false); 1d8c: 4a02 ldr r2, [pc, #8] ; (1d98 <_GLOBAL__sub_I__ZN14AudioOutputTDM11block_inputE+0xc>) 1d8e: 4903 ldr r1, [pc, #12] ; (1d9c <_GLOBAL__sub_I__ZN14AudioOutputTDM11block_inputE+0x10>) 1d90: 4803 ldr r0, [pc, #12] ; (1da0 <_GLOBAL__sub_I__ZN14AudioOutputTDM11block_inputE+0x14>) 1d92: f00b bbc5 b.w d520 <__aeabi_atexit> 1d96: bf00 nop 1d98: 200010b4 .word 0x200010b4 1d9c: 00001929 .word 0x00001929 1da0: 20002534 .word 0x20002534 00001da4 <_GLOBAL__sub_I__ZN15AudioOutputTDM211block_inputE>: audio_block_t * AudioOutputTDM2::block_input[16] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; bool AudioOutputTDM2::update_responsibility = false; DMAChannel AudioOutputTDM2::dma(false); 1da4: 4a02 ldr r2, [pc, #8] ; (1db0 <_GLOBAL__sub_I__ZN15AudioOutputTDM211block_inputE+0xc>) 1da6: 4903 ldr r1, [pc, #12] ; (1db4 <_GLOBAL__sub_I__ZN15AudioOutputTDM211block_inputE+0x10>) 1da8: 4803 ldr r0, [pc, #12] ; (1db8 <_GLOBAL__sub_I__ZN15AudioOutputTDM211block_inputE+0x14>) 1daa: f00b bbb9 b.w d520 <__aeabi_atexit> 1dae: bf00 nop 1db0: 200010b4 .word 0x200010b4 1db4: 00001929 .word 0x00001929 1db8: 20002564 .word 0x20002564 00001dbc : { 1dbc: b538 push {r3, r4, r5, lr} 1dbe: 4604 mov r4, r0 state = STATE_STOP; 1dc0: 230e movs r3, #14 if (block_left) { 1dc2: 6e00 ldr r0, [r0, #96] ; 0x60 data_length = 0; 1dc4: 2500 movs r5, #0 state = STATE_STOP; 1dc6: f884 326f strb.w r3, [r4, #623] ; 0x26f state_play = STATE_STOP; 1dca: f884 3270 strb.w r3, [r4, #624] ; 0x270 data_length = 0; 1dce: 6565 str r5, [r4, #84] ; 0x54 if (block_left) { 1dd0: b110 cbz r0, 1dd8 release(block_left); 1dd2: f008 fc9d bl a710 block_left = NULL; 1dd6: 6625 str r5, [r4, #96] ; 0x60 if (block_right) { 1dd8: 6e60 ldr r0, [r4, #100] ; 0x64 1dda: b118 cbz r0, 1de4 release(block_right); 1ddc: f008 fc98 bl a710 block_right = NULL; 1de0: 2300 movs r3, #0 1de2: 6663 str r3, [r4, #100] ; 0x64 } 1de4: bd38 pop {r3, r4, r5, pc} 1de6: bf00 nop 00001de8 : if (NVIC_IS_ENABLED(IRQ_SOFTWARE)) { 1de8: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 1dec: f8d2 3108 ldr.w r3, [r2, #264] ; 0x108 1df0: f013 0340 ands.w r3, r3, #64 ; 0x40 { 1df4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 1df8: 4604 mov r4, r0 if (NVIC_IS_ENABLED(IRQ_SOFTWARE)) { 1dfa: d008 beq.n 1e0e NVIC_DISABLE_IRQ(IRQ_SOFTWARE); 1dfc: 2340 movs r3, #64 ; 0x40 1dfe: f8c2 3188 str.w r3, [r2, #392] ; 0x188 if (state != STATE_STOP) { 1e02: f890 326f ldrb.w r3, [r0, #623] ; 0x26f 1e06: 2b0e cmp r3, #14 1e08: d06e beq.n 1ee8 irq = true; 1e0a: 2501 movs r5, #1 1e0c: e004 b.n 1e18 if (state != STATE_STOP) { 1e0e: f890 226f ldrb.w r2, [r0, #623] ; 0x26f 1e12: 2a0e cmp r2, #14 1e14: d06d beq.n 1ef2 bool irq = false; 1e16: 461d mov r5, r3 block_left = NULL; 1e18: 2300 movs r3, #0 audio_block_t *b2 = block_right; 1e1a: e9d4 0618 ldrd r0, r6, [r4, #96] ; 0x60 block_right = NULL; 1e1e: e9c4 3318 strd r3, r3, [r4, #96] ; 0x60 state = STATE_STOP; 1e22: 230e movs r3, #14 1e24: f884 326f strb.w r3, [r4, #623] ; 0x26f if (b1) release(b1); 1e28: b108 cbz r0, 1e2e 1e2a: f008 fc71 bl a710 if (b2) release(b2); 1e2e: b116 cbz r6, 1e36 1e30: 4630 mov r0, r6 1e32: f008 fc6d bl a710 if (f) { 1e36: 6aa6 ldr r6, [r4, #40] ; 0x28 1e38: 2e00 cmp r6, #0 1e3a: d049 beq.n 1ed0 f->close(); 1e3c: 6833 ldr r3, [r6, #0] 1e3e: f8df 80f4 ldr.w r8, [pc, #244] ; 1f34 1e42: 6adb ldr r3, [r3, #44] ; 0x2c 1e44: 4543 cmp r3, r8 1e46: d15a bne.n 1efe if (filename) { 1e48: 6db0 ldr r0, [r6, #88] ; 0x58 1e4a: b118 cbz r0, 1e54 free(filename); 1e4c: f00b fb76 bl d53c filename = nullptr; 1e50: 2300 movs r3, #0 1e52: 65b3 str r3, [r6, #88] ; 0x58 1e54: 6d33 ldr r3, [r6, #80] ; 0x50 1e56: 2b00 cmp r3, #0 1e58: d04d beq.n 1ef6 sdfatfile.close(); 1e5a: f106 0018 add.w r0, r6, #24 1e5e: f005 ff87 bl 7d70 if (--(f->refcount) == 0) { 1e62: 6aa7 ldr r7, [r4, #40] ; 0x28 1e64: 687e ldr r6, [r7, #4] 1e66: 3e01 subs r6, #1 1e68: 607e str r6, [r7, #4] 1e6a: 2e00 cmp r6, #0 1e6c: d12e bne.n 1ecc f->close(); 1e6e: 683b ldr r3, [r7, #0] 1e70: 6adb ldr r3, [r3, #44] ; 0x2c 1e72: 4543 cmp r3, r8 1e74: d14a bne.n 1f0c if (filename) { 1e76: 6db8 ldr r0, [r7, #88] ; 0x58 1e78: b110 cbz r0, 1e80 free(filename); 1e7a: f00b fb5f bl d53c filename = nullptr; 1e7e: 65be str r6, [r7, #88] ; 0x58 1e80: 6d3b ldr r3, [r7, #80] ; 0x50 1e82: 2b00 cmp r3, #0 1e84: d03e beq.n 1f04 sdfatfile.close(); 1e86: f107 0018 add.w r0, r7, #24 1e8a: f005 ff71 bl 7d70 delete f; 1e8e: 6aa6 ldr r6, [r4, #40] ; 0x28 1e90: b1e6 cbz r6, 1ecc 1e92: 6833 ldr r3, [r6, #0] 1e94: 4a22 ldr r2, [pc, #136] ; (1f20 ) 1e96: 685b ldr r3, [r3, #4] 1e98: 4293 cmp r3, r2 1e9a: d13e bne.n 1f1a virtual ~SDFile(void) { 1e9c: 4b21 ldr r3, [pc, #132] ; (1f24 ) if (filename) { 1e9e: 6db0 ldr r0, [r6, #88] ; 0x58 virtual ~SDFile(void) { 1ea0: 6033 str r3, [r6, #0] if (filename) { 1ea2: b118 cbz r0, 1eac free(filename); 1ea4: f00b fb4a bl d53c filename = nullptr; 1ea8: 2300 movs r3, #0 1eaa: 65b3 str r3, [r6, #88] ; 0x58 1eac: 6d33 ldr r3, [r6, #80] ; 0x50 sdfatfile.close(); 1eae: f106 0718 add.w r7, r6, #24 1eb2: b373 cbz r3, 1f12 1eb4: 4638 mov r0, r7 1eb6: f005 ff5b bl 7d70 1eba: 4b1b ldr r3, [pc, #108] ; (1f28 ) ~FsBaseFile() {close();} 1ebc: 4638 mov r0, r7 1ebe: 60b3 str r3, [r6, #8] 1ec0: f005 ff56 bl 7d70 } 1ec4: 215c movs r1, #92 ; 0x5c 1ec6: 4630 mov r0, r6 1ec8: f009 fb04 bl b4d4 } f = nullptr; 1ecc: 2300 movs r3, #0 1ece: 62a3 str r3, [r4, #40] ; 0x28 SPI.usingInterrupt(IRQ_SOFTWARE); AudioUsingSPICount++; } static inline void AudioStopUsingSPI(void) { if (AudioUsingSPICount == 0 || --AudioUsingSPICount == 0) 1ed0: 4a16 ldr r2, [pc, #88] ; (1f2c ) 1ed2: 8813 ldrh r3, [r2, #0] 1ed4: b11b cbz r3, 1ede 1ed6: 3b01 subs r3, #1 1ed8: b29b uxth r3, r3 1eda: 8013 strh r3, [r2, #0] 1edc: b91b cbnz r3, 1ee6 SPI.notUsingInterrupt(IRQ_SOFTWARE); 1ede: 2146 movs r1, #70 ; 0x46 1ee0: 4813 ldr r0, [pc, #76] ; (1f30 ) 1ee2: f000 fedd bl 2ca0 if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 1ee6: b125 cbz r5, 1ef2 1ee8: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 1eec: 2240 movs r2, #64 ; 0x40 1eee: f8c3 2108 str.w r2, [r3, #264] ; 0x108 } 1ef2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} bool isOpen() const {return m_fFile || m_xFile;} 1ef6: 6d73 ldr r3, [r6, #84] ; 0x54 1ef8: 2b00 cmp r3, #0 1efa: d1ae bne.n 1e5a 1efc: e7b1 b.n 1e62 f->close(); 1efe: 4630 mov r0, r6 1f00: 4798 blx r3 1f02: e7ae b.n 1e62 1f04: 6d7b ldr r3, [r7, #84] ; 0x54 1f06: 2b00 cmp r3, #0 1f08: d1bd bne.n 1e86 1f0a: e7c0 b.n 1e8e f->close(); 1f0c: 4638 mov r0, r7 1f0e: 4798 blx r3 1f10: e7bd b.n 1e8e 1f12: 6d73 ldr r3, [r6, #84] ; 0x54 1f14: 2b00 cmp r3, #0 1f16: d1cd bne.n 1eb4 1f18: e7cf b.n 1eba delete f; 1f1a: 4630 mov r0, r6 1f1c: 4798 blx r3 1f1e: e7d5 b.n 1ecc 1f20: 00000835 .word 0x00000835 1f24: 20000a00 .word 0x20000a00 1f28: 200008e0 .word 0x200008e0 1f2c: 20002dd4 .word 0x20002dd4 1f30: 20001048 .word 0x20001048 1f34: 00000121 .word 0x00000121 00001f38 : { 1f38: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 1f3c: b096 sub sp, #88 ; 0x58 1f3e: 4606 mov r6, r0 1f40: 460c mov r4, r1 stop(); 1f42: f7ff ff51 bl 1de8 if (NVIC_IS_ENABLED(IRQ_SOFTWARE)) { 1f46: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 1f4a: f8d3 5108 ldr.w r5, [r3, #264] ; 0x108 1f4e: f015 0540 ands.w r5, r5, #64 ; 0x40 1f52: d003 beq.n 1f5c NVIC_DISABLE_IRQ(IRQ_SOFTWARE); 1f54: 2240 movs r2, #64 ; 0x40 irq = true; 1f56: 2501 movs r5, #1 NVIC_DISABLE_IRQ(IRQ_SOFTWARE); 1f58: f8c3 2188 str.w r2, [r3, #392] ; 0x188 AudioUsingSPICount++; 1f5c: f8df 81e0 ldr.w r8, [pc, #480] ; 2140 SPI.usingInterrupt(IRQ_SOFTWARE); 1f60: 2146 movs r1, #70 ; 0x46 1f62: 486f ldr r0, [pc, #444] ; (2120 ) 1f64: f000 fe88 bl 2c78 AudioUsingSPICount++; 1f68: f8b8 3000 ldrh.w r3, [r8] SDFAT_FILE file = sdfs.open(filepath, flags); 1f6c: 4622 mov r2, r4 1f6e: 496d ldr r1, [pc, #436] ; (2124 ) 1f70: 3301 adds r3, #1 1f72: a802 add r0, sp, #8 1f74: f8a8 3000 strh.w r3, [r8] 1f78: 2300 movs r3, #0 1f7a: f006 f813 bl 7fa4 1f7e: 9b14 ldr r3, [sp, #80] ; 0x50 1f80: 2b00 cmp r3, #0 1f82: f000 80a9 beq.w 20d8 if (file) return File(new SDFile(file)); 1f86: 205c movs r0, #92 ; 0x5c class FileImpl { 1f88: 2700 movs r7, #0 1f8a: f009 faa1 bl b4d0 class Print 1f8e: 9b03 ldr r3, [sp, #12] 1f90: 4604 mov r4, r0 1f92: 6047 str r7, [r0, #4] 1f94: 60c3 str r3, [r0, #12] 1f96: a906 add r1, sp, #24 class Stream : public Print 1f98: 9b04 ldr r3, [sp, #16] 1f9a: 3018 adds r0, #24 1f9c: f8df 91a4 ldr.w r9, [pc, #420] ; 2144 1fa0: f840 3c08 str.w r3, [r0, #-8] 1fa4: f89d 3014 ldrb.w r3, [sp, #20] 1fa8: f800 3c04 strb.w r3, [r0, #-4] SDFile(const SDFAT_FILE &file) : sdfatfile(file), filename(nullptr) { } 1fac: 4b5e ldr r3, [pc, #376] ; (2128 ) 1fae: f840 3c18 str.w r3, [r0, #-24] 1fb2: 4b5e ldr r3, [pc, #376] ; (212c ) 1fb4: f840 3c10 str.w r3, [r0, #-16] 1fb8: f005 fe98 bl 7cec if (f) f->refcount++; 1fbc: 6863 ldr r3, [r4, #4] 1fbe: 65a7 str r7, [r4, #88] ; 0x58 ~FsBaseFile() {close();} 1fc0: a806 add r0, sp, #24 1fc2: 3301 adds r3, #1 1fc4: f8cd 9008 str.w r9, [sp, #8] 1fc8: 6063 str r3, [r4, #4] class FsFile : public StreamFile { 1fca: 4b59 ldr r3, [pc, #356] ; (2130 ) 1fcc: 60a3 str r3, [r4, #8] ~FsBaseFile() {close();} 1fce: f005 fecf bl 7d70 if (f) { dec_refcount(); /*Serial.println("File move assignment autoclose");*/ } 1fd2: 6ab7 ldr r7, [r6, #40] ; 0x28 1fd4: 2f00 cmp r7, #0 1fd6: d054 beq.n 2082 if (--(f->refcount) == 0) { 1fd8: 687b ldr r3, [r7, #4] 1fda: 3b01 subs r3, #1 1fdc: 607b str r3, [r7, #4] 1fde: 9301 str r3, [sp, #4] 1fe0: 2b00 cmp r3, #0 1fe2: d132 bne.n 204a f->close(); 1fe4: 683a ldr r2, [r7, #0] 1fe6: 4953 ldr r1, [pc, #332] ; (2134 ) 1fe8: 6ad2 ldr r2, [r2, #44] ; 0x2c 1fea: 428a cmp r2, r1 1fec: f040 808d bne.w 210a if (filename) { 1ff0: 6db8 ldr r0, [r7, #88] ; 0x58 1ff2: b118 cbz r0, 1ffc free(filename); 1ff4: f00b faa2 bl d53c filename = nullptr; 1ff8: 9b01 ldr r3, [sp, #4] 1ffa: 65bb str r3, [r7, #88] ; 0x58 bool isOpen() const {return m_fFile || m_xFile;} 1ffc: 6d3b ldr r3, [r7, #80] ; 0x50 1ffe: 2b00 cmp r3, #0 2000: d07e beq.n 2100 sdfatfile.close(); 2002: f107 0018 add.w r0, r7, #24 2006: f005 feb3 bl 7d70 delete f; 200a: 6ab7 ldr r7, [r6, #40] ; 0x28 200c: b1ef cbz r7, 204a 200e: 683b ldr r3, [r7, #0] 2010: 4a49 ldr r2, [pc, #292] ; (2138 ) 2012: 685b ldr r3, [r3, #4] 2014: 4293 cmp r3, r2 2016: d17f bne.n 2118 virtual ~SDFile(void) { 2018: 4b43 ldr r3, [pc, #268] ; (2128 ) if (filename) { 201a: 6db8 ldr r0, [r7, #88] ; 0x58 virtual ~SDFile(void) { 201c: 603b str r3, [r7, #0] if (filename) { 201e: b118 cbz r0, 2028 free(filename); 2020: f00b fa8c bl d53c filename = nullptr; 2024: 2300 movs r3, #0 2026: 65bb str r3, [r7, #88] ; 0x58 2028: 6d3b ldr r3, [r7, #80] ; 0x50 sdfatfile.close(); 202a: f107 0a18 add.w sl, r7, #24 202e: 2b00 cmp r3, #0 2030: d06e beq.n 2110 2032: 4650 mov r0, sl 2034: f005 fe9c bl 7d70 ~FsBaseFile() {close();} 2038: 4650 mov r0, sl 203a: f8c7 9008 str.w r9, [r7, #8] 203e: f005 fe97 bl 7d70 } 2042: 4638 mov r0, r7 2044: 215c movs r1, #92 ; 0x5c 2046: f009 fa45 bl b4d4 f = file.f; 204a: 62b4 str r4, [r6, #40] ; 0x28 return (f) ? f->isOpen() : false; 204c: b31c cbz r4, 2096 204e: 6823 ldr r3, [r4, #0] 2050: 4a3a ldr r2, [pc, #232] ; (213c ) 2052: 6b1b ldr r3, [r3, #48] ; 0x30 2054: 4293 cmp r3, r2 2056: d11a bne.n 208e bool isOpen() const {return m_fFile || m_xFile;} 2058: 6d23 ldr r3, [r4, #80] ; 0x50 205a: 2b00 cmp r3, #0 205c: d04c beq.n 20f8 buffer_offset = 0; 205e: 2300 movs r3, #0 data_length = 20; 2060: 2114 movs r1, #20 buffer_length = 0; 2062: f04f 6200 mov.w r2, #134217728 ; 0x8000000 buffer_offset = 0; 2066: f8a6 326a strh.w r3, [r6, #618] ; 0x26a state_play = STATE_STOP; 206a: 230e movs r3, #14 data_length = 20; 206c: 6571 str r1, [r6, #84] ; 0x54 buffer_length = 0; 206e: f8c6 226c str.w r2, [r6, #620] ; 0x26c state_play = STATE_STOP; 2072: f886 3270 strb.w r3, [r6, #624] ; 0x270 if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 2076: bb35 cbnz r5, 20c6 return true; 2078: 2501 movs r5, #1 } 207a: 4628 mov r0, r5 207c: b016 add sp, #88 ; 0x58 207e: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 2082: 6823 ldr r3, [r4, #0] 2084: 4a2d ldr r2, [pc, #180] ; (213c ) 2086: 6b1b ldr r3, [r3, #48] ; 0x30 f = file.f; 2088: 62b4 str r4, [r6, #40] ; 0x28 return (f) ? f->isOpen() : false; 208a: 4293 cmp r3, r2 208c: d0e4 beq.n 2058 208e: 4620 mov r0, r4 2090: 4798 blx r3 2092: 2800 cmp r0, #0 2094: d1e3 bne.n 205e if (AudioUsingSPICount == 0 || --AudioUsingSPICount == 0) 2096: f8b8 3000 ldrh.w r3, [r8] 209a: b123 cbz r3, 20a6 209c: 3b01 subs r3, #1 209e: b29b uxth r3, r3 20a0: f8a8 3000 strh.w r3, [r8] 20a4: b91b cbnz r3, 20ae SPI.notUsingInterrupt(IRQ_SOFTWARE); 20a6: 2146 movs r1, #70 ; 0x46 20a8: 481d ldr r0, [pc, #116] ; (2120 ) 20aa: f000 fdf9 bl 2ca0 if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 20ae: 2d00 cmp r5, #0 20b0: d0e3 beq.n 207a return false; 20b2: 2500 movs r5, #0 if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 20b4: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 20b8: 2240 movs r2, #64 ; 0x40 } 20ba: 4628 mov r0, r5 if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 20bc: f8c3 2108 str.w r2, [r3, #264] ; 0x108 } 20c0: b016 add sp, #88 ; 0x58 20c2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 20c6: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 20ca: 2240 movs r2, #64 ; 0x40 } 20cc: 4628 mov r0, r5 if (irq) NVIC_ENABLE_IRQ(IRQ_SOFTWARE); 20ce: f8c3 2108 str.w r2, [r3, #264] ; 0x108 } 20d2: b016 add sp, #88 ; 0x58 20d4: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 20d8: 9c15 ldr r4, [sp, #84] ; 0x54 20da: 2c00 cmp r4, #0 20dc: f47f af53 bne.w 1f86 20e0: f8df 9060 ldr.w r9, [pc, #96] ; 2144 ~FsBaseFile() {close();} 20e4: a806 add r0, sp, #24 20e6: f8cd 9008 str.w r9, [sp, #8] 20ea: f005 fe41 bl 7d70 if (f) { dec_refcount(); /*Serial.println("File move assignment autoclose");*/ } 20ee: 6ab7 ldr r7, [r6, #40] ; 0x28 20f0: 2f00 cmp r7, #0 20f2: f47f af71 bne.w 1fd8 20f6: e7ce b.n 2096 bool isOpen() const {return m_fFile || m_xFile;} 20f8: 6d63 ldr r3, [r4, #84] ; 0x54 20fa: 2b00 cmp r3, #0 20fc: d1af bne.n 205e 20fe: e7ca b.n 2096 2100: 6d7b ldr r3, [r7, #84] ; 0x54 2102: 2b00 cmp r3, #0 2104: f47f af7d bne.w 2002 2108: e77f b.n 200a f->close(); 210a: 4638 mov r0, r7 210c: 4790 blx r2 210e: e77c b.n 200a 2110: 6d7b ldr r3, [r7, #84] ; 0x54 2112: 2b00 cmp r3, #0 2114: d18d bne.n 2032 2116: e78f b.n 2038 delete f; 2118: 4638 mov r0, r7 211a: 4798 blx r3 211c: e795 b.n 204a 211e: bf00 nop 2120: 20001048 .word 0x20001048 2124: 20001f44 .word 0x20001f44 2128: 20000a00 .word 0x20000a00 212c: 20000a5c .word 0x20000a5c 2130: 200009dc .word 0x200009dc 2134: 00000121 .word 0x00000121 2138: 00000835 .word 0x00000835 213c: 00000071 .word 0x00000071 2140: 20002dd4 .word 0x20002dd4 2144: 200008e0 .word 0x200008e0 00002148 : uint16_t format; uint16_t channels; uint32_t rate, b2m; uint16_t bits; format = header[0]; 2148: 6ac2 ldr r2, [r0, #44] ; 0x2c //Serial.print(" format = "); //Serial.println(format); if (format != 1) return false; 214a: b291 uxth r1, r2 214c: 2901 cmp r1, #1 214e: d112 bne.n 2176 rate = header[1]; 2150: 6b01 ldr r1, [r0, #48] ; 0x30 2152: 4603 mov r3, r0 //Serial.print(" rate = "); //Serial.println(rate); if (rate == 44100) { 2154: f64a 4044 movw r0, #44100 ; 0xac44 2158: 4281 cmp r1, r0 { 215a: b410 push {r4} if (rate == 44100) { 215c: d00d beq.n 217a b2m = B2M_44100; } else if (rate == 22050) { 215e: f245 6022 movw r0, #22050 ; 0x5622 2162: 4281 cmp r1, r0 2164: d025 beq.n 21b2 b2m = B2M_22050; num |= 4; } else if (rate == 11025) { 2166: f642 3011 movw r0, #11025 ; 0x2b11 216a: 4281 cmp r1, r0 216c: d01e beq.n 21ac if (format != 1) return false; 216e: 2000 movs r0, #0 // if they're not the expected values, all we could do is // return false. Do any real wav files have unexpected // values in these other fields? state_play = num; return true; } 2170: f85d 4b04 ldr.w r4, [sp], #4 2174: 4770 bx lr if (format != 1) return false; 2176: 2000 movs r0, #0 } 2178: 4770 bx lr b2m = B2M_44100; 217a: 4c0f ldr r4, [pc, #60] ; (21b8 ) uint8_t num = 0; 217c: 2100 movs r1, #0 channels = header[0] >> 16; 217e: 0c12 lsrs r2, r2, #16 if (channels == 1) { 2180: 2a01 cmp r2, #1 2182: d004 beq.n 218e } else if (channels == 2) { 2184: 2a02 cmp r2, #2 2186: d1f2 bne.n 216e b2m >>= 1; 2188: 0864 lsrs r4, r4, #1 num |= 1; 218a: f041 0101 orr.w r1, r1, #1 bits = header[3] >> 16; 218e: 8f5a ldrh r2, [r3, #58] ; 0x3a if (bits == 8) { 2190: 2a08 cmp r2, #8 2192: d004 beq.n 219e } else if (bits == 16) { 2194: 2a10 cmp r2, #16 2196: d1ea bne.n 216e b2m >>= 1; 2198: 0864 lsrs r4, r4, #1 num |= 2; 219a: f041 0102 orr.w r1, r1, #2 state_play = num; 219e: f883 1270 strb.w r1, [r3, #624] ; 0x270 return true; 21a2: 2001 movs r0, #1 bytes2millis = b2m; 21a4: 65dc str r4, [r3, #92] ; 0x5c } 21a6: f85d 4b04 ldr.w r4, [sp], #4 21aa: 4770 bx lr b2m = B2M_11025; 21ac: 4c03 ldr r4, [pc, #12] ; (21bc ) num |= 4; 21ae: 2104 movs r1, #4 21b0: e7e5 b.n 217e b2m = B2M_22050; 21b2: 4c03 ldr r4, [pc, #12] ; (21c0 ) num |= 4; 21b4: 2104 movs r1, #4 21b6: e7e2 b.n 217e 21b8: 05ce13bc .word 0x05ce13bc 21bc: 17384ef2 .word 0x17384ef2 21c0: 0b9c2779 .word 0x0b9c2779 000021c4 : { 21c4: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} p = buffer + buffer_offset; 21c8: f8b0 326a ldrh.w r3, [r0, #618] ; 0x26a 21cc: f100 066a add.w r6, r0, #106 ; 0x6a { 21d0: b083 sub sp, #12 p = buffer + buffer_offset; 21d2: eb06 0b03 add.w fp, r6, r3 if (size == 0) return false; 21d6: b309 cbz r1, 221c 21d8: 4604 mov r4, r0 21da: 460d mov r5, r1 data_length = 8; 21dc: 2708 movs r7, #8 header_offset = 0; 21de: f44f 6820 mov.w r8, #2560 ; 0xa00 if (header[0] == 0x61746164) { 21e2: f8df a364 ldr.w sl, [pc, #868] ; 2548 if (header[0] == 0x46464952 && header[2] == 0x45564157) { 21e6: f8df 9364 ldr.w r9, [pc, #868] ; 254c switch (state) { 21ea: f894 326f ldrb.w r3, [r4, #623] ; 0x26f 21ee: 2b0e cmp r3, #14 21f0: f200 812d bhi.w 244e 21f4: e8df f013 tbh [pc, r3, lsl #1] 21f8: 00120012 .word 0x00120012 21fc: 00d800f1 .word 0x00d800f1 2200: 00120012 .word 0x00120012 2204: 00120012 .word 0x00120012 2208: 007300a0 .word 0x007300a0 220c: 002b003c .word 0x002b003c 2210: 012b0016 .word 0x012b0016 2214: 0012 .short 0x0012 if (data_length == 0) break; 2216: 2b00 cmp r3, #0 2218: f000 80d8 beq.w 23cc switch (state) { 221c: 2000 movs r0, #0 } 221e: b003 add sp, #12 2220: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} len = data_length; 2224: 6d62 ldr r2, [r4, #84] ; 0x54 if (size < len) len = size; 2226: 462b mov r3, r5 buffer_offset += len; 2228: f8b4 126a ldrh.w r1, [r4, #618] ; 0x26a 222c: 4295 cmp r5, r2 222e: bf28 it cs 2230: 4613 movcs r3, r2 2232: 4419 add r1, r3 if (data_length > 0) return false; 2234: 1ad2 subs r2, r2, r3 buffer_offset += len; 2236: f8a4 126a strh.w r1, [r4, #618] ; 0x26a if (data_length > 0) return false; 223a: f040 8177 bne.w 252c size -= len; 223e: 1aed subs r5, r5, r3 p += len; 2240: 449b add fp, r3 data_length = 8; 2242: 6567 str r7, [r4, #84] ; 0x54 state = STATE_PARSE1; 2244: f884 726f strb.w r7, [r4, #623] ; 0x26f if (size == 0) return false; 2248: 2d00 cmp r5, #0 224a: d1ce bne.n 21ea 224c: e7e6 b.n 221c if (size < data_length) { 224e: 6d62 ldr r2, [r4, #84] ; 0x54 2250: 42aa cmp r2, r5 2252: f200 816d bhi.w 2530 buffer_offset += data_length; 2256: f8b4 326a ldrh.w r3, [r4, #618] ; 0x26a p += data_length; 225a: 4493 add fp, r2 size -= data_length; 225c: 1aad subs r5, r5, r2 data_length = 8; 225e: 6567 str r7, [r4, #84] ; 0x54 buffer_offset += data_length; 2260: 441a add r2, r3 header_offset = 0; 2262: f8a4 826e strh.w r8, [r4, #622] ; 0x26e buffer_offset += data_length; 2266: f8a4 226a strh.w r2, [r4, #618] ; 0x26a if (size == 0) return false; 226a: 2d00 cmp r5, #0 226c: d1bd bne.n 21ea 226e: e7d5 b.n 221c if (size < len) len = size; 2270: 6d62 ldr r2, [r4, #84] ; 0x54 memcpy((uint8_t *)header + header_offset, p, len); 2272: f104 002c add.w r0, r4, #44 ; 0x2c 2276: f894 326e ldrb.w r3, [r4, #622] ; 0x26e 227a: 4659 mov r1, fp 227c: 42aa cmp r2, r5 227e: 4418 add r0, r3 2280: bf28 it cs 2282: 462a movcs r2, r5 2284: 9201 str r2, [sp, #4] 2286: f009 f889 bl b39c header_offset += len; 228a: 9a01 ldr r2, [sp, #4] 228c: f894 326e ldrb.w r3, [r4, #622] ; 0x26e 2290: 4413 add r3, r2 2292: f884 326e strb.w r3, [r4, #622] ; 0x26e buffer_offset += len; 2296: f8b4 326a ldrh.w r3, [r4, #618] ; 0x26a 229a: 4413 add r3, r2 229c: f8a4 326a strh.w r3, [r4, #618] ; 0x26a data_length -= len; 22a0: 6d63 ldr r3, [r4, #84] ; 0x54 22a2: 1a9b subs r3, r3, r2 22a4: 6563 str r3, [r4, #84] ; 0x54 if (data_length > 0) return false; 22a6: 2b00 cmp r3, #0 22a8: d1b8 bne.n 221c if (header[0] == 0x61746164) { 22aa: 6ae1 ldr r1, [r4, #44] ; 0x2c p += len; 22ac: 4493 add fp, r2 size -= len; 22ae: 1aad subs r5, r5, r2 data_length = header[1]; 22b0: 6b22 ldr r2, [r4, #48] ; 0x30 if (header[0] == 0x61746164) { 22b2: 4551 cmp r1, sl data_length = header[1]; 22b4: 6562 str r2, [r4, #84] ; 0x54 if (header[0] == 0x61746164) { 22b6: f040 80d3 bne.w 2460 leftover_bytes = 0; 22ba: f884 3271 strb.w r3, [r4, #625] ; 0x271 state = state_play; 22be: f894 3270 ldrb.w r3, [r4, #624] ; 0x270 22c2: f884 326f strb.w r3, [r4, #623] ; 0x26f if (state & 1) { 22c6: 07db lsls r3, r3, #31 22c8: d505 bpl.n 22d6 block_right = allocate(); 22ca: f008 f9cb bl a664 22ce: 6660 str r0, [r4, #100] ; 0x64 if (!block_right) return false; 22d0: 2800 cmp r0, #0 22d2: d0a3 beq.n 221c total_length = data_length; 22d4: 6d62 ldr r2, [r4, #84] ; 0x54 22d6: 65a2 str r2, [r4, #88] ; 0x58 if (size == 0) return false; 22d8: 2d00 cmp r5, #0 22da: d186 bne.n 21ea 22dc: e79e b.n 221c if (size < len) len = size; 22de: 6d62 ldr r2, [r4, #84] ; 0x54 memcpy((uint8_t *)header + header_offset, p, len); 22e0: f104 002c add.w r0, r4, #44 ; 0x2c 22e4: f894 326e ldrb.w r3, [r4, #622] ; 0x26e 22e8: 4659 mov r1, fp 22ea: 42aa cmp r2, r5 22ec: 4418 add r0, r3 22ee: bf28 it cs 22f0: 462a movcs r2, r5 22f2: 9201 str r2, [sp, #4] 22f4: f009 f852 bl b39c header_offset += len; 22f8: 9a01 ldr r2, [sp, #4] 22fa: f894 326e ldrb.w r3, [r4, #622] ; 0x26e 22fe: 4413 add r3, r2 2300: f884 326e strb.w r3, [r4, #622] ; 0x26e buffer_offset += len; 2304: f8b4 326a ldrh.w r3, [r4, #618] ; 0x26a 2308: 4413 add r3, r2 230a: f8a4 326a strh.w r3, [r4, #618] ; 0x26a data_length -= len; 230e: 6d63 ldr r3, [r4, #84] ; 0x54 2310: 1a9b subs r3, r3, r2 2312: 6563 str r3, [r4, #84] ; 0x54 if (data_length > 0) return false; 2314: 2b00 cmp r3, #0 2316: d181 bne.n 221c if (parse_format()) { 2318: 4620 mov r0, r4 231a: f7ff ff15 bl 2148 231e: 2800 cmp r0, #0 2320: f000 8095 beq.w 244e p += len; 2324: 9a01 ldr r2, [sp, #4] data_length = 8; 2326: 6567 str r7, [r4, #84] ; 0x54 size -= len; 2328: 1aad subs r5, r5, r2 p += len; 232a: 4493 add fp, r2 header_offset = 0; 232c: f8a4 826e strh.w r8, [r4, #622] ; 0x26e if (size == 0) return false; 2330: 2d00 cmp r5, #0 2332: f47f af5a bne.w 21ea 2336: e771 b.n 221c if (size < len) len = size; 2338: 6d62 ldr r2, [r4, #84] ; 0x54 memcpy((uint8_t *)header + header_offset, p, len); 233a: f104 002c add.w r0, r4, #44 ; 0x2c 233e: f894 326e ldrb.w r3, [r4, #622] ; 0x26e 2342: 4659 mov r1, fp 2344: 42aa cmp r2, r5 2346: 4418 add r0, r3 2348: bf28 it cs 234a: 462a movcs r2, r5 234c: 9201 str r2, [sp, #4] 234e: f009 f825 bl b39c header_offset += len; 2352: 9a01 ldr r2, [sp, #4] 2354: f894 326e ldrb.w r3, [r4, #622] ; 0x26e 2358: 4413 add r3, r2 235a: f884 326e strb.w r3, [r4, #622] ; 0x26e buffer_offset += len; 235e: f8b4 326a ldrh.w r3, [r4, #618] ; 0x26a 2362: 4413 add r3, r2 2364: f8a4 326a strh.w r3, [r4, #618] ; 0x26a data_length -= len; 2368: 6d63 ldr r3, [r4, #84] ; 0x54 236a: 1a9b subs r3, r3, r2 236c: 6563 str r3, [r4, #84] ; 0x54 if (data_length > 0) return false; 236e: 2b00 cmp r3, #0 2370: f47f af54 bne.w 221c if (header[0] == 0x46464952 && header[2] == 0x45564157) { 2374: 6ae3 ldr r3, [r4, #44] ; 0x2c 2376: 454b cmp r3, r9 2378: d169 bne.n 244e 237a: 6b63 ldr r3, [r4, #52] ; 0x34 237c: 4971 ldr r1, [pc, #452] ; (2544 ) 237e: 428b cmp r3, r1 2380: d165 bne.n 244e if (header[3] == 0x20746D66) { 2382: f101 415b add.w r1, r1, #3674210304 ; 0xdb000000 2386: 6ba3 ldr r3, [r4, #56] ; 0x38 2388: f501 11f1 add.w r1, r1, #1974272 ; 0x1e2000 238c: f601 410f addw r1, r1, #3087 ; 0xc0f 2390: 428b cmp r3, r1 2392: d16c bne.n 246e if (header[4] < 16) { 2394: 6be3 ldr r3, [r4, #60] ; 0x3c if (header[4] > sizeof(header)) { 2396: f1a3 0110 sub.w r1, r3, #16 239a: 2918 cmp r1, #24 239c: d857 bhi.n 244e header_offset = 0; 239e: f44f 6110 mov.w r1, #2304 ; 0x900 23a2: f8a4 126e strh.w r1, [r4, #622] ; 0x26e 23a6: e067 b.n 2478 if (size > data_length) size = data_length; 23a8: 6d62 ldr r2, [r4, #84] ; 0x54 if (leftover_bytes) { 23aa: f894 1271 ldrb.w r1, [r4, #625] ; 0x271 23ae: 4295 cmp r5, r2 23b0: bf28 it cs 23b2: 4615 movcs r5, r2 data_length -= size; 23b4: 1b52 subs r2, r2, r5 23b6: 6562 str r2, [r4, #84] ; 0x54 if (leftover_bytes) { 23b8: 2900 cmp r1, #0 23ba: d164 bne.n 2486 if (size == 0) { 23bc: 3d02 subs r5, #2 23be: f8bb 7000 ldrh.w r7, [fp] 23c2: f040 8082 bne.w 24ca if (data_length == 0) break; 23c6: 2a00 cmp r2, #0 23c8: f040 80aa bne.w 2520 state = STATE_STOP; 23cc: 230e movs r3, #14 return false; 23ce: 2000 movs r0, #0 state = STATE_STOP; 23d0: f884 326f strb.w r3, [r4, #623] ; 0x26f } 23d4: b003 add sp, #12 23d6: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} if (size > data_length) size = data_length; 23da: 6d63 ldr r3, [r4, #84] ; 0x54 block_left->data[block_offset++] = (msb << 8) | lsb; 23dc: 6e21 ldr r1, [r4, #96] ; 0x60 23de: 429d cmp r5, r3 block_left->data[block_offset] = header[0]; 23e0: f8b4 2068 ldrh.w r2, [r4, #104] ; 0x68 23e4: bf28 it cs 23e6: 461d movcs r5, r3 data_length -= size; 23e8: 1b5b subs r3, r3, r5 23ea: 6563 str r3, [r4, #84] ; 0x54 23ec: e002 b.n 23f4 if (size == 0) { 23ee: 2d00 cmp r5, #0 23f0: f43f af11 beq.w 2216 block_left->data[block_offset++] = (msb << 8) | lsb; 23f4: f9bb 0000 ldrsh.w r0, [fp] 23f8: 1c57 adds r7, r2, #1 23fa: eb01 0242 add.w r2, r1, r2, lsl #1 size -= 2; 23fe: 3d02 subs r5, #2 block_left->data[block_offset++] = (msb << 8) | lsb; 2400: f8a4 7068 strh.w r7, [r4, #104] ; 0x68 2404: f10b 0b02 add.w fp, fp, #2 2408: 8090 strh r0, [r2, #4] if (block_offset >= AUDIO_BLOCK_SAMPLES) { 240a: f8b4 2068 ldrh.w r2, [r4, #104] ; 0x68 240e: 2a7f cmp r2, #127 ; 0x7f 2410: d9ed bls.n 23ee transmit(block_left, 0); 2412: 2200 movs r2, #0 2414: 4620 mov r0, r4 2416: f008 f9a3 bl a760 transmit(block_left, 1); 241a: 2201 movs r2, #1 241c: 6e21 ldr r1, [r4, #96] ; 0x60 241e: 4620 mov r0, r4 2420: f008 f99e bl a760 release(block_left); 2424: 6e20 ldr r0, [r4, #96] ; 0x60 2426: f008 f973 bl a710 block_left = NULL; 242a: 2200 movs r2, #0 buffer_offset = p - buffer; 242c: ebab 0306 sub.w r3, fp, r6 if (block_right) release(block_right); 2430: 6e60 ldr r0, [r4, #100] ; 0x64 block_left = NULL; 2432: 6622 str r2, [r4, #96] ; 0x60 data_length += size; 2434: 6d62 ldr r2, [r4, #84] ; 0x54 buffer_offset = p - buffer; 2436: f8a4 326a strh.w r3, [r4, #618] ; 0x26a data_length += size; 243a: 4415 add r5, r2 243c: 6565 str r5, [r4, #84] ; 0x54 if (block_right) release(block_right); 243e: b110 cbz r0, 2446 2440: f008 f966 bl a710 if (data_length == 0) state = STATE_STOP; 2444: 6d65 ldr r5, [r4, #84] ; 0x54 2446: 2d00 cmp r5, #0 2448: d063 beq.n 2512 return true; 244a: 2001 movs r0, #1 244c: e6e7 b.n 221e state_play = STATE_STOP; 244e: 230e movs r3, #14 return false; 2450: 2000 movs r0, #0 state_play = STATE_STOP; 2452: f884 3270 strb.w r3, [r4, #624] ; 0x270 state = STATE_STOP; 2456: f884 326f strb.w r3, [r4, #623] ; 0x26f } 245a: b003 add sp, #12 245c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} state = STATE_PARSE4; 2460: 230b movs r3, #11 2462: f884 326f strb.w r3, [r4, #623] ; 0x26f if (size == 0) return false; 2466: 2d00 cmp r5, #0 2468: f47f aebf bne.w 21ea 246c: e6d6 b.n 221c header_offset = 12; 246e: f640 430c movw r3, #3084 ; 0xc0c 2472: f8a4 326e strh.w r3, [r4, #622] ; 0x26e if (header[4] < 16) { 2476: 6be3 ldr r3, [r4, #60] ; 0x3c size -= len; 2478: 1aad subs r5, r5, r2 p += len; 247a: 4493 add fp, r2 data_length = header[4]; 247c: 6563 str r3, [r4, #84] ; 0x54 if (size == 0) return false; 247e: 2d00 cmp r5, #0 2480: f47f aeb3 bne.w 21ea 2484: e6ca b.n 221c block_left->data[block_offset] = header[0]; 2486: 6e21 ldr r1, [r4, #96] ; 0x60 2488: f8b4 0068 ldrh.w r0, [r4, #104] ; 0x68 248c: 6ae7 ldr r7, [r4, #44] ; 0x2c 248e: eb01 0040 add.w r0, r1, r0, lsl #1 2492: 8087 strh r7, [r0, #4] leftover_bytes = 0; 2494: 2000 movs r0, #0 2496: f884 0271 strb.w r0, [r4, #625] ; 0x271 block_right->data[block_offset++] = (msb << 8) | lsb; 249a: f8b4 0068 ldrh.w r0, [r4, #104] ; 0x68 msb = *p++; 249e: 46d8 mov r8, fp block_right->data[block_offset++] = (msb << 8) | lsb; 24a0: 6e67 ldr r7, [r4, #100] ; 0x64 size -= 2; 24a2: 3d02 subs r5, #2 block_right->data[block_offset++] = (msb << 8) | lsb; 24a4: f938 3b02 ldrsh.w r3, [r8], #2 24a8: eb07 0740 add.w r7, r7, r0, lsl #1 24ac: 3001 adds r0, #1 24ae: f8a4 0068 strh.w r0, [r4, #104] ; 0x68 24b2: 80bb strh r3, [r7, #4] if (block_offset >= AUDIO_BLOCK_SAMPLES) { 24b4: f8b4 3068 ldrh.w r3, [r4, #104] ; 0x68 24b8: 2b7f cmp r3, #127 ; 0x7f 24ba: d80f bhi.n 24dc if (size == 0) { 24bc: bb75 cbnz r5, 251c if (data_length == 0) break; 24be: 2a00 cmp r2, #0 24c0: d084 beq.n 23cc return false; 24c2: 4628 mov r0, r5 leftover_bytes = 0; 24c4: f884 5271 strb.w r5, [r4, #625] ; 0x271 return false; 24c8: e6a9 b.n 221e block_left->data[block_offset] = (msb << 8) | lsb; 24ca: 6e21 ldr r1, [r4, #96] ; 0x60 msb = *p++; 24cc: f10b 0b02 add.w fp, fp, #2 block_left->data[block_offset] = (msb << 8) | lsb; 24d0: f8b4 0068 ldrh.w r0, [r4, #104] ; 0x68 24d4: eb01 0040 add.w r0, r1, r0, lsl #1 24d8: 8087 strh r7, [r0, #4] 24da: e7de b.n 249a transmit(block_left, 0); 24dc: 2200 movs r2, #0 24de: 4620 mov r0, r4 block_left = NULL; 24e0: 2700 movs r7, #0 transmit(block_left, 0); 24e2: f008 f93d bl a760 release(block_left); 24e6: 6e20 ldr r0, [r4, #96] ; 0x60 24e8: f008 f912 bl a710 transmit(block_right, 1); 24ec: 2201 movs r2, #1 24ee: 6e61 ldr r1, [r4, #100] ; 0x64 24f0: 4620 mov r0, r4 block_left = NULL; 24f2: 6627 str r7, [r4, #96] ; 0x60 transmit(block_right, 1); 24f4: f008 f934 bl a760 release(block_right); 24f8: 6e60 ldr r0, [r4, #100] ; 0x64 24fa: f008 f909 bl a710 data_length += size; 24fe: 6d62 ldr r2, [r4, #84] ; 0x54 buffer_offset = p - buffer; 2500: eba8 0306 sub.w r3, r8, r6 block_right = NULL; 2504: 6667 str r7, [r4, #100] ; 0x64 data_length += size; 2506: 442a add r2, r5 buffer_offset = p - buffer; 2508: f8a4 326a strh.w r3, [r4, #618] ; 0x26a data_length += size; 250c: 6562 str r2, [r4, #84] ; 0x54 if (data_length == 0) state = STATE_STOP; 250e: 2a00 cmp r2, #0 2510: d19b bne.n 244a if (data_length == 0) state = STATE_STOP; 2512: 230e movs r3, #14 return true; 2514: 2001 movs r0, #1 if (data_length == 0) state = STATE_STOP; 2516: f884 326f strb.w r3, [r4, #623] ; 0x26f 251a: e680 b.n 221e msb = *p++; 251c: 46c3 mov fp, r8 251e: e74d b.n 23bc leftover_bytes = 2; 2520: 2302 movs r3, #2 return false; 2522: 4628 mov r0, r5 header[0] = (msb << 8) | lsb; 2524: 62e7 str r7, [r4, #44] ; 0x2c leftover_bytes = 2; 2526: f884 3271 strb.w r3, [r4, #625] ; 0x271 return false; 252a: e678 b.n 221e data_length -= len; 252c: 6562 str r2, [r4, #84] ; 0x54 252e: e675 b.n 221c buffer_offset += size; 2530: f8b4 326a ldrh.w r3, [r4, #618] ; 0x26a data_length -= size; 2534: 1b52 subs r2, r2, r5 return false; 2536: 2000 movs r0, #0 buffer_offset += size; 2538: 442b add r3, r5 data_length -= size; 253a: 6562 str r2, [r4, #84] ; 0x54 buffer_offset += size; 253c: f8a4 326a strh.w r3, [r4, #618] ; 0x26a return false; 2540: e66d b.n 221e 2542: bf00 nop 2544: 45564157 .word 0x45564157 2548: 61746164 .word 0x61746164 254c: 46464952 .word 0x46464952 00002550 : if (state == STATE_STOP || state == STATE_PAUSED) return; 2550: f890 326f ldrb.w r3, [r0, #623] ; 0x26f 2554: 3b0d subs r3, #13 2556: 2b01 cmp r3, #1 2558: f240 80bc bls.w 26d4 { 255c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 2560: 4604 mov r4, r0 block_left = allocate(); 2562: f008 f87f bl a664 2566: 6620 str r0, [r4, #96] ; 0x60 if (block_left == NULL) return; 2568: 2800 cmp r0, #0 256a: f000 80ac beq.w 26c6 if (state < 8 && (state & 1) == 1) { 256e: f894 326f ldrb.w r3, [r4, #623] ; 0x26f 2572: 2b07 cmp r3, #7 2574: d802 bhi.n 257c 2576: 07dd lsls r5, r3, #31 2578: f100 80ad bmi.w 26d6 block_right = NULL; 257c: 2300 movs r3, #0 257e: 6663 str r3, [r4, #100] ; 0x64 n = buffer_length - buffer_offset; 2580: f8b4 126c ldrh.w r1, [r4, #620] ; 0x26c block_offset = 0; 2584: 2300 movs r3, #0 n = buffer_length - buffer_offset; 2586: f8b4 226a ldrh.w r2, [r4, #618] ; 0x26a block_offset = 0; 258a: f8a4 3068 strh.w r3, [r4, #104] ; 0x68 n = buffer_length - buffer_offset; 258e: 1a89 subs r1, r1, r2 if (n > 0) { 2590: 4299 cmp r1, r3 2592: f300 8106 bgt.w 27a2 if (state != STATE_STOP && wavfile.available()) { 2596: f894 326f ldrb.w r3, [r4, #623] ; 0x26f 259a: 2b0e cmp r3, #14 259c: f000 80b3 beq.w 2706 return (f) ? f->available() : 0; 25a0: 6aa5 ldr r5, [r4, #40] ; 0x28 25a2: 2d00 cmp r5, #0 25a4: d044 beq.n 2630 25a6: 682b ldr r3, [r5, #0] 25a8: 49a2 ldr r1, [pc, #648] ; (2834 ) 25aa: 691a ldr r2, [r3, #16] 25ac: 428a cmp r2, r1 25ae: f040 8130 bne.w 2812 return m_fFile ? m_fFile->available() : 25b2: 6d2a ldr r2, [r5, #80] ; 0x50 25b4: 2a00 cmp r2, #0 25b6: f000 8106 beq.w 27c6 return isFile() ? fileSize() - curPosition() : 0; 25ba: 7811 ldrb r1, [r2, #0] 25bc: 0708 lsls r0, r1, #28 25be: f140 80a6 bpl.w 270e 25c2: 69d1 ldr r1, [r2, #28] 25c4: 6952 ldr r2, [r2, #20] return n > INT_MAX ? INT_MAX : n; 25c6: 1a89 subs r1, r1, r2 25c8: f140 8112 bpl.w 27f0 buffer_length = wavfile.read(buffer, 512); 25cc: f104 076a add.w r7, r4, #106 ; 0x6a 25d0: 4e99 ldr r6, [pc, #612] ; (2838 ) 25d2: f64f 78ff movw r8, #65535 ; 0xffff return (f) ? f->read(buf, nbyte) : 0; 25d6: b34d cbz r5, 262c 25d8: 682b ldr r3, [r5, #0] 25da: 689b ldr r3, [r3, #8] 25dc: 42b3 cmp r3, r6 25de: f040 80e7 bne.w 27b0 return m_fFile ? m_fFile->read(buf, count) : 25e2: 6d28 ldr r0, [r5, #80] ; 0x50 25e4: 2800 cmp r0, #0 25e6: f000 8081 beq.w 26ec 25ea: f44f 7200 mov.w r2, #512 ; 0x200 25ee: 4639 mov r1, r7 25f0: f003 fb02 bl 5bf8 25f4: b283 uxth r3, r0 25f6: f8a4 326c strh.w r3, [r4, #620] ; 0x26c if (buffer_length == 0) goto end; 25fa: 2b00 cmp r3, #0 25fc: f000 8083 beq.w 2706 buffer_offset = 0; 2600: 2300 movs r3, #0 bool txok = consume(buffer_length); 2602: b281 uxth r1, r0 2604: 4620 mov r0, r4 bool parsing = (state >= 8); 2606: f894 526f ldrb.w r5, [r4, #623] ; 0x26f buffer_offset = 0; 260a: f8a4 326a strh.w r3, [r4, #618] ; 0x26a bool txok = consume(buffer_length); 260e: f7ff fdd9 bl 21c4 if (state != STATE_STOP) return; 2612: f894 326f ldrb.w r3, [r4, #623] ; 0x26f if (txok) { 2616: 2800 cmp r0, #0 2618: d173 bne.n 2702 if (state != STATE_STOP) { 261a: 2b0e cmp r3, #14 261c: d073 beq.n 2706 if (parsing && state < 8) goto readagain; 261e: 2d07 cmp r5, #7 2620: d914 bls.n 264c 2622: 2b07 cmp r3, #7 2624: d812 bhi.n 264c if (f) { 2626: 6aa5 ldr r5, [r4, #40] ; 0x28 return (f) ? f->read(buf, nbyte) : 0; 2628: 2d00 cmp r5, #0 262a: d1d5 bne.n 25d8 buffer_length = wavfile.read(buffer, 512); 262c: f8a4 526c strh.w r5, [r4, #620] ; 0x26c if (AudioUsingSPICount == 0 || --AudioUsingSPICount == 0) 2630: 4a82 ldr r2, [pc, #520] ; (283c ) 2632: 8813 ldrh r3, [r2, #0] 2634: 2b00 cmp r3, #0 2636: d048 beq.n 26ca 2638: 3b01 subs r3, #1 263a: b29b uxth r3, r3 263c: 8013 strh r3, [r2, #0] 263e: 2b00 cmp r3, #0 2640: d043 beq.n 26ca state_play = STATE_STOP; 2642: 230e movs r3, #14 2644: f884 3270 strb.w r3, [r4, #624] ; 0x270 state = STATE_STOP; 2648: f884 326f strb.w r3, [r4, #623] ; 0x26f if (block_left) { 264c: 6e25 ldr r5, [r4, #96] ; 0x60 264e: b1fd cbz r5, 2690 if (block_offset > 0) { 2650: f8b4 0068 ldrh.w r0, [r4, #104] ; 0x68 2654: b1b8 cbz r0, 2686 for (uint32_t i=block_offset; i < AUDIO_BLOCK_SAMPLES; i++) { 2656: 287f cmp r0, #127 ; 0x7f 2658: d808 bhi.n 266c block_left->data[i] = 0; 265a: f1c0 0280 rsb r2, r0, #128 ; 0x80 265e: 3002 adds r0, #2 2660: 2100 movs r1, #0 2662: 0052 lsls r2, r2, #1 2664: eb05 0040 add.w r0, r5, r0, lsl #1 2668: f00b fa62 bl db30 transmit(block_left, 0); 266c: 2200 movs r2, #0 266e: 4629 mov r1, r5 2670: 4620 mov r0, r4 2672: f008 f875 bl a760 if (state < 8 && (state & 1) == 0) { 2676: f894 326f ldrb.w r3, [r4, #623] ; 0x26f 267a: 2b07 cmp r3, #7 267c: d802 bhi.n 2684 267e: 07db lsls r3, r3, #31 2680: f140 80ba bpl.w 27f8 release(block_left); 2684: 6e25 ldr r5, [r4, #96] ; 0x60 2686: 4628 mov r0, r5 2688: f008 f842 bl a710 block_left = NULL; 268c: 2300 movs r3, #0 268e: 6623 str r3, [r4, #96] ; 0x60 if (block_right) { 2690: 6e65 ldr r5, [r4, #100] ; 0x64 2692: b1c5 cbz r5, 26c6 if (block_offset > 0) { 2694: f8b4 0068 ldrh.w r0, [r4, #104] ; 0x68 2698: b180 cbz r0, 26bc for (uint32_t i=block_offset; i < AUDIO_BLOCK_SAMPLES; i++) { 269a: 287f cmp r0, #127 ; 0x7f 269c: d808 bhi.n 26b0 block_right->data[i] = 0; 269e: f1c0 0280 rsb r2, r0, #128 ; 0x80 26a2: 3002 adds r0, #2 26a4: 2100 movs r1, #0 26a6: 0052 lsls r2, r2, #1 26a8: eb05 0040 add.w r0, r5, r0, lsl #1 26ac: f00b fa40 bl db30 transmit(block_right, 1); 26b0: 4629 mov r1, r5 26b2: 2201 movs r2, #1 26b4: 4620 mov r0, r4 26b6: f008 f853 bl a760 release(block_right); 26ba: 6e65 ldr r5, [r4, #100] ; 0x64 26bc: 4628 mov r0, r5 26be: f008 f827 bl a710 block_right = NULL; 26c2: 2300 movs r3, #0 26c4: 6663 str r3, [r4, #100] ; 0x64 } 26c6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} SPI.notUsingInterrupt(IRQ_SOFTWARE); 26ca: 2146 movs r1, #70 ; 0x46 26cc: 485c ldr r0, [pc, #368] ; (2840 ) 26ce: f000 fae7 bl 2ca0 26d2: e7b6 b.n 2642 26d4: 4770 bx lr block_right = allocate(); 26d6: f007 ffc5 bl a664 26da: 6660 str r0, [r4, #100] ; 0x64 if (block_right == NULL) { 26dc: 2800 cmp r0, #0 26de: f47f af4f bne.w 2580 release(block_left); 26e2: 6e20 ldr r0, [r4, #96] ; 0x60 } 26e4: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} release(block_left); 26e8: f008 b812 b.w a710 26ec: 6d68 ldr r0, [r5, #84] ; 0x54 m_xFile ? m_xFile->read(buf, count) : -1; 26ee: 2800 cmp r0, #0 26f0: f000 80b0 beq.w 2854 26f4: f44f 7200 mov.w r2, #512 ; 0x200 26f8: 4639 mov r1, r7 26fa: f000 ffa3 bl 3644 buffer_length = wavfile.read(buffer, 512); 26fe: b283 uxth r3, r0 2700: e779 b.n 25f6 if (state != STATE_STOP) return; 2702: 2b0e cmp r3, #14 2704: d1df bne.n 26c6 return (f) ? f->available() : 0; 2706: 6aa5 ldr r5, [r4, #40] ; 0x28 if (f) { 2708: 2d00 cmp r5, #0 270a: d091 beq.n 2630 f->close(); 270c: 682b ldr r3, [r5, #0] 270e: 6adb ldr r3, [r3, #44] ; 0x2c 2710: 4f4c ldr r7, [pc, #304] ; (2844 ) 2712: 42bb cmp r3, r7 2714: d17a bne.n 280c if (filename) { 2716: 6da8 ldr r0, [r5, #88] ; 0x58 2718: b118 cbz r0, 2722 free(filename); 271a: f00a ff0f bl d53c filename = nullptr; 271e: 2300 movs r3, #0 2720: 65ab str r3, [r5, #88] ; 0x58 bool isOpen() const {return m_fFile || m_xFile;} 2722: 6d2b ldr r3, [r5, #80] ; 0x50 2724: 2b00 cmp r3, #0 2726: d04a beq.n 27be sdfatfile.close(); 2728: f105 0018 add.w r0, r5, #24 272c: f005 fb20 bl 7d70 if (--(f->refcount) == 0) { 2730: 6aa6 ldr r6, [r4, #40] ; 0x28 2732: 6875 ldr r5, [r6, #4] 2734: 3d01 subs r5, #1 2736: 6075 str r5, [r6, #4] 2738: 2d00 cmp r5, #0 273a: d12f bne.n 279c f->close(); 273c: 6833 ldr r3, [r6, #0] 273e: 6adb ldr r3, [r3, #44] ; 0x2c 2740: 42bb cmp r3, r7 2742: d171 bne.n 2828 if (filename) { 2744: 6db0 ldr r0, [r6, #88] ; 0x58 2746: b110 cbz r0, 274e free(filename); 2748: f00a fef8 bl d53c filename = nullptr; 274c: 65b5 str r5, [r6, #88] ; 0x58 274e: 6d33 ldr r3, [r6, #80] ; 0x50 2750: 2b00 cmp r3, #0 2752: d065 beq.n 2820 sdfatfile.close(); 2754: f106 0018 add.w r0, r6, #24 2758: f005 fb0a bl 7d70 delete f; 275c: 6aa5 ldr r5, [r4, #40] ; 0x28 275e: b1ed cbz r5, 279c 2760: 682b ldr r3, [r5, #0] 2762: 4a39 ldr r2, [pc, #228] ; (2848 ) 2764: 685b ldr r3, [r3, #4] 2766: 4293 cmp r3, r2 2768: d161 bne.n 282e virtual ~SDFile(void) { 276a: 4b38 ldr r3, [pc, #224] ; (284c ) if (filename) { 276c: 6da8 ldr r0, [r5, #88] ; 0x58 virtual ~SDFile(void) { 276e: 602b str r3, [r5, #0] if (filename) { 2770: b118 cbz r0, 277a free(filename); 2772: f00a fee3 bl d53c filename = nullptr; 2776: 2300 movs r3, #0 2778: 65ab str r3, [r5, #88] ; 0x58 277a: 6d2b ldr r3, [r5, #80] ; 0x50 sdfatfile.close(); 277c: f105 0618 add.w r6, r5, #24 2780: 2b00 cmp r3, #0 2782: d03f beq.n 2804 2784: 4630 mov r0, r6 2786: f005 faf3 bl 7d70 278a: 4b31 ldr r3, [pc, #196] ; (2850 ) ~FsBaseFile() {close();} 278c: 4630 mov r0, r6 278e: 60ab str r3, [r5, #8] 2790: f005 faee bl 7d70 } 2794: 215c movs r1, #92 ; 0x5c 2796: 4628 mov r0, r5 2798: f008 fe9c bl b4d4 f = nullptr; 279c: 2300 movs r3, #0 279e: 62a3 str r3, [r4, #40] ; 0x28 } 27a0: e746 b.n 2630 if (consume(n)) return; // it was enough to transmit audio 27a2: 4620 mov r0, r4 27a4: f7ff fd0e bl 21c4 27a8: 2800 cmp r0, #0 27aa: f43f aef4 beq.w 2596 27ae: e78a b.n 26c6 return (f) ? f->read(buf, nbyte) : 0; 27b0: 4628 mov r0, r5 27b2: f44f 7200 mov.w r2, #512 ; 0x200 27b6: 4639 mov r1, r7 27b8: 4798 blx r3 buffer_length = wavfile.read(buffer, 512); 27ba: b283 uxth r3, r0 27bc: e71b b.n 25f6 bool isOpen() const {return m_fFile || m_xFile;} 27be: 6d6b ldr r3, [r5, #84] ; 0x54 27c0: 2b00 cmp r3, #0 27c2: d1b1 bne.n 2728 27c4: e7b4 b.n 2730 27c6: 6d6a ldr r2, [r5, #84] ; 0x54 m_xFile ? m_xFile->available() : 0; 27c8: 2a00 cmp r2, #0 27ca: d0a0 beq.n 270e return isFile() ? fileSize() - curPosition() : 0; 27cc: f892 1031 ldrb.w r1, [r2, #49] ; 0x31 27d0: 0709 lsls r1, r1, #28 27d2: d59c bpl.n 270e 27d4: 6810 ldr r0, [r2, #0] 27d6: 6911 ldr r1, [r2, #16] 27d8: 1a09 subs r1, r1, r0 27da: 6950 ldr r0, [r2, #20] 27dc: 6852 ldr r2, [r2, #4] 27de: eb60 0202 sbc.w r2, r0, r2 return n > INT_MAX ? INT_MAX : n; 27e2: f1b1 4f00 cmp.w r1, #2147483648 ; 0x80000000 27e6: f172 0200 sbcs.w r2, r2, #0 27ea: d301 bcc.n 27f0 27ec: f06f 4100 mvn.w r1, #2147483648 ; 0x80000000 if (state != STATE_STOP && wavfile.available()) { 27f0: 2900 cmp r1, #0 27f2: f47f aeeb bne.w 25cc 27f6: e78a b.n 270e transmit(block_left, 1); 27f8: 2201 movs r2, #1 27fa: 6e21 ldr r1, [r4, #96] ; 0x60 27fc: 4620 mov r0, r4 27fe: f007 ffaf bl a760 2802: e73f b.n 2684 bool isOpen() const {return m_fFile || m_xFile;} 2804: 6d6b ldr r3, [r5, #84] ; 0x54 2806: 2b00 cmp r3, #0 2808: d1bc bne.n 2784 280a: e7be b.n 278a f->close(); 280c: 4628 mov r0, r5 280e: 4798 blx r3 2810: e78e b.n 2730 return (f) ? f->available() : 0; 2812: 4628 mov r0, r5 2814: 4790 blx r2 if (f) { 2816: 6aa5 ldr r5, [r4, #40] ; 0x28 if (state != STATE_STOP && wavfile.available()) { 2818: 2800 cmp r0, #0 281a: f47f aed7 bne.w 25cc 281e: e773 b.n 2708 2820: 6d73 ldr r3, [r6, #84] ; 0x54 2822: 2b00 cmp r3, #0 2824: d196 bne.n 2754 2826: e799 b.n 275c f->close(); 2828: 4630 mov r0, r6 282a: 4798 blx r3 282c: e796 b.n 275c delete f; 282e: 4628 mov r0, r5 2830: 4798 blx r3 2832: e7b3 b.n 279c 2834: 00000755 .word 0x00000755 2838: 000005e1 .word 0x000005e1 283c: 20002dd4 .word 0x20002dd4 2840: 20001048 .word 0x20001048 2844: 00000121 .word 0x00000121 2848: 00000835 .word 0x00000835 284c: 20000a00 .word 0x20000a00 2850: 200008e0 .word 0x200008e0 buffer_length = wavfile.read(buffer, 512); 2854: f04f 30ff mov.w r0, #4294967295 2858: f8a4 826c strh.w r8, [r4, #620] ; 0x26c if (buffer_length == 0) goto end; 285c: e6d0 b.n 2600 285e: bf00 nop 00002860 : bool AudioPlaySdWav::isPlaying(void) { uint8_t s = *(volatile uint8_t *)&state; 2860: f890 026f ldrb.w r0, [r0, #623] ; 0x26f return (s < 8); } 2864: 2807 cmp r0, #7 2866: bf8c ite hi 2868: 2000 movhi r0, #0 286a: 2001 movls r0, #1 286c: 4770 bx lr 286e: bf00 nop 00002870 : { audio_block_t *block; uint32_t i, ph, inc, index, scale; int32_t val1, val2; if (magnitude) { 2870: 6a03 ldr r3, [r0, #32] { 2872: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 2876: 4605 mov r5, r0 if (magnitude) { 2878: b933 cbnz r3, 2888 transmit(block); release(block); return; } } phase_accumulator += phase_increment * AUDIO_BLOCK_SAMPLES; 287a: e9d5 3206 ldrd r3, r2, [r5, #24] 287e: eb03 13c2 add.w r3, r3, r2, lsl #7 2882: 61ab str r3, [r5, #24] } 2884: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} block = allocate(); 2888: f007 feec bl a664 if (block) { 288c: 4606 mov r6, r0 288e: 2800 cmp r0, #0 2890: d0f3 beq.n 287a ph = phase_accumulator; 2892: f100 0c02 add.w ip, r0, #2 block->data[i] = multiply_32x32_rshift32(val1 + val2, magnitude); 2896: 6a2f ldr r7, [r5, #32] 2898: f500 7081 add.w r0, r0, #258 ; 0x102 289c: 4c13 ldr r4, [pc, #76] ; (28ec ) inc = phase_increment; 289e: e9d5 8106 ldrd r8, r1, [r5, #24] ph = phase_accumulator; 28a2: 4642 mov r2, r8 index = ph >> 24; 28a4: ea4f 6912 mov.w r9, r2, lsr #24 scale = (ph >> 8) & 0xFFFF; 28a8: f3c2 2e0f ubfx lr, r2, #8, #16 val2 = AudioWaveformSine[index+1]; 28ac: f109 0a01 add.w sl, r9, #1 val1 *= 0x10000 - scale; 28b0: f5ce 3380 rsb r3, lr, #65536 ; 0x10000 28b4: f934 9019 ldrsh.w r9, [r4, r9, lsl #1] 28b8: fb09 f303 mul.w r3, r9, r3 val2 *= scale; 28bc: f934 901a ldrsh.w r9, [r4, sl, lsl #1] block->data[i] = multiply_32x32_rshift32(val1 + val2, magnitude); 28c0: fb0e 3309 mla r3, lr, r9, r3 asm volatile("smmul %0, %1, %2" : "=r" (out) : "r" (a), "r" (b)); 28c4: fb53 f307 smmul r3, r3, r7 28c8: f82c 3f02 strh.w r3, [ip, #2]! for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { 28cc: 4560 cmp r0, ip ph += inc; 28ce: 440a add r2, r1 for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { 28d0: d1e8 bne.n 28a4 ph += inc; 28d2: eb08 13c1 add.w r3, r8, r1, lsl #7 transmit(block); 28d6: 4628 mov r0, r5 28d8: 4631 mov r1, r6 28da: 2200 movs r2, #0 phase_accumulator = ph; 28dc: 61ab str r3, [r5, #24] transmit(block); 28de: f007 ff3f bl a760 release(block); 28e2: 4630 mov r0, r6 } 28e4: e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr} release(block); 28e8: f007 bf12 b.w a710 28ec: 20000380 .word 0x20000380 000028f0 : // The code triggering the event does NOT control which of the above // response methods will be used. virtual void triggerEvent(int status=0, void *data=nullptr) { _status = status; _data = data; if (_type == EventTypeImmediate) { 28f0: f890 c01c ldrb.w ip, [r0, #28] _status = status; 28f4: 6041 str r1, [r0, #4] if (_type == EventTypeImmediate) { 28f6: f1bc 0f02 cmp.w ip, #2 _data = data; 28fa: 60c2 str r2, [r0, #12] if (_type == EventTypeImmediate) { 28fc: d101 bne.n 2902 (*_function)(*this); 28fe: 6883 ldr r3, [r0, #8] 2900: 4718 bx r3 } else { triggerEventNotImmediate(); 2902: f008 b883 b.w aa0c 2906: bf00 nop 00002908 : if (interruptMask[n >> 5] == 0) { interruptMasksUsed &= ~(1 << (n >> 5)); } } void SPIClass::transfer(const void * buf, void * retbuf, size_t count) 2908: b4f0 push {r4, r5, r6, r7} IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } 290a: 6804 ldr r4, [r0, #0] uint8_t *p_read = (uint8_t*)retbuf; size_t count_read = count; // Pass 1 keep it simple and don't try packing 8 bits into 16 yet.. // Lets clear the reader queue port().CR = LPSPI_CR_RRF | LPSPI_CR_MEN; // clear the queue and make sure still enabled. 290c: f240 2501 movw r5, #513 ; 0x201 while (count > 0) { 2910: 461e mov r6, r3 port().CR = LPSPI_CR_RRF | LPSPI_CR_MEN; // clear the queue and make sure still enabled. 2912: 6125 str r5, [r4, #16] while (count > 0) { 2914: b1a3 cbz r3, 2940 // Push out the next byte; port().TDR = p_write? *p_write++ : _transferWriteFill; 2916: b321 cbz r1, 2962 2918: f811 5b01 ldrb.w r5, [r1], #1 count--; // how many bytes left to output. 291c: 3b01 subs r3, #1 port().TDR = p_write? *p_write++ : _transferWriteFill; 291e: 6665 str r5, [r4, #100] ; 0x64 // Make sure queue is not full before pushing next byte out do { if ((port().RSR & LPSPI_RSR_RXEMPTY) == 0) { 2920: 6f25 ldr r5, [r4, #112] ; 0x70 2922: 07af lsls r7, r5, #30 2924: d407 bmi.n 2936 uint8_t b = port().RDR; // Read any pending RX bytes in if (p_read) *p_read++ = b; 2926: 4615 mov r5, r2 count_read--; 2928: 3e01 subs r6, #1 uint8_t b = port().RDR; // Read any pending RX bytes in 292a: 6f67 ldr r7, [r4, #116] ; 0x74 if (p_read) *p_read++ = b; 292c: b11a cbz r2, 2936 uint8_t b = port().RDR; // Read any pending RX bytes in 292e: f805 7b01 strb.w r7, [r5], #1 if (p_read) *p_read++ = b; 2932: 462a mov r2, r5 2934: 6804 ldr r4, [r0, #0] } } while ((port().SR & LPSPI_SR_TDF) == 0) ; 2936: 6965 ldr r5, [r4, #20] 2938: 07ed lsls r5, r5, #31 293a: d5f1 bpl.n 2920 while (count > 0) { 293c: 2b00 cmp r3, #0 293e: d1ea bne.n 2916 } // now lets wait for all of the read bytes to be returned... while (count_read) { 2940: b16e cbz r6, 295e 2942: 6803 ldr r3, [r0, #0] if ((port().RSR & LPSPI_RSR_RXEMPTY) == 0) { 2944: 6f19 ldr r1, [r3, #112] ; 0x70 2946: 0789 lsls r1, r1, #30 2948: d4fa bmi.n 2940 uint8_t b = port().RDR; // Read any pending RX bytes in if (p_read) *p_read++ = b; 294a: 4611 mov r1, r2 count_read--; 294c: 3e01 subs r6, #1 uint8_t b = port().RDR; // Read any pending RX bytes in 294e: 6f5b ldr r3, [r3, #116] ; 0x74 if (p_read) *p_read++ = b; 2950: 2a00 cmp r2, #0 2952: d0f5 beq.n 2940 uint8_t b = port().RDR; // Read any pending RX bytes in 2954: f801 3b01 strb.w r3, [r1], #1 if (p_read) *p_read++ = b; 2958: 460a mov r2, r1 while (count_read) { 295a: 2e00 cmp r6, #0 295c: d1f1 bne.n 2942 } } } 295e: bcf0 pop {r4, r5, r6, r7} 2960: 4770 bx lr port().TDR = p_write? *p_write++ : _transferWriteFill; 2962: f890 503c ldrb.w r5, [r0, #60] ; 0x3c 2966: e7d9 b.n 291c 00002968 <_spi_dma_rxISR0()>: //------------------------------------------------------------------------- // DMA RX ISR //------------------------------------------------------------------------- void SPIClass::dma_rxisr(void) { _dmaRX->clearInterrupt(); 2968: 4b32 ldr r3, [pc, #200] ; (2a34 <_spi_dma_rxISR0()+0xcc>) void detachInterrupt(void) { NVIC_DISABLE_IRQ(IRQ_DMA_CH0 + channel); } void clearInterrupt(void) { DMA_CINT = channel; 296a: 4933 ldr r1, [pc, #204] ; (2a38 <_spi_dma_rxISR0()+0xd0>) void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} 296c: b530 push {r4, r5, lr} _dmaTX->clearComplete(); 296e: e9d3 5411 ldrd r5, r4, [r3, #68] ; 0x44 2972: 7920 ldrb r0, [r4, #4] 2974: 77c8 strb r0, [r1, #31] _dmaRX->clearComplete(); if (_dma_count_remaining) { 2976: 6c1a ldr r2, [r3, #64] ; 0x40 bool complete(void) { if (TCD->CSR & DMA_TCD_CSR_DONE) return true; return false; } void clearComplete(void) { DMA_CDNE = channel; 2978: f895 c004 ldrb.w ip, [r5, #4] 297c: f881 c01c strb.w ip, [r1, #28] 2980: 7708 strb r0, [r1, #28] 2982: b152 cbz r2, 299a <_spi_dma_rxISR0()+0x32> // What do I need to do to start it back up again... // We will use the BITR/CITR from RX as TX may have prefed some stuff if (_dma_count_remaining > MAX_DMA_COUNT) { 2984: f5b2 4f00 cmp.w r2, #32768 ; 0x8000 2988: d323 bcc.n 29d2 <_spi_dma_rxISR0()+0x6a> _dma_count_remaining -= MAX_DMA_COUNT; 298a: 492c ldr r1, [pc, #176] ; (2a3c <_spi_dma_rxISR0()+0xd4>) 298c: 4411 add r1, r2 DMA_SERQ = channel; 298e: 4a2a ldr r2, [pc, #168] ; (2a38 <_spi_dma_rxISR0()+0xd0>) 2990: 6419 str r1, [r3, #64] ; 0x40 2992: 76d0 strb r0, [r2, #27] 2994: f882 c01b strb.w ip, [r2, #27] void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} 2998: bd30 pop {r4, r5, pc} 299a: 6819 ldr r1, [r3, #0] } _dmaRX->enable(); _dmaTX->enable(); } else { port().FCR = LPSPI_FCR_TXWATER(15); // _spi_fcr_save; // restore the FSR status... 299c: 240f movs r4, #15 port().CR = LPSPI_CR_MEN | LPSPI_CR_RRF | LPSPI_CR_RTF; // actually clear both... port().SR = 0x3f00; // clear out all of the other status... _dma_state = DMAState::completed; // set back to 1 in case our call wants to start up dma again _dma_event_responder->triggerEvent(); 299e: 6cd8 ldr r0, [r3, #76] ; 0x4c port().FCR = LPSPI_FCR_TXWATER(15); // _spi_fcr_save; // restore the FSR status... 29a0: 658c str r4, [r1, #88] ; 0x58 port().CR = LPSPI_CR_MEN | LPSPI_CR_RRF | LPSPI_CR_RTF; // actually clear both... 29a2: f240 3401 movw r4, #769 ; 0x301 port().DER = 0; // DMA no longer doing TX (or RX) 29a6: 61ca str r2, [r1, #28] port().CR = LPSPI_CR_MEN | LPSPI_CR_RRF | LPSPI_CR_RTF; // actually clear both... 29a8: 610c str r4, [r1, #16] port().SR = 0x3f00; // clear out all of the other status... 29aa: f44f 547c mov.w r4, #16128 ; 0x3f00 29ae: 614c str r4, [r1, #20] _dma_state = DMAState::completed; // set back to 1 in case our call wants to start up dma again 29b0: 2103 movs r1, #3 _dma_event_responder->triggerEvent(); 29b2: 6804 ldr r4, [r0, #0] 29b4: 6824 ldr r4, [r4, #0] _dma_state = DMAState::completed; // set back to 1 in case our call wants to start up dma again 29b6: f883 103d strb.w r1, [r3, #61] ; 0x3d _dma_event_responder->triggerEvent(); 29ba: 4b21 ldr r3, [pc, #132] ; (2a40 <_spi_dma_rxISR0()+0xd8>) 29bc: 429c cmp r4, r3 29be: d126 bne.n 2a0e <_spi_dma_rxISR0()+0xa6> if (_type == EventTypeImmediate) { 29c0: 7f03 ldrb r3, [r0, #28] _status = status; 29c2: 6042 str r2, [r0, #4] if (_type == EventTypeImmediate) { 29c4: 2b02 cmp r3, #2 _data = data; 29c6: 60c2 str r2, [r0, #12] if (_type == EventTypeImmediate) { 29c8: d126 bne.n 2a18 <_spi_dma_rxISR0()+0xb0> (*_function)(*this); 29ca: 6883 ldr r3, [r0, #8] void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} 29cc: e8bd 4030 ldmia.w sp!, {r4, r5, lr} 29d0: 4718 bx r3 DMAChanneltransferCount(_dmaTX, _dma_count_remaining); 29d2: 682d ldr r5, [r5, #0] if (!(tcd->BITER & DMA_TCD_BITER_ELINK)) { 29d4: 8be9 ldrh r1, [r5, #30] 29d6: 0409 lsls r1, r1, #16 29d8: d422 bmi.n 2a20 <_spi_dma_rxISR0()+0xb8> tcd->BITER = len & 0x7fff; 29da: b292 uxth r2, r2 29dc: 83ea strh r2, [r5, #30] tcd->CITER = tcd->BITER; 29de: 6821 ldr r1, [r4, #0] 29e0: 8bec ldrh r4, [r5, #30] 29e2: b2a4 uxth r4, r4 29e4: 82ec strh r4, [r5, #22] if (!(tcd->BITER & DMA_TCD_BITER_ELINK)) { 29e6: 8bcc ldrh r4, [r1, #30] 29e8: 0424 lsls r4, r4, #16 29ea: d505 bpl.n 29f8 <_spi_dma_rxISR0()+0x90> tcd->BITER = (tcd->BITER & 0xFE00) | (len & 0x1ff); 29ec: 8bcc ldrh r4, [r1, #30] 29ee: f3c2 0208 ubfx r2, r2, #0, #9 29f2: f404 447e and.w r4, r4, #65024 ; 0xfe00 29f6: 4322 orrs r2, r4 29f8: 83ca strh r2, [r1, #30] tcd->CITER = tcd->BITER; 29fa: 8bca ldrh r2, [r1, #30] 29fc: b292 uxth r2, r2 29fe: 82ca strh r2, [r1, #22] 2a00: 2100 movs r1, #0 2a02: 4a0d ldr r2, [pc, #52] ; (2a38 <_spi_dma_rxISR0()+0xd0>) _dma_count_remaining -= MAX_DMA_COUNT; 2a04: 6419 str r1, [r3, #64] ; 0x40 2a06: 76d0 strb r0, [r2, #27] 2a08: f882 c01b strb.w ip, [r2, #27] void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} 2a0c: bd30 pop {r4, r5, pc} _dma_event_responder->triggerEvent(); 2a0e: 4623 mov r3, r4 2a10: 4611 mov r1, r2 void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} 2a12: e8bd 4030 ldmia.w sp!, {r4, r5, lr} _dma_event_responder->triggerEvent(); 2a16: 4718 bx r3 void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} 2a18: e8bd 4030 ldmia.w sp!, {r4, r5, lr} triggerEventNotImmediate(); 2a1c: f007 bff6 b.w aa0c tcd->BITER = (tcd->BITER & 0xFE00) | (len & 0x1ff); 2a20: 8be9 ldrh r1, [r5, #30] 2a22: f3c2 0e08 ubfx lr, r2, #0, #9 2a26: b292 uxth r2, r2 2a28: f401 417e and.w r1, r1, #65024 ; 0xfe00 2a2c: ea41 010e orr.w r1, r1, lr 2a30: 83e9 strh r1, [r5, #30] 2a32: e7d4 b.n 29de <_spi_dma_rxISR0()+0x76> 2a34: 20001048 .word 0x20001048 2a38: 400e8000 .word 0x400e8000 2a3c: ffff8001 .word 0xffff8001 2a40: 000028f1 .word 0x000028f1 00002a44 : const SPI_Hardware_t & hardware() { return *(const SPI_Hardware_t *)hardware_addr; } 2a44: 6843 ldr r3, [r0, #4] { 2a46: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} hardware().clock_gate_register &= ~hardware().clock_gate_mask; 2a4a: e9d3 4100 ldrd r4, r1, [r3] CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_LPSPI_PODF_MASK | CCM_CBCMR_LPSPI_CLK_SEL_MASK)) | 2a4e: 4d81 ldr r5, [pc, #516] ; (2c54 ) *(portControlRegister(hardware().miso_pin[miso_pin_index])) = fastio; 2a50: f04f 0ab8 mov.w sl, #184 ; 0xb8 hardware().clock_gate_register &= ~hardware().clock_gate_mask; 2a54: 6822 ldr r2, [r4, #0] port().CR = LPSPI_CR_RST; 2a56: f04f 0802 mov.w r8, #2 hardware().clock_gate_register &= ~hardware().clock_gate_mask; 2a5a: ea22 0201 bic.w r2, r2, r1 CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_LPSPI_PODF_MASK | CCM_CBCMR_LPSPI_CLK_SEL_MASK)) | 2a5e: 497e ldr r1, [pc, #504] ; (2c58 ) hardware().clock_gate_register &= ~hardware().clock_gate_mask; 2a60: 6022 str r2, [r4, #0] CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_LPSPI_PODF_MASK | CCM_CBCMR_LPSPI_CLK_SEL_MASK)) | 2a62: 69aa ldr r2, [r5, #24] 2a64: 4011 ands r1, r2 CCM_CBCMR_LPSPI_PODF(2) | CCM_CBCMR_LPSPI_CLK_SEL(1); // pg 1049 2a66: 4a7d ldr r2, [pc, #500] ; (2c5c ) 2a68: 430a orrs r2, r1 CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_LPSPI_PODF_MASK | CCM_CBCMR_LPSPI_CLK_SEL_MASK)) | 2a6a: 61aa str r2, [r5, #24] *(portControlRegister(hardware().miso_pin[miso_pin_index])) = fastio; 2a6c: f890 e010 ldrb.w lr, [r0, #16] 2a70: 4a7b ldr r2, [pc, #492] ; (2c60 ) 2a72: eb03 060e add.w r6, r3, lr *(portConfigRegister(hardware().miso_pin[miso_pin_index])) = hardware().miso_mux[miso_pin_index]; 2a76: eb03 0e8e add.w lr, r3, lr, lsl #2 *(portControlRegister(hardware().miso_pin[miso_pin_index])) = fastio; 2a7a: 7c31 ldrb r1, [r6, #16] 2a7c: eb02 1101 add.w r1, r2, r1, lsl #4 2a80: 6889 ldr r1, [r1, #8] 2a82: f8c1 a000 str.w sl, [r1] *(portControlRegister(hardware().mosi_pin[mosi_pin_index])) = fastio; 2a86: f890 c011 ldrb.w ip, [r0, #17] 2a8a: eb03 050c add.w r5, r3, ip *(portConfigRegister(hardware().mosi_pin [mosi_pin_index])) = hardware().mosi_mux[mosi_pin_index]; 2a8e: f10c 0c0a add.w ip, ip, #10 *(portControlRegister(hardware().mosi_pin[mosi_pin_index])) = fastio; 2a92: f895 1024 ldrb.w r1, [r5, #36] ; 0x24 2a96: eb02 1101 add.w r1, r2, r1, lsl #4 2a9a: 6889 ldr r1, [r1, #8] 2a9c: f8c1 a000 str.w sl, [r1] *(portControlRegister(hardware().sck_pin[sck_pin_index])) = fastio; 2aa0: 7c81 ldrb r1, [r0, #18] 2aa2: eb03 0901 add.w r9, r3, r1 *(portConfigRegister(hardware().sck_pin [sck_pin_index])) = hardware().sck_mux[sck_pin_index]; 2aa6: eb03 0181 add.w r1, r3, r1, lsl #2 *(portControlRegister(hardware().sck_pin[sck_pin_index])) = fastio; 2aaa: f899 b038 ldrb.w fp, [r9, #56] ; 0x38 2aae: eb02 1b0b add.w fp, r2, fp, lsl #4 2ab2: f8db b008 ldr.w fp, [fp, #8] 2ab6: f8cb a000 str.w sl, [fp] hardware().clock_gate_register |= hardware().clock_gate_mask; 2aba: f8d4 a000 ldr.w sl, [r4] 2abe: 685f ldr r7, [r3, #4] 2ac0: ea4a 0a07 orr.w sl, sl, r7 2ac4: f8c4 a000 str.w sl, [r4] *(portConfigRegister(hardware().miso_pin[miso_pin_index])) = hardware().miso_mux[miso_pin_index]; 2ac8: 7c34 ldrb r4, [r6, #16] 2aca: f8de e014 ldr.w lr, [lr, #20] 2ace: eb02 1404 add.w r4, r2, r4, lsl #4 2ad2: 6864 ldr r4, [r4, #4] 2ad4: f8c4 e000 str.w lr, [r4] *(portConfigRegister(hardware().mosi_pin [mosi_pin_index])) = hardware().mosi_mux[mosi_pin_index]; 2ad8: f895 4024 ldrb.w r4, [r5, #36] ; 0x24 2adc: f853 c02c ldr.w ip, [r3, ip, lsl #2] 2ae0: eb02 1404 add.w r4, r2, r4, lsl #4 2ae4: 6864 ldr r4, [r4, #4] 2ae6: f8c4 c000 str.w ip, [r4] *(portConfigRegister(hardware().sck_pin [sck_pin_index])) = hardware().sck_mux[sck_pin_index]; 2aea: 6bc9 ldr r1, [r1, #60] ; 0x3c 2aec: f899 4038 ldrb.w r4, [r9, #56] ; 0x38 2af0: eb02 1204 add.w r2, r2, r4, lsl #4 2af4: 6852 ldr r2, [r2, #4] 2af6: 6011 str r1, [r2, #0] hardware().sck_select_input_register = hardware().sck_select_val[sck_pin_index]; 2af8: 6c9a ldr r2, [r3, #72] ; 0x48 2afa: f899 1044 ldrb.w r1, [r9, #68] ; 0x44 2afe: 6011 str r1, [r2, #0] hardware().miso_select_input_register = hardware().miso_select_val[miso_pin_index]; 2b00: 6a1a ldr r2, [r3, #32] 2b02: 7f31 ldrb r1, [r6, #28] hardware().mosi_select_input_register = hardware().mosi_select_val[mosi_pin_index]; 2b04: 6b5b ldr r3, [r3, #52] ; 0x34 hardware().miso_select_input_register = hardware().miso_select_val[miso_pin_index]; 2b06: 6011 str r1, [r2, #0] hardware().mosi_select_input_register = hardware().mosi_select_val[mosi_pin_index]; 2b08: f895 2030 ldrb.w r2, [r5, #48] ; 0x30 2b0c: 601a str r2, [r3, #0] port().FCR = LPSPI_FCR_TXWATER(15); 2b0e: 220f movs r2, #15 IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } 2b10: 6803 ldr r3, [r0, #0] port().CR = LPSPI_CR_RST; 2b12: f8c3 8010 str.w r8, [r3, #16] port().FCR = LPSPI_FCR_TXWATER(15); 2b16: 659a str r2, [r3, #88] ; 0x58 if (interruptMasksUsed) { 2b18: 7cc2 ldrb r2, [r0, #19] 2b1a: 2a00 cmp r2, #0 2b1c: d031 beq.n 2b82 __disable_irq(); 2b1e: b672 cpsid i if (interruptMasksUsed & 0x01) { 2b20: 7cc3 ldrb r3, [r0, #19] 2b22: 07dc lsls r4, r3, #31 2b24: d508 bpl.n 2b38 interruptSave[0] = NVIC_ICER0 & interruptMask[0]; 2b26: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 2b2a: 6944 ldr r4, [r0, #20] 2b2c: f8d1 2180 ldr.w r2, [r1, #384] ; 0x180 2b30: 4022 ands r2, r4 2b32: 6282 str r2, [r0, #40] ; 0x28 NVIC_ICER0 = interruptSave[0]; 2b34: f8c1 2180 str.w r2, [r1, #384] ; 0x180 if (interruptMasksUsed & 0x02) { 2b38: 0799 lsls r1, r3, #30 2b3a: d508 bpl.n 2b4e interruptSave[1] = NVIC_ICER1 & interruptMask[1]; 2b3c: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 2b40: 6984 ldr r4, [r0, #24] 2b42: f8d1 2184 ldr.w r2, [r1, #388] ; 0x184 2b46: 4022 ands r2, r4 2b48: 62c2 str r2, [r0, #44] ; 0x2c NVIC_ICER1 = interruptSave[1]; 2b4a: f8c1 2184 str.w r2, [r1, #388] ; 0x184 if (interruptMasksUsed & 0x04) { 2b4e: 075a lsls r2, r3, #29 2b50: d508 bpl.n 2b64 interruptSave[2] = NVIC_ICER2 & interruptMask[2]; 2b52: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 2b56: 69c4 ldr r4, [r0, #28] 2b58: f8d1 2188 ldr.w r2, [r1, #392] ; 0x188 2b5c: 4022 ands r2, r4 2b5e: 6302 str r2, [r0, #48] ; 0x30 NVIC_ICER2 = interruptSave[2]; 2b60: f8c1 2188 str.w r2, [r1, #392] ; 0x188 if (interruptMasksUsed & 0x08) { 2b64: 071f lsls r7, r3, #28 2b66: d508 bpl.n 2b7a interruptSave[3] = NVIC_ICER3 & interruptMask[3]; 2b68: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 2b6c: 6a04 ldr r4, [r0, #32] 2b6e: f8d1 218c ldr.w r2, [r1, #396] ; 0x18c 2b72: 4022 ands r2, r4 2b74: 6342 str r2, [r0, #52] ; 0x34 NVIC_ICER3 = interruptSave[3]; 2b76: f8c1 218c str.w r2, [r1, #396] ; 0x18c if (interruptMasksUsed & 0x10) { 2b7a: 06de lsls r6, r3, #27 2b7c: d455 bmi.n 2c2a __enable_irq(); 2b7e: b662 cpsie i IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } 2b80: 6803 ldr r3, [r0, #0] if (settings.clock() != _clock) { 2b82: 4c38 ldr r4, [pc, #224] ; (2c64 ) 2b84: 6882 ldr r2, [r0, #8] 2b86: 42a2 cmp r2, r4 2b88: d059 beq.n 2c3e uint32_t cbcmr = CCM_CBCMR; 2b8a: 4a32 ldr r2, [pc, #200] ; (2c54 ) _clock = settings.clock(); 2b8c: 6084 str r4, [r0, #8] uint32_t cbcmr = CCM_CBCMR; 2b8e: 6992 ldr r2, [r2, #24] uint32_t clkhz = clk_sel[(cbcmr >> 4) & 0x03] / (((cbcmr >> 26 ) & 0x07 ) + 1); // LPSPI peripheral clock 2b90: 4935 ldr r1, [pc, #212] ; (2c68 ) 2b92: f3c2 1601 ubfx r6, r2, #4, #2 2b96: f3c2 6282 ubfx r2, r2, #26, #3 if (d && clkhz/d > _clock) d++; 2b9a: 4d34 ldr r5, [pc, #208] ; (2c6c ) uint32_t clkhz = clk_sel[(cbcmr >> 4) & 0x03] / (((cbcmr >> 26 ) & 0x07 ) + 1); // LPSPI peripheral clock 2b9c: f851 1026 ldr.w r1, [r1, r6, lsl #2] 2ba0: 3201 adds r2, #1 2ba2: fbb1 f2f2 udiv r2, r1, r2 if (d && clkhz/d > _clock) d++; 2ba6: 42aa cmp r2, r5 2ba8: d831 bhi.n 2c0e 2baa: 2200 movs r2, #0 _ccr = LPSPI_CCR_SCKDIV(div) | LPSPI_CCR_DBT(div/2) | LPSPI_CCR_PCSSCK(div/2); 2bac: 60c2 str r2, [r0, #12] port().CR = 0; 2bae: 2400 movs r4, #0 port().CFGR1 = LPSPI_CFGR1_MASTER | LPSPI_CFGR1_SAMPLE; 2bb0: 2103 movs r1, #3 port().CR = 0; 2bb2: 611c str r4, [r3, #16] port().TCR = settings.tcr; 2bb4: 2407 movs r4, #7 port().CFGR1 = LPSPI_CFGR1_MASTER | LPSPI_CFGR1_SAMPLE; 2bb6: 6259 str r1, [r3, #36] ; 0x24 port().CR = LPSPI_CR_MEN; 2bb8: 2101 movs r1, #1 port().CCR = _ccr; 2bba: 641a str r2, [r3, #64] ; 0x40 port().TCR = settings.tcr; 2bbc: 661c str r4, [r3, #96] ; 0x60 port().CR = LPSPI_CR_MEN; 2bbe: 6119 str r1, [r3, #16] if (interruptMasksUsed) { 2bc0: 7cc3 ldrb r3, [r0, #19] 2bc2: b313 cbz r3, 2c0a if (interruptMasksUsed & 0x01) NVIC_ISER0 = interruptSave[0]; 2bc4: 07dd lsls r5, r3, #31 2bc6: d504 bpl.n 2bd2 2bc8: 6a81 ldr r1, [r0, #40] ; 0x28 2bca: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 2bce: f8c2 1100 str.w r1, [r2, #256] ; 0x100 if (interruptMasksUsed & 0x02) NVIC_ISER1 = interruptSave[1]; 2bd2: 079c lsls r4, r3, #30 2bd4: d504 bpl.n 2be0 2bd6: 6ac1 ldr r1, [r0, #44] ; 0x2c 2bd8: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 2bdc: f8c2 1104 str.w r1, [r2, #260] ; 0x104 if (interruptMasksUsed & 0x04) NVIC_ISER2 = interruptSave[2]; 2be0: 0759 lsls r1, r3, #29 2be2: d504 bpl.n 2bee 2be4: 6b01 ldr r1, [r0, #48] ; 0x30 2be6: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 2bea: f8c2 1108 str.w r1, [r2, #264] ; 0x108 if (interruptMasksUsed & 0x08) NVIC_ISER3 = interruptSave[3]; 2bee: 071a lsls r2, r3, #28 2bf0: d504 bpl.n 2bfc 2bf2: 6b41 ldr r1, [r0, #52] ; 0x34 2bf4: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 2bf8: f8c2 110c str.w r1, [r2, #268] ; 0x10c if (interruptMasksUsed & 0x10) NVIC_ISER4 = interruptSave[4]; 2bfc: 06db lsls r3, r3, #27 2bfe: d504 bpl.n 2c0a 2c00: 6b82 ldr r2, [r0, #56] ; 0x38 2c02: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 2c06: f8c3 2110 str.w r2, [r3, #272] ; 0x110 } 2c0a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} d = _clock ? clkhz/_clock : clkhz; 2c0e: 4918 ldr r1, [pc, #96] ; (2c70 ) 2c10: fba1 5102 umull r5, r1, r1, r2 2c14: 0d09 lsrs r1, r1, #20 if (d && clkhz/d > _clock) d++; 2c16: fbb2 f2f1 udiv r2, r2, r1 2c1a: 42a2 cmp r2, r4 2c1c: bf88 it hi 2c1e: 3101 addhi r1, #1 if (d > 257) d= 257; // max div 2c20: f5b1 7f81 cmp.w r1, #258 ; 0x102 2c24: d30d bcc.n 2c42 2c26: 4a13 ldr r2, [pc, #76] ; (2c74 ) div = d-2; 2c28: e7c0 b.n 2bac interruptSave[4] = NVIC_ICER4 & interruptMask[4]; 2c2a: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 2c2e: 6a41 ldr r1, [r0, #36] ; 0x24 2c30: f8d2 3190 ldr.w r3, [r2, #400] ; 0x190 2c34: 400b ands r3, r1 2c36: 6383 str r3, [r0, #56] ; 0x38 NVIC_ICER4 = interruptSave[4]; 2c38: f8c2 3190 str.w r3, [r2, #400] ; 0x190 2c3c: e79f b.n 2b7e port().CCR = _ccr; 2c3e: 68c2 ldr r2, [r0, #12] 2c40: e7b5 b.n 2bae if (d > 2) { 2c42: 2902 cmp r1, #2 2c44: d9b1 bls.n 2baa div = d-2; 2c46: 3902 subs r1, #2 _ccr = LPSPI_CCR_SCKDIV(div) | LPSPI_CCR_DBT(div/2) | LPSPI_CCR_PCSSCK(div/2); 2c48: 084c lsrs r4, r1, #1 2c4a: 0222 lsls r2, r4, #8 2c4c: ea42 4204 orr.w r2, r2, r4, lsl #16 2c50: 430a orrs r2, r1 2c52: e7ab b.n 2bac 2c54: 400fc000 .word 0x400fc000 2c58: e3ffffcf .word 0xe3ffffcf 2c5c: 08000010 .word 0x08000010 2c60: 20000b44 .word 0x20000b44 2c64: 003d0900 .word 0x003d0900 2c68: 20000b34 .word 0x20000b34 2c6c: 003d08ff .word 0x003d08ff 2c70: 431bde83 .word 0x431bde83 2c74: 007f7fff .word 0x007f7fff 00002c78 : if (n >= NVIC_NUM_INTERRUPTS) return; 2c78: 299f cmp r1, #159 ; 0x9f 2c7a: d80f bhi.n 2c9c interruptMasksUsed |= (1 << (n >> 5)); 2c7c: 094b lsrs r3, r1, #5 2c7e: 2201 movs r2, #1 interruptMask[n >> 5] |= (1 << (n & 0x1F)); 2c80: f001 011f and.w r1, r1, #31 interruptMasksUsed |= (1 << (n >> 5)); 2c84: fa02 fc03 lsl.w ip, r2, r3 2c88: eb00 0383 add.w r3, r0, r3, lsl #2 interruptMask[n >> 5] |= (1 << (n & 0x1F)); 2c8c: 408a lsls r2, r1 interruptMasksUsed |= (1 << (n >> 5)); 2c8e: 7cc1 ldrb r1, [r0, #19] 2c90: ea41 010c orr.w r1, r1, ip 2c94: 74c1 strb r1, [r0, #19] interruptMask[n >> 5] |= (1 << (n & 0x1F)); 2c96: 6959 ldr r1, [r3, #20] 2c98: 4311 orrs r1, r2 2c9a: 6159 str r1, [r3, #20] } 2c9c: 4770 bx lr 2c9e: bf00 nop 00002ca0 : if (n >= NVIC_NUM_INTERRUPTS) return; 2ca0: 299f cmp r1, #159 ; 0x9f 2ca2: d818 bhi.n 2cd6 interruptMask[n >> 5] &= ~(1 << (n & 0x1F)); 2ca4: 2201 movs r2, #1 { 2ca6: b500 push {lr} interruptMask[n >> 5] &= ~(1 << (n & 0x1F)); 2ca8: ea4f 1e51 mov.w lr, r1, lsr #5 2cac: f001 011f and.w r1, r1, #31 2cb0: eb00 0c8e add.w ip, r0, lr, lsl #2 2cb4: fa02 f101 lsl.w r1, r2, r1 2cb8: f8dc 3014 ldr.w r3, [ip, #20] 2cbc: ea23 0301 bic.w r3, r3, r1 2cc0: f8cc 3014 str.w r3, [ip, #20] if (interruptMask[n >> 5] == 0) { 2cc4: b92b cbnz r3, 2cd2 interruptMasksUsed &= ~(1 << (n >> 5)); 2cc6: 7cc3 ldrb r3, [r0, #19] 2cc8: fa02 f20e lsl.w r2, r2, lr 2ccc: ea23 0302 bic.w r3, r3, r2 2cd0: 74c3 strb r3, [r0, #19] } 2cd2: f85d fb04 ldr.w pc, [sp], #4 2cd6: 4770 bx lr 00002cd8 : if (count == 0) return; 2cd8: b10b cbz r3, 2cde 2cda: f7ff be15 b.w 2908 } 2cde: 4770 bx lr 00002ce0 : const SPI_Hardware_t & hardware() { return *(const SPI_Hardware_t *)hardware_addr; } 2ce0: 6843 ldr r3, [r0, #4] if (hardware().clock_gate_register & hardware().clock_gate_mask) { 2ce2: e9d3 1200 ldrd r1, r2, [r3] 2ce6: 6809 ldr r1, [r1, #0] 2ce8: 4211 tst r1, r2 2cea: d100 bne.n 2cee 2cec: 4770 bx lr void SPIClass::end() { 2cee: b510 push {r4, lr} IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } 2cf0: 6802 ldr r2, [r0, #0] 2cf2: 4604 mov r4, r0 port().CR = 0; // turn off the enable 2cf4: 2000 movs r0, #0 pinMode(hardware().miso_pin[miso_pin_index], INPUT_DISABLE); 2cf6: 2105 movs r1, #5 port().CR = 0; // turn off the enable 2cf8: 6110 str r0, [r2, #16] pinMode(hardware().miso_pin[miso_pin_index], INPUT_DISABLE); 2cfa: 7c22 ldrb r2, [r4, #16] 2cfc: 4413 add r3, r2 2cfe: 7c18 ldrb r0, [r3, #16] 2d00: f008 fb0c bl b31c pinMode(hardware().mosi_pin[mosi_pin_index], INPUT_DISABLE); 2d04: 7c62 ldrb r2, [r4, #17] 2d06: 6863 ldr r3, [r4, #4] 2d08: 2105 movs r1, #5 2d0a: 4413 add r3, r2 2d0c: f893 0024 ldrb.w r0, [r3, #36] ; 0x24 2d10: f008 fb04 bl b31c pinMode(hardware().sck_pin[sck_pin_index], INPUT_DISABLE); 2d14: 6863 ldr r3, [r4, #4] 2d16: 7ca2 ldrb r2, [r4, #18] 2d18: 2105 movs r1, #5 2d1a: 4413 add r3, r2 } 2d1c: e8bd 4010 ldmia.w sp!, {r4, lr} pinMode(hardware().sck_pin[sck_pin_index], INPUT_DISABLE); 2d20: f893 0038 ldrb.w r0, [r3, #56] ; 0x38 2d24: f008 bafa b.w b31c 00002d28 : virtual bool mediaPresent() { return true; } virtual const char * name() { return nullptr; } 2d28: 2000 movs r0, #0 2d2a: 4770 bx lr 00002d2c : class SDClass : public FS 2d2c: 4770 bx lr 2d2e: bf00 nop 00002d30 : { 2d30: b530 push {r4, r5, lr} 2d32: b083 sub sp, #12 2d34: 4605 mov r5, r0 2d36: 460c mov r4, r1 uint32_t makeTime(const DateTimeFields &tm); // convert DateTimeFields to 32 bit time class teensy3_clock_class { public: static unsigned long get(void) __attribute__((always_inline)) { return rtc_get(); } 2d38: f008 fcb8 bl b6ac if (now < 315532800) { // before 1980 2d3c: 4b1c ldr r3, [pc, #112] ; (2db0 ) 2d3e: 4298 cmp r0, r3 2d40: d804 bhi.n 2d4c *date = 0; 2d42: 2300 movs r3, #0 2d44: 802b strh r3, [r5, #0] *time = 0; 2d46: 8023 strh r3, [r4, #0] } 2d48: b003 add sp, #12 2d4a: bd30 pop {r4, r5, pc} breakTime(now, datetime); 2d4c: 4669 mov r1, sp 2d4e: f007 fff1 bl ad34 *date = FS_DATE(datetime.year + 1900, datetime.mon + 1, datetime.mday); 2d52: f89d 3005 ldrb.w r3, [sp, #5] 2d56: f89d 2006 ldrb.w r2, [sp, #6] 2d5a: 3301 adds r3, #1 2d5c: f89d 1004 ldrb.w r1, [sp, #4] year -= 1980; 2d60: 3a50 subs r2, #80 ; 0x50 2d62: b2db uxtb r3, r3 2d64: b292 uxth r2, r2 return year > 127 || month > 12 || day > 31 ? 0 : 2d66: 291f cmp r1, #31 2d68: bf98 it ls 2d6a: 2b0c cmpls r3, #12 2d6c: d801 bhi.n 2d72 2d6e: 2a7f cmp r2, #127 ; 0x7f 2d70: d918 bls.n 2da4 year << 9 | month << 5 | day; 2d72: 2100 movs r1, #0 *time = FS_TIME(datetime.hour, datetime.min, datetime.sec); 2d74: f89d 2002 ldrb.w r2, [sp, #2] 2d78: f89d 3001 ldrb.w r3, [sp, #1] *date = FS_DATE(datetime.year + 1900, datetime.mon + 1, datetime.mday); 2d7c: 8029 strh r1, [r5, #0] return hour > 23 || minute > 59 || second > 59 ? 0 : 2d7e: 2a17 cmp r2, #23 2d80: bf98 it ls 2d82: 2b3b cmpls r3, #59 ; 0x3b *time = FS_TIME(datetime.hour, datetime.min, datetime.sec); 2d84: f89d 1000 ldrb.w r1, [sp] 2d88: d801 bhi.n 2d8e 2d8a: 293b cmp r1, #59 ; 0x3b 2d8c: d903 bls.n 2d96 hour << 11 | minute << 5 | second >> 1; 2d8e: 2300 movs r3, #0 2d90: 8023 strh r3, [r4, #0] } 2d92: b003 add sp, #12 2d94: bd30 pop {r4, r5, pc} 2d96: 015b lsls r3, r3, #5 2d98: ea43 23c2 orr.w r3, r3, r2, lsl #11 2d9c: ea43 0351 orr.w r3, r3, r1, lsr #1 2da0: b29b uxth r3, r3 2da2: e7f5 b.n 2d90 year << 9 | month << 5 | day; 2da4: ea41 1143 orr.w r1, r1, r3, lsl #5 2da8: ea41 2142 orr.w r1, r1, r2, lsl #9 2dac: b289 uxth r1, r1 2dae: e7e1 b.n 2d74 2db0: 12cea5ff .word 0x12cea5ff 00002db4 : 2db4: b510 push {r4, lr} 2db6: 4604 mov r4, r0 2db8: f240 41d4 movw r1, #1236 ; 0x4d4 2dbc: f008 fb8a bl b4d4 2dc0: 4620 mov r0, r4 2dc2: bd10 pop {r4, pc} 00002dc4 : if (mode == FILE_WRITE) flags = O_RDWR | O_CREAT | O_AT_END; 2dc4: 2b01 cmp r3, #1 File open(const char *filepath, uint8_t mode = FILE_READ) { 2dc6: b5f0 push {r4, r5, r6, r7, lr} 2dc8: 4605 mov r5, r0 2dca: b095 sub sp, #84 ; 0x54 if (mode == FILE_WRITE) flags = O_RDWR | O_CREAT | O_AT_END; 2dcc: d03d beq.n 2e4a else if (mode == FILE_WRITE_BEGIN) flags = O_RDWR | O_CREAT; 2dce: 2b02 cmp r3, #2 2dd0: f240 2002 movw r0, #514 ; 0x202 SDFAT_FILE file = sdfs.open(filepath, flags); 2dd4: f101 0104 add.w r1, r1, #4 else if (mode == FILE_WRITE_BEGIN) flags = O_RDWR | O_CREAT; 2dd8: bf0c ite eq 2dda: 4603 moveq r3, r0 2ddc: 2300 movne r3, #0 SDFAT_FILE file = sdfs.open(filepath, flags); 2dde: 4668 mov r0, sp 2de0: f005 f8e0 bl 7fa4 2de4: 9b12 ldr r3, [sp, #72] ; 0x48 2de6: 2b00 cmp r3, #0 2de8: d038 beq.n 2e5c if (file) return File(new SDFile(file)); 2dea: 205c movs r0, #92 ; 0x5c class FileImpl { 2dec: 2600 movs r6, #0 2dee: f008 fb6f bl b4d0 SDFile(const SDFAT_FILE &file) : sdfatfile(file), filename(nullptr) { } 2df2: 4b21 ldr r3, [pc, #132] ; (2e78 ) 2df4: af04 add r7, sp, #16 if (file) return File(new SDFile(file)); 2df6: 4604 mov r4, r0 SDFile(const SDFAT_FILE &file) : sdfatfile(file), filename(nullptr) { } 2df8: e9c0 3600 strd r3, r6, [r0] 2dfc: 9b01 ldr r3, [sp, #4] 2dfe: 4639 mov r1, r7 2e00: 3018 adds r0, #24 2e02: f840 3c0c str.w r3, [r0, #-12] 2e06: 4b1d ldr r3, [pc, #116] ; (2e7c ) 2e08: f840 3c10 str.w r3, [r0, #-16] 2e0c: 9b02 ldr r3, [sp, #8] 2e0e: f840 3c08 str.w r3, [r0, #-8] 2e12: f89d 300c ldrb.w r3, [sp, #12] 2e16: f800 3c04 strb.w r3, [r0, #-4] 2e1a: f004 ff67 bl 7cec class FsFile : public StreamFile { 2e1e: 4b18 ldr r3, [pc, #96] ; (2e80 ) constexpr Stream() : _timeout(1000), read_error(0) {} 2e20: f44f 727a mov.w r2, #1000 ; 0x3e8 2e24: 65a6 str r6, [r4, #88] ; 0x58 2e26: 60a3 str r3, [r4, #8] File(FileImpl *file) { 2e28: 4b16 ldr r3, [pc, #88] ; (2e84 ) constexpr Print() : write_error(0) {} 2e2a: 606e str r6, [r5, #4] 2e2c: 602b str r3, [r5, #0] if (f) f->refcount++; 2e2e: 6863 ldr r3, [r4, #4] 2e30: 732e strb r6, [r5, #12] 2e32: 3301 adds r3, #1 2e34: 60aa str r2, [r5, #8] f = file; 2e36: 612c str r4, [r5, #16] if (f) f->refcount++; 2e38: 6063 str r3, [r4, #4] 2e3a: 4b13 ldr r3, [pc, #76] ; (2e88 ) ~FsBaseFile() {close();} 2e3c: 4638 mov r0, r7 2e3e: 9300 str r3, [sp, #0] 2e40: f004 ff96 bl 7d70 return File(); } 2e44: 4628 mov r0, r5 2e46: b015 add sp, #84 ; 0x54 2e48: bdf0 pop {r4, r5, r6, r7, pc} if (mode == FILE_WRITE) flags = O_RDWR | O_CREAT | O_AT_END; 2e4a: f244 2302 movw r3, #16898 ; 0x4202 SDFAT_FILE file = sdfs.open(filepath, flags); 2e4e: 3104 adds r1, #4 2e50: 4668 mov r0, sp 2e52: f005 f8a7 bl 7fa4 bool isOpen() const {return m_fFile || m_xFile;} 2e56: 9b12 ldr r3, [sp, #72] ; 0x48 2e58: 2b00 cmp r3, #0 2e5a: d1c6 bne.n 2dea 2e5c: 9b13 ldr r3, [sp, #76] ; 0x4c 2e5e: 2b00 cmp r3, #0 2e60: d1c3 bne.n 2dea 2e62: f44f 717a mov.w r1, #1000 ; 0x3e8 constexpr File() : f(nullptr) { } 2e66: 4a07 ldr r2, [pc, #28] ; (2e84 ) 2e68: af04 add r7, sp, #16 2e6a: 732b strb r3, [r5, #12] 2e6c: 602a str r2, [r5, #0] 2e6e: 612b str r3, [r5, #16] 2e70: e9c5 3101 strd r3, r1, [r5, #4] 2e74: e7e1 b.n 2e3a 2e76: bf00 nop 2e78: 20000a00 .word 0x20000a00 2e7c: 20000a5c .word 0x20000a5c 2e80: 200009dc .word 0x200009dc 2e84: 200009b0 .word 0x200009b0 2e88: 200008e0 .word 0x200008e0 00002e8c : return sdfs.rename(oldfilepath, newfilepath); } bool remove(const char *filepath) { return sdfs.remove(filepath); } bool rmdir(const char *filepath) { 2e8c: b510 push {r4, lr} * The subdirectory file will be removed only if it is empty. * * \return true for success or false for failure. */ bool rmdir(const char *path) { return m_fVol ? m_fVol->rmdir(path) : 2e8e: f8d0 4484 ldr.w r4, [r0, #1156] ; 0x484 2e92: b08e sub sp, #56 ; 0x38 2e94: 460a mov r2, r1 2e96: b144 cbz r4, 2eaa FatFile() {} 2e98: 2300 movs r3, #0 * * \return true for success or false for failure. */ bool rmdir(const char* path) { FatFile sub; return sub.open(this, path, O_RDONLY) && sub.rmdir(); 2e9a: 4621 mov r1, r4 2e9c: 4668 mov r0, sp 2e9e: 9300 str r3, [sp, #0] 2ea0: f002 fe56 bl 5b50 2ea4: b980 cbnz r0, 2ec8 return sdfs.rmdir(filepath); } 2ea6: b00e add sp, #56 ; 0x38 2ea8: bd10 pop {r4, pc} 2eaa: f8d0 1488 ldr.w r1, [r0, #1160] ; 0x488 m_xVol ? m_xVol->rmdir(path) : false; 2eae: b141 cbz r1, 2ec2 * * \return true for success or false for failure. */ bool rmdir(const char* path) { ExFatFile sub; return sub.open(this, path, O_RDONLY) && sub.rmdir(); 2eb0: 4623 mov r3, r4 2eb2: 4668 mov r0, sp ExFatFile() {} 2eb4: 940c str r4, [sp, #48] ; 0x30 2eb6: f000 ff69 bl 3d8c 2eba: b950 cbnz r0, 2ed2 2ebc: 2000 movs r0, #0 2ebe: b00e add sp, #56 ; 0x38 2ec0: bd10 pop {r4, pc} 2ec2: 4608 mov r0, r1 2ec4: b00e add sp, #56 ; 0x38 2ec6: bd10 pop {r4, pc} 2ec8: 4668 mov r0, sp 2eca: f003 f895 bl 5ff8 2ece: b00e add sp, #56 ; 0x38 2ed0: bd10 pop {r4, pc} 2ed2: 4668 mov r0, sp 2ed4: f001 f818 bl 3f08 2ed8: 2800 cmp r0, #0 2eda: d0ef beq.n 2ebc 2edc: e7e3 b.n 2ea6 2ede: bf00 nop 00002ee0 : bool rename(const char *oldfilepath, const char *newfilepath) { 2ee0: b570 push {r4, r5, r6, lr} return m_fVol ? m_fVol->rename(oldPath, newPath) : 2ee2: f8d0 5484 ldr.w r5, [r0, #1156] ; 0x484 2ee6: b08e sub sp, #56 ; 0x38 2ee8: 4616 mov r6, r2 2eea: b15d cbz r5, 2f04 #endif // ENABLE_ARDUINO_STRING private: friend FatFile; static FatVolume* cwv() {return m_cwv;} FatFile* vwd() {return &m_vwd;} 2eec: f505 6589 add.w r5, r5, #1096 ; 0x448 2ef0: 2300 movs r3, #0 return file.open(vwd(), oldPath, O_RDONLY) && file.rename(vwd(), newPath); 2ef2: 460a mov r2, r1 2ef4: 4668 mov r0, sp 2ef6: 4629 mov r1, r5 2ef8: 9300 str r3, [sp, #0] 2efa: f002 fda7 bl 5a4c 2efe: b990 cbnz r0, 2f26 } 2f00: b00e add sp, #56 ; 0x38 2f02: bd70 pop {r4, r5, r6, pc} 2f04: f8d0 0488 ldr.w r0, [r0, #1160] ; 0x488 m_xVol ? m_xVol->rename(oldPath, newPath) : false; 2f08: 2800 cmp r0, #0 2f0a: d0f9 beq.n 2f00 #endif // ENABLE_ARDUINO_STRING private: friend ExFatFile; static ExFatVolume* cwv() {return m_cwv;} ExFatFile* vwd() {return &m_vwd;} 2f0c: f500 6489 add.w r4, r0, #1096 ; 0x448 return file.open(vwd(), oldPath, O_RDONLY) && file.rename(vwd(), newPath); 2f10: 460a mov r2, r1 2f12: 462b mov r3, r5 2f14: 4668 mov r0, sp 2f16: 4621 mov r1, r4 2f18: 950c str r5, [sp, #48] ; 0x30 2f1a: f000 febb bl 3c94 2f1e: b948 cbnz r0, 2f34 2f20: 2000 movs r0, #0 2f22: b00e add sp, #56 ; 0x38 2f24: bd70 pop {r4, r5, r6, pc} 2f26: 4632 mov r2, r6 2f28: 4629 mov r1, r5 2f2a: 4668 mov r0, sp 2f2c: f002 ff6e bl 5e0c 2f30: b00e add sp, #56 ; 0x38 2f32: bd70 pop {r4, r5, r6, pc} 2f34: 4632 mov r2, r6 2f36: 4621 mov r1, r4 2f38: 4668 mov r0, sp 2f3a: f001 f939 bl 41b0 2f3e: 2800 cmp r0, #0 2f40: d0ee beq.n 2f20 2f42: e7dd b.n 2f00 00002f44 : bool remove(const char *filepath) { 2f44: b510 push {r4, lr} return m_fVol ? m_fVol->remove(path) : 2f46: f8d0 4484 ldr.w r4, [r0, #1156] ; 0x484 2f4a: b08e sub sp, #56 ; 0x38 2f4c: 460a mov r2, r1 2f4e: b14c cbz r4, 2f64 2f50: 2000 movs r0, #0 return tmp.open(this, path, O_WRONLY) && tmp.remove(); 2f52: 2301 movs r3, #1 2f54: 4621 mov r1, r4 2f56: 9000 str r0, [sp, #0] 2f58: 4668 mov r0, sp 2f5a: f002 fdf9 bl 5b50 2f5e: b980 cbnz r0, 2f82 } 2f60: b00e add sp, #56 ; 0x38 2f62: bd10 pop {r4, pc} 2f64: f8d0 1488 ldr.w r1, [r0, #1160] ; 0x488 m_xVol ? m_xVol->remove(path) : false; 2f68: b141 cbz r1, 2f7c return tmp.open(this, path, O_WRONLY) && tmp.remove(); 2f6a: 2301 movs r3, #1 2f6c: 4668 mov r0, sp 2f6e: 940c str r4, [sp, #48] ; 0x30 2f70: f000 ff0c bl 3d8c 2f74: b950 cbnz r0, 2f8c 2f76: 2000 movs r0, #0 2f78: b00e add sp, #56 ; 0x38 2f7a: bd10 pop {r4, pc} 2f7c: 4608 mov r0, r1 2f7e: b00e add sp, #56 ; 0x38 2f80: bd10 pop {r4, pc} 2f82: 4668 mov r0, sp 2f84: f003 feea bl 6d5c 2f88: b00e add sp, #56 ; 0x38 2f8a: bd10 pop {r4, pc} 2f8c: 4668 mov r0, sp 2f8e: f000 ff61 bl 3e54 2f92: 2800 cmp r0, #0 2f94: d0ef beq.n 2f76 2f96: e7e3 b.n 2f60 00002f98 : bool mkdir(const char *filepath) { 2f98: b530 push {r4, r5, lr} return m_fVol ? m_fVol->mkdir(path, pFlag) : 2f9a: f8d0 4484 ldr.w r4, [r0, #1156] ; 0x484 2f9e: b08f sub sp, #60 ; 0x3c 2fa0: 460a mov r2, r1 2fa2: b14c cbz r4, 2fb8 2fa4: 2500 movs r5, #0 return sub.mkdir(vwd(), path, pFlag); 2fa6: 2301 movs r3, #1 2fa8: f504 6189 add.w r1, r4, #1096 ; 0x448 2fac: 4668 mov r0, sp 2fae: 9500 str r5, [sp, #0] 2fb0: f002 fcd6 bl 5960 } 2fb4: b00f add sp, #60 ; 0x3c 2fb6: bd30 pop {r4, r5, pc} 2fb8: f8d0 0488 ldr.w r0, [r0, #1160] ; 0x488 m_xVol ? m_xVol->mkdir(path, pFlag) : false; 2fbc: 2800 cmp r0, #0 2fbe: d0f9 beq.n 2fb4 return sub.mkdir(vwd(), path, pFlag); 2fc0: f500 6189 add.w r1, r0, #1096 ; 0x448 2fc4: 2301 movs r3, #1 2fc6: 4668 mov r0, sp 2fc8: 940c str r4, [sp, #48] ; 0x30 2fca: f001 f973 bl 42b4 2fce: b00f add sp, #60 ; 0x3c 2fd0: bd30 pop {r4, r5, pc} 2fd2: bf00 nop 00002fd4 : bool exists(const char *filepath) { 2fd4: b510 push {r4, lr} return m_fVol ? m_fVol->exists(path) : 2fd6: f8d0 4484 ldr.w r4, [r0, #1156] ; 0x484 2fda: b08e sub sp, #56 ; 0x38 2fdc: 460a mov r2, r1 2fde: b13c cbz r4, 2ff0 2fe0: 2300 movs r3, #0 return tmp.open(this, path, O_RDONLY); 2fe2: 4621 mov r1, r4 2fe4: 4668 mov r0, sp 2fe6: 9300 str r3, [sp, #0] 2fe8: f002 fdb2 bl 5b50 } 2fec: b00e add sp, #56 ; 0x38 2fee: bd10 pop {r4, pc} 2ff0: f8d0 1488 ldr.w r1, [r0, #1160] ; 0x488 m_xVol ? m_xVol->exists(path) : false; 2ff4: b131 cbz r1, 3004 return tmp.open(this, path, O_RDONLY); 2ff6: 4623 mov r3, r4 2ff8: 4668 mov r0, sp 2ffa: 940c str r4, [sp, #48] ; 0x30 2ffc: f000 fec6 bl 3d8c 3000: b00e add sp, #56 ; 0x38 3002: bd10 pop {r4, pc} 3004: 4608 mov r0, r1 3006: b00e add sp, #56 ; 0x38 3008: bd10 pop {r4, pc} 300a: bf00 nop 0000300c : uint64_t usedSize() { 300c: b5f8 push {r3, r4, r5, r6, r7, lr} 300e: 4605 mov r5, r0 if (!cardPreviouslyPresent) return (uint64_t)0; 3010: f890 04d0 ldrb.w r0, [r0, #1232] ; 0x4d0 3014: b908 cbnz r0, 301a 3016: 4601 mov r1, r0 return (uint64_t)(sdfs.clusterCount() - sdfs.freeClusterCount()) * (uint64_t)sdfs.bytesPerCluster(); } 3018: bdf8 pop {r3, r4, r5, r6, r7, pc} return m_fVol ? m_fVol->clusterCount() : 301a: f8d5 3484 ldr.w r3, [r5, #1156] ; 0x484 301e: 2b00 cmp r3, #0 3020: d04c beq.n 30bc uint8_t* cacheClear() { return m_cache.clear(); } /** \return The total number of clusters in the volume. */ uint32_t clusterCount() const { return m_lastCluster - 1; 3022: 69dc ldr r4, [r3, #28] 3024: f8d5 0490 ldr.w r0, [r5, #1168] ; 0x490 3028: 3c01 subs r4, #1 } return rtn; } //---------------------------------------------------------------------------- /** \return true if can be in dedicated SPI state */ bool hasDedicatedSpi() {return m_card ? m_card->hasDedicatedSpi() : false;} 302a: 2800 cmp r0, #0 302c: d054 beq.n 30d8 302e: 6803 ldr r3, [r0, #0] 3030: 6bdb ldr r3, [r3, #60] ; 0x3c 3032: 4798 blx r3 3034: b1e0 cbz r0, 3070 3036: f8d5 0490 ldr.w r0, [r5, #1168] ; 0x490 } errorPrint(pr); } //---------------------------------------------------------------------------- /** \return true if in dedicated SPI state. */ bool isDedicatedSpi() {return m_card ? m_card->isDedicatedSpi() : false;} 303a: b378 cbz r0, 309c 303c: 6803 ldr r3, [r0, #0] 303e: 6c1b ldr r3, [r3, #64] ; 0x40 3040: 4798 blx r3 3042: b9a8 cbnz r0, 3070 3044: f8d5 0490 ldr.w r0, [r5, #1168] ; 0x490 /** Set SPI sharing state * \param[in] value desired state. * \return true for success else false; */ bool setDedicatedSpi(bool value) { if (m_card) { 3048: b340 cbz r0, 309c return m_card->setDedicatedSpi(value); 304a: 6803 ldr r3, [r0, #0] 304c: 2101 movs r1, #1 304e: 6c5b ldr r3, [r3, #68] ; 0x44 3050: 4798 blx r3 if (switchSpi && !setDedicatedSpi(true)) { 3052: 4607 mov r7, r0 3054: b310 cbz r0, 309c return m_fVol ? m_fVol->freeClusterCount() : 3056: f8d5 0484 ldr.w r0, [r5, #1156] ; 0x484 305a: bb58 cbnz r0, 30b4 305c: f8d5 6488 ldr.w r6, [r5, #1160] ; 0x488 3060: 4633 mov r3, r6 m_xVol ? m_xVol->freeClusterCount() : 0; 3062: b96e cbnz r6, 3080 3064: f8d5 0490 ldr.w r0, [r5, #1168] ; 0x490 if (m_card) { 3068: b990 cbnz r0, 3090 uint32_t bytesPerCluster() const { 306a: 2000 movs r0, #0 306c: 4601 mov r1, r0 306e: e7d3 b.n 3018 return m_fVol ? m_fVol->freeClusterCount() : 3070: f8d5 0484 ldr.w r0, [r5, #1156] ; 0x484 3074: b9e8 cbnz r0, 30b2 3076: f8d5 3488 ldr.w r3, [r5, #1160] ; 0x488 m_xVol ? m_xVol->freeClusterCount() : 0; 307a: 2b00 cmp r3, #0 307c: d0f5 beq.n 306a bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); 307e: 4607 mov r7, r0 3080: 4618 mov r0, r3 3082: f002 f9eb bl 545c 3086: 4606 mov r6, r0 if (switchSpi && !setDedicatedSpi(false)) { 3088: b13f cbz r7, 309a 308a: f8d5 0490 ldr.w r0, [r5, #1168] ; 0x490 if (m_card) { 308e: b128 cbz r0, 309c return m_card->setDedicatedSpi(value); 3090: 6803 ldr r3, [r0, #0] 3092: 2100 movs r1, #0 3094: 6c5b ldr r3, [r3, #68] ; 0x44 3096: 4798 blx r3 if (switchSpi && !setDedicatedSpi(false)) { 3098: b100 cbz r0, 309c return (uint64_t)(sdfs.clusterCount() - sdfs.freeClusterCount()) 309a: 1ba4 subs r4, r4, r6 return m_fVol ? m_fVol->bytesPerCluster() : 309c: f8d5 3484 ldr.w r3, [r5, #1156] ; 0x484 30a0: b1fb cbz r3, 30e2 return m_bytesPerSector << m_sectorsPerClusterShift; 30a2: 799b ldrb r3, [r3, #6] 30a4: f44f 7100 mov.w r1, #512 ; 0x200 30a8: 4099 lsls r1, r3 * (uint64_t)sdfs.bytesPerCluster(); 30aa: b289 uxth r1, r1 30ac: fba1 0104 umull r0, r1, r1, r4 } 30b0: bdf8 pop {r3, r4, r5, r6, r7, pc} bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); 30b2: 2700 movs r7, #0 return m_fVol ? m_fVol->freeClusterCount() : 30b4: f004 fca4 bl 7a00 30b8: 4606 mov r6, r0 30ba: e7e5 b.n 3088 30bc: f8d5 3488 ldr.w r3, [r5, #1160] ; 0x488 uint32_t clusterCount() const { 30c0: f8d5 0490 ldr.w r0, [r5, #1168] ; 0x490 m_xVol ? m_xVol->clusterCount() : 0; 30c4: b1b3 cbz r3, 30f4 */ uint8_t* cacheClear() { return m_dataCache.clear(); } /** \return the cluster count for the partition. */ uint32_t clusterCount() const {return m_clusterCount;} 30c6: f8d3 4430 ldr.w r4, [r3, #1072] ; 0x430 bool hasDedicatedSpi() {return m_card ? m_card->hasDedicatedSpi() : false;} 30ca: 2800 cmp r0, #0 30cc: d1af bne.n 302e m_xVol ? m_xVol->freeClusterCount() : 0; 30ce: 4618 mov r0, r3 30d0: f002 f9c4 bl 545c 30d4: 4606 mov r6, r0 30d6: e7e0 b.n 309a return m_fVol ? m_fVol->freeClusterCount() : 30d8: 4618 mov r0, r3 30da: f004 fc91 bl 7a00 30de: 4606 mov r6, r0 30e0: e7db b.n 309a 30e2: f8d5 6488 ldr.w r6, [r5, #1160] ; 0x488 m_xVol ? m_xVol->bytesPerCluster() : 0; 30e6: 2e00 cmp r6, #0 30e8: d0bf beq.n 306a * (uint64_t)sdfs.bytesPerCluster(); 30ea: f8d6 143c ldr.w r1, [r6, #1084] ; 0x43c 30ee: fba1 0104 umull r0, r1, r1, r4 } 30f2: bdf8 pop {r3, r4, r5, r6, r7, pc} 30f4: 2800 cmp r0, #0 30f6: d0b8 beq.n 306a m_xVol ? m_xVol->clusterCount() : 0; 30f8: 461c mov r4, r3 30fa: e798 b.n 302e 000030fc : uint64_t totalSize() { if (!cardPreviouslyPresent) return (uint64_t)0; 30fc: f890 34d0 ldrb.w r3, [r0, #1232] ; 0x4d0 3100: b163 cbz r3, 311c return m_fVol ? m_fVol->clusterCount() : 3102: f8d0 3484 ldr.w r3, [r0, #1156] ; 0x484 3106: b163 cbz r3, 3122 3108: 799a ldrb r2, [r3, #6] 310a: f44f 7000 mov.w r0, #512 ; 0x200 return m_lastCluster - 1; 310e: 69d9 ldr r1, [r3, #28] return m_bytesPerSector << m_sectorsPerClusterShift; 3110: 4090 lsls r0, r2 return m_lastCluster - 1; 3112: 3901 subs r1, #1 return (uint64_t)sdfs.clusterCount() * (uint64_t)sdfs.bytesPerCluster(); 3114: b280 uxth r0, r0 3116: fba0 0101 umull r0, r1, r0, r1 311a: 4770 bx lr if (!cardPreviouslyPresent) return (uint64_t)0; 311c: 4618 mov r0, r3 311e: 4601 mov r1, r0 } 3120: 4770 bx lr 3122: f8d0 0488 ldr.w r0, [r0, #1160] ; 0x488 m_xVol ? m_xVol->clusterCount() : 0; 3126: 2800 cmp r0, #0 3128: d0f9 beq.n 311e return (uint64_t)sdfs.clusterCount() * (uint64_t)sdfs.bytesPerCluster(); 312a: f8d0 143c ldr.w r1, [r0, #1084] ; 0x43c 312e: f8d0 0430 ldr.w r0, [r0, #1072] ; 0x430 3132: fba1 0100 umull r0, r1, r1, r0 3136: 4770 bx lr 00003138 : { 3138: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} SdCard* card() {return m_card;} 313c: f8d0 5490 ldr.w r5, [r0, #1168] ; 0x490 3140: b08d sub sp, #52 ; 0x34 if (!card) return false; // no SD card 3142: b14d cbz r5, 3158 3144: 4698 mov r8, r3 uint32_t sectors = card->sectorCount(); 3146: 682b ldr r3, [r5, #0] 3148: 4604 mov r4, r0 314a: 4628 mov r0, r5 314c: 69db ldr r3, [r3, #28] 314e: 4798 blx r3 if (sectors <= 12288) return false; // card too small 3150: f5b0 5f40 cmp.w r0, #12288 ; 0x3000 uint32_t sectors = card->sectorCount(); 3154: 4606 mov r6, r0 if (sectors <= 12288) return false; // card too small 3156: d804 bhi.n 3162 if (!card) return false; // no SD card 3158: 2600 movs r6, #0 } 315a: 4630 mov r0, r6 315c: b00d add sp, #52 ; 0x34 315e: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} uint8_t *buf = (uint8_t *)malloc(512); 3162: f44f 7000 mov.w r0, #512 ; 0x200 3166: f00a f9e1 bl d52c if (!buf) return false; // unable to allocate memory 316a: 4607 mov r7, r0 316c: 2800 cmp r0, #0 316e: d0f3 beq.n 3158 ret = exFatFormatter.format(card, buf, &pr); 3170: f10d 0904 add.w r9, sp, #4 if (sectors > 67108864) { 3174: f1b6 6f80 cmp.w r6, #67108864 ; 0x4000000 ret = exFatFormatter.format(card, buf, &pr); 3178: 4602 mov r2, r0 317a: 4643 mov r3, r8 317c: 4629 mov r1, r5 317e: 4648 mov r0, r9 if (sectors > 67108864) { 3180: d92e bls.n 31e0 ret = exFatFormatter.format(card, buf, &pr); 3182: f001 fc37 bl 49f4 3186: 4606 mov r6, r0 free(buf); 3188: 4638 mov r0, r7 318a: f00a f9d7 bl d53c if (ret) { 318e: 2e00 cmp r6, #0 3190: d0e2 beq.n 3158 card->syncDevice(); 3192: 682b ldr r3, [r5, #0] 3194: 4628 mov r0, r5 sdfs.restart(); // TODO: is sdfs.volumeBegin() enough?? 3196: 1d27 adds r7, r4, #4 card->syncDevice(); 3198: 6a1b ldr r3, [r3, #32] 319a: 4798 blx r3 if (spiConfigBackupPin == 255) { 319c: f894 34c0 ldrb.w r3, [r4, #1216] ; 0x4c0 31a0: 2bff cmp r3, #255 ; 0xff 31a2: d021 beq.n 31e8 SdSpiConfig spiConfig(spiConfigBackupPin, spiConfigBackupOptions, 31a4: f8d4 34c4 ldr.w r3, [r4, #1220] ; 0x4c4 * * \param[in] config SPI configuration. * \return generic card pointer. */ SdCard* newCard(SdSpiConfig config) { m_spiCard.begin(config); 31a8: f504 6594 add.w r5, r4, #1184 ; 0x4a0 31ac: 9302 str r3, [sp, #8] 31ae: 4628 mov r0, r5 31b0: f8d4 34c8 ldr.w r3, [r4, #1224] ; 0x4c8 bool cardBegin(SdSpiConfig spiConfig) { 31b4: 9303 str r3, [sp, #12] 31b6: f8b4 34c0 ldrh.w r3, [r4, #1216] ; 0x4c0 31ba: f8ad 3004 strh.w r3, [sp, #4] 31be: e899 000e ldmia.w r9, {r1, r2, r3} 31c2: f005 fdb5 bl 8d30 return m_card && !m_card->errorCode(); 31c6: f894 34b1 ldrb.w r3, [r4, #1201] ; 0x4b1 m_card = m_cardFactory.newCard(spiConfig); 31ca: f8c4 5490 str.w r5, [r4, #1168] ; 0x490 return m_card && !m_card->errorCode(); 31ce: 2b00 cmp r3, #0 31d0: d1c3 bne.n 315a return cardBegin(sdioConfig) && Vol::begin(m_card); 31d2: 2301 movs r3, #1 31d4: 4629 mov r1, r5 31d6: 4638 mov r0, r7 31d8: 461a mov r2, r3 31da: f004 fe71 bl 7ec0 31de: e7bc b.n 315a ret = fatFormatter.format(card, buf, &pr); 31e0: f004 f8d4 bl 738c 31e4: 4606 mov r6, r0 31e6: e7cf b.n 3188 * \param[in] config SDIO configuration. * \return generic card pointer or nullptr if SDIO is not supported. */ SdCard* newCard(SdioConfig config) { #if HAS_SDIO_CLASS m_sdioCard.begin(config); 31e8: f204 4594 addw r5, r4, #1172 ; 0x494 31ec: f894 14cc ldrb.w r1, [r4, #1228] ; 0x4cc 31f0: 4628 mov r0, r5 31f2: f006 fbe5 bl 99c0 return m_card && !m_card->errorCode(); 31f6: 4628 mov r0, r5 m_card = m_cardFactory.newCard(sdioConfig); 31f8: f8c4 5490 str.w r5, [r4, #1168] ; 0x490 return m_card && !m_card->errorCode(); 31fc: f005 fe42 bl 8e84 3200: 2800 cmp r0, #0 3202: d1aa bne.n 315a return cardBegin(sdioConfig) && Vol::begin(m_card); 3204: 2301 movs r3, #1 3206: f8d4 1490 ldr.w r1, [r4, #1168] ; 0x490 320a: 4638 mov r0, r7 320c: 461a mov r2, r3 320e: f004 fe57 bl 7ec0 3212: e7a2 b.n 315a 00003214 : { 3214: b570 push {r4, r5, r6, lr} SdCard* card() {return m_card;} 3216: f8d0 5490 ldr.w r5, [r0, #1168] ; 0x490 321a: b084 sub sp, #16 321c: 4604 mov r4, r0 if (card) { 321e: 2d00 cmp r5, #0 3220: d040 beq.n 32a4 if (cardPreviouslyPresent) { 3222: f890 34d0 ldrb.w r3, [r0, #1232] ; 0x4d0 3226: b183 cbz r3, 324a if (csPin_ == BUILTIN_SDCARD) { 3228: f890 34d1 ldrb.w r3, [r0, #1233] ; 0x4d1 322c: 2bfe cmp r3, #254 ; 0xfe 322e: d06e beq.n 330e if (cdPin_ < NUM_DIGITAL_PINS) ret = digitalRead(cdPin_); 3230: f894 04d2 ldrb.w r0, [r4, #1234] ; 0x4d2 3234: 2836 cmp r0, #54 ; 0x36 3236: d95a bls.n 32ee ret = card->readCID(&cid); 3238: 682b ldr r3, [r5, #0] 323a: 4669 mov r1, sp 323c: 4628 mov r0, r5 323e: 6c9b ldr r3, [r3, #72] ; 0x48 3240: 4798 blx r3 cardPreviouslyPresent = ret; 3242: f884 04d0 strb.w r0, [r4, #1232] ; 0x4d0 } 3246: b004 add sp, #16 3248: bd70 pop {r4, r5, r6, pc} if (csPin_ == BUILTIN_SDCARD) ret = digitalReadFast(_SD_DAT3); 324a: f890 34d1 ldrb.w r3, [r0, #1233] ; 0x4d1 324e: 2bfe cmp r3, #254 ; 0xfe 3250: d058 beq.n 3304 if (cdPin_ < NUM_DIGITAL_PINS) ret = digitalRead(cdPin_); 3252: f890 04d2 ldrb.w r0, [r0, #1234] ; 0x4d2 3256: 2836 cmp r0, #54 ; 0x36 3258: d94f bls.n 32fa if (spiConfigBackupPin == 255) { 325a: f894 34c0 ldrb.w r3, [r4, #1216] ; 0x4c0 ret = sdfs.restart(); 325e: 1d26 adds r6, r4, #4 3260: 2bff cmp r3, #255 ; 0xff 3262: d124 bne.n 32ae 3264: f204 4594 addw r5, r4, #1172 ; 0x494 3268: f894 14cc ldrb.w r1, [r4, #1228] ; 0x4cc 326c: 4628 mov r0, r5 326e: f006 fba7 bl 99c0 return m_card && !m_card->errorCode(); 3272: 4628 mov r0, r5 m_card = m_cardFactory.newCard(sdioConfig); 3274: f8c4 5490 str.w r5, [r4, #1168] ; 0x490 return m_card && !m_card->errorCode(); 3278: f005 fe04 bl 8e84 327c: 2800 cmp r0, #0 327e: d064 beq.n 334a pinMode(_SD_DAT3, INPUT_PULLDOWN); 3280: 2103 movs r1, #3 3282: 202e movs r0, #46 ; 0x2e 3284: f008 f84a bl b31c uint32_t begin = ARM_DWT_CYCCNT; 3288: 4935 ldr r1, [pc, #212] ; (3360 ) uint32_t cycles = F_CPU_ACTUAL / 1000000 * usec; 328a: 4a36 ldr r2, [pc, #216] ; (3364 ) 328c: 4b36 ldr r3, [pc, #216] ; (3368 ) uint32_t begin = ARM_DWT_CYCCNT; 328e: 6848 ldr r0, [r1, #4] uint32_t cycles = F_CPU_ACTUAL / 1000000 * usec; 3290: 6812 ldr r2, [r2, #0] 3292: fba3 3202 umull r3, r2, r3, r2 3296: 0c92 lsrs r2, r2, #18 3298: eb02 0282 add.w r2, r2, r2, lsl #2 while (ARM_DWT_CYCCNT - begin < cycles) ; // wait 329c: 684b ldr r3, [r1, #4] 329e: 1a1b subs r3, r3, r0 32a0: 429a cmp r2, r3 32a2: d8fb bhi.n 329c ret = false; 32a4: 2000 movs r0, #0 cardPreviouslyPresent = ret; 32a6: f884 04d0 strb.w r0, [r4, #1232] ; 0x4d0 } 32aa: b004 add sp, #16 32ac: bd70 pop {r4, r5, r6, pc} SdSpiConfig spiConfig(spiConfigBackupPin, spiConfigBackupOptions, 32ae: f8d4 34c8 ldr.w r3, [r4, #1224] ; 0x4c8 m_spiCard.begin(config); 32b2: f504 6594 add.w r5, r4, #1184 ; 0x4a0 32b6: f8d4 14c4 ldr.w r1, [r4, #1220] ; 0x4c4 bool cardBegin(SdSpiConfig spiConfig) { 32ba: f8b4 24c0 ldrh.w r2, [r4, #1216] ; 0x4c0 32be: 4628 mov r0, r5 32c0: 9302 str r3, [sp, #8] 32c2: 466b mov r3, sp 32c4: 9101 str r1, [sp, #4] 32c6: f8ad 2000 strh.w r2, [sp] 32ca: cb0e ldmia r3, {r1, r2, r3} 32cc: f005 fd30 bl 8d30 return m_card && !m_card->errorCode(); 32d0: f894 34b1 ldrb.w r3, [r4, #1201] ; 0x4b1 m_card = m_cardFactory.newCard(spiConfig); 32d4: f8c4 5490 str.w r5, [r4, #1168] ; 0x490 return m_card && !m_card->errorCode(); 32d8: 2b00 cmp r3, #0 32da: d1d1 bne.n 3280 return cardBegin(sdioConfig) && Vol::begin(m_card); 32dc: 2301 movs r3, #1 32de: 4629 mov r1, r5 32e0: 4630 mov r0, r6 32e2: 461a mov r2, r3 32e4: f004 fdec bl 7ec0 32e8: 2800 cmp r0, #0 32ea: d1dc bne.n 32a6 32ec: e7c8 b.n 3280 if (cdPin_ < NUM_DIGITAL_PINS) ret = digitalRead(cdPin_); 32ee: f008 f803 bl b2f8 32f2: 3800 subs r0, #0 32f4: bf18 it ne 32f6: 2001 movne r0, #1 32f8: e7d5 b.n 32a6 if (cdPin_ < NUM_DIGITAL_PINS) ret = digitalRead(cdPin_); 32fa: f007 fffd bl b2f8 if (ret) { 32fe: 2800 cmp r0, #0 3300: d1ab bne.n 325a 3302: e7cf b.n 32a4 return (CORE_PIN46_PINREG & CORE_PIN46_BITMASK) ? 1 : 0; 3304: 4b19 ldr r3, [pc, #100] ; (336c ) 3306: 689b ldr r3, [r3, #8] 3308: 039b lsls r3, r3, #14 330a: d5cb bpl.n 32a4 330c: e7a5 b.n 325a s = card->status(); 330e: 682b ldr r3, [r5, #0] 3310: 4628 mov r0, r5 3312: 6d5b ldr r3, [r3, #84] ; 0x54 3314: 4798 blx r3 if (s == 0xFFFFFFFF) { 3316: 1c42 adds r2, r0, #1 3318: d08a beq.n 3230 } else if (s == 0) { 331a: b9f8 cbnz r0, 335c if (csPin_ == BUILTIN_SDCARD) { 331c: f894 34d1 ldrb.w r3, [r4, #1233] ; 0x4d1 3320: 2bfe cmp r3, #254 ; 0xfe 3322: d1bf bne.n 32a4 pinMode(_SD_DAT3, INPUT_PULLDOWN); 3324: 2103 movs r1, #3 3326: 202e movs r0, #46 ; 0x2e 3328: f007 fff8 bl b31c uint32_t begin = ARM_DWT_CYCCNT; 332c: 490c ldr r1, [pc, #48] ; (3360 ) uint32_t cycles = F_CPU_ACTUAL / 1000000 * usec; 332e: 4a0d ldr r2, [pc, #52] ; (3364 ) 3330: 4b0d ldr r3, [pc, #52] ; (3368 ) uint32_t begin = ARM_DWT_CYCCNT; 3332: 6848 ldr r0, [r1, #4] uint32_t cycles = F_CPU_ACTUAL / 1000000 * usec; 3334: 6812 ldr r2, [r2, #0] 3336: fba3 3202 umull r3, r2, r3, r2 333a: 0c92 lsrs r2, r2, #18 333c: eb02 0282 add.w r2, r2, r2, lsl #2 while (ARM_DWT_CYCCNT - begin < cycles) ; // wait 3340: 684b ldr r3, [r1, #4] 3342: 1a1b subs r3, r3, r0 3344: 429a cmp r2, r3 3346: d8fb bhi.n 3340 3348: e7ac b.n 32a4 334a: 2301 movs r3, #1 334c: f8d4 1490 ldr.w r1, [r4, #1168] ; 0x490 3350: 4630 mov r0, r6 3352: 461a mov r2, r3 3354: f004 fdb4 bl 7ec0 3358: 2800 cmp r0, #0 335a: d091 beq.n 3280 ret = true; 335c: 2001 movs r0, #1 335e: e7a2 b.n 32a6 3360: e0001000 .word 0xe0001000 3364: 20001044 .word 0x20001044 3368: 431bde83 .word 0x431bde83 336c: 42008000 .word 0x42008000 00003370 : bool SDClass::begin(uint8_t csPin) { 3370: b5f0 push {r4, r5, r6, r7, lr} 3372: 460d mov r5, r1 3374: 4604 mov r4, r0 3376: b085 sub sp, #20 FsDateTime::setCallback(dateTime); 3378: 4836 ldr r0, [pc, #216] ; (3454 ) 337a: f006 ffb3 bl a2e4 if (csPin == BUILTIN_SDCARD) { 337e: 2dfe cmp r5, #254 ; 0xfe csPin_ = csPin; // remember which one passed in. 3380: f884 54d1 strb.w r5, [r4, #1233] ; 0x4d1 if (csPin == BUILTIN_SDCARD) { 3384: d026 beq.n 33d4 if (csPin < NUM_DIGITAL_PINS) { 3386: 2d36 cmp r5, #54 ; 0x36 3388: d902 bls.n 3390 return cardBegin(spiConfig) && Vol::begin(m_card); 338a: 2000 movs r0, #0 } 338c: b005 add sp, #20 338e: bdf0 pop {r4, r5, r6, r7, pc} spiConfigBackupOptions = spiConfig.options; 3390: 2600 movs r6, #0 spiConfigBackupClock = spiConfig.maxSck; 3392: 4b31 ldr r3, [pc, #196] ; (3458 ) 3394: f504 6794 add.w r7, r4, #1184 ; 0x4a0 3398: f88d 5004 strb.w r5, [sp, #4] 339c: f8c4 34c4 str.w r3, [r4, #1220] ; 0x4c4 33a0: f88d 6005 strb.w r6, [sp, #5] 33a4: 4638 mov r0, r7 spiConfigBackupPin = spiConfig.csPin; 33a6: f884 54c0 strb.w r5, [r4, #1216] ; 0x4c0 spiConfigBackupOptions = spiConfig.options; 33aa: f884 64c1 strb.w r6, [r4, #1217] ; 0x4c1 spiConfigBackupPort = spiConfig.spiPort; 33ae: f8c4 64c8 str.w r6, [r4, #1224] ; 0x4c8 33b2: e9cd 3602 strd r3, r6, [sp, #8] 33b6: ab04 add r3, sp, #16 33b8: e913 000e ldmdb r3, {r1, r2, r3} 33bc: f005 fcb8 bl 8d30 return m_card && !m_card->errorCode(); 33c0: f894 34b1 ldrb.w r3, [r4, #1201] ; 0x4b1 m_card = m_cardFactory.newCard(spiConfig); 33c4: f8c4 7490 str.w r7, [r4, #1168] ; 0x490 return m_card && !m_card->errorCode(); 33c8: b3b3 cbz r3, 3438 return cardBegin(spiConfig) && Vol::begin(m_card); 33ca: 4630 mov r0, r6 cardPreviouslyPresent = ret; 33cc: f884 04d0 strb.w r0, [r4, #1232] ; 0x4d0 } 33d0: b005 add sp, #20 33d2: bdf0 pop {r4, r5, r6, r7, pc} m_sdioCard.begin(config); 33d4: f204 4594 addw r5, r4, #1172 ; 0x494 sdioConfigBackup = sdioConfig; 33d8: 2300 movs r3, #0 spiConfigBackupPin = 255; 33da: 22ff movs r2, #255 ; 0xff 33dc: 4619 mov r1, r3 33de: 4628 mov r0, r5 sdioConfigBackup = sdioConfig; 33e0: f884 34cc strb.w r3, [r4, #1228] ; 0x4cc spiConfigBackupPin = 255; 33e4: f884 24c0 strb.w r2, [r4, #1216] ; 0x4c0 33e8: f006 faea bl 99c0 return m_card && !m_card->errorCode(); 33ec: 4628 mov r0, r5 m_card = m_cardFactory.newCard(sdioConfig); 33ee: f8c4 5490 str.w r5, [r4, #1168] ; 0x490 return m_card && !m_card->errorCode(); 33f2: f005 fd47 bl 8e84 33f6: b938 cbnz r0, 3408 return cardBegin(sdioConfig) && Vol::begin(m_card); 33f8: 2301 movs r3, #1 33fa: f8d4 1490 ldr.w r1, [r4, #1168] ; 0x490 33fe: 1d20 adds r0, r4, #4 3400: 461a mov r2, r3 3402: f004 fd5d bl 7ec0 3406: b9f0 cbnz r0, 3446 cdPin_ = _SD_DAT3; 3408: 202e movs r0, #46 ; 0x2e cardPreviouslyPresent = ret; 340a: 2300 movs r3, #0 pinMode(_SD_DAT3, INPUT_PULLDOWN); 340c: 2103 movs r1, #3 cardPreviouslyPresent = ret; 340e: f884 34d0 strb.w r3, [r4, #1232] ; 0x4d0 cdPin_ = _SD_DAT3; 3412: f884 04d2 strb.w r0, [r4, #1234] ; 0x4d2 pinMode(_SD_DAT3, INPUT_PULLDOWN); 3416: f007 ff81 bl b31c uint32_t begin = ARM_DWT_CYCCNT; 341a: 4910 ldr r1, [pc, #64] ; (345c ) uint32_t cycles = F_CPU_ACTUAL / 1000000 * usec; 341c: 4a10 ldr r2, [pc, #64] ; (3460 ) 341e: 4b11 ldr r3, [pc, #68] ; (3464 ) uint32_t begin = ARM_DWT_CYCCNT; 3420: 6848 ldr r0, [r1, #4] uint32_t cycles = F_CPU_ACTUAL / 1000000 * usec; 3422: 6812 ldr r2, [r2, #0] 3424: fba3 3202 umull r3, r2, r3, r2 3428: 0c92 lsrs r2, r2, #18 342a: eb02 0282 add.w r2, r2, r2, lsl #2 while (ARM_DWT_CYCCNT - begin < cycles) ; // wait 342e: 684b ldr r3, [r1, #4] 3430: 1a1b subs r3, r3, r0 3432: 429a cmp r2, r3 3434: d8fb bhi.n 342e 3436: e7a8 b.n 338a 3438: 2301 movs r3, #1 343a: 4639 mov r1, r7 343c: 1d20 adds r0, r4, #4 343e: 461a mov r2, r3 3440: f004 fd3e bl 7ec0 3444: e7c2 b.n 33cc cardPreviouslyPresent = ret; 3446: 2201 movs r2, #1 cdPin_ = _SD_DAT3; 3448: 232e movs r3, #46 ; 0x2e cardPreviouslyPresent = ret; 344a: f884 24d0 strb.w r2, [r4, #1232] ; 0x4d0 cdPin_ = _SD_DAT3; 344e: f884 34d2 strb.w r3, [r4, #1234] ; 0x4d2 if (!ret) { 3452: e79b b.n 338c 3454: 00002d31 .word 0x00002d31 3458: 017d7840 .word 0x017d7840 345c: e0001000 .word 0xe0001000 3460: 20001044 .word 0x20001044 3464: 431bde83 .word 0x431bde83 00003468 <_GLOBAL__sub_I_SD>: SDClass() { } 3468: 4818 ldr r0, [pc, #96] ; (34cc <_GLOBAL__sub_I_SD+0x64>) /** SD is in multi-sector read state. */ static const uint8_t READ_STATE = 1; /** SD is in multi-sector write state. */ static const uint8_t WRITE_STATE = 2; /** Construct an instance of SharedSpiCard. */ SharedSpiCard() {} 346a: f04f 0c29 mov.w ip, #41 ; 0x29 //------------------------------------------------------------------------------ /** * \class SdioCard * \brief Raw SDIO access to SD and SDHC flash memory cards. */ class SdioCard : public SdCardInterface { 346e: 4a18 ldr r2, [pc, #96] ; (34d0 <_GLOBAL__sub_I_SD+0x68>) FsVolume() {} 3470: 2300 movs r3, #0 SPISettings() : _clock(4000000) { 3472: 4918 ldr r1, [pc, #96] ; (34d4 <_GLOBAL__sub_I_SD+0x6c>) } return true; } 3474: b410 push {r4} 3476: f8c0 2494 str.w r2, [r0, #1172] ; 0x494 tcr = LPSPI_TCR_FRAMESZ(7); // TCR has polarity and bit order too 347a: 2207 movs r2, #7 347c: f880 c4b1 strb.w ip, [r0, #1201] ; 0x4b1 3480: f04f 0cff mov.w ip, #255 ; 0xff SPISettings() : _clock(4000000) { 3484: f8c0 14a8 str.w r1, [r0, #1192] ; 0x4a8 3488: f44f 417f mov.w r1, #65280 ; 0xff00 348c: 4c12 ldr r4, [pc, #72] ; (34d8 <_GLOBAL__sub_I_SD+0x70>) tcr = LPSPI_TCR_FRAMESZ(7); // TCR has polarity and bit order too 348e: f8c0 24ac str.w r2, [r0, #1196] ; 0x4ac * \brief Raw access to SD and SDHC flash memory cards via dedicate SPI port. */ class DedicatedSpiCard : public SharedSpiCard { public: /** Construct an instance of DedicatedSpiCard. */ DedicatedSpiCard() {} 3492: 4a12 ldr r2, [pc, #72] ; (34dc <_GLOBAL__sub_I_SD+0x74>) 3494: f8a0 14d0 strh.w r1, [r0, #1232] ; 0x4d0 SdioConfig() {} 3498: f8a0 349c strh.w r3, [r0, #1180] ; 0x49c SharedSpiCard() {} 349c: f880 34b5 strb.w r3, [r0, #1205] ; 0x4b5 34a0: f880 34cc strb.w r3, [r0, #1228] ; 0x4cc 34a4: f880 c4d2 strb.w ip, [r0, #1234] ; 0x4d2 34a8: 6004 str r4, [r0, #0] DedicatedSpiCard() {} 34aa: f8c0 24a0 str.w r2, [r0, #1184] ; 0x4a0 SDClass SD; 34ae: 490c ldr r1, [pc, #48] ; (34e0 <_GLOBAL__sub_I_SD+0x78>) 34b0: 4a0c ldr r2, [pc, #48] ; (34e4 <_GLOBAL__sub_I_SD+0x7c>) } 34b2: f85d 4b04 ldr.w r4, [sp], #4 34b6: f8c0 3484 str.w r3, [r0, #1156] ; 0x484 34ba: f8c0 3488 str.w r3, [r0, #1160] ; 0x488 class SdBase : public Vol { 34be: f8c0 3490 str.w r3, [r0, #1168] ; 0x490 34c2: f880 34bc strb.w r3, [r0, #1212] ; 0x4bc SDClass SD; 34c6: f00a b82b b.w d520 <__aeabi_atexit> 34ca: bf00 nop 34cc: 20001f40 .word 0x20001f40 34d0: 20000abc .word 0x20000abc 34d4: 003d0900 .word 0x003d0900 34d8: 20000a80 .word 0x20000a80 34dc: 20000934 .word 0x20000934 34e0: 00002d2d .word 0x00002d2d 34e4: 200010b4 .word 0x200010b4 000034e8 : #else // USE_UTF8_LONG_NAMES return !(lfnReservedChar(c) || c & 0X80); #endif // USE_UTF8_LONG_NAMES } //------------------------------------------------------------------------------ uint8_t* ExFatFile::dirCache(uint8_t set, uint8_t options) { 34e8: b570 push {r4, r5, r6, lr} DirPos_t pos = m_dirPos; 34ea: f100 0324 add.w r3, r0, #36 ; 0x24 uint8_t* ExFatFile::dirCache(uint8_t set, uint8_t options) { 34ee: b084 sub sp, #16 34f0: 468c mov ip, r1 34f2: 4604 mov r4, r0 DirPos_t pos = m_dirPos; 34f4: ad01 add r5, sp, #4 uint8_t* ExFatFile::dirCache(uint8_t set, uint8_t options) { 34f6: 4616 mov r6, r2 DirPos_t pos = m_dirPos; 34f8: e893 0007 ldmia.w r3, {r0, r1, r2} 34fc: e885 0007 stmia.w r5, {r0, r1, r2} if (m_vol->dirSeek(&pos, FS_DIR_SIZE*set) != 1) { 3500: ea4f 124c mov.w r2, ip, lsl #5 3504: 4629 mov r1, r5 3506: 6a20 ldr r0, [r4, #32] 3508: f001 fec4 bl 5294 350c: 2801 cmp r0, #1 350e: d106 bne.n 351e return nullptr; } return m_vol->dirCache(&pos, options); 3510: 4632 mov r2, r6 3512: 4629 mov r1, r5 3514: 6a20 ldr r0, [r4, #32] 3516: f001 fea1 bl 525c } 351a: b004 add sp, #16 351c: bd70 pop {r4, r5, r6, pc} return nullptr; 351e: 2000 movs r0, #0 } 3520: b004 add sp, #16 3522: bd70 pop {r4, r5, r6, pc} 00003524 : //------------------------------------------------------------------------------ bool ExFatFile::close() { 3524: b510 push {r4, lr} 3526: 4604 mov r4, r0 bool rtn = sync(); 3528: f000 fdba bl 40a0 m_attributes = FILE_ATTR_CLOSED; 352c: 2300 movs r3, #0 352e: f884 3031 strb.w r3, [r4, #49] ; 0x31 m_flags = 0; 3532: f884 3033 strb.w r3, [r4, #51] ; 0x33 return rtn; } 3536: bd10 pop {r4, pc} 00003538 : fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { 3538: b538 push {r3, r4, r5, lr} 353a: 4614 mov r4, r2 353c: 460d mov r5, r1 DirFile_t* df = reinterpret_cast (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); 353e: 2200 movs r2, #0 3540: f100 0124 add.w r1, r0, #36 ; 0x24 3544: 6a00 ldr r0, [r0, #32] 3546: f001 fe89 bl 525c if (!df) { 354a: 4603 mov r3, r0 354c: b120 cbz r0, 3558 void lbaToMbrChs(uint8_t* chs, uint32_t capacityMB, uint32_t lba); //----------------------------------------------------------------------------- #if !defined(USE_SIMPLE_LITTLE_ENDIAN) || USE_SIMPLE_LITTLE_ENDIAN // assumes CPU is little-endian and handles alignment issues. inline uint16_t getLe16(const uint8_t* src) { return *reinterpret_cast(src); 354e: 8942 ldrh r2, [r0, #10] DBG_FAIL_MACRO; goto fail; } *pdate = getLe16(df->createDate); *ptime = getLe16(df->createTime); return true; 3550: 2001 movs r0, #1 *pdate = getLe16(df->createDate); 3552: 802a strh r2, [r5, #0] 3554: 891b ldrh r3, [r3, #8] *ptime = getLe16(df->createTime); 3556: 8023 strh r3, [r4, #0] fail: return false; } 3558: bd38 pop {r3, r4, r5, pc} 355a: bf00 nop 0000355c : //------------------------------------------------------------------------------ bool ExFatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { 355c: b538 push {r3, r4, r5, lr} 355e: 4614 mov r4, r2 3560: 460d mov r5, r1 DirFile_t* df = reinterpret_cast (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); 3562: 2200 movs r2, #0 3564: f100 0124 add.w r1, r0, #36 ; 0x24 3568: 6a00 ldr r0, [r0, #32] 356a: f001 fe77 bl 525c if (!df) { 356e: 4603 mov r3, r0 3570: b120 cbz r0, 357c 3572: 89c2 ldrh r2, [r0, #14] DBG_FAIL_MACRO; goto fail; } *pdate = getLe16(df->modifyDate); *ptime = getLe16(df->modifyTime); return true; 3574: 2001 movs r0, #1 *pdate = getLe16(df->modifyDate); 3576: 802a strh r2, [r5, #0] 3578: 899b ldrh r3, [r3, #12] *ptime = getLe16(df->modifyTime); 357a: 8023 strh r3, [r4, #0] fail: return false; } 357c: bd38 pop {r3, r4, r5, pc} 357e: bf00 nop 00003580 : m_attributes = FILE_ATTR_CLOSED; m_flags = 0; return false; } //------------------------------------------------------------------------------ bool ExFatFile::openRoot(ExFatVolume* vol) { 3580: b538 push {r3, r4, r5, lr} 3582: 460d mov r5, r1 if (isOpen()) { 3584: f890 1031 ldrb.w r1, [r0, #49] ; 0x31 3588: b109 cbz r1, 358e m_vol = vol; m_flags = FILE_FLAG_READ; return true; fail: return false; 358a: 2000 movs r0, #0 } 358c: bd38 pop {r3, r4, r5, pc} memset(this, 0, sizeof(ExFatFile)); 358e: 2238 movs r2, #56 ; 0x38 3590: 4604 mov r4, r0 3592: f00a facd bl db30 m_flags = FILE_FLAG_READ; 3596: 2301 movs r3, #1 m_attributes = FILE_ATTR_ROOT; 3598: 2240 movs r2, #64 ; 0x40 m_vol = vol; 359a: 6225 str r5, [r4, #32] m_flags = FILE_FLAG_READ; 359c: 4618 mov r0, r3 359e: f884 3033 strb.w r3, [r4, #51] ; 0x33 m_attributes = FILE_ATTR_ROOT; 35a2: f884 2031 strb.w r2, [r4, #49] ; 0x31 } 35a6: bd38 pop {r3, r4, r5, pc} 000035a8 : //------------------------------------------------------------------------------ bool ExFatFile::parsePathName(const char* path, ExName_t* fname, const char** ptr) { 35a8: b4f0 push {r4, r5, r6, r7} 35aa: 460d mov r5, r1 // Skip leading spaces. while (*path == ' ') { 35ac: 7809 ldrb r1, [r1, #0] 35ae: 2920 cmp r1, #32 35b0: d103 bne.n 35ba 35b2: f815 4f01 ldrb.w r4, [r5, #1]! 35b6: 2c20 cmp r4, #32 35b8: d0fb beq.n 35b2 path++; } fname->begin = path; 35ba: 6015 str r5, [r2, #0] fname->end = path; 35bc: 6095 str r5, [r2, #8] while (*path && !isDirSeparator(*path)) { 35be: 782c ldrb r4, [r5, #0] 35c0: 2c2f cmp r4, #47 ; 0x2f 35c2: d011 beq.n 35e8 35c4: b184 cbz r4, 35e8 35c6: 1c6e adds r6, r5, #1 35c8: 2c3c cmp r4, #60 ; 0x3c 35ca: 4f1d ldr r7, [pc, #116] ; (3640 ) uint8_t c = *path++; 35cc: 4635 mov r5, r6 if (!lfnLegalChar(c)) { 35ce: d82a bhi.n 3626 35d0: 2c21 cmp r4, #33 ; 0x21 35d2: d812 bhi.n 35fa 35d4: f104 3cff add.w ip, r4, #4294967295 35d8: f1bc 0f1e cmp.w ip, #30 35dc: d816 bhi.n 360c *ptr = path; return hashName(fname); fail: return false; } 35de: 2000 movs r0, #0 35e0: bcf0 pop {r4, r5, r6, r7} 35e2: 4770 bx lr for (; *path == ' ' || isDirSeparator(*path); path++) {} 35e4: f815 4f01 ldrb.w r4, [r5, #1]! 35e8: 2c20 cmp r4, #32 35ea: d0fb beq.n 35e4 35ec: 2c2f cmp r4, #47 ; 0x2f 35ee: d0f9 beq.n 35e4 *ptr = path; 35f0: 601d str r5, [r3, #0] return hashName(fname); 35f2: 4611 mov r1, r2 } 35f4: bcf0 pop {r4, r5, r6, r7} return hashName(fname); 35f6: f001 bd1f b.w 5038 35fa: f1a4 0c22 sub.w ip, r4, #34 ; 0x22 35fe: fa5f fc8c uxtb.w ip, ip 3602: fa27 fc0c lsr.w ip, r7, ip 3606: f01c 0f01 tst.w ip, #1 360a: d1e8 bne.n 35de if (c != '.' && c != ' ') { 360c: 2c2e cmp r4, #46 ; 0x2e 360e: d001 beq.n 3614 3610: 2c20 cmp r4, #32 3612: d10d bne.n 3630 while (*path && !isDirSeparator(*path)) { 3614: f816 4b01 ldrb.w r4, [r6], #1 3618: 2c00 cmp r4, #0 361a: d0e5 beq.n 35e8 361c: 2c2f cmp r4, #47 ; 0x2f 361e: d0e3 beq.n 35e8 uint8_t c = *path++; 3620: 2c3c cmp r4, #60 ; 0x3c 3622: 4635 mov r5, r6 if (!lfnLegalChar(c)) { 3624: d9d4 bls.n 35d0 3626: 2c5c cmp r4, #92 ; 0x5c 3628: d0d9 beq.n 35de 362a: d903 bls.n 3634 362c: 2c7c cmp r4, #124 ; 0x7c 362e: d0d6 beq.n 35de fname->end = path; 3630: 6096 str r6, [r2, #8] 3632: e7ef b.n 3614 3634: 3c3e subs r4, #62 ; 0x3e 3636: 2c01 cmp r4, #1 3638: d8fa bhi.n 3630 } 363a: 2000 movs r0, #0 363c: bcf0 pop {r4, r5, r6, r7} 363e: 4770 bx lr 3640: 05002101 .word 0x05002101 00003644 : m_curPosition = curPosition; m_curCluster = curCluster; return c; } //------------------------------------------------------------------------------ int ExFatFile::read(void* buf, size_t count) { 3644: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bool isReadable() const {return m_flags & FILE_FLAG_READ;} 3648: f890 3033 ldrb.w r3, [r0, #51] ; 0x33 364c: b083 sub sp, #12 364e: 4605 mov r5, r0 uint8_t* cache; uint16_t sectorOffset; uint32_t sector; uint32_t clusterOffset; if (!isReadable()) { 3650: 07dc lsls r4, r3, #31 3652: d574 bpl.n 373e DBG_FAIL_MACRO; goto fail; } if (isContiguous() || isFile()) { 3654: 0658 lsls r0, r3, #25 3656: 460f mov r7, r1 3658: 4690 mov r8, r2 365a: f140 80b0 bpl.w 37be if ((m_curPosition + count) > m_validLength) { 365e: e9d5 2300 ldrd r2, r3, [r5] 3662: e9d5 1004 ldrd r1, r0, [r5, #16] 3666: eb18 0402 adds.w r4, r8, r2 366a: f143 0300 adc.w r3, r3, #0 366e: 42a1 cmp r1, r4 3670: eb70 0303 sbcs.w r3, r0, r3 3674: f0c0 80a9 bcc.w 37ca count = toRead = m_validLength - m_curPosition; } } while (toRead) { 3678: f1b8 0f00 cmp.w r8, #0 367c: d05b beq.n 3736 if ((m_curPosition + count) > m_validLength) { 367e: 4646 mov r6, r8 m_curCluster = isRoot() ? m_vol->rootDirectoryCluster() : m_firstCluster; } else if (isContiguous()) { m_curCluster++; } else { fg = m_vol->fatGet(m_curCluster, &m_curCluster); 3680: f105 0918 add.w r9, r5, #24 if ((m_curPosition + count) > m_validLength) { 3684: e9d5 3200 ldrd r3, r2, [r5] clusterOffset = m_curPosition & m_vol->clusterMask(); 3688: f8d5 a020 ldr.w sl, [r5, #32] 368c: f8da 4438 ldr.w r4, [sl, #1080] ; 0x438 3690: 401c ands r4, r3 sectorOffset = clusterOffset & m_vol->sectorMask(); 3692: f3c4 0b08 ubfx fp, r4, #0, #9 if (clusterOffset == 0) { 3696: 2c00 cmp r4, #0 3698: d170 bne.n 377c if (m_curPosition == 0) { 369a: 4313 orrs r3, r2 369c: d170 bne.n 3780 ? m_vol->rootDirectoryCluster() : m_firstCluster; 369e: f895 3031 ldrb.w r3, [r5, #49] ; 0x31 36a2: 065a lsls r2, r3, #25 * * \return true if busy else false. */ bool isBusy() {return m_blockDev->isBusy();} /** \return the root directory start cluster number. */ uint32_t rootDirectoryCluster() const {return m_rootDirectoryCluster;} 36a4: bf4c ite mi 36a6: f8da 2434 ldrmi.w r2, [sl, #1076] ; 0x434 36aa: 69ea ldrpl r2, [r5, #28] m_curCluster++; 36ac: 61aa str r2, [r5, #24] bool dataCacheSync() {return m_dataCache.sync();} //---------------------------------------------------------------------------- uint32_t clusterMask() const {return m_clusterMask;} uint32_t clusterStartSector(uint32_t cluster) { return m_clusterHeapStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 36ae: f89a 0445 ldrb.w r0, [sl, #1093] ; 0x445 36b2: 3a02 subs r2, #2 DBG_FAIL_MACRO; goto fail; } } } sector = m_vol->clusterStartSector(m_curCluster) + 36b4: f8da 142c ldr.w r1, [sl, #1068] ; 0x42c (clusterOffset >> m_vol->bytesPerSectorShift()); 36b8: 0a63 lsrs r3, r4, #9 36ba: 4082 lsls r2, r0 sector = m_vol->clusterStartSector(m_curCluster) + 36bc: eb01 2154 add.w r1, r1, r4, lsr #9 36c0: 4411 add r1, r2 if (sectorOffset != 0 || toRead < m_vol->bytesPerSector() 36c2: f1bb 0f00 cmp.w fp, #0 36c6: d145 bne.n 3754 36c8: f5b6 7f00 cmp.w r6, #512 ; 0x200 36cc: d342 bcc.n 3754 * \return Address of cached sector. */ uint8_t* prepare(uint32_t sector, uint8_t option); /** \return Logical sector number for cached sector. */ uint32_t sector() { return m_sector; 36ce: f8da 221c ldr.w r2, [sl, #540] ; 0x21c || sector == m_vol->dataCacheSector()) { 36d2: 4291 cmp r1, r2 36d4: d03e beq.n 3754 goto fail; } uint8_t* src = cache + sectorOffset; memcpy(dst, src, n); #if USE_MULTI_SECTOR_IO } else if (toRead >= 2*m_vol->bytesPerSector()) { 36d6: f5b6 6f80 cmp.w r6, #1024 ; 0x400 36da: d358 bcc.n 378e uint32_t sectorsPerCluster() const {return 1UL << m_sectorsPerClusterShift;} 36dc: f04f 0b01 mov.w fp, #1 36e0: fa0b fb00 lsl.w fp, fp, r0 uint32_t ns = toRead >> m_vol->bytesPerSectorShift(); // Limit reads to current cluster. uint32_t maxNs = m_vol->sectorsPerCluster() - (clusterOffset >> m_vol->bytesPerSectorShift()); 36e4: ebab 0b03 sub.w fp, fp, r3 uint32_t ns = toRead >> m_vol->bytesPerSectorShift(); 36e8: 0a73 lsrs r3, r6, #9 36ea: 459b cmp fp, r3 36ec: bf28 it cs 36ee: 469b movcs fp, r3 return sector <= m_sector && m_sector < (sector + count); 36f0: 4291 cmp r1, r2 if (ns > maxNs) { ns = maxNs; } n = ns << m_vol->bytesPerSectorShift(); 36f2: ea4f 244b mov.w r4, fp, lsl #9 36f6: d80a bhi.n 370e 36f8: eb01 030b add.w r3, r1, fp 36fc: 429a cmp r2, r3 36fe: d206 bcs.n 370e if (isCached(sector, count) && !sync()) { 3700: f50a 7004 add.w r0, sl, #528 ; 0x210 3704: 9101 str r1, [sp, #4] 3706: f006 fd8f bl a228 370a: 9901 ldr r1, [sp, #4] 370c: b1b8 cbz r0, 373e return m_blockDev->readSectors(sector, dst, count); 370e: f8da 0214 ldr.w r0, [sl, #532] ; 0x214 3712: 465b mov r3, fp 3714: 6802 ldr r2, [r0, #0] 3716: f8d2 a014 ldr.w sl, [r2, #20] 371a: 463a mov r2, r7 371c: 47d0 blx sl if (!m_vol->cacheSafeRead(sector, dst, ns)) { 371e: b170 cbz r0, 373e DBG_FAIL_MACRO; goto fail; } } dst += n; m_curPosition += n; 3720: 4623 mov r3, r4 dst += n; 3722: 4427 add r7, r4 m_curPosition += n; 3724: e9d5 1200 ldrd r1, r2, [r5] 3728: 185b adds r3, r3, r1 372a: f142 0200 adc.w r2, r2, #0 while (toRead) { 372e: 1b36 subs r6, r6, r4 m_curPosition += n; 3730: e9c5 3200 strd r3, r2, [r5] while (toRead) { 3734: d1a8 bne.n 3688 toRead -= n; } return count - toRead; 3736: 4640 mov r0, r8 fail: m_error |= READ_ERROR; return -1; } 3738: b003 add sp, #12 373a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} m_error |= READ_ERROR; 373e: f895 3032 ldrb.w r3, [r5, #50] ; 0x32 return -1; 3742: f04f 30ff mov.w r0, #4294967295 m_error |= READ_ERROR; 3746: f043 0302 orr.w r3, r3, #2 374a: f885 3032 strb.w r3, [r5, #50] ; 0x32 } 374e: b003 add sp, #12 3750: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} n = m_vol->bytesPerSector() - sectorOffset; 3754: f5cb 7400 rsb r4, fp, #512 ; 0x200 return m_dataCache.prepare(sector, option); 3758: 2200 movs r2, #0 375a: f50a 7004 add.w r0, sl, #528 ; 0x210 375e: 42b4 cmp r4, r6 3760: bf28 it cs 3762: 4634 movcs r4, r6 3764: f006 fd8c bl a280 if (!cache) { 3768: 2800 cmp r0, #0 376a: d0e8 beq.n 373e memcpy(dst, src, n); 376c: eb00 010b add.w r1, r0, fp 3770: 4622 mov r2, r4 3772: 4638 mov r0, r7 3774: f007 fe12 bl b39c m_curPosition += n; 3778: 4623 mov r3, r4 377a: e7d2 b.n 3722 m_curCluster++; 377c: 69aa ldr r2, [r5, #24] 377e: e796 b.n 36ae } else if (isContiguous()) { 3780: f895 3033 ldrb.w r3, [r5, #51] ; 0x33 3784: 065b lsls r3, r3, #25 3786: d50e bpl.n 37a6 m_curCluster++; 3788: 69aa ldr r2, [r5, #24] 378a: 3201 adds r2, #1 378c: e78e b.n 36ac return m_blockDev->readSector(sector, dst); 378e: f8da 0214 ldr.w r0, [sl, #532] ; 0x214 3792: 463a mov r2, r7 3794: 6803 ldr r3, [r0, #0] 3796: 691b ldr r3, [r3, #16] 3798: 4798 blx r3 if (!m_vol->cacheSafeRead(sector, dst)) { 379a: 2800 cmp r0, #0 379c: d0cf beq.n 373e 379e: f44f 7300 mov.w r3, #512 ; 0x200 n = m_vol->bytesPerSector(); 37a2: 461c mov r4, r3 37a4: e7bd b.n 3722 fg = m_vol->fatGet(m_curCluster, &m_curCluster); 37a6: 464a mov r2, r9 37a8: 4650 mov r0, sl 37aa: 69a9 ldr r1, [r5, #24] 37ac: f001 fdb4 bl 5318 if (fg < 0) { 37b0: 2800 cmp r0, #0 37b2: dbc4 blt.n 373e if (fg == 0) { 37b4: d00c beq.n 37d0 sector = m_vol->clusterStartSector(m_curCluster) + 37b6: f8d5 a020 ldr.w sl, [r5, #32] 37ba: 69aa ldr r2, [r5, #24] 37bc: e777 b.n 36ae if (isContiguous() || isFile()) { 37be: f895 3031 ldrb.w r3, [r5, #49] ; 0x31 37c2: 0719 lsls r1, r3, #28 37c4: f57f af58 bpl.w 3678 37c8: e749 b.n 365e count = toRead = m_validLength - m_curPosition; 37ca: eba1 0802 sub.w r8, r1, r2 37ce: e753 b.n 3678 if (isDir()) { 37d0: f895 3031 ldrb.w r3, [r5, #49] ; 0x31 37d4: f013 0f50 tst.w r3, #80 ; 0x50 37d8: d0b1 beq.n 373e return count - toRead; 37da: eba8 0806 sub.w r8, r8, r6 37de: 4640 mov r0, r8 37e0: e7aa b.n 3738 37e2: bf00 nop 000037e4 : int ExFatFile::peek() { 37e4: b5f0 push {r4, r5, r6, r7, lr} 37e6: b083 sub sp, #12 return read(&b, 1) == 1 ? b : -1; 37e8: 2201 movs r2, #1 37ea: 4604 mov r4, r0 uint32_t curCluster = m_curCluster; 37ec: 6985 ldr r5, [r0, #24] 37ee: f10d 0107 add.w r1, sp, #7 uint64_t curPosition = m_curPosition; 37f2: e9d0 6700 ldrd r6, r7, [r0] 37f6: f7ff ff25 bl 3644 37fa: 2801 cmp r0, #1 m_curCluster = curCluster; 37fc: 61a5 str r5, [r4, #24] 37fe: bf0c ite eq 3800: f89d 0007 ldrbeq.w r0, [sp, #7] 3804: f04f 30ff movne.w r0, #4294967295 m_curPosition = curPosition; 3808: e9c4 6700 strd r6, r7, [r4] } 380c: b003 add sp, #12 380e: bdf0 pop {r4, r5, r6, r7, pc} 00003810 : fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::seekSet(uint64_t pos) { 3810: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 3814: 461f mov r7, r3 bool isOpen() const {return m_attributes;} 3816: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 381a: b083 sub sp, #12 381c: 4604 mov r4, r0 uint32_t nCur; uint32_t nNew; uint32_t tmp = m_curCluster; 381e: f8d0 8018 ldr.w r8, [r0, #24] // error if file not open if (!isOpen()) { 3822: 2b00 cmp r3, #0 3824: d051 beq.n 38ca 3826: 4616 mov r6, r2 DBG_FAIL_MACRO; goto fail; } // Optimize O_APPEND writes. if (pos == m_curPosition) { 3828: e9d0 1c00 ldrd r1, ip, [r0] 382c: 45bc cmp ip, r7 382e: bf08 it eq 3830: 4291 cmpeq r1, r2 3832: d05c beq.n 38ee return true; } if (pos == 0) { 3834: ea56 0207 orrs.w r2, r6, r7 3838: d04d beq.n 38d6 // set position to start of file m_curCluster = 0; goto done; } if (isFile()) { 383a: 071d lsls r5, r3, #28 383c: d504 bpl.n 3848 if (pos > m_validLength) { 383e: e9d0 0204 ldrd r0, r2, [r0, #16] 3842: 42b0 cmp r0, r6 3844: 41ba sbcs r2, r7 3846: d340 bcc.n 38ca goto fail; } } // calculate cluster index for new position nNew = (pos - 1) >> m_vol->bytesPerClusterShift(); if (isContiguous()) { 3848: f894 2033 ldrb.w r2, [r4, #51] ; 0x33 nNew = (pos - 1) >> m_vol->bytesPerClusterShift(); 384c: 1e75 subs r5, r6, #1 384e: f8d4 a020 ldr.w sl, [r4, #32] if (isContiguous()) { 3852: 9201 str r2, [sp, #4] nNew = (pos - 1) >> m_vol->bytesPerClusterShift(); 3854: f147 30ff adc.w r0, r7, #4294967295 return m_bytesPerSectorShift + m_sectorsPerClusterShift; 3858: f89a 2445 ldrb.w r2, [sl, #1093] ; 0x445 385c: 3209 adds r2, #9 385e: b2d2 uxtb r2, r2 3860: f1c2 0e20 rsb lr, r2, #32 3864: 40d5 lsrs r5, r2 3866: f1a2 0920 sub.w r9, r2, #32 386a: fa00 fb0e lsl.w fp, r0, lr 386e: fa20 f009 lsr.w r0, r0, r9 3872: ea45 050b orr.w r5, r5, fp 3876: 4305 orrs r5, r0 if (isContiguous()) { 3878: 9801 ldr r0, [sp, #4] 387a: 0640 lsls r0, r0, #25 387c: d433 bmi.n 38e6 m_curCluster = m_firstCluster + nNew; goto done; } // calculate cluster index for current position nCur = (m_curPosition - 1) >> m_vol->bytesPerClusterShift(); 387e: 1e48 subs r0, r1, #1 3880: fa20 f202 lsr.w r2, r0, r2 3884: f14c 30ff adc.w r0, ip, #4294967295 if (nNew < nCur || m_curPosition == 0) { 3888: ea51 0c0c orrs.w ip, r1, ip nCur = (m_curPosition - 1) >> m_vol->bytesPerClusterShift(); 388c: fa00 fe0e lsl.w lr, r0, lr 3890: fa20 f009 lsr.w r0, r0, r9 3894: ea42 020e orr.w r2, r2, lr 3898: ea42 0200 orr.w r2, r2, r0 if (nNew < nCur || m_curPosition == 0) { 389c: d001 beq.n 38a2 389e: 4295 cmp r5, r2 38a0: d229 bcs.n 38f6 // must follow chain from first cluster m_curCluster = isRoot() ? m_vol->rootDirectoryCluster() : m_firstCluster; 38a2: 065b lsls r3, r3, #25 uint32_t rootDirectoryCluster() const {return m_rootDirectoryCluster;} 38a4: bf4c ite mi 38a6: f8da 3434 ldrmi.w r3, [sl, #1076] ; 0x434 38aa: 69e3 ldrpl r3, [r4, #28] 38ac: 61a3 str r3, [r4, #24] } else { // advance from curPosition nNew -= nCur; } while (nNew--) { if (m_vol->fatGet(m_curCluster, &m_curCluster) <= 0) { 38ae: f104 0918 add.w r9, r4, #24 38b2: e006 b.n 38c2 38b4: 69a1 ldr r1, [r4, #24] 38b6: 3d01 subs r5, #1 38b8: 6a20 ldr r0, [r4, #32] 38ba: f001 fd2d bl 5318 38be: 2800 cmp r0, #0 38c0: dd03 ble.n 38ca 38c2: 464a mov r2, r9 while (nNew--) { 38c4: 2d00 cmp r5, #0 38c6: d1f5 bne.n 38b4 DBG_FAIL_MACRO; goto fail; } } done: 38c8: e007 b.n 38da m_curPosition = pos; return true; fail: m_curCluster = tmp; return false; 38ca: 2000 movs r0, #0 m_curCluster = tmp; 38cc: f8c4 8018 str.w r8, [r4, #24] } 38d0: b003 add sp, #12 38d2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} m_curCluster = 0; 38d6: 2300 movs r3, #0 38d8: 6183 str r3, [r0, #24] return true; 38da: 2001 movs r0, #1 m_curPosition = pos; 38dc: e9c4 6700 strd r6, r7, [r4] } 38e0: b003 add sp, #12 38e2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} m_curCluster = m_firstCluster + nNew; 38e6: 69e3 ldr r3, [r4, #28] 38e8: 442b add r3, r5 38ea: 61a3 str r3, [r4, #24] goto done; 38ec: e7f5 b.n 38da return true; 38ee: 2001 movs r0, #1 } 38f0: b003 add sp, #12 38f2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} nNew -= nCur; 38f6: 1aad subs r5, r5, r2 38f8: e7d9 b.n 38ae 38fa: bf00 nop 000038fc : bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { 38fc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 3900: 4617 mov r7, r2 3902: f890 2031 ldrb.w r2, [r0, #49] ; 0x31 3906: b08f sub sp, #60 ; 0x3c 3908: 4605 mov r5, r0 if (isOpen() || !dir->isDir()) { 390a: 2a00 cmp r2, #0 390c: f040 80d7 bne.w 3abe bool isDir() const {return m_attributes & FILE_ATTR_DIR;} 3910: 468b mov fp, r1 3912: f891 1031 ldrb.w r1, [r1, #49] ; 0x31 3916: f011 0f50 tst.w r1, #80 ; 0x50 391a: f000 80d0 beq.w 3abe switch (oflag & O_ACCMODE) { 391e: f003 0103 and.w r1, r3, #3 3922: 469a mov sl, r3 3924: 2903 cmp r1, #3 3926: f000 80ca beq.w 3abe modeFlags |= oflag & O_APPEND ? FILE_FLAG_APPEND : 0; 392a: 3101 adds r1, #1 392c: f003 0008 and.w r0, r3, #8 3930: ea41 0300 orr.w r3, r1, r0 3934: 9302 str r3, [sp, #8] if (fname) { 3936: 2f00 cmp r7, #0 3938: f000 80cb beq.w 3ad2 freeNeed = 2 + (fname->nameLength + 14)/15; 393c: 6939 ldr r1, [r7, #16] 393e: f101 080e add.w r8, r1, #14 3942: 49b6 ldr r1, [pc, #728] ; (3c1c ) 3944: fba1 1808 umull r1, r8, r1, r8 if (pos == m_curPosition) { 3948: e9db 1000 ldrd r1, r0, [fp] freeNeed = 2 + (fname->nameLength + 14)/15; 394c: ea4f 08d8 mov.w r8, r8, lsr #3 if (pos == m_curPosition) { 3950: 4301 orrs r1, r0 freeNeed = 2 + (fname->nameLength + 14)/15; 3952: f108 0802 add.w r8, r8, #2 3956: fa5f f888 uxtb.w r8, r8 if (pos == m_curPosition) { 395a: d005 beq.n 3968 m_curPosition = pos; 395c: 2000 movs r0, #0 395e: 2100 movs r1, #0 m_curCluster = 0; 3960: f8cb 2018 str.w r2, [fp, #24] m_curPosition = pos; 3964: e9cb 0100 strd r0, r1, [fp] inSet = false; 3968: 2400 movs r4, #0 m_flags |= FILE_FLAG_CONTIGUOUS; 396a: 9b02 ldr r3, [sp, #8] inSet = false; 396c: 4626 mov r6, r4 m_flags |= FILE_FLAG_CONTIGUOUS; 396e: f043 0340 orr.w r3, r3, #64 ; 0x40 3972: 9303 str r3, [sp, #12] n = dir->read(buf, FS_DIR_SIZE); 3974: 2220 movs r2, #32 3976: a906 add r1, sp, #24 3978: 4658 mov r0, fp 397a: f7ff fe63 bl 3644 if (n == 0) { 397e: b300 cbz r0, 39c2 if (n != FS_DIR_SIZE) { 3980: 2820 cmp r0, #32 3982: f040 809c bne.w 3abe if (!(buf[0] & 0x80)) { 3986: f99d 2018 ldrsb.w r2, [sp, #24] 398a: f89d 3018 ldrb.w r3, [sp, #24] 398e: 2a00 cmp r2, #0 3990: f2c0 80a2 blt.w 3ad8 if (freeCount == 0) { 3994: b934 cbnz r4, 39a4 freePos.position = dir->curPosition() - FS_DIR_SIZE; 3996: f8db 2000 ldr.w r2, [fp] 399a: f1a2 0920 sub.w r9, r2, #32 bool mkdir(ExFatFile* parent, ExName_t* fname); bool openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag); bool parsePathName(const char* path, ExName_t* fname, const char** ptr); uint32_t curCluster() const {return m_curCluster;} 399e: f8db 2018 ldr.w r2, [fp, #24] 39a2: 9201 str r2, [sp, #4] if (freeCount < freeNeed) { 39a4: 4544 cmp r4, r8 39a6: d201 bcs.n 39ac freeCount++; 39a8: 3401 adds r4, #1 39aa: b2e4 uxtb r4, r4 if (!buf[0]) { 39ac: 2b00 cmp r3, #0 39ae: f000 8113 beq.w 3bd8 n = dir->read(buf, FS_DIR_SIZE); 39b2: 2220 movs r2, #32 39b4: a906 add r1, sp, #24 39b6: 4658 mov r0, fp inSet = false; 39b8: 2600 movs r6, #0 n = dir->read(buf, FS_DIR_SIZE); 39ba: f7ff fe43 bl 3644 if (n == 0) { 39be: 2800 cmp r0, #0 39c0: d1de bne.n 3980 if (!(oflag & O_CREAT) || !(modeFlags & FILE_FLAG_WRITE) || !fname) { 39c2: f41a 7f00 tst.w sl, #512 ; 0x200 39c6: d07a beq.n 3abe 39c8: 9b02 ldr r3, [sp, #8] 39ca: 079b lsls r3, r3, #30 39cc: d577 bpl.n 3abe 39ce: 2f00 cmp r7, #0 39d0: d075 beq.n 3abe while (freeCount < freeNeed) { 39d2: 4544 cmp r4, r8 39d4: d217 bcs.n 3a06 39d6: f8dd a004 ldr.w sl, [sp, #4] n = dir->read(buf, FS_DIR_SIZE); 39da: 2220 movs r2, #32 39dc: a906 add r1, sp, #24 39de: 4658 mov r0, fp 39e0: f7ff fe30 bl 3644 freeCount++; 39e4: 1c63 adds r3, r4, #1 if (n == 0) { 39e6: 2800 cmp r0, #0 39e8: d061 beq.n 3aae if (n != FS_DIR_SIZE) { 39ea: 2820 cmp r0, #32 39ec: d167 bne.n 3abe if (freeCount == 0) { 39ee: b92c cbnz r4, 39fc freePos.position = dir->curPosition() - FS_DIR_SIZE; 39f0: f8db 2000 ldr.w r2, [fp] 39f4: f8db a018 ldr.w sl, [fp, #24] 39f8: f1a2 0920 sub.w r9, r2, #32 freeCount++; 39fc: b2dc uxtb r4, r3 while (freeCount < freeNeed) { 39fe: 45a0 cmp r8, r4 3a00: d8eb bhi.n 39da 3a02: f8cd a004 str.w sl, [sp, #4] memset(this, 0, sizeof(ExFatFile)); 3a06: 2238 movs r2, #56 ; 0x38 3a08: 2100 movs r1, #0 3a0a: 4628 mov r0, r5 bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} 3a0c: f89b 4033 ldrb.w r4, [fp, #51] ; 0x33 3a10: f00a f88e bl db30 ExFatVolume* volume() const {return m_vol;} 3a14: f8db 3020 ldr.w r3, [fp, #32] freePos.isContiguous = dir->isContiguous(); 3a18: f3c4 1480 ubfx r4, r4, #6, #1 m_dirPos = freePos; 3a1c: 9a01 ldr r2, [sp, #4] m_vol = dir->volume(); 3a1e: 622b str r3, [r5, #32] m_attributes = FILE_ATTR_FILE; 3a20: 2308 movs r3, #8 bool atEnd() { return !ls && next == end; } void reset() { next = begin; ls = 0; // lowSurrogate 3a22: 2600 movs r6, #0 m_dirPos = freePos; 3a24: f885 402c strb.w r4, [r5, #44] ; 0x2c m_attributes = FILE_ATTR_FILE; 3a28: f885 3031 strb.w r3, [r5, #49] ; 0x31 next = begin; 3a2c: 683b ldr r3, [r7, #0] m_dirPos = freePos; 3a2e: e9c5 2909 strd r2, r9, [r5, #36] ; 0x24 3a32: 607b str r3, [r7, #4] ls = 0; // lowSurrogate 3a34: 81be strh r6, [r7, #12] for (uint8_t i = 0; i < freeNeed; i++) { 3a36: f1b8 0f00 cmp.w r8, #0 3a3a: d033 beq.n 3aa4 m_setCount = freeNeed - 1; 3a3c: f108 39ff add.w r9, r8, #4294967295 3a40: 46b3 mov fp, r6 if (FsDateTime::callback) { 3a42: f8df a1dc ldr.w sl, [pc, #476] ; 3c20 m_setCount = freeNeed - 1; 3a46: fa5f f989 uxtb.w r9, r9 cache = dirCache(i, FsCache::CACHE_FOR_WRITE); 3a4a: 2201 movs r2, #1 3a4c: 4659 mov r1, fp 3a4e: 4628 mov r0, r5 3a50: f7ff fd4a bl 34e8 if (!cache || (cache[0] & 0x80)) { 3a54: 4604 mov r4, r0 3a56: b390 cbz r0, 3abe 3a58: f990 2000 ldrsb.w r2, [r0] 3a5c: 2a00 cmp r2, #0 3a5e: db2e blt.n 3abe memset(cache, 0 , FS_DIR_SIZE); 3a60: 2220 movs r2, #32 3a62: 2100 movs r1, #0 3a64: f00a f864 bl db30 if (i == 0) { 3a68: 2e00 cmp r6, #0 3a6a: f000 80bc beq.w 3be6 } else if (i == 1) { 3a6e: f1bb 0f01 cmp.w fp, #1 3a72: f000 80d7 beq.w 3c24 dirName->type = EXFAT_TYPE_NAME; 3a76: 23c1 movs r3, #193 ; 0xc1 3a78: 46a3 mov fp, r4 3a7a: 341e adds r4, #30 3a7c: f804 3c1e strb.w r3, [r4, #-30] return !ls && next == end; 3a80: 89bb ldrh r3, [r7, #12] uint16_t u = fname->get16(); 3a82: 4638 mov r0, r7 3a84: b91b cbnz r3, 3a8e 3a86: e9d7 2301 ldrd r2, r3, [r7, #4] 3a8a: 429a cmp r2, r3 3a8c: d005 beq.n 3a9a 3a8e: f006 fc35 bl a2fc } inline uint64_t getLe64(const uint8_t* src) { return *reinterpret_cast(src); } inline void setLe16(uint8_t* dst, uint16_t src) { *reinterpret_cast(dst) = src; 3a92: f82b 0f02 strh.w r0, [fp, #2]! for (size_t k = 0; k < 15; k++) { 3a96: 45a3 cmp fp, r4 3a98: d1f2 bne.n 3a80 for (uint8_t i = 0; i < freeNeed; i++) { 3a9a: 3601 adds r6, #1 3a9c: fa5f fb86 uxtb.w fp, r6 3aa0: 45d8 cmp r8, fp 3aa2: d8d2 bhi.n 3a4a return sync(); 3aa4: 4628 mov r0, r5 3aa6: f000 fafb bl 40a0 3aaa: 4606 mov r6, r0 3aac: e00d b.n 3aca if (!dir->addDirCluster()) { 3aae: 4658 mov r0, fp curCluster = dir->m_curCluster; 3ab0: f8db 6018 ldr.w r6, [fp, #24] if (!dir->addDirCluster()) { 3ab4: f000 fb24 bl 4100 3ab8: 2800 cmp r0, #0 3aba: f040 8091 bne.w 3be0 m_attributes = FILE_ATTR_CLOSED; 3abe: 2300 movs r3, #0 return false; 3ac0: 461e mov r6, r3 m_attributes = FILE_ATTR_CLOSED; 3ac2: f885 3031 strb.w r3, [r5, #49] ; 0x31 m_flags = 0; 3ac6: f885 3033 strb.w r3, [r5, #51] ; 0x33 } 3aca: 4630 mov r0, r6 3acc: b00f add sp, #60 ; 0x3c 3ace: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} uint8_t freeNeed = 3; 3ad2: f04f 0803 mov.w r8, #3 3ad6: e747 b.n 3968 } else if (!inSet) { 3ad8: bb56 cbnz r6, 3b30 freeCount = 0; 3ada: 4544 cmp r4, r8 3adc: bf38 it cc 3ade: 2400 movcc r4, #0 if (buf[0] != EXFAT_TYPE_FILE) { 3ae0: 2b85 cmp r3, #133 ; 0x85 3ae2: f47f af47 bne.w 3974 memset(this, 0, sizeof(ExFatFile)); 3ae6: 4631 mov r1, r6 3ae8: 2238 movs r2, #56 ; 0x38 3aea: 4628 mov r0, r5 inSet = true; 3aec: 2601 movs r6, #1 memset(this, 0, sizeof(ExFatFile)); 3aee: f00a f81f bl db30 m_attributes = getLe16(dirFile->attributes) & FILE_ATTR_COPY; 3af2: f89d 201c ldrb.w r2, [sp, #28] m_setCount = dirFile->setCount; 3af6: f89d 3019 ldrb.w r3, [sp, #25] 3afa: f885 3030 strb.w r3, [r5, #48] ; 0x30 m_attributes = getLe16(dirFile->attributes) & FILE_ATTR_COPY; 3afe: f002 0337 and.w r3, r2, #55 ; 0x37 if (!(m_attributes & EXFAT_ATTRIB_DIRECTORY)) { 3b02: 06d2 lsls r2, r2, #27 m_attributes |= FILE_ATTR_FILE; 3b04: bf58 it pl 3b06: f043 0308 orrpl.w r3, r3, #8 3b0a: f885 3031 strb.w r3, [r5, #49] ; 0x31 m_dirPos.position = dir->curPosition() - FS_DIR_SIZE; 3b0e: f8db 3000 ldr.w r3, [fp] 3b12: f8db 2020 ldr.w r2, [fp, #32] 3b16: 3b20 subs r3, #32 m_vol = dir->volume(); 3b18: 622a str r2, [r5, #32] m_dirPos.cluster = dir->curCluster(); 3b1a: f8db 2018 ldr.w r2, [fp, #24] 3b1e: e9c5 2309 strd r2, r3, [r5, #36] ; 0x24 bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} 3b22: f89b 3033 ldrb.w r3, [fp, #51] ; 0x33 3b26: f3c3 1380 ubfx r3, r3, #6, #1 m_dirPos.isContiguous = dir->isContiguous(); 3b2a: f885 302c strb.w r3, [r5, #44] ; 0x2c 3b2e: e721 b.n 3974 } else if (buf[0] == EXFAT_TYPE_STREAM) { 3b30: 2bc0 cmp r3, #192 ; 0xc0 3b32: d028 beq.n 3b86 } else if (buf[0] == EXFAT_TYPE_NAME) { 3b34: 2bc1 cmp r3, #193 ; 0xc1 3b36: f47f af3c bne.w 39b2 if (!cmpName(dirName, fname)) { 3b3a: 463a mov r2, r7 3b3c: a906 add r1, sp, #24 3b3e: 4628 mov r0, r5 3b40: f001 f9ee bl 4f20 3b44: b1e8 cbz r0, 3b82 3b46: 89bb ldrh r3, [r7, #12] 3b48: b9db cbnz r3, 3b82 3b4a: e9d7 3201 ldrd r3, r2, [r7, #4] 3b4e: 429a cmp r2, r3 3b50: d117 bne.n 3b82 if (oflag & O_EXCL) { 3b52: f41a 6f00 tst.w sl, #2048 ; 0x800 3b56: d1b2 bne.n 3abe if ((oflag & (O_TRUNC | O_AT_END)) || (m_flags & FILE_FLAG_WRITE)) { 3b58: f41a 4f88 tst.w sl, #17408 ; 0x4400 3b5c: d170 bne.n 3c40 3b5e: f895 3033 ldrb.w r3, [r5, #51] ; 0x33 3b62: 0798 lsls r0, r3, #30 3b64: d46c bmi.n 3c40 if (oflag & O_TRUNC) { 3b66: f41a 6f80 tst.w sl, #1024 ; 0x400 3b6a: d1a8 bne.n 3abe } else if ((oflag & O_AT_END) && !seekSet(fileSize())) { 3b6c: f41a 4f80 tst.w sl, #16384 ; 0x4000 3b70: d0ab beq.n 3aca 3b72: 4628 mov r0, r5 3b74: e9d5 2304 ldrd r2, r3, [r5, #16] 3b78: f7ff fe4a bl 3810 3b7c: 2800 cmp r0, #0 3b7e: d1a4 bne.n 3aca 3b80: e79d b.n 3abe 3b82: 4606 mov r6, r0 3b84: e6f6 b.n 3974 m_flags = modeFlags; 3b86: 9b02 ldr r3, [sp, #8] 3b88: f885 3033 strb.w r3, [r5, #51] ; 0x33 if (dirStream->flags & EXFAT_FLAG_CONTIGUOUS) { 3b8c: f89d 3019 ldrb.w r3, [sp, #25] 3b90: 079b lsls r3, r3, #30 3b92: d502 bpl.n 3b9a m_flags |= FILE_FLAG_CONTIGUOUS; 3b94: 9b03 ldr r3, [sp, #12] 3b96: f885 3033 strb.w r3, [r5, #51] ; 0x33 m_firstCluster = getLe32(dirStream->firstCluster); 3b9a: 9b0b ldr r3, [sp, #44] ; 0x2c 3b9c: 61eb str r3, [r5, #28] m_validLength = getLe64(dirStream->validLength); 3b9e: e9dd 2308 ldrd r2, r3, [sp, #32] 3ba2: e9c5 2304 strd r2, r3, [r5, #16] m_dataLength = getLe64(dirStream->dataLength); 3ba6: e9dd 230c ldrd r2, r3, [sp, #48] ; 0x30 3baa: e9c5 2302 strd r2, r3, [r5, #8] if (!fname) { 3bae: 2f00 cmp r7, #0 3bb0: d0cf beq.n 3b52 ls = 0; // lowSurrogate 3bb2: f04f 0300 mov.w r3, #0 if (fname->nameLength != dirStream->nameLength || 3bb6: 693a ldr r2, [r7, #16] 3bb8: 81bb strh r3, [r7, #12] next = begin; 3bba: 683b ldr r3, [r7, #0] 3bbc: 607b str r3, [r7, #4] 3bbe: f89d 301b ldrb.w r3, [sp, #27] 3bc2: 429a cmp r2, r3 3bc4: f47f aef5 bne.w 39b2 3bc8: 8abe ldrh r6, [r7, #20] 3bca: f8bd 301c ldrh.w r3, [sp, #28] 3bce: 1af6 subs r6, r6, r3 3bd0: fab6 f686 clz r6, r6 3bd4: 0976 lsrs r6, r6, #5 3bd6: e6cd b.n 3974 if (fname) { 3bd8: 2f00 cmp r7, #0 3bda: f47f aef2 bne.w 39c2 3bde: e76e b.n 3abe dir->m_curCluster = curCluster; 3be0: f8cb 6018 str.w r6, [fp, #24] continue; 3be4: e70b b.n 39fe dirFile->type = EXFAT_TYPE_FILE; 3be6: 2385 movs r3, #133 ; 0x85 3be8: 7023 strb r3, [r4, #0] m_setCount = freeNeed - 1; 3bea: f885 9030 strb.w r9, [r5, #48] ; 0x30 dirFile->setCount = m_setCount; 3bee: f884 9001 strb.w r9, [r4, #1] if (FsDateTime::callback) { 3bf2: f8da 3000 ldr.w r3, [sl] 3bf6: 2b00 cmp r3, #0 3bf8: d046 beq.n 3c88 FsDateTime::callback(&date, &time, &ms10); 3bfa: f10d 0213 add.w r2, sp, #19 3bfe: f10d 0116 add.w r1, sp, #22 3c02: a805 add r0, sp, #20 3c04: 4798 blx r3 3c06: f8bd 3014 ldrh.w r3, [sp, #20] 3c0a: 8163 strh r3, [r4, #10] 3c0c: f8bd 3016 ldrh.w r3, [sp, #22] 3c10: 8123 strh r3, [r4, #8] dirFile->createTimeMs = ms10; 3c12: f89d 3013 ldrb.w r3, [sp, #19] 3c16: 7523 strb r3, [r4, #20] 3c18: e73f b.n 3a9a 3c1a: bf00 nop 3c1c: 88888889 .word 0x88888889 3c20: 2000244c .word 0x2000244c dirStream->type = EXFAT_TYPE_STREAM; 3c24: 23c0 movs r3, #192 ; 0xc0 dirStream->flags = EXFAT_FLAG_ALWAYS1; 3c26: f884 b001 strb.w fp, [r4, #1] dirStream->type = EXFAT_TYPE_STREAM; 3c2a: 7023 strb r3, [r4, #0] m_flags = modeFlags | FILE_FLAG_DIR_DIRTY; 3c2c: 9b02 ldr r3, [sp, #8] 3c2e: f063 037f orn r3, r3, #127 ; 0x7f 3c32: f885 3033 strb.w r3, [r5, #51] ; 0x33 dirStream->nameLength = fname->nameLength; 3c36: 693b ldr r3, [r7, #16] 3c38: 70e3 strb r3, [r4, #3] setLe16(dirStream->nameHash, fname->nameHash); 3c3a: 8abb ldrh r3, [r7, #20] 3c3c: 80a3 strh r3, [r4, #4] } 3c3e: e72c b.n 3a9a bool isSubDir() const {return m_attributes & FILE_ATTR_SUBDIR;} 3c40: f895 3031 ldrb.w r3, [r5, #49] ; 0x31 if (isSubDir() || isReadOnly() || EXFAT_READ_ONLY) { 3c44: 06d9 lsls r1, r3, #27 3c46: f53f af3a bmi.w 3abe 3c4a: f013 0101 ands.w r1, r3, #1 3c4e: f47f af36 bne.w 3abe if (oflag & O_TRUNC) { 3c52: f41a 6f80 tst.w sl, #1024 ; 0x400 3c56: d089 beq.n 3b6c if (!(m_flags & FILE_FLAG_WRITE)) { 3c58: f895 2033 ldrb.w r2, [r5, #51] ; 0x33 3c5c: 0792 lsls r2, r2, #30 3c5e: f57f af2e bpl.w 3abe if (!isOpen()) { 3c62: 2b00 cmp r3, #0 3c64: f43f af2b beq.w 3abe if (pos == m_curPosition) { 3c68: e9d5 3200 ldrd r3, r2, [r5] 3c6c: 4313 orrs r3, r2 3c6e: d004 beq.n 3c7a m_curPosition = pos; 3c70: 2200 movs r2, #0 3c72: 2300 movs r3, #0 m_curCluster = 0; 3c74: 61a9 str r1, [r5, #24] m_curPosition = pos; 3c76: e9c5 2300 strd r2, r3, [r5] return seekSet(length) && truncate(); 3c7a: 4628 mov r0, r5 3c7c: f000 fc42 bl 4504 3c80: 2800 cmp r0, #0 3c82: f43f af1c beq.w 3abe 3c86: e720 b.n 3aca *reinterpret_cast(dst) = src; 3c88: f645 4321 movw r3, #23585 ; 0x5c21 3c8c: 8163 strh r3, [r4, #10] 3c8e: 81e3 strh r3, [r4, #14] 3c90: 8263 strh r3, [r4, #18] if (FS_DEFAULT_TIME) { 3c92: e702 b.n 3a9a 00003c94 : bool ExFatFile::open(ExFatFile* dirFile, const char* path, oflag_t oflag) { 3c94: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} ExFatFile() {} 3c98: 2500 movs r5, #0 3c9a: b097 sub sp, #92 ; 0x5c 3c9c: 4699 mov r9, r3 if (isOpen() || !dirFile->isDir()) { 3c9e: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 bool ExFatFile::open(ExFatFile* dirFile, const char* path, oflag_t oflag) { 3ca2: 9201 str r2, [sp, #4] 3ca4: 9514 str r5, [sp, #80] ; 0x50 class FsName { 3ca6: f8ad 5014 strh.w r5, [sp, #20] if (isOpen() || !dirFile->isDir()) { 3caa: 2b00 cmp r3, #0 3cac: d13e bne.n 3d2c 3cae: f891 3031 ldrb.w r3, [r1, #49] ; 0x31 3cb2: 460f mov r7, r1 3cb4: f013 0f50 tst.w r3, #80 ; 0x50 3cb8: d038 beq.n 3d2c if (isDirSeparator(*path)) { 3cba: 7813 ldrb r3, [r2, #0] 3cbc: 4604 mov r4, r0 3cbe: 4616 mov r6, r2 3cc0: 2b2f cmp r3, #47 ; 0x2f 3cc2: d037 beq.n 3d34 if (!openPrivate(dirFile, &fname, O_RDONLY)) { 3cc4: f04f 0800 mov.w r8, #0 if (!parsePathName(path, &fname, &path)) { 3cc8: ab01 add r3, sp, #4 3cca: aa02 add r2, sp, #8 3ccc: 4631 mov r1, r6 3cce: 4620 mov r0, r4 3cd0: f7ff fc6a bl 35a8 3cd4: b350 cbz r0, 3d2c if (*path == 0) { 3cd6: 9e01 ldr r6, [sp, #4] 3cd8: 7833 ldrb r3, [r6, #0] 3cda: 2b00 cmp r3, #0 3cdc: d03e beq.n 3d5c if (!openPrivate(dirFile, &fname, O_RDONLY)) { 3cde: 2300 movs r3, #0 3ce0: aa02 add r2, sp, #8 3ce2: 4639 mov r1, r7 3ce4: 4620 mov r0, r4 3ce6: f7ff fe09 bl 38fc 3cea: b1f8 cbz r0, 3d2c tmpDir = *this; 3cec: 46a4 mov ip, r4 3cee: ad08 add r5, sp, #32 3cf0: f104 0730 add.w r7, r4, #48 ; 0x30 3cf4: f8dc 0000 ldr.w r0, [ip] 3cf8: f10c 0c10 add.w ip, ip, #16 3cfc: f85c 1c0c ldr.w r1, [ip, #-12] 3d00: 46ae mov lr, r5 3d02: f85c 2c08 ldr.w r2, [ip, #-8] 3d06: 3510 adds r5, #16 3d08: f85c 3c04 ldr.w r3, [ip, #-4] 3d0c: 45bc cmp ip, r7 3d0e: e8ae 000f stmia.w lr!, {r0, r1, r2, r3} 3d12: d1ef bne.n 3cf4 3d14: f8dc 0000 ldr.w r0, [ip] dirFile = &tmpDir; 3d18: af08 add r7, sp, #32 tmpDir = *this; 3d1a: 6028 str r0, [r5, #0] bool rtn = sync(); 3d1c: 4620 mov r0, r4 3d1e: f000 f9bf bl 40a0 m_attributes = FILE_ATTR_CLOSED; 3d22: f884 8031 strb.w r8, [r4, #49] ; 0x31 m_flags = 0; 3d26: f884 8033 strb.w r8, [r4, #51] ; 0x33 return rtn; 3d2a: e7cd b.n 3cc8 return false; 3d2c: 2000 movs r0, #0 } 3d2e: b017 add sp, #92 ; 0x5c 3d30: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} while (isDirSeparator(*path)) { 3d34: f816 1f01 ldrb.w r1, [r6, #1]! 3d38: 292f cmp r1, #47 ; 0x2f 3d3a: d0fb beq.n 3d34 3d3c: 9601 str r6, [sp, #4] if (*path == 0) { 3d3e: b9b1 cbnz r1, 3d6e memset(this, 0, sizeof(ExFatFile)); 3d40: 2238 movs r2, #56 ; 0x38 3d42: 4620 mov r0, r4 return openRoot(dirFile->m_vol); 3d44: 6a3d ldr r5, [r7, #32] memset(this, 0, sizeof(ExFatFile)); 3d46: f009 fef3 bl db30 m_flags = FILE_FLAG_READ; 3d4a: 2301 movs r3, #1 m_attributes = FILE_ATTR_ROOT; 3d4c: 2240 movs r2, #64 ; 0x40 m_vol = vol; 3d4e: 6225 str r5, [r4, #32] return openRoot(dirFile->m_vol); 3d50: 4618 mov r0, r3 m_flags = FILE_FLAG_READ; 3d52: f884 3033 strb.w r3, [r4, #51] ; 0x33 m_attributes = FILE_ATTR_ROOT; 3d56: f884 2031 strb.w r2, [r4, #49] ; 0x31 return openRoot(dirFile->m_vol); 3d5a: e7e8 b.n 3d2e return openPrivate(dirFile, &fname, oflag); 3d5c: 464b mov r3, r9 3d5e: aa02 add r2, sp, #8 3d60: 4639 mov r1, r7 3d62: 4620 mov r0, r4 3d64: f7ff fdca bl 38fc } 3d68: b017 add sp, #92 ; 0x5c 3d6a: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} memset(this, 0, sizeof(ExFatFile)); 3d6e: 2238 movs r2, #56 ; 0x38 3d70: 2100 movs r1, #0 3d72: a808 add r0, sp, #32 if (!tmpDir.openRoot(dirFile->m_vol)) { 3d74: 6a3d ldr r5, [r7, #32] memset(this, 0, sizeof(ExFatFile)); 3d76: f009 fedb bl db30 m_flags = FILE_FLAG_READ; 3d7a: 2301 movs r3, #1 dirFile = &tmpDir; 3d7c: af08 add r7, sp, #32 m_vol = vol; 3d7e: 9510 str r5, [sp, #64] ; 0x40 m_flags = FILE_FLAG_READ; 3d80: f88d 3053 strb.w r3, [sp, #83] ; 0x53 m_attributes = FILE_ATTR_ROOT; 3d84: 2340 movs r3, #64 ; 0x40 3d86: f88d 3051 strb.w r3, [sp, #81] ; 0x51 return true; 3d8a: e79b b.n 3cc4 00003d8c : return vol && open(vol->vwd(), path, oflag); 3d8c: b119 cbz r1, 3d96 3d8e: f501 6189 add.w r1, r1, #1096 ; 0x448 3d92: f7ff bf7f b.w 3c94 } 3d96: 4608 mov r0, r1 3d98: 4770 bx lr 3d9a: bf00 nop 00003d9c : if (isOpen() || !dir->isDir() || (dir->curPosition() & 0X1F)) { 3d9c: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 3da0: b963 cbnz r3, 3dbc 3da2: f891 3031 ldrb.w r3, [r1, #49] ; 0x31 3da6: f013 0f50 tst.w r3, #80 ; 0x50 3daa: d007 beq.n 3dbc 3dac: 680b ldr r3, [r1, #0] 3dae: f013 0c1f ands.w ip, r3, #31 3db2: d103 bne.n 3dbc return openPrivate(dir, nullptr, oflag); 3db4: 4613 mov r3, r2 3db6: 4662 mov r2, ip 3db8: f7ff bda0 b.w 38fc } 3dbc: 2000 movs r0, #0 3dbe: 4770 bx lr 00003dc0 : } return checksum; } //------------------------------------------------------------------------------ bool ExFatFile::addCluster() { uint32_t find = m_vol->bitmapFind(m_curCluster ? m_curCluster + 1 : 0, 1); 3dc0: 6981 ldr r1, [r0, #24] bool ExFatFile::addCluster() { 3dc2: b5f8 push {r3, r4, r5, r6, r7, lr} 3dc4: 4604 mov r4, r0 uint32_t find = m_vol->bitmapFind(m_curCluster ? m_curCluster + 1 : 0, 1); 3dc6: 6a00 ldr r0, [r0, #32] 3dc8: b101 cbz r1, 3dcc 3dca: 3101 adds r1, #1 3dcc: 2201 movs r2, #1 3dce: f001 f969 bl 50a4 if (find < 2) { 3dd2: 2801 cmp r0, #1 uint32_t find = m_vol->bitmapFind(m_curCluster ? m_curCluster + 1 : 0, 1); 3dd4: 4605 mov r5, r0 if (find < 2) { 3dd6: d932 bls.n 3e3e DBG_FAIL_MACRO; goto fail; } if (!m_vol->bitmapModify(find, 1, 1)) { 3dd8: 2301 movs r3, #1 3dda: 4601 mov r1, r0 3ddc: 6a20 ldr r0, [r4, #32] 3dde: 461a mov r2, r3 3de0: f001 f9c0 bl 5164 3de4: 4606 mov r6, r0 3de6: b350 cbz r0, 3e3e DBG_FAIL_MACRO; goto fail; } if (m_curCluster == 0) { 3de8: 69a3 ldr r3, [r4, #24] 3dea: b35b cbz r3, 3e44 bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} 3dec: f894 2033 ldrb.w r2, [r4, #51] ; 0x33 m_flags |= FILE_FLAG_CONTIGUOUS; goto done; } if (isContiguous()) { 3df0: 0651 lsls r1, r2, #25 3df2: d512 bpl.n 3e1a if (find == (m_curCluster + 1)) { 3df4: 1c59 adds r1, r3, #1 3df6: 42a9 cmp r1, r5 3df8: d018 beq.n 3e2c goto done; } // No longer contiguous so make FAT chain. m_flags &= ~FILE_FLAG_CONTIGUOUS; 3dfa: f022 0240 bic.w r2, r2, #64 ; 0x40 for (uint32_t c = m_firstCluster; c < m_curCluster; c++) { 3dfe: 69e1 ldr r1, [r4, #28] m_flags &= ~FILE_FLAG_CONTIGUOUS; 3e00: f884 2033 strb.w r2, [r4, #51] ; 0x33 for (uint32_t c = m_firstCluster; c < m_curCluster; c++) { 3e04: e005 b.n 3e12 if (!m_vol->fatPut(c, c + 1)) { 3e06: 6a20 ldr r0, [r4, #32] 3e08: f001 faa8 bl 535c for (uint32_t c = m_firstCluster; c < m_curCluster; c++) { 3e0c: 4639 mov r1, r7 if (!m_vol->fatPut(c, c + 1)) { 3e0e: b1b0 cbz r0, 3e3e for (uint32_t c = m_firstCluster; c < m_curCluster; c++) { 3e10: 69a3 ldr r3, [r4, #24] if (!m_vol->fatPut(c, c + 1)) { 3e12: 1c4f adds r7, r1, #1 for (uint32_t c = m_firstCluster; c < m_curCluster; c++) { 3e14: 4299 cmp r1, r3 if (!m_vol->fatPut(c, c + 1)) { 3e16: 463a mov r2, r7 for (uint32_t c = m_firstCluster; c < m_curCluster; c++) { 3e18: d3f5 bcc.n 3e06 goto fail; } } } // New cluster is EOC. if (!m_vol->fatPut(find, EXFAT_EOC)) { 3e1a: f04f 32ff mov.w r2, #4294967295 3e1e: 4629 mov r1, r5 3e20: 6a20 ldr r0, [r4, #32] 3e22: f001 fa9b bl 535c 3e26: b150 cbz r0, 3e3e DBG_FAIL_MACRO; goto fail; } // Connect new cluster to existing chain. if (m_curCluster) { 3e28: 69a1 ldr r1, [r4, #24] 3e2a: b911 cbnz r1, 3e32 m_curCluster = find; return true; fail: return false; } 3e2c: 4630 mov r0, r6 m_curCluster = find; 3e2e: 61a5 str r5, [r4, #24] } 3e30: bdf8 pop {r3, r4, r5, r6, r7, pc} if (!m_vol->fatPut(m_curCluster, find)) { 3e32: 462a mov r2, r5 3e34: 6a20 ldr r0, [r4, #32] 3e36: f001 fa91 bl 535c 3e3a: 2800 cmp r0, #0 3e3c: d1f6 bne.n 3e2c return false; 3e3e: 2600 movs r6, #0 } 3e40: 4630 mov r0, r6 3e42: bdf8 pop {r3, r4, r5, r6, r7, pc} m_flags |= FILE_FLAG_CONTIGUOUS; 3e44: f894 3033 ldrb.w r3, [r4, #51] ; 0x33 3e48: f043 0340 orr.w r3, r3, #64 ; 0x40 3e4c: f884 3033 strb.w r3, [r4, #51] ; 0x33 goto done; 3e50: e7ec b.n 3e2c 3e52: bf00 nop 00003e54 : bool isWritable() const {return m_flags & FILE_FLAG_WRITE;} 3e54: f890 3033 ldrb.w r3, [r0, #51] ; 0x33 return false; } //------------------------------------------------------------------------------ bool ExFatFile::remove() { uint8_t* cache; if (!isWritable()) { 3e58: 079a lsls r2, r3, #30 3e5a: d536 bpl.n 3eca DBG_FAIL_MACRO; goto fail; } // Free any clusters. if (m_firstCluster) { 3e5c: 69c1 ldr r1, [r0, #28] bool ExFatFile::remove() { 3e5e: b570 push {r4, r5, r6, lr} 3e60: 4605 mov r5, r0 if (m_firstCluster) { 3e62: b9a1 cbnz r1, 3e8e bool ExFatFile::remove() { 3e64: 2400 movs r4, #0 3e66: 4621 mov r1, r4 3e68: e007 b.n 3e7a if (!cache) { DBG_FAIL_MACRO; goto fail; } // Mark entry not used. cache[0] &= 0x7F; 3e6a: 7803 ldrb r3, [r0, #0] 3e6c: f003 037f and.w r3, r3, #127 ; 0x7f 3e70: 7003 strb r3, [r0, #0] for (uint8_t is = 0; is <= m_setCount; is++) { 3e72: f895 3030 ldrb.w r3, [r5, #48] ; 0x30 3e76: 428b cmp r3, r1 3e78: d329 bcc.n 3ece 3e7a: 3401 adds r4, #1 cache = dirCache(is, FsCache::CACHE_FOR_WRITE); 3e7c: 2201 movs r2, #1 3e7e: 4628 mov r0, r5 3e80: f7ff fb32 bl 34e8 for (uint8_t is = 0; is <= m_setCount; is++) { 3e84: b2e1 uxtb r1, r4 if (!cache) { 3e86: 2800 cmp r0, #0 3e88: d1ef bne.n 3e6a // Write entry to device. return m_vol->cacheSync(); fail: return false; } 3e8a: 2000 movs r0, #0 3e8c: bd70 pop {r4, r5, r6, pc} if (isContiguous()) { 3e8e: 065b lsls r3, r3, #25 uint32_t nc = 1 + ((m_dataLength - 1) >> m_vol->bytesPerClusterShift()); 3e90: 6a00 ldr r0, [r0, #32] if (isContiguous()) { 3e92: d534 bpl.n 3efe return m_bytesPerSectorShift + m_sectorsPerClusterShift; 3e94: f890 3445 ldrb.w r3, [r0, #1093] ; 0x445 uint32_t nc = 1 + ((m_dataLength - 1) >> m_vol->bytesPerClusterShift()); 3e98: e9d5 2402 ldrd r2, r4, [r5, #8] 3e9c: 3309 adds r3, #9 3e9e: 3a01 subs r2, #1 3ea0: b2db uxtb r3, r3 3ea2: f144 34ff adc.w r4, r4, #4294967295 3ea6: f1c3 0c20 rsb ip, r3, #32 3eaa: 40da lsrs r2, r3 3eac: 3b20 subs r3, #32 3eae: fa04 fc0c lsl.w ip, r4, ip 3eb2: fa24 f303 lsr.w r3, r4, r3 3eb6: ea42 020c orr.w r2, r2, ip 3eba: 431a orrs r2, r3 if (!m_vol->bitmapModify(m_firstCluster, nc, 0)) { 3ebc: 2300 movs r3, #0 3ebe: 3201 adds r2, #1 3ec0: f001 f950 bl 5164 3ec4: 2800 cmp r0, #0 3ec6: d1cd bne.n 3e64 3ec8: e7df b.n 3e8a } 3eca: 2000 movs r0, #0 3ecc: 4770 bx lr m_attributes = FILE_ATTR_CLOSED; 3ece: 2300 movs r3, #0 return m_vol->cacheSync(); 3ed0: 6a2c ldr r4, [r5, #32] m_attributes = FILE_ATTR_CLOSED; 3ed2: f885 3031 strb.w r3, [r5, #49] ; 0x31 return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); 3ed6: 4620 mov r0, r4 m_flags = 0; 3ed8: f885 3033 strb.w r3, [r5, #51] ; 0x33 3edc: f006 f9a4 bl a228 3ee0: 2800 cmp r0, #0 3ee2: d0d2 beq.n 3e8a 3ee4: f504 7004 add.w r0, r4, #528 ; 0x210 3ee8: f006 f99e bl a228 3eec: 2800 cmp r0, #0 3eee: d0cc beq.n 3e8a 3ef0: f8d4 0440 ldr.w r0, [r4, #1088] ; 0x440 bool fatPut(uint32_t cluster, uint32_t value); uint32_t chainSize(uint32_t cluster); bool freeChain(uint32_t cluster); uint16_t sectorMask() const {return m_sectorMask;} bool syncDevice() { return m_blockDev->syncDevice(); 3ef4: 6803 ldr r3, [r0, #0] } 3ef6: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} 3efa: 6a1b ldr r3, [r3, #32] 3efc: 4718 bx r3 if (!m_vol->freeChain(m_firstCluster)) { 3efe: f001 fa4d bl 539c 3f02: 2800 cmp r0, #0 3f04: d1ae bne.n 3e64 3f06: e7c0 b.n 3e8a 00003f08 : //------------------------------------------------------------------------------ bool ExFatFile::rmdir() { int n; uint8_t dir[FS_DIR_SIZE]; // must be open subdirectory if (!isSubDir()) { 3f08: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 3f0c: 06db lsls r3, r3, #27 3f0e: d401 bmi.n 3f14 m_attributes = FILE_ATTR_FILE; m_flags |= FILE_FLAG_WRITE; return remove(); fail: return false; 3f10: 2000 movs r0, #0 } 3f12: 4770 bx lr bool ExFatFile::rmdir() { 3f14: b510 push {r4, lr} seekSet(0); 3f16: 2200 movs r2, #0 3f18: b088 sub sp, #32 3f1a: 2300 movs r3, #0 3f1c: 4604 mov r4, r0 3f1e: f7ff fc77 bl 3810 } 3f22: e008 b.n 3f36 if (n != FS_DIR_SIZE || dir[0] & 0X80) { 3f24: 2820 cmp r0, #32 3f26: d11b bne.n 3f60 3f28: f99d 3000 ldrsb.w r3, [sp] 3f2c: f89d 2000 ldrb.w r2, [sp] 3f30: 2b00 cmp r3, #0 3f32: db15 blt.n 3f60 if (dir[0] == 0) { 3f34: b132 cbz r2, 3f44 n = read(dir, FS_DIR_SIZE); 3f36: 2220 movs r2, #32 3f38: 4669 mov r1, sp 3f3a: 4620 mov r0, r4 3f3c: f7ff fb82 bl 3644 if (n == 0) { 3f40: 2800 cmp r0, #0 3f42: d1ef bne.n 3f24 m_flags |= FILE_FLAG_WRITE; 3f44: f894 3033 ldrb.w r3, [r4, #51] ; 0x33 m_attributes = FILE_ATTR_FILE; 3f48: 2208 movs r2, #8 return remove(); 3f4a: 4620 mov r0, r4 m_flags |= FILE_FLAG_WRITE; 3f4c: f043 0302 orr.w r3, r3, #2 m_attributes = FILE_ATTR_FILE; 3f50: f884 2031 strb.w r2, [r4, #49] ; 0x31 m_flags |= FILE_FLAG_WRITE; 3f54: f884 3033 strb.w r3, [r4, #51] ; 0x33 return remove(); 3f58: f7ff ff7c bl 3e54 } 3f5c: b008 add sp, #32 3f5e: bd10 pop {r4, pc} return false; 3f60: 2000 movs r0, #0 } 3f62: b008 add sp, #32 3f64: bd10 pop {r4, pc} 3f66: bf00 nop 00003f68 : fail: m_error |= WRITE_ERROR; return false; } //------------------------------------------------------------------------------ bool ExFatFile::syncDir() { 3f68: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 3f6c: f04f 0800 mov.w r8, #0 3f70: b082 sub sp, #8 } switch (cache[0]) { case EXFAT_TYPE_FILE: df = reinterpret_cast(cache); setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); if (FsDateTime::callback) { 3f72: 4f4a ldr r7, [pc, #296] ; (409c ) bool ExFatFile::syncDir() { 3f74: 4606 mov r6, r0 uint16_t checksum = 0; 3f76: 4644 mov r4, r8 3f78: 4641 mov r1, r8 cache = dirCache(is, FsCache::CACHE_FOR_READ); 3f7a: 2200 movs r2, #0 3f7c: 4630 mov r0, r6 3f7e: f7ff fab3 bl 34e8 if (!cache) { 3f82: 4605 mov r5, r0 3f84: b130 cbz r0, 3f94 switch (cache[0]) { 3f86: 7801 ldrb r1, [r0, #0] 3f88: 29c0 cmp r1, #192 ; 0xc0 3f8a: d069 beq.n 4060 3f8c: 29c1 cmp r1, #193 ; 0xc1 3f8e: d02b beq.n 3fe8 3f90: 2985 cmp r1, #133 ; 0x85 3f92: d009 beq.n 3fa8 goto fail; } return true; fail: m_error |= WRITE_ERROR; 3f94: f896 3032 ldrb.w r3, [r6, #50] ; 0x32 return false; 3f98: 2000 movs r0, #0 m_error |= WRITE_ERROR; 3f9a: f043 0301 orr.w r3, r3, #1 3f9e: f886 3032 strb.w r3, [r6, #50] ; 0x32 } 3fa2: b002 add sp, #8 3fa4: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); 3fa8: f896 3031 ldrb.w r3, [r6, #49] ; 0x31 3fac: f003 0337 and.w r3, r3, #55 ; 0x37 3fb0: 8083 strh r3, [r0, #4] if (FsDateTime::callback) { 3fb2: 683b ldr r3, [r7, #0] 3fb4: b183 cbz r3, 3fd8 FsDateTime::callback(&date, &time, &ms10); 3fb6: f10d 0203 add.w r2, sp, #3 3fba: f10d 0106 add.w r1, sp, #6 3fbe: a801 add r0, sp, #4 3fc0: 4798 blx r3 setLe16(df->modifyTime, time); 3fc2: f8bd 3006 ldrh.w r3, [sp, #6] 3fc6: 81ab strh r3, [r5, #12] 3fc8: 822b strh r3, [r5, #16] setLe16(df->modifyDate, date); 3fca: f8bd 3004 ldrh.w r3, [sp, #4] 3fce: 81eb strh r3, [r5, #14] 3fd0: 826b strh r3, [r5, #18] df->modifyTimeMs = ms10; 3fd2: f89d 3003 ldrb.w r3, [sp, #3] 3fd6: 756b strb r3, [r5, #21] m_vol->dataCacheDirty(); 3fd8: 6a32 ldr r2, [r6, #32] m_status |= CACHE_STATUS_DIRTY; 3fda: f892 3210 ldrb.w r3, [r2, #528] ; 0x210 3fde: f043 0301 orr.w r3, r3, #1 3fe2: f882 3210 strb.w r3, [r2, #528] ; 0x210 bool skip = data[0] == EXFAT_TYPE_FILE; 3fe6: 7829 ldrb r1, [r5, #0] 3fe8: f1a1 0085 sub.w r0, r1, #133 ; 0x85 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 3fec: 2200 movs r2, #0 bool skip = data[0] == EXFAT_TYPE_FILE; 3fee: fab0 f080 clz r0, r0 3ff2: 0940 lsrs r0, r0, #5 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 3ff4: e001 b.n 3ffa 3ff6: 2204 movs r2, #4 checksum = ((checksum << 15) | (checksum >> 1)) + data[i]; 3ff8: 5ca9 ldrb r1, [r5, r2] 3ffa: 03e3 lsls r3, r4, #15 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 3ffc: 2a01 cmp r2, #1 3ffe: f102 0201 add.w r2, r2, #1 checksum = ((checksum << 15) | (checksum >> 1)) + data[i]; 4002: ea43 0354 orr.w r3, r3, r4, lsr #1 4006: fa11 f383 uxtah r3, r1, r3 400a: b29c uxth r4, r3 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 400c: d101 bne.n 4012 400e: 2800 cmp r0, #0 4010: d1f1 bne.n 3ff6 4012: 2a1f cmp r2, #31 4014: d9f0 bls.n 3ff8 for (uint8_t is = 0; is <= m_setCount ; is++) { 4016: f108 0801 add.w r8, r8, #1 401a: f896 3030 ldrb.w r3, [r6, #48] ; 0x30 401e: fa5f f188 uxtb.w r1, r8 4022: 428b cmp r3, r1 4024: d2a9 bcs.n 3f7a (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); 4026: 2201 movs r2, #1 4028: f106 0124 add.w r1, r6, #36 ; 0x24 402c: 6a30 ldr r0, [r6, #32] 402e: f001 f915 bl 525c if (!df) { 4032: 2800 cmp r0, #0 4034: d0ae beq.n 3f94 if (!m_vol->cacheSync()) { 4036: 6a35 ldr r5, [r6, #32] 4038: 8044 strh r4, [r0, #2] return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); 403a: 4628 mov r0, r5 403c: f006 f8f4 bl a228 4040: 2800 cmp r0, #0 4042: d0a7 beq.n 3f94 4044: f505 7004 add.w r0, r5, #528 ; 0x210 4048: f006 f8ee bl a228 404c: 2800 cmp r0, #0 404e: d0a1 beq.n 3f94 4050: f8d5 0440 ldr.w r0, [r5, #1088] ; 0x440 return m_blockDev->syncDevice(); 4054: 6803 ldr r3, [r0, #0] 4056: 6a1b ldr r3, [r3, #32] 4058: 4798 blx r3 return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); 405a: 2800 cmp r0, #0 405c: d1a1 bne.n 3fa2 405e: e799 b.n 3f94 if (isContiguous()) { 4060: f896 3033 ldrb.w r3, [r6, #51] ; 0x33 4064: f013 0f40 tst.w r3, #64 ; 0x40 ds->flags |= EXFAT_FLAG_CONTIGUOUS; 4068: 7843 ldrb r3, [r0, #1] 406a: bf14 ite ne 406c: f043 0302 orrne.w r3, r3, #2 ds->flags &= ~EXFAT_FLAG_CONTIGUOUS; 4070: f003 03fd andeq.w r3, r3, #253 ; 0xfd 4074: 7043 strb r3, [r0, #1] setLe64(ds->validLength, m_validLength); 4076: e9d6 0104 ldrd r0, r1, [r6, #16] m_vol->dataCacheDirty(); 407a: e9d6 3207 ldrd r3, r2, [r6, #28] inline void setLe32(uint8_t* dst, uint32_t src) { *reinterpret_cast(dst) = src; } inline void setLe64(uint8_t* dst, uint64_t src) { *reinterpret_cast(dst) = src; 407e: e9c5 0102 strd r0, r1, [r5, #8] setLe64(ds->dataLength, m_dataLength); 4082: e9d6 0102 ldrd r0, r1, [r6, #8] *reinterpret_cast(dst) = src; 4086: 616b str r3, [r5, #20] *reinterpret_cast(dst) = src; 4088: e9c5 0106 strd r0, r1, [r5, #24] 408c: f892 3210 ldrb.w r3, [r2, #528] ; 0x210 4090: f043 0301 orr.w r3, r3, #1 4094: f882 3210 strb.w r3, [r2, #528] ; 0x210 bool skip = data[0] == EXFAT_TYPE_FILE; 4098: 7829 ldrb r1, [r5, #0] void dataCacheDirty() {m_dataCache.dirty();} 409a: e7a5 b.n 3fe8 409c: 2000244c .word 0x2000244c 000040a0 : bool ExFatFile::sync() { 40a0: b538 push {r3, r4, r5, lr} if (!isOpen()) { 40a2: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 40a6: b343 cbz r3, 40fa if (m_flags & FILE_FLAG_DIR_DIRTY) { 40a8: f990 2033 ldrsb.w r2, [r0, #51] ; 0x33 40ac: 4604 mov r4, r0 40ae: f890 3033 ldrb.w r3, [r0, #51] ; 0x33 40b2: 2a00 cmp r2, #0 40b4: db0c blt.n 40d0 if (!m_vol->cacheSync()) { 40b6: 6a05 ldr r5, [r0, #32] return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); 40b8: 4628 mov r0, r5 40ba: f006 f8b5 bl a228 40be: b978 cbnz r0, 40e0 m_error |= WRITE_ERROR; 40c0: f894 3032 ldrb.w r3, [r4, #50] ; 0x32 return false; 40c4: 2000 movs r0, #0 m_error |= WRITE_ERROR; 40c6: f043 0301 orr.w r3, r3, #1 40ca: f884 3032 strb.w r3, [r4, #50] ; 0x32 } 40ce: bd38 pop {r3, r4, r5, pc} m_flags &= ~FILE_FLAG_DIR_DIRTY; 40d0: f003 037f and.w r3, r3, #127 ; 0x7f 40d4: f880 3033 strb.w r3, [r0, #51] ; 0x33 } 40d8: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} return syncDir(); 40dc: f7ff bf44 b.w 3f68 40e0: f505 7004 add.w r0, r5, #528 ; 0x210 40e4: f006 f8a0 bl a228 40e8: 2800 cmp r0, #0 40ea: d0e9 beq.n 40c0 40ec: f8d5 0440 ldr.w r0, [r5, #1088] ; 0x440 return m_blockDev->syncDevice(); 40f0: 6803 ldr r3, [r0, #0] 40f2: 6a1b ldr r3, [r3, #32] 40f4: 4798 blx r3 return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); 40f6: 2800 cmp r0, #0 40f8: d0e2 beq.n 40c0 return true; 40fa: 2001 movs r0, #1 } 40fc: bd38 pop {r3, r4, r5, pc} 40fe: bf00 nop 00004100 : bool ExFatFile::addDirCluster() { 4100: b570 push {r4, r5, r6, lr} uint32_t dl = isRoot() ? m_vol->rootLength() : m_dataLength; 4102: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 bool ExFatFile::addDirCluster() { 4106: 4605 mov r5, r0 uint32_t dl = isRoot() ? m_vol->rootLength() : m_dataLength; 4108: 065a lsls r2, r3, #25 410a: d44c bmi.n 41a6 410c: 6880 ldr r0, [r0, #8] uint32_t bytesPerCluster() const {return m_bytesPerCluster;} 410e: 6a2b ldr r3, [r5, #32] dl += m_vol->bytesPerCluster(); 4110: f8d3 343c ldr.w r3, [r3, #1084] ; 0x43c 4114: 4418 add r0, r3 if (dl >= 0X4000000) { 4116: f1b0 6f80 cmp.w r0, #67108864 ; 0x4000000 411a: d301 bcc.n 4120 } 411c: 2000 movs r0, #0 411e: bd70 pop {r4, r5, r6, pc} if (!addCluster()) { 4120: 4628 mov r0, r5 4122: f7ff fe4d bl 3dc0 4126: 2800 cmp r0, #0 4128: d0f8 beq.n 411c sector = m_vol->clusterStartSector(m_curCluster); 412a: 6a28 ldr r0, [r5, #32] for (uint32_t i = 0; i < m_vol->sectorsPerCluster(); i++) { 412c: 2400 movs r4, #0 ((cluster - 2) << m_sectorsPerClusterShift); 412e: 69ae ldr r6, [r5, #24] 4130: f890 3445 ldrb.w r3, [r0, #1093] ; 0x445 4134: 3e02 subs r6, #2 4136: 409e lsls r6, r3 4138: f8d0 342c ldr.w r3, [r0, #1068] ; 0x42c 413c: 441e add r6, r3 return m_dataCache.prepare(sector, option); 413e: 1931 adds r1, r6, r4 4140: 2205 movs r2, #5 4142: f500 7004 add.w r0, r0, #528 ; 0x210 4146: 3401 adds r4, #1 4148: f006 f89a bl a280 memset(cache, 0, m_vol->bytesPerSector()); 414c: f44f 7200 mov.w r2, #512 ; 0x200 4150: 2100 movs r1, #0 if (!cache) { 4152: 2800 cmp r0, #0 4154: d0e2 beq.n 411c memset(cache, 0, m_vol->bytesPerSector()); 4156: f009 fceb bl db30 for (uint32_t i = 0; i < m_vol->sectorsPerCluster(); i++) { 415a: 6a28 ldr r0, [r5, #32] uint32_t sectorsPerCluster() const {return 1UL << m_sectorsPerClusterShift;} 415c: 2301 movs r3, #1 415e: f890 2445 ldrb.w r2, [r0, #1093] ; 0x445 4162: 4093 lsls r3, r2 4164: 429c cmp r4, r3 4166: d3ea bcc.n 413e if (!isRoot()) { 4168: f895 3031 ldrb.w r3, [r5, #49] ; 0x31 416c: 065b lsls r3, r3, #25 416e: d415 bmi.n 419c m_flags |= FILE_FLAG_DIR_DIRTY; 4170: f895 2033 ldrb.w r2, [r5, #51] ; 0x33 4174: f062 027f orn r2, r2, #127 ; 0x7f m_dataLength += m_vol->bytesPerCluster(); 4178: e9d5 3102 ldrd r3, r1, [r5, #8] m_flags |= FILE_FLAG_DIR_DIRTY; 417c: f885 2033 strb.w r2, [r5, #51] ; 0x33 m_dataLength += m_vol->bytesPerCluster(); 4180: f8d0 243c ldr.w r2, [r0, #1084] ; 0x43c 4184: 189b adds r3, r3, r2 4186: f141 0000 adc.w r0, r1, #0 418a: 60ab str r3, [r5, #8] m_validLength += m_vol->bytesPerCluster(); 418c: e9d5 3104 ldrd r3, r1, [r5, #16] m_dataLength += m_vol->bytesPerCluster(); 4190: 60e8 str r0, [r5, #12] m_validLength += m_vol->bytesPerCluster(); 4192: 189b adds r3, r3, r2 4194: f141 0100 adc.w r1, r1, #0 4198: e9c5 3104 strd r3, r1, [r5, #16] return sync(); 419c: 4628 mov r0, r5 } 419e: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} return sync(); 41a2: f7ff bf7d b.w 40a0 uint32_t dl = isRoot() ? m_vol->rootLength() : m_dataLength; 41a6: 6a00 ldr r0, [r0, #32] 41a8: f001 f9fe bl 55a8 41ac: e7af b.n 410e 41ae: bf00 nop 000041b0 : bool ExFatFile::rename(ExFatFile* dirFile, const char* newPath) { 41b0: b570 push {r4, r5, r6, lr} 41b2: 4604 mov r4, r0 if (!(isFile() || isSubDir())) { 41b4: f890 0031 ldrb.w r0, [r0, #49] ; 0x31 bool ExFatFile::rename(ExFatFile* dirFile, const char* newPath) { 41b8: b09c sub sp, #112 ; 0x70 ExFatFile() {} 41ba: 2300 movs r3, #0 if (!(isFile() || isSubDir())) { 41bc: f010 0f18 tst.w r0, #24 41c0: 930c str r3, [sp, #48] ; 0x30 41c2: 931a str r3, [sp, #104] ; 0x68 41c4: d003 beq.n 41ce if (m_vol != dirFile->m_vol) { 41c6: 6a20 ldr r0, [r4, #32] 41c8: 6a0b ldr r3, [r1, #32] 41ca: 4298 cmp r0, r3 41cc: d002 beq.n 41d4 return false; 41ce: 2000 movs r0, #0 } 41d0: b01c add sp, #112 ; 0x70 41d2: bd70 pop {r4, r5, r6, pc} if (!file.open(dirFile, newPath, O_CREAT | O_EXCL | O_WRONLY)) { 41d4: f640 2301 movw r3, #2561 ; 0xa01 41d8: 4668 mov r0, sp 41da: f7ff fd5b bl 3c94 41de: 2800 cmp r0, #0 41e0: d0f5 beq.n 41ce oldFile = *this; 41e2: 46a4 mov ip, r4 41e4: f104 0630 add.w r6, r4, #48 ; 0x30 41e8: ad0e add r5, sp, #56 ; 0x38 41ea: f8dc 0000 ldr.w r0, [ip] 41ee: f10c 0c10 add.w ip, ip, #16 41f2: f85c 1c0c ldr.w r1, [ip, #-12] 41f6: 46ae mov lr, r5 41f8: f85c 2c08 ldr.w r2, [ip, #-8] 41fc: 3510 adds r5, #16 41fe: f85c 3c04 ldr.w r3, [ip, #-4] 4202: 45b4 cmp ip, r6 4204: e8ae 000f stmia.w lr!, {r0, r1, r2, r3} 4208: d1ef bne.n 41ea 420a: f8dc 0000 ldr.w r0, [ip] m_dirPos = file.m_dirPos; 420e: aa09 add r2, sp, #36 ; 0x24 4210: f104 0324 add.w r3, r4, #36 ; 0x24 oldFile = *this; 4214: 6028 str r0, [r5, #0] m_setCount = file.m_setCount; 4216: f89d 5030 ldrb.w r5, [sp, #48] ; 0x30 m_dirPos = file.m_dirPos; 421a: ca07 ldmia r2, {r0, r1, r2} 421c: e883 0007 stmia.w r3, {r0, r1, r2} m_flags |= FILE_FLAG_DIR_DIRTY; 4220: f894 3033 ldrb.w r3, [r4, #51] ; 0x33 if (!sync()) { 4224: 4620 mov r0, r4 m_setCount = file.m_setCount; 4226: f884 5030 strb.w r5, [r4, #48] ; 0x30 m_flags |= FILE_FLAG_DIR_DIRTY; 422a: f063 037f orn r3, r3, #127 ; 0x7f 422e: f884 3033 strb.w r3, [r4, #51] ; 0x33 if (!sync()) { 4232: f7ff ff35 bl 40a0 4236: 2800 cmp r0, #0 4238: d0c9 beq.n 41ce oldFile.m_firstCluster = 0; 423a: 2100 movs r1, #0 oldFile.m_flags = FILE_FLAG_WRITE; 423c: 2202 movs r2, #2 oldFile.m_attributes = FILE_ATTR_FILE; 423e: 2308 movs r3, #8 return oldFile.remove(); 4240: a80e add r0, sp, #56 ; 0x38 oldFile.m_firstCluster = 0; 4242: 9115 str r1, [sp, #84] ; 0x54 oldFile.m_flags = FILE_FLAG_WRITE; 4244: f88d 206b strb.w r2, [sp, #107] ; 0x6b oldFile.m_attributes = FILE_ATTR_FILE; 4248: f88d 3069 strb.w r3, [sp, #105] ; 0x69 return oldFile.remove(); 424c: f7ff fe02 bl 3e54 4250: e7be b.n 41d0 4252: bf00 nop 00004254 : bool ExFatFile::mkdir(ExFatFile* parent, ExName_t* fname) { 4254: b538 push {r3, r4, r5, lr} if (!parent->isDir()) { 4256: f891 3031 ldrb.w r3, [r1, #49] ; 0x31 425a: f013 0f50 tst.w r3, #80 ; 0x50 425e: d102 bne.n 4266 return false; 4260: 2500 movs r5, #0 } 4262: 4628 mov r0, r5 4264: bd38 pop {r3, r4, r5, pc} if (!openPrivate(parent, fname, O_CREAT | O_EXCL | O_RDWR)) { 4266: f640 2302 movw r3, #2562 ; 0xa02 426a: 4604 mov r4, r0 426c: f7ff fb46 bl 38fc 4270: 2800 cmp r0, #0 4272: d0f5 beq.n 4260 m_attributes = FILE_ATTR_SUBDIR; 4274: 2310 movs r3, #16 if (!addDirCluster()) { 4276: 4620 mov r0, r4 m_attributes = FILE_ATTR_SUBDIR; 4278: f884 3031 strb.w r3, [r4, #49] ; 0x31 if (!addDirCluster()) { 427c: f7ff ff40 bl 4100 4280: 4605 mov r5, r0 4282: 2800 cmp r0, #0 4284: d0ec beq.n 4260 m_firstCluster = m_curCluster; 4286: 69a1 ldr r1, [r4, #24] seekSet(0); 4288: 2200 movs r2, #0 428a: 2300 movs r3, #0 428c: 4620 mov r0, r4 428e: 61e1 str r1, [r4, #28] 4290: f7ff fabe bl 3810 m_flags = FILE_FLAG_READ | FILE_FLAG_CONTIGUOUS | FILE_FLAG_DIR_DIRTY; 4294: 22c1 movs r2, #193 ; 0xc1 if (!isOpen()) { 4296: f894 3031 ldrb.w r3, [r4, #49] ; 0x31 m_flags = FILE_FLAG_READ | FILE_FLAG_CONTIGUOUS | FILE_FLAG_DIR_DIRTY; 429a: f884 2033 strb.w r2, [r4, #51] ; 0x33 if (!isOpen()) { 429e: 2b00 cmp r3, #0 42a0: d0df beq.n 4262 m_flags &= ~FILE_FLAG_DIR_DIRTY; 42a2: 2341 movs r3, #65 ; 0x41 return syncDir(); 42a4: 4620 mov r0, r4 m_flags &= ~FILE_FLAG_DIR_DIRTY; 42a6: f884 3033 strb.w r3, [r4, #51] ; 0x33 } 42aa: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} return syncDir(); 42ae: f7ff be5b b.w 3f68 42b2: bf00 nop 000042b4 : bool ExFatFile::mkdir(ExFatFile* parent, const char* path, bool pFlag) { 42b4: b5f0 push {r4, r5, r6, r7, lr} 42b6: 2500 movs r5, #0 42b8: b097 sub sp, #92 ; 0x5c 42ba: 461f mov r7, r3 if (isOpen() || !parent->isDir()) { 42bc: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 bool ExFatFile::mkdir(ExFatFile* parent, const char* path, bool pFlag) { 42c0: 9201 str r2, [sp, #4] 42c2: f8ad 5014 strh.w r5, [sp, #20] ExFatFile() {} 42c6: 9514 str r5, [sp, #80] ; 0x50 if (isOpen() || !parent->isDir()) { 42c8: 2b00 cmp r3, #0 42ca: d146 bne.n 435a 42cc: f891 3031 ldrb.w r3, [r1, #49] ; 0x31 42d0: 460e mov r6, r1 42d2: f013 0f50 tst.w r3, #80 ; 0x50 42d6: d040 beq.n 435a if (isDirSeparator(*path)) { 42d8: 7813 ldrb r3, [r2, #0] 42da: 4604 mov r4, r0 42dc: 4611 mov r1, r2 42de: 2b2f cmp r3, #47 ; 0x2f 42e0: d03e beq.n 4360 if (!parsePathName(path, &fname, &path)) { 42e2: ab01 add r3, sp, #4 42e4: aa02 add r2, sp, #8 42e6: 4620 mov r0, r4 42e8: f7ff f95e bl 35a8 42ec: 2800 cmp r0, #0 42ee: d034 beq.n 435a if (!*path) { 42f0: 9b01 ldr r3, [sp, #4] 42f2: 781b ldrb r3, [r3, #0] 42f4: 2b00 cmp r3, #0 42f6: d041 beq.n 437c if (!openPrivate(parent, &fname, O_RDONLY)) { 42f8: 2300 movs r3, #0 42fa: aa02 add r2, sp, #8 42fc: 4631 mov r1, r6 42fe: 4620 mov r0, r4 4300: f7ff fafc bl 38fc 4304: b930 cbnz r0, 4314 if (!pFlag || !mkdir(parent, &fname)) { 4306: b347 cbz r7, 435a 4308: aa02 add r2, sp, #8 430a: 4631 mov r1, r6 430c: 4620 mov r0, r4 430e: f7ff ffa1 bl 4254 4312: b310 cbz r0, 435a tmpDir = *this; 4314: 46a4 mov ip, r4 4316: ad08 add r5, sp, #32 4318: f104 0630 add.w r6, r4, #48 ; 0x30 431c: f8dc 0000 ldr.w r0, [ip] 4320: f10c 0c10 add.w ip, ip, #16 4324: f85c 1c0c ldr.w r1, [ip, #-12] 4328: 46ae mov lr, r5 432a: f85c 2c08 ldr.w r2, [ip, #-8] 432e: 3510 adds r5, #16 4330: f85c 3c04 ldr.w r3, [ip, #-4] 4334: 45b4 cmp ip, r6 4336: e8ae 000f stmia.w lr!, {r0, r1, r2, r3} 433a: d1ef bne.n 431c 433c: f8dc 0000 ldr.w r0, [ip] parent = &tmpDir; 4340: ae08 add r6, sp, #32 tmpDir = *this; 4342: 6028 str r0, [r5, #0] close(); 4344: 4620 mov r0, r4 4346: f7ff f8ed bl 3524 if (!parsePathName(path, &fname, &path)) { 434a: 9901 ldr r1, [sp, #4] 434c: ab01 add r3, sp, #4 434e: aa02 add r2, sp, #8 4350: 4620 mov r0, r4 4352: f7ff f929 bl 35a8 4356: 2800 cmp r0, #0 4358: d1ca bne.n 42f0 return false; 435a: 2000 movs r0, #0 } 435c: b017 add sp, #92 ; 0x5c 435e: bdf0 pop {r4, r5, r6, r7, pc} path++; 4360: 3101 adds r1, #1 4362: 9101 str r1, [sp, #4] while (isDirSeparator(*path)) { 4364: 780b ldrb r3, [r1, #0] 4366: 2b2f cmp r3, #47 ; 0x2f 4368: d0fa beq.n 4360 if (!tmpDir.openRoot(parent->m_vol)) { 436a: 6a31 ldr r1, [r6, #32] 436c: a808 add r0, sp, #32 436e: f7ff f907 bl 3580 4372: 2800 cmp r0, #0 4374: d0f1 beq.n 435a if (!parsePathName(path, &fname, &path)) { 4376: 9901 ldr r1, [sp, #4] parent = &tmpDir; 4378: ae08 add r6, sp, #32 437a: e7b2 b.n 42e2 return mkdir(parent, &fname); 437c: aa02 add r2, sp, #8 437e: 4631 mov r1, r6 4380: 4620 mov r0, r4 4382: f7ff ff67 bl 4254 } 4386: b017 add sp, #92 ; 0x5c 4388: bdf0 pop {r4, r5, r6, r7, pc} 438a: bf00 nop 0000438c : //------------------------------------------------------------------------------ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { 438c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 4390: 460e mov r6, r1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 59) { 4392: f890 1031 ldrb.w r1, [r0, #49] ; 0x31 uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { 4396: b083 sub sp, #12 || second > 59) { 4398: 0709 lsls r1, r1, #28 uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { 439a: f89d b030 ldrb.w fp, [sp, #48] ; 0x30 439e: f89d 9034 ldrb.w r9, [sp, #52] ; 0x34 43a2: f89d 8038 ldrb.w r8, [sp, #56] ; 0x38 43a6: f89d 703c ldrb.w r7, [sp, #60] ; 0x3c || second > 59) { 43aa: f140 8085 bpl.w 44b8 || year > 2107 43ae: f2a2 72bc subw r2, r2, #1980 ; 0x7bc 43b2: b294 uxth r4, r2 43b4: 2c7f cmp r4, #127 ; 0x7f 43b6: d87f bhi.n 44b8 || month > 12 43b8: 1e5a subs r2, r3, #1 43ba: 2a0b cmp r2, #11 43bc: d87c bhi.n 44b8 || day > 31 43be: f10b 32ff add.w r2, fp, #4294967295 43c2: 2a1e cmp r2, #30 43c4: d878 bhi.n 44b8 || minute > 59 43c6: f1b8 0f3b cmp.w r8, #59 ; 0x3b 43ca: bf98 it ls 43cc: f1b9 0f17 cmpls.w r9, #23 43d0: bf8c ite hi 43d2: f04f 0a01 movhi.w sl, #1 43d6: f04f 0a00 movls.w sl, #0 43da: 2f3b cmp r7, #59 ; 0x3b 43dc: bf88 it hi 43de: f04a 0a01 orrhi.w sl, sl, #1 || second > 59) { 43e2: f1ba 0f00 cmp.w sl, #0 43e6: d167 bne.n 44b8 DBG_FAIL_MACRO; goto fail; } // update directory entry if (!sync()) { 43e8: 4605 mov r5, r0 43ea: 9301 str r3, [sp, #4] 43ec: f7ff fe58 bl 40a0 43f0: 2800 cmp r0, #0 43f2: d061 beq.n 44b8 43f4: 9b01 ldr r3, [sp, #4] 43f6: 4651 mov r1, sl 43f8: ea4b 1b43 orr.w fp, fp, r3, lsl #5 hour << 11 | minute << 5 | second >> 1; 43fc: 087b lsrs r3, r7, #1 goto fail; } date = FS_DATE(year, month, day); time = FS_TIME(hour, minute, second); ms10 = second & 1 ? 100 : 0; 43fe: f017 0701 ands.w r7, r7, #1 year << 9 | month << 5 | day; 4402: ea4b 2444 orr.w r4, fp, r4, lsl #9 uint16_t checksum = 0; 4406: 46d3 mov fp, sl hour << 11 | minute << 5 | second >> 1; 4408: ea43 1848 orr.w r8, r3, r8, lsl #5 ms10 = second & 1 ? 100 : 0; 440c: bf18 it ne 440e: 2764 movne r7, #100 ; 0x64 year << 9 | month << 5 | day; 4410: b2a4 uxth r4, r4 hour << 11 | minute << 5 | second >> 1; 4412: ea48 28c9 orr.w r8, r8, r9, lsl #11 switch (cache[0]) { case EXFAT_TYPE_FILE: df = reinterpret_cast(cache); setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); m_vol->dataCacheDirty(); if (flags & T_ACCESS) { 4416: f006 0901 and.w r9, r6, #1 441a: fa1f f888 uxth.w r8, r8 cache = dirCache(is, FsCache::CACHE_FOR_READ); 441e: 2200 movs r2, #0 4420: 4628 mov r0, r5 4422: f7ff f861 bl 34e8 if (!cache) { 4426: 2800 cmp r0, #0 4428: d046 beq.n 44b8 switch (cache[0]) { 442a: f890 c000 ldrb.w ip, [r0] 442e: f1bc 0f85 cmp.w ip, #133 ; 0x85 4432: d045 beq.n 44c0 4434: f10c 0340 add.w r3, ip, #64 ; 0x40 4438: b2db uxtb r3, r3 443a: 2b01 cmp r3, #1 443c: d83c bhi.n 44b8 bool skip = data[0] == EXFAT_TYPE_FILE; 443e: f1ac 0185 sub.w r1, ip, #133 ; 0x85 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 4442: 2300 movs r3, #0 bool skip = data[0] == EXFAT_TYPE_FILE; 4444: fab1 f181 clz r1, r1 4448: 0949 lsrs r1, r1, #5 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 444a: e002 b.n 4452 444c: 2304 movs r3, #4 checksum = ((checksum << 15) | (checksum >> 1)) + data[i]; 444e: f810 c003 ldrb.w ip, [r0, r3] 4452: ea4f 32cb mov.w r2, fp, lsl #15 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 4456: 2b01 cmp r3, #1 4458: f103 0301 add.w r3, r3, #1 checksum = ((checksum << 15) | (checksum >> 1)) + data[i]; 445c: ea42 025b orr.w r2, r2, fp, lsr #1 4460: fa1c f282 uxtah r2, ip, r2 4464: fa1f fb82 uxth.w fp, r2 for (size_t i = 0; i < 32; i += i == 1 && skip ? 3 : 1) { 4468: d101 bne.n 446e 446a: 2900 cmp r1, #0 446c: d1ee bne.n 444c 446e: 2b1f cmp r3, #31 4470: d9ed bls.n 444e for (uint8_t is = 0; is <= m_setCount; is++) { 4472: f10a 0a01 add.w sl, sl, #1 4476: f895 3030 ldrb.w r3, [r5, #48] ; 0x30 447a: fa5f f18a uxtb.w r1, sl 447e: 428b cmp r3, r1 4480: d2cd bcs.n 441e break; } checksum = exFatDirChecksum(cache, checksum); } df = reinterpret_cast (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); 4482: 2201 movs r2, #1 4484: f105 0124 add.w r1, r5, #36 ; 0x24 4488: 6a28 ldr r0, [r5, #32] 448a: f000 fee7 bl 525c if (!df) { 448e: b198 cbz r0, 44b8 DBG_FAIL_MACRO; goto fail; } setLe16(df->setChecksum, checksum); if (!m_vol->cacheSync()) { 4490: 6a2c ldr r4, [r5, #32] *reinterpret_cast(dst) = src; 4492: f8a0 b002 strh.w fp, [r0, #2] return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); 4496: 4620 mov r0, r4 4498: f005 fec6 bl a228 449c: b160 cbz r0, 44b8 449e: f504 7004 add.w r0, r4, #528 ; 0x210 44a2: f005 fec1 bl a228 44a6: b138 cbz r0, 44b8 44a8: f8d4 0440 ldr.w r0, [r4, #1088] ; 0x440 return m_blockDev->syncDevice(); 44ac: 6803 ldr r3, [r0, #0] 44ae: 6a1b ldr r3, [r3, #32] } return true; fail: return false; } 44b0: b003 add sp, #12 44b2: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 44b6: 4718 bx r3 44b8: 2000 movs r0, #0 44ba: b003 add sp, #12 44bc: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); 44c0: f895 3031 ldrb.w r3, [r5, #49] ; 0x31 m_vol->dataCacheDirty(); 44c4: 6a2a ldr r2, [r5, #32] setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); 44c6: f003 0337 and.w r3, r3, #55 ; 0x37 44ca: 8083 strh r3, [r0, #4] 44cc: f892 3210 ldrb.w r3, [r2, #528] ; 0x210 44d0: f043 0301 orr.w r3, r3, #1 44d4: f882 3210 strb.w r3, [r2, #528] ; 0x210 if (flags & T_ACCESS) { 44d8: f1b9 0f00 cmp.w r9, #0 44dc: d002 beq.n 44e4 44de: f8a0 8010 strh.w r8, [r0, #16] 44e2: 8244 strh r4, [r0, #18] if (flags & T_CREATE) { 44e4: 07b2 lsls r2, r6, #30 44e6: d503 bpl.n 44f0 df->createTimeMs = ms10; 44e8: 7507 strb r7, [r0, #20] 44ea: f8a0 8008 strh.w r8, [r0, #8] 44ee: 8144 strh r4, [r0, #10] if (flags & T_WRITE) { 44f0: 0773 lsls r3, r6, #29 44f2: d503 bpl.n 44fc df->modifyTimeMs = ms10; 44f4: 7547 strb r7, [r0, #21] 44f6: f8a0 800c strh.w r8, [r0, #12] 44fa: 81c4 strh r4, [r0, #14] bool skip = data[0] == EXFAT_TYPE_FILE; 44fc: f890 c000 ldrb.w ip, [r0] } 4500: e79d b.n 443e 4502: bf00 nop 00004504 : bool isWritable() const {return m_flags & FILE_FLAG_WRITE;} 4504: f890 3033 ldrb.w r3, [r0, #51] ; 0x33 //------------------------------------------------------------------------------ bool ExFatFile::truncate() { uint32_t toFree; // error if not a normal file or read-only if (!isWritable()) { 4508: 079a lsls r2, r3, #30 450a: d562 bpl.n 45d2 bool ExFatFile::truncate() { 450c: b570 push {r4, r5, r6, lr} DBG_FAIL_MACRO; goto fail; } if (m_firstCluster == 0) { 450e: 69c5 ldr r5, [r0, #28] bool ExFatFile::truncate() { 4510: b082 sub sp, #8 4512: 4604 mov r4, r0 if (m_firstCluster == 0) { 4514: b3a5 cbz r5, 4580 return true; } if (isContiguous()) { 4516: f013 0640 ands.w r6, r3, #64 ; 0x40 451a: d034 beq.n 4586 uint32_t nc = 1 + ((m_dataLength - 1) >> m_vol->bytesPerClusterShift()); 451c: 6a00 ldr r0, [r0, #32] 451e: 68a2 ldr r2, [r4, #8] return m_bytesPerSectorShift + m_sectorsPerClusterShift; 4520: f890 c445 ldrb.w ip, [r0, #1093] ; 0x445 4524: 3a01 subs r2, #1 4526: 68e1 ldr r1, [r4, #12] 4528: f10c 0c09 add.w ip, ip, #9 452c: f141 31ff adc.w r1, r1, #4294967295 4530: fa5f fc8c uxtb.w ip, ip 4534: f1cc 0e20 rsb lr, ip, #32 4538: fa22 f20c lsr.w r2, r2, ip 453c: f1ac 0c20 sub.w ip, ip, #32 4540: fa01 fe0e lsl.w lr, r1, lr 4544: fa21 fc0c lsr.w ip, r1, ip if (m_curCluster) { 4548: 69a1 ldr r1, [r4, #24] uint32_t nc = 1 + ((m_dataLength - 1) >> m_vol->bytesPerClusterShift()); 454a: ea42 020e orr.w r2, r2, lr 454e: ea42 020c orr.w r2, r2, ip 4552: 3201 adds r2, #1 if (m_curCluster) { 4554: b319 cbz r1, 459e toFree = m_curCluster + 1; nc -= 1 + m_curCluster - m_firstCluster; 4556: 3d01 subs r5, #1 4558: 1a6d subs r5, r5, r1 toFree = m_curCluster + 1; 455a: 3101 adds r1, #1 nc -= 1 + m_curCluster - m_firstCluster; 455c: 442a add r2, r5 toFree = m_curCluster + 1; 455e: 9101 str r1, [sp, #4] } else { toFree = m_firstCluster; m_firstCluster = 0; } if (nc && !m_vol->bitmapModify(toFree, nc, 0)) { 4560: bb72 cbnz r2, 45c0 } } } m_dataLength = m_curPosition; m_validLength = m_curPosition; m_flags |= FILE_FLAG_DIR_DIRTY; 4562: f063 037f orn r3, r3, #127 ; 0x7f return sync(); 4566: 4620 mov r0, r4 m_dataLength = m_curPosition; 4568: ed94 7b00 vldr d7, [r4] m_flags |= FILE_FLAG_DIR_DIRTY; 456c: f884 3033 strb.w r3, [r4, #51] ; 0x33 m_dataLength = m_curPosition; 4570: ed84 7b02 vstr d7, [r4, #8] m_validLength = m_curPosition; 4574: ed84 7b04 vstr d7, [r4, #16] return sync(); 4578: f7ff fd92 bl 40a0 fail: return false; } 457c: b002 add sp, #8 457e: bd70 pop {r4, r5, r6, pc} return true; 4580: 2001 movs r0, #1 } 4582: b002 add sp, #8 4584: bd70 pop {r4, r5, r6, pc} if (m_curCluster) { 4586: 6981 ldr r1, [r0, #24] 4588: b961 cbnz r1, 45a4 toFree = m_firstCluster; 458a: 9501 str r5, [sp, #4] m_firstCluster = 0; 458c: 61c1 str r1, [r0, #28] if (!m_vol->freeChain(toFree)) { 458e: 4629 mov r1, r5 4590: 6a20 ldr r0, [r4, #32] 4592: f000 ff03 bl 539c 4596: b1c8 cbz r0, 45cc m_flags |= FILE_FLAG_DIR_DIRTY; 4598: f894 3033 ldrb.w r3, [r4, #51] ; 0x33 459c: e7e1 b.n 4562 toFree = m_firstCluster; 459e: 9501 str r5, [sp, #4] m_firstCluster = 0; 45a0: 61e1 str r1, [r4, #28] 45a2: e7dd b.n 4560 int8_t fg = m_vol->fatGet(m_curCluster, &toFree); 45a4: aa01 add r2, sp, #4 45a6: 6a00 ldr r0, [r0, #32] toFree = 0; 45a8: 9601 str r6, [sp, #4] int8_t fg = m_vol->fatGet(m_curCluster, &toFree); 45aa: f000 feb5 bl 5318 if (fg < 0) { 45ae: 2800 cmp r0, #0 45b0: db0c blt.n 45cc if (fg) { 45b2: d110 bne.n 45d6 if (toFree) { 45b4: 9d01 ldr r5, [sp, #4] 45b6: 2d00 cmp r5, #0 45b8: d1e9 bne.n 458e m_flags |= FILE_FLAG_DIR_DIRTY; 45ba: f894 3033 ldrb.w r3, [r4, #51] ; 0x33 45be: e7d0 b.n 4562 if (nc && !m_vol->bitmapModify(toFree, nc, 0)) { 45c0: 2300 movs r3, #0 45c2: 9901 ldr r1, [sp, #4] 45c4: f000 fdce bl 5164 45c8: 2800 cmp r0, #0 45ca: d1e5 bne.n 4598 return false; 45cc: 2000 movs r0, #0 } 45ce: b002 add sp, #8 45d0: bd70 pop {r4, r5, r6, pc} return false; 45d2: 2000 movs r0, #0 } 45d4: 4770 bx lr if (!m_vol->fatPut(m_curCluster, EXFAT_EOC)) { 45d6: f04f 32ff mov.w r2, #4294967295 45da: 69a1 ldr r1, [r4, #24] 45dc: 6a20 ldr r0, [r4, #32] 45de: f000 febd bl 535c 45e2: 2800 cmp r0, #0 45e4: d1e6 bne.n 45b4 45e6: e7f1 b.n 45cc 000045e8 : //------------------------------------------------------------------------------ size_t ExFatFile::write(const void* buf, size_t nbyte) { 45e8: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} 45ec: f890 3033 ldrb.w r3, [r0, #51] ; 0x33 45f0: b083 sub sp, #12 45f2: 4604 mov r4, r0 // number of bytes left to write - must be before goto statements size_t toWrite = nbyte; size_t n; // error if not an open file or is read-only if (!isWritable()) { 45f4: 079d lsls r5, r3, #30 45f6: f140 80a1 bpl.w 473c DBG_FAIL_MACRO; goto fail; } // seek to end of file if append flag if ((m_flags & FILE_FLAG_APPEND)) { 45fa: 4691 mov r9, r2 45fc: 071a lsls r2, r3, #28 45fe: 460e mov r6, r1 4600: f100 8095 bmi.w 472e if (!seekSet(m_validLength)) { DBG_FAIL_MACRO; goto fail; } } while (toWrite) { 4604: f1b9 0f00 cmp.w r9, #0 4608: f000 8128 beq.w 485c if (m_curPosition > m_validLength) { m_flags |= FILE_FLAG_DIR_DIRTY; m_validLength = m_curPosition; } } if (m_curPosition > m_dataLength) { 460c: 6823 ldr r3, [r4, #0] 460e: 464d mov r5, r9 clusterOffset = m_curPosition & m_vol->clusterMask(); 4610: 6a20 ldr r0, [r4, #32] if (m_curCluster != 0) { 4612: 69a1 ldr r1, [r4, #24] clusterOffset = m_curPosition & m_vol->clusterMask(); 4614: f8d0 2438 ldr.w r2, [r0, #1080] ; 0x438 4618: ea02 0803 and.w r8, r2, r3 sectorOffset = clusterOffset & m_vol->sectorMask(); 461c: f3c8 0708 ubfx r7, r8, #0, #9 if (clusterOffset == 0) { 4620: f1b8 0f00 cmp.w r8, #0 4624: f040 8094 bne.w 4750 if (m_curCluster != 0) { 4628: 2900 cmp r1, #0 462a: f000 80d4 beq.w 47d6 if (isContiguous()) { 462e: f894 3033 ldrb.w r3, [r4, #51] ; 0x33 4632: 065b lsls r3, r3, #25 4634: f140 80ec bpl.w 4810 4638: f890 c445 ldrb.w ip, [r0, #1093] ; 0x445 lc += (m_dataLength - 1) >> m_vol->bytesPerClusterShift(); 463c: e9d4 3202 ldrd r3, r2, [r4, #8] 4640: f10c 0c09 add.w ip, ip, #9 4644: 3b01 subs r3, #1 4646: fa5f fc8c uxtb.w ip, ip 464a: f142 32ff adc.w r2, r2, #4294967295 464e: f1cc 0e20 rsb lr, ip, #32 4652: fa23 f30c lsr.w r3, r3, ip 4656: f1ac 0c20 sub.w ip, ip, #32 465a: fa02 fe0e lsl.w lr, r2, lr 465e: fa22 fc0c lsr.w ip, r2, ip 4662: 69e2 ldr r2, [r4, #28] 4664: ea43 030e orr.w r3, r3, lr 4668: ea43 030c orr.w r3, r3, ip 466c: 4413 add r3, r2 if (m_curCluster < lc) { 466e: 4299 cmp r1, r3 4670: f080 80d5 bcs.w 481e m_curCluster++; 4674: 3101 adds r1, #1 4676: 61a1 str r1, [r4, #24] ((cluster - 2) << m_sectorsPerClusterShift); 4678: f890 2445 ldrb.w r2, [r0, #1093] ; 0x445 467c: 3902 subs r1, #2 sector = m_vol->clusterStartSector(m_curCluster) + 467e: f8d0 342c ldr.w r3, [r0, #1068] ; 0x42c 4682: 4091 lsls r1, r2 4684: 4419 add r1, r3 if (sectorOffset != 0 || toWrite < m_vol->bytesPerSector()) { 4686: f5b5 7f00 cmp.w r5, #512 ; 0x200 468a: f0c0 808a bcc.w 47a2 } else if (toWrite >= 2*m_vol->bytesPerSector()) { 468e: f5b5 6f80 cmp.w r5, #1024 ; 0x400 4692: f0c0 80a6 bcc.w 47e2 uint32_t sectorsPerCluster() const {return 1UL << m_sectorsPerClusterShift;} 4696: 2301 movs r3, #1 4698: 4093 lsls r3, r2 uint32_t ns = toWrite >> m_vol->bytesPerSectorShift(); 469a: 0a6a lsrs r2, r5, #9 - (clusterOffset >> m_vol->bytesPerSectorShift()); 469c: eba3 0308 sub.w r3, r3, r8 46a0: 4293 cmp r3, r2 46a2: bf28 it cs 46a4: 4613 movcs r3, r2 return sector <= m_sector && m_sector < (sector + count); 46a6: f8d0 221c ldr.w r2, [r0, #540] ; 0x21c 46aa: 428a cmp r2, r1 n = ns << m_vol->bytesPerSectorShift(); 46ac: ea4f 2843 mov.w r8, r3, lsl #9 46b0: d309 bcc.n 46c6 46b2: 185f adds r7, r3, r1 46b4: 42ba cmp r2, r7 46b6: d206 bcs.n 46c6 m_status = 0; 46b8: 2200 movs r2, #0 46ba: f880 2210 strb.w r2, [r0, #528] ; 0x210 m_sector = 0XFFFFFFFF; 46be: f04f 32ff mov.w r2, #4294967295 46c2: f8c0 221c str.w r2, [r0, #540] ; 0x21c return m_blockDev->writeSectors(sector, src, count); 46c6: f8d0 0214 ldr.w r0, [r0, #532] ; 0x214 46ca: 4632 mov r2, r6 46cc: 6807 ldr r7, [r0, #0] 46ce: 6abf ldr r7, [r7, #40] ; 0x28 46d0: 47b8 blx r7 if (!m_vol->cacheSafeWrite(sector, src, ns)) { 46d2: b398 cbz r0, 473c m_curPosition += n; 46d4: 4643 mov r3, r8 src += n; 46d6: 4446 add r6, r8 toWrite -= n; 46d8: eba5 0508 sub.w r5, r5, r8 m_curPosition += n; 46dc: e9d4 7200 ldrd r7, r2, [r4] if (m_curPosition > m_validLength) { 46e0: e9d4 0104 ldrd r0, r1, [r4, #16] m_curPosition += n; 46e4: 19db adds r3, r3, r7 46e6: f142 0200 adc.w r2, r2, #0 if (m_curPosition > m_validLength) { 46ea: 4298 cmp r0, r3 46ec: 4191 sbcs r1, r2 m_curPosition += n; 46ee: e9c4 3200 strd r3, r2, [r4] if (m_curPosition > m_validLength) { 46f2: d207 bcs.n 4704 m_flags |= FILE_FLAG_DIR_DIRTY; 46f4: f894 1033 ldrb.w r1, [r4, #51] ; 0x33 46f8: f061 017f orn r1, r1, #127 ; 0x7f m_validLength = m_curPosition; 46fc: e9c4 3204 strd r3, r2, [r4, #16] m_flags |= FILE_FLAG_DIR_DIRTY; 4700: f884 1033 strb.w r1, [r4, #51] ; 0x33 while (toWrite) { 4704: 2d00 cmp r5, #0 4706: d183 bne.n 4610 if (m_curPosition > m_dataLength) { 4708: e9d4 0102 ldrd r0, r1, [r4, #8] 470c: 4298 cmp r0, r3 470e: 4191 sbcs r1, r2 4710: f0c0 8096 bcc.w 4840 m_dataLength = m_curPosition; // update fileSize and insure sync will update dir entry m_flags |= FILE_FLAG_DIR_DIRTY; } else if (FsDateTime::callback) { 4714: 4b53 ldr r3, [pc, #332] ; (4864 ) 4716: 681b ldr r3, [r3, #0] 4718: 2b00 cmp r3, #0 471a: f000 809d beq.w 4858 // insure sync will update modified date and time m_flags |= FILE_FLAG_DIR_DIRTY; 471e: f894 3033 ldrb.w r3, [r4, #51] ; 0x33 4722: 4648 mov r0, r9 4724: f063 037f orn r3, r3, #127 ; 0x7f 4728: f884 3033 strb.w r3, [r4, #51] ; 0x33 472c: e00d b.n 474a if (!seekSet(m_validLength)) { 472e: e9d0 2304 ldrd r2, r3, [r0, #16] 4732: f7ff f86d bl 3810 4736: 2800 cmp r0, #0 4738: f47f af64 bne.w 4604 } return nbyte; fail: // return for write error m_error |= WRITE_ERROR; 473c: f894 3032 ldrb.w r3, [r4, #50] ; 0x32 return 0; 4740: 2000 movs r0, #0 m_error |= WRITE_ERROR; 4742: f043 0301 orr.w r3, r3, #1 4746: f884 3032 strb.w r3, [r4, #50] ; 0x32 } 474a: b003 add sp, #12 474c: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} ((cluster - 2) << m_sectorsPerClusterShift); 4750: f890 2445 ldrb.w r2, [r0, #1093] ; 0x445 4754: 3902 subs r1, #2 (clusterOffset >> m_vol->bytesPerSectorShift()); 4756: ea4f 2858 mov.w r8, r8, lsr #9 sector = m_vol->clusterStartSector(m_curCluster) + 475a: f8d0 342c ldr.w r3, [r0, #1068] ; 0x42c 475e: 4091 lsls r1, r2 4760: 4441 add r1, r8 4762: 4419 add r1, r3 if (sectorOffset != 0 || toWrite < m_vol->bytesPerSector()) { 4764: 2f00 cmp r7, #0 4766: d08e beq.n 4686 n = m_vol->bytesPerSector() - sectorOffset; 4768: f5c7 7800 rsb r8, r7, #512 ; 0x200 return m_dataCache.prepare(sector, option); 476c: 2201 movs r2, #1 476e: f500 7004 add.w r0, r0, #528 ; 0x210 4772: 45a8 cmp r8, r5 4774: bf28 it cs 4776: 46a8 movcs r8, r5 4778: f005 fd82 bl a280 if (!cache) { 477c: 2800 cmp r0, #0 477e: d0dd beq.n 473c memcpy(dst, src, n); 4780: 4438 add r0, r7 if (m_vol->bytesPerSector() == (n + sectorOffset)) { 4782: 4447 add r7, r8 memcpy(dst, src, n); 4784: 4642 mov r2, r8 4786: 4631 mov r1, r6 4788: f006 fe08 bl b39c if (m_vol->bytesPerSector() == (n + sectorOffset)) { 478c: f5b7 7f00 cmp.w r7, #512 ; 0x200 4790: 6a20 ldr r0, [r4, #32] 4792: d19f bne.n 46d4 bool dataCacheSync() {return m_dataCache.sync();} 4794: f500 7004 add.w r0, r0, #528 ; 0x210 4798: f005 fd46 bl a228 if (!m_vol->dataCacheSync()) { 479c: 2800 cmp r0, #0 479e: d199 bne.n 46d4 47a0: e7cc b.n 473c if (sectorOffset == 0 && m_curPosition >= m_validLength) { 47a2: 6862 ldr r2, [r4, #4] 47a4: 6963 ldr r3, [r4, #20] 47a6: 9200 str r2, [sp, #0] 47a8: 9301 str r3, [sp, #4] 47aa: 6922 ldr r2, [r4, #16] 47ac: 6823 ldr r3, [r4, #0] 47ae: 4293 cmp r3, r2 47b0: e9dd 2300 ldrd r2, r3, [sp] 47b4: 419a sbcs r2, r3 47b6: d212 bcs.n 47de cacheOption = FsCache::CACHE_FOR_WRITE; 47b8: 2201 movs r2, #1 return m_dataCache.prepare(sector, option); 47ba: f500 7004 add.w r0, r0, #528 ; 0x210 47be: f005 fd5f bl a280 if (!cache) { 47c2: 2800 cmp r0, #0 47c4: d0ba beq.n 473c memcpy(dst, src, n); 47c6: 462a mov r2, r5 47c8: 4631 mov r1, r6 47ca: 4438 add r0, r7 m_curPosition += n; 47cc: 46a8 mov r8, r5 memcpy(dst, src, n); 47ce: f006 fde5 bl b39c m_curPosition += n; 47d2: 462b mov r3, r5 47d4: e77f b.n 46d6 if (m_firstCluster == 0) { 47d6: 69e1 ldr r1, [r4, #28] 47d8: b349 cbz r1, 482e m_curCluster = m_firstCluster; 47da: 61a1 str r1, [r4, #24] 47dc: e74c b.n 4678 cacheOption = FsCache::CACHE_RESERVE_FOR_WRITE; 47de: 2205 movs r2, #5 47e0: e7eb b.n 47ba if (isCached(sector)) { 47e2: f8d0 321c ldr.w r3, [r0, #540] ; 0x21c 47e6: 428b cmp r3, r1 47e8: d106 bne.n 47f8 m_status = 0; 47ea: 2300 movs r3, #0 47ec: f880 3210 strb.w r3, [r0, #528] ; 0x210 m_sector = 0XFFFFFFFF; 47f0: f04f 33ff mov.w r3, #4294967295 47f4: f8c0 321c str.w r3, [r0, #540] ; 0x21c return m_blockDev->writeSector(sector, src); 47f8: f8d0 0214 ldr.w r0, [r0, #532] ; 0x214 47fc: 4632 mov r2, r6 47fe: 6803 ldr r3, [r0, #0] 4800: 6a5b ldr r3, [r3, #36] ; 0x24 4802: 4798 blx r3 if (!m_vol->cacheSafeWrite(sector, src)) { 4804: 2800 cmp r0, #0 4806: d099 beq.n 473c 4808: f44f 7300 mov.w r3, #512 ; 0x200 n = m_vol->bytesPerSector(); 480c: 4698 mov r8, r3 480e: e762 b.n 46d6 fg = m_vol->fatGet(m_curCluster, &m_curCluster); 4810: f104 0218 add.w r2, r4, #24 4814: f000 fd80 bl 5318 if (fg < 0) { 4818: 2800 cmp r0, #0 481a: db8f blt.n 473c if (fg == 0) { 481c: d104 bne.n 4828 if (!addCluster()) { 481e: 4620 mov r0, r4 4820: f7ff face bl 3dc0 4824: 2800 cmp r0, #0 4826: d089 beq.n 473c sector = m_vol->clusterStartSector(m_curCluster) + 4828: 69a1 ldr r1, [r4, #24] 482a: 6a20 ldr r0, [r4, #32] 482c: e724 b.n 4678 if (!addCluster()) { 482e: 4620 mov r0, r4 4830: f7ff fac6 bl 3dc0 4834: 2800 cmp r0, #0 4836: d081 beq.n 473c m_firstCluster = m_curCluster; 4838: 69a1 ldr r1, [r4, #24] sector = m_vol->clusterStartSector(m_curCluster) + 483a: 6a20 ldr r0, [r4, #32] m_firstCluster = m_curCluster; 483c: 61e1 str r1, [r4, #28] 483e: e71b b.n 4678 m_flags |= FILE_FLAG_DIR_DIRTY; 4840: f894 1033 ldrb.w r1, [r4, #51] ; 0x33 4844: 4648 mov r0, r9 m_dataLength = m_curPosition; 4846: e9c4 3202 strd r3, r2, [r4, #8] m_flags |= FILE_FLAG_DIR_DIRTY; 484a: f061 037f orn r3, r1, #127 ; 0x7f 484e: f884 3033 strb.w r3, [r4, #51] ; 0x33 } 4852: b003 add sp, #12 4854: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} 4858: 4648 mov r0, r9 485a: e776 b.n 474a if (m_curPosition > m_dataLength) { 485c: e9d4 3200 ldrd r3, r2, [r4] 4860: e752 b.n 4708 4862: bf00 nop 4864: 2000244c .word 0x2000244c 00004868 : size_t write(const char *str) { if (str == nullptr) return 0; 4868: b169 cbz r1, 4886 486a: b570 push {r4, r5, r6, lr} 486c: 4605 mov r5, r0 return write((const uint8_t *)str, strlen(str)); } 486e: 4608 mov r0, r1 4870: 460c mov r4, r1 4872: f009 fa45 bl dd00 4876: 682b ldr r3, [r5, #0] 4878: 4602 mov r2, r0 487a: 4621 mov r1, r4 487c: 4628 mov r0, r5 487e: 685b ldr r3, [r3, #4] 4880: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} 4884: 4718 bx r3 4886: 4770 bx lr 00004888 : writeMsg(pr, "Format failed\r\n"); return false; } //------------------------------------------------------------------------------ bool ExFatFormatter::syncUpcase() { uint16_t index = m_upcaseSize & SECTOR_MASK; 4888: 6883 ldr r3, [r0, #8] 488a: f3c3 0308 ubfx r3, r3, #0, #9 if (!index) { 488e: b183 cbz r3, 48b2 return true; } for (size_t i = index; i < BYTES_PER_SECTOR; i++) { m_secBuf[i] = 0; 4890: 2100 movs r1, #0 bool ExFatFormatter::syncUpcase() { 4892: b410 push {r4} m_secBuf[i] = 0; 4894: 6902 ldr r2, [r0, #16] 4896: 54d1 strb r1, [r2, r3] for (size_t i = index; i < BYTES_PER_SECTOR; i++) { 4898: 3301 adds r3, #1 489a: f5b3 7f00 cmp.w r3, #512 ; 0x200 489e: d1f9 bne.n 4894 } return m_dev->writeSector(m_upcaseSector, m_secBuf); 48a0: 6801 ldr r1, [r0, #0] 48a2: e9d0 3203 ldrd r3, r2, [r0, #12] 48a6: 681c ldr r4, [r3, #0] 48a8: 4618 mov r0, r3 48aa: 6a63 ldr r3, [r4, #36] ; 0x24 } 48ac: f85d 4b04 ldr.w r4, [sp], #4 return m_dev->writeSector(m_upcaseSector, m_secBuf); 48b0: 4718 bx r3 } 48b2: 2001 movs r0, #1 48b4: 4770 bx lr 48b6: bf00 nop 000048b8 : //------------------------------------------------------------------------------ bool ExFatFormatter::writeUpcaseByte(uint8_t b) { uint16_t index = m_upcaseSize & SECTOR_MASK; 48b8: 6882 ldr r2, [r0, #8] bool ExFatFormatter::writeUpcaseByte(uint8_t b) { 48ba: 4603 mov r3, r0 m_secBuf[index] = b; 48bc: 6900 ldr r0, [r0, #16] uint16_t index = m_upcaseSize & SECTOR_MASK; 48be: f240 1cff movw ip, #511 ; 0x1ff 48c2: f3c2 0208 ubfx r2, r2, #0, #9 m_secBuf[index] = b; 48c6: 5481 strb r1, [r0, r2] m_upcaseChecksum = exFatChecksum(m_upcaseChecksum, b); m_upcaseSize++; if (index == SECTOR_MASK) { 48c8: 4562 cmp r2, ip uint8_t mustBeZero2[2]; uint8_t unicode3[4]; } DirLfn_t; //============================================================================= inline uint32_t exFatChecksum(uint32_t sum, uint8_t data) { return (sum << 31) + (sum >> 1) + data; 48ca: 6858 ldr r0, [r3, #4] 48cc: eb01 0170 add.w r1, r1, r0, ror #1 m_upcaseSize++; 48d0: 6898 ldr r0, [r3, #8] 48d2: f100 0001 add.w r0, r0, #1 48d6: e9c3 1001 strd r1, r0, [r3, #4] if (index == SECTOR_MASK) { 48da: d001 beq.n 48e0 return m_dev->writeSector(m_upcaseSector++, m_secBuf); } return true; } 48dc: 2001 movs r0, #1 48de: 4770 bx lr return m_dev->writeSector(m_upcaseSector++, m_secBuf); 48e0: 68d8 ldr r0, [r3, #12] 48e2: 6819 ldr r1, [r3, #0] bool ExFatFormatter::writeUpcaseByte(uint8_t b) { 48e4: b410 push {r4} return m_dev->writeSector(m_upcaseSector++, m_secBuf); 48e6: 6804 ldr r4, [r0, #0] 48e8: 1c4a adds r2, r1, #1 48ea: 6a64 ldr r4, [r4, #36] ; 0x24 48ec: 601a str r2, [r3, #0] 48ee: 691a ldr r2, [r3, #16] 48f0: 4623 mov r3, r4 } 48f2: f85d 4b04 ldr.w r4, [sp], #4 return m_dev->writeSector(m_upcaseSector++, m_secBuf); 48f6: 4718 bx r3 000048f8 : //------------------------------------------------------------------------------ bool ExFatFormatter::writeUpcaseUnicode(uint16_t unicode) { 48f8: b538 push {r3, r4, r5, lr} uint16_t index = m_upcaseSize & SECTOR_MASK; 48fa: 6883 ldr r3, [r0, #8] return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 48fc: b2ca uxtb r2, r1 bool ExFatFormatter::writeUpcaseUnicode(uint16_t unicode) { 48fe: 460d mov r5, r1 m_secBuf[index] = b; 4900: 6901 ldr r1, [r0, #16] uint16_t index = m_upcaseSize & SECTOR_MASK; 4902: f3c3 0308 ubfx r3, r3, #0, #9 4906: f240 1cff movw ip, #511 ; 0x1ff bool ExFatFormatter::writeUpcaseUnicode(uint16_t unicode) { 490a: 4604 mov r4, r0 m_secBuf[index] = b; 490c: 54ca strb r2, [r1, r3] if (index == SECTOR_MASK) { 490e: 4563 cmp r3, ip 4910: 6841 ldr r1, [r0, #4] 4912: eb02 0271 add.w r2, r2, r1, ror #1 m_upcaseChecksum = exFatChecksum(m_upcaseChecksum, b); 4916: 6042 str r2, [r0, #4] m_upcaseSize++; 4918: 6882 ldr r2, [r0, #8] 491a: f102 0201 add.w r2, r2, #1 491e: 6082 str r2, [r0, #8] if (index == SECTOR_MASK) { 4920: d005 beq.n 492e return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 4922: 0a29 lsrs r1, r5, #8 4924: 4620 mov r0, r4 } 4926: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 492a: f7ff bfc5 b.w 48b8 return m_dev->writeSector(m_upcaseSector++, m_secBuf); 492e: 6801 ldr r1, [r0, #0] 4930: 68c0 ldr r0, [r0, #12] 4932: 1c4a adds r2, r1, #1 4934: 6803 ldr r3, [r0, #0] 4936: 6a5b ldr r3, [r3, #36] ; 0x24 4938: 6022 str r2, [r4, #0] 493a: 6922 ldr r2, [r4, #16] 493c: 4798 blx r3 return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 493e: 2800 cmp r0, #0 4940: d1ef bne.n 4922 } 4942: bd38 pop {r3, r4, r5, pc} 00004944 : //------------------------------------------------------------------------------ bool ExFatFormatter::writeUpcase(uint32_t sector) { 4944: b5f8 push {r3, r4, r5, r6, r7, lr} uint32_t n; uint32_t ns; uint32_t ch = 0; uint16_t uc; m_upcaseSize = 0; 4946: 2300 movs r3, #0 bool ExFatFormatter::writeUpcase(uint32_t sector) { 4948: 4606 mov r6, r0 m_upcaseChecksum = 0; m_upcaseSector = sector; 494a: 6001 str r1, [r0, #0] uint32_t ch = 0; 494c: 461d mov r5, r3 m_upcaseChecksum = 0; 494e: e9c0 3301 strd r3, r3, [r0, #4] while (ch < 0X10000) { uc = toUpcase(ch); 4952: b2a8 uxth r0, r5 4954: f005 fde6 bl a524 if (uc != ch) { 4958: 42a8 cmp r0, r5 uc = toUpcase(ch); 495a: 4604 mov r4, r0 if (uc != ch) { 495c: d007 beq.n 496e return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 495e: b2c1 uxtb r1, r0 4960: 4630 mov r0, r6 4962: f7ff ffa9 bl 48b8 4966: 2800 cmp r0, #0 4968: d13b bne.n 49e2 } return true; fail: return false; } 496a: 2000 movs r0, #0 496c: bdf8 pop {r3, r4, r5, r6, r7, pc} for (n = ch + 1; n < 0X10000 && n == toUpcase(n); n++) {} 496e: 1c6c adds r4, r5, #1 4970: f5b4 3f80 cmp.w r4, #65536 ; 0x10000 4974: d104 bne.n 4980 4976: e02a b.n 49ce 4978: 3401 adds r4, #1 497a: f5b4 3f80 cmp.w r4, #65536 ; 0x10000 497e: d004 beq.n 498a 4980: b2a0 uxth r0, r4 4982: f005 fdcf bl a524 4986: 42a0 cmp r0, r4 4988: d0f6 beq.n 4978 ns = n - ch; 498a: 1b67 subs r7, r4, r5 if (ns >= MINIMUM_UPCASE_SKIP) { 498c: f5b7 7f00 cmp.w r7, #512 ; 0x200 4990: d31d bcc.n 49ce if (!writeUpcaseUnicode(0XFFFF) || !writeUpcaseUnicode(ns)) { 4992: f64f 71ff movw r1, #65535 ; 0xffff 4996: 4630 mov r0, r6 4998: f7ff ffae bl 48f8 499c: 2800 cmp r0, #0 499e: d0e4 beq.n 496a 49a0: b2b9 uxth r1, r7 49a2: 4630 mov r0, r6 49a4: f7ff ffa8 bl 48f8 49a8: 2800 cmp r0, #0 49aa: d0de beq.n 496a 49ac: 4625 mov r5, r4 while (ch < 0X10000) { 49ae: f5b5 3f80 cmp.w r5, #65536 ; 0x10000 49b2: d1ce bne.n 4952 if (!syncUpcase()) { 49b4: 4630 mov r0, r6 } 49b6: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} if (!syncUpcase()) { 49ba: f7ff bf65 b.w 4888 return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 49be: f3c5 2107 ubfx r1, r5, #8, #8 49c2: 4630 mov r0, r6 49c4: 3501 adds r5, #1 49c6: f7ff ff77 bl 48b8 49ca: 2800 cmp r0, #0 49cc: d0cd beq.n 496a while (ch < n) { 49ce: 42a5 cmp r5, r4 return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 49d0: b2e9 uxtb r1, r5 49d2: 4630 mov r0, r6 while (ch < n) { 49d4: d2eb bcs.n 49ae return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 49d6: f7ff ff6f bl 48b8 49da: 2800 cmp r0, #0 49dc: d1ef bne.n 49be } 49de: 2000 movs r0, #0 49e0: bdf8 pop {r3, r4, r5, r6, r7, pc} return writeUpcaseByte(unicode) && writeUpcaseByte(unicode >> 8); 49e2: f3c4 2107 ubfx r1, r4, #8, #8 49e6: 4630 mov r0, r6 49e8: f7ff ff66 bl 48b8 49ec: 2800 cmp r0, #0 49ee: d0bc beq.n 496a ch++; 49f0: 3501 adds r5, #1 49f2: e7dc b.n 49ae 000049f4 : bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { 49f4: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 49f8: 461f mov r7, r3 49fa: b089 sub sp, #36 ; 0x24 sectorCount = dev->sectorCount(); 49fc: 680b ldr r3, [r1, #0] bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { 49fe: 460d mov r5, r1 4a00: 9004 str r0, [sp, #16] 4a02: 4614 mov r4, r2 m_dev = dev; 4a04: 60c1 str r1, [r0, #12] m_secBuf = secBuf; 4a06: 6102 str r2, [r0, #16] sectorCount = dev->sectorCount(); 4a08: 4608 mov r0, r1 4a0a: 69db ldr r3, [r3, #28] 4a0c: 4798 blx r3 if (sectorCount < 0X100000) { 4a0e: f5b0 1f80 cmp.w r0, #1048576 ; 0x100000 sectorCount = dev->sectorCount(); 4a12: 9000 str r0, [sp, #0] if (sectorCount < 0X100000) { 4a14: f0c0 80d8 bcc.w 4bc8 for (m = 1, vs = 0; m && sectorCount > m; m <<= 1, vs++) {} 4a18: 2300 movs r3, #0 4a1a: 2201 movs r2, #1 4a1c: 9e00 ldr r6, [sp, #0] 4a1e: 3301 adds r3, #1 4a20: 0052 lsls r2, r2, #1 4a22: b2db uxtb r3, r3 4a24: d001 beq.n 4a2a 4a26: 4296 cmp r6, r2 4a28: d8f9 bhi.n 4a1e sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11)/2; 4a2a: 2b1c cmp r3, #28 4a2c: 9600 str r6, [sp, #0] 4a2e: f240 80b7 bls.w 4ba0 4a32: f1a3 080b sub.w r8, r3, #11 sectorsPerCluster = 1UL << sectorsPerClusterShift; 4a36: 2201 movs r2, #1 sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11)/2; 4a38: fa48 f102 asr.w r1, r8, r2 4a3c: f3c8 0847 ubfx r8, r8, #1, #8 sectorsPerCluster = 1UL << sectorsPerClusterShift; 4a40: 408a lsls r2, r1 sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11)/2; 4a42: 9102 str r1, [sp, #8] sectorsPerCluster = 1UL << sectorsPerClusterShift; 4a44: 9207 str r2, [sp, #28] fatLength = 1UL << (vs < 27 ? 13 : (vs + 1)/2); 4a46: 3301 adds r3, #1 4a48: 2201 movs r2, #1 4a4a: 105b asrs r3, r3, #1 4a4c: 409a lsls r2, r3 4a4e: 9206 str r2, [sp, #24] clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; 4a50: 2204 movs r2, #4 4a52: 409a lsls r2, r3 4a54: 9203 str r2, [sp, #12] partitionOffset = 2*fatLength; 4a56: 2202 movs r2, #2 4a58: fa02 f303 lsl.w r3, r2, r3 4a5c: 9301 str r3, [sp, #4] clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; 4a5e: 9a00 ldr r2, [sp, #0] memset(secBuf, 0, BYTES_PER_SECTOR); 4a60: 2100 movs r1, #0 clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; 4a62: 9b03 ldr r3, [sp, #12] memset(secBuf, 0, BYTES_PER_SECTOR); 4a64: 4620 mov r0, r4 clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; 4a66: 9e02 ldr r6, [sp, #8] mbr->part->beginCHS[0] = 1; 4a68: f04f 0a01 mov.w sl, #1 clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; 4a6c: 1ad3 subs r3, r2, r3 memset(secBuf, 0, BYTES_PER_SECTOR); 4a6e: f44f 7200 mov.w r2, #512 ; 0x200 *reinterpret_cast(dst) = src; 4a72: f64a 2b55 movw fp, #43605 ; 0xaa55 clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; 4a76: 40f3 lsrs r3, r6 volumeLength = clusterHeapOffset + (clusterCount << sectorsPerClusterShift); 4a78: fa03 f906 lsl.w r9, r3, r6 4a7c: 9305 str r3, [sp, #20] 4a7e: 9e01 ldr r6, [sp, #4] memset(secBuf, 0, BYTES_PER_SECTOR); 4a80: f009 f856 bl db30 mbr->part->endCHS[1] = 0XFF; 4a84: 23ff movs r3, #255 ; 0xff mbr->part->beginCHS[0] = 1; 4a86: f884 a1bf strb.w sl, [r4, #447] ; 0x1bf mbr->part->beginCHS[1] = 1; 4a8a: f884 a1c0 strb.w sl, [r4, #448] ; 0x1c0 volumeLength = clusterHeapOffset + (clusterCount << sectorsPerClusterShift); 4a8e: 44b1 add r9, r6 mbr->part->endCHS[1] = 0XFF; 4a90: f884 31c4 strb.w r3, [r4, #452] ; 0x1c4 if (!dev->writeSector(0, secBuf)) { 4a94: 4622 mov r2, r4 mbr->part->endCHS[2] = 0XFF; 4a96: f884 31c5 strb.w r3, [r4, #453] ; 0x1c5 mbr->part->type = 7; 4a9a: 2307 movs r3, #7 if (!dev->writeSector(0, secBuf)) { 4a9c: 2100 movs r1, #0 4a9e: 4628 mov r0, r5 mbr->part->type = 7; 4aa0: f884 31c2 strb.w r3, [r4, #450] ; 0x1c2 mbr->part->endCHS[0] = 0XFE; 4aa4: 23fe movs r3, #254 ; 0xfe *reinterpret_cast(dst) = src; 4aa6: f8c4 61c6 str.w r6, [r4, #454] ; 0x1c6 4aaa: f884 31c3 strb.w r3, [r4, #451] ; 0x1c3 if (!dev->writeSector(0, secBuf)) { 4aae: 682b ldr r3, [r5, #0] 4ab0: f8c4 91ca str.w r9, [r4, #458] ; 0x1ca 4ab4: 6a5b ldr r3, [r3, #36] ; 0x24 *reinterpret_cast(dst) = src; 4ab6: f8a4 b1fe strh.w fp, [r4, #510] ; 0x1fe 4aba: 4798 blx r3 4abc: 2800 cmp r0, #0 4abe: d063 beq.n 4b88 memset(secBuf, 0, BYTES_PER_SECTOR); 4ac0: f44f 7200 mov.w r2, #512 ; 0x200 4ac4: 2100 movs r1, #0 4ac6: 4620 mov r0, r4 4ac8: f009 f832 bl db30 *reinterpret_cast(dst) = src; 4acc: 9b00 ldr r3, [sp, #0] pbs->bpb.sectorsPerClusterShift = sectorsPerClusterShift; 4ace: f884 806d strb.w r8, [r4, #109] ; 0x6d for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { 4ad2: f04f 0800 mov.w r8, #0 4ad6: 6663 str r3, [r4, #100] ; 0x64 pbs->bootCode[i] = 0XF4; 4ad8: 21f4 movs r1, #244 ; 0xf4 4ada: 9b05 ldr r3, [sp, #20] 4adc: f104 0078 add.w r0, r4, #120 ; 0x78 4ae0: 9a06 ldr r2, [sp, #24] 4ae2: 65e3 str r3, [r4, #92] ; 0x5c pbs->oemName[5] = ' '; 4ae4: 2320 movs r3, #32 setLe64(pbs->bpb.partitionOffset, partitionOffset); 4ae6: 6426 str r6, [r4, #64] ; 0x40 pbs->oemName[5] = ' '; 4ae8: 7223 strb r3, [r4, #8] pbs->oemName[6] = ' '; 4aea: 7263 strb r3, [r4, #9] pbs->oemName[7] = ' '; 4aec: 72a3 strb r3, [r4, #10] pbs->jmpInstruction[0] = 0XEB; 4aee: 23eb movs r3, #235 ; 0xeb 4af0: 65a6 str r6, [r4, #88] ; 0x58 uint32_t checksum = 0; 4af2: 4646 mov r6, r8 pbs->jmpInstruction[0] = 0XEB; 4af4: 7023 strb r3, [r4, #0] pbs->jmpInstruction[1] = 0X76; 4af6: 2376 movs r3, #118 ; 0x76 setLe64(pbs->bpb.volumeLength, volumeLength); 4af8: f8c4 9048 str.w r9, [r4, #72] ; 0x48 pbs->jmpInstruction[1] = 0X76; 4afc: 7063 strb r3, [r4, #1] pbs->jmpInstruction[2] = 0X90; 4afe: 2390 movs r3, #144 ; 0x90 pbs->bpb.numberOfFats = 1; 4b00: f884 a06e strb.w sl, [r4, #110] ; 0x6e pbs->jmpInstruction[2] = 0X90; 4b04: 70a3 strb r3, [r4, #2] pbs->oemName[0] = 'E'; 4b06: 2345 movs r3, #69 ; 0x45 4b08: 70e3 strb r3, [r4, #3] pbs->oemName[1] = 'X'; 4b0a: 2358 movs r3, #88 ; 0x58 4b0c: 7123 strb r3, [r4, #4] pbs->oemName[2] = 'F'; 4b0e: 2346 movs r3, #70 ; 0x46 4b10: 7163 strb r3, [r4, #5] pbs->oemName[3] = 'A'; 4b12: 2341 movs r3, #65 ; 0x41 4b14: 71a3 strb r3, [r4, #6] pbs->oemName[4] = 'T'; 4b16: 2354 movs r3, #84 ; 0x54 4b18: 71e3 strb r3, [r4, #7] 4b1a: 2304 movs r3, #4 4b1c: 6623 str r3, [r4, #96] ; 0x60 *reinterpret_cast(dst) = src; 4b1e: f44f 7380 mov.w r3, #256 ; 0x100 4b22: f8a4 3068 strh.w r3, [r4, #104] ; 0x68 pbs->bpb.bytesPerSectorShift = BYTES_PER_SECTOR_SHIFT; 4b26: 2309 movs r3, #9 4b28: f884 306c strb.w r3, [r4, #108] ; 0x6c pbs->bpb.driveSelect = 0X80; 4b2c: 2380 movs r3, #128 ; 0x80 *reinterpret_cast(dst) = src; 4b2e: e9c4 2214 strd r2, r2, [r4, #80] ; 0x50 4b32: f884 306f strb.w r3, [r4, #111] ; 0x6f pbs->bootCode[i] = 0XF4; 4b36: f44f 72c3 mov.w r2, #390 ; 0x186 4b3a: f008 fff9 bl db30 *reinterpret_cast(dst) = src; 4b3e: f8a4 b1fe strh.w fp, [r4, #510] ; 0x1fe if (i == offsetof(ExFatPbs_t, bpb.volumeFlags[0]) || 4b42: f1a8 036a sub.w r3, r8, #106 ; 0x6a 4b46: 2b01 cmp r3, #1 4b48: d906 bls.n 4b58 4b4a: f1b8 0f70 cmp.w r8, #112 ; 0x70 4b4e: d003 beq.n 4b58 return (sum << 31) + (sum >> 1) + data; 4b50: f814 3008 ldrb.w r3, [r4, r8] 4b54: eb03 0676 add.w r6, r3, r6, ror #1 for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { 4b58: f108 0801 add.w r8, r8, #1 4b5c: f5b8 7f00 cmp.w r8, #512 ; 0x200 4b60: d1ef bne.n 4b42 if (!dev->writeSector(sector, secBuf) || 4b62: 682b ldr r3, [r5, #0] 4b64: 4622 mov r2, r4 4b66: f8dd 9004 ldr.w r9, [sp, #4] 4b6a: 4628 mov r0, r5 4b6c: 6a5b ldr r3, [r3, #36] ; 0x24 4b6e: 4649 mov r1, r9 4b70: 4798 blx r3 4b72: b148 cbz r0, 4b88 !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { 4b74: 682b ldr r3, [r5, #0] 4b76: 4649 mov r1, r9 4b78: 4622 mov r2, r4 4b7a: 4628 mov r0, r5 4b7c: 6a5b ldr r3, [r3, #36] ; 0x24 4b7e: 310c adds r1, #12 4b80: f8cd 9004 str.w r9, [sp, #4] 4b84: 4798 blx r3 if (!dev->writeSector(sector, secBuf) || 4b86: bb40 cbnz r0, 4bda writeMsg(pr, "Format failed\r\n"); 4b88: b12f cbz r7, 4b96 4b8a: 683b ldr r3, [r7, #0] 4b8c: 220f movs r2, #15 4b8e: 49b8 ldr r1, [pc, #736] ; (4e70 ) 4b90: 4638 mov r0, r7 4b92: 685b ldr r3, [r3, #4] 4b94: 4798 blx r3 return false; 4b96: 2600 movs r6, #0 } 4b98: 4630 mov r0, r6 4b9a: b009 add sp, #36 ; 0x24 4b9c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} fatLength = 1UL << (vs < 27 ? 13 : (vs + 1)/2); 4ba0: 2b1a cmp r3, #26 sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11)/2; 4ba2: f04f 0808 mov.w r8, #8 fatLength = 1UL << (vs < 27 ? 13 : (vs + 1)/2); 4ba6: f200 81a6 bhi.w 4ef6 4baa: f44f 4380 mov.w r3, #16384 ; 0x4000 sectorsPerCluster = 1UL << sectorsPerClusterShift; 4bae: f8cd 8008 str.w r8, [sp, #8] 4bb2: 9301 str r3, [sp, #4] 4bb4: f44f 4300 mov.w r3, #32768 ; 0x8000 4bb8: 9303 str r3, [sp, #12] 4bba: f44f 7380 mov.w r3, #256 ; 0x100 4bbe: 9307 str r3, [sp, #28] fatLength = 1UL << (vs < 27 ? 13 : (vs + 1)/2); 4bc0: f44f 5300 mov.w r3, #8192 ; 0x2000 4bc4: 9306 str r3, [sp, #24] 4bc6: e74a b.n 4a5e writeMsg(pr, "Device is too small\r\n"); 4bc8: 2f00 cmp r7, #0 4bca: d0e4 beq.n 4b96 4bcc: 683b ldr r3, [r7, #0] 4bce: 2215 movs r2, #21 4bd0: 49a8 ldr r1, [pc, #672] ; (4e74 ) 4bd2: 4638 mov r0, r7 4bd4: 685b ldr r3, [r3, #4] 4bd6: 4798 blx r3 writeMsg(pr, "Format failed\r\n"); 4bd8: e7d7 b.n 4b8a memset(secBuf, 0, BYTES_PER_SECTOR); 4bda: 4642 mov r2, r8 4bdc: 2100 movs r1, #0 4bde: 4620 mov r0, r4 sector++; 4be0: f109 0a01 add.w sl, r9, #1 memset(secBuf, 0, BYTES_PER_SECTOR); 4be4: f008 ffa4 bl db30 *reinterpret_cast(dst) = src; 4be8: f64a 2355 movw r3, #43605 ; 0xaa55 4bec: f109 0209 add.w r2, r9, #9 4bf0: f204 19ff addw r9, r4, #511 ; 0x1ff 4bf4: f8a4 31fe strh.w r3, [r4, #510] ; 0x1fe 4bf8: 2300 movs r3, #0 4bfa: 4693 mov fp, r2 uint32_t checksum = 0; 4bfc: 46a0 mov r8, r4 4bfe: e001 b.n 4c04 checksum = exFatChecksum(checksum, secBuf[i]); 4c00: f818 3f01 ldrb.w r3, [r8, #1]! for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { 4c04: 45c1 cmp r9, r8 return (sum << 31) + (sum >> 1) + data; 4c06: eb03 0676 add.w r6, r3, r6, ror #1 4c0a: d1f9 bne.n 4c00 if (!dev->writeSector(sector, secBuf) || 4c0c: 682b ldr r3, [r5, #0] 4c0e: 4622 mov r2, r4 4c10: 4651 mov r1, sl 4c12: 4628 mov r0, r5 4c14: 6a5b ldr r3, [r3, #36] ; 0x24 4c16: 4798 blx r3 4c18: 2800 cmp r0, #0 4c1a: d0b5 beq.n 4b88 !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { 4c1c: 682b ldr r3, [r5, #0] 4c1e: 4622 mov r2, r4 4c20: f10a 010c add.w r1, sl, #12 4c24: 4628 mov r0, r5 4c26: 6a5b ldr r3, [r3, #36] ; 0x24 4c28: 4798 blx r3 if (!dev->writeSector(sector, secBuf) || 4c2a: 2800 cmp r0, #0 4c2c: d0ac beq.n 4b88 sector++; 4c2e: f10a 0301 add.w r3, sl, #1 for (int j = 0; j < 8; j++) { 4c32: 459b cmp fp, r3 4c34: d002 beq.n 4c3c checksum = exFatChecksum(checksum, secBuf[i]); 4c36: 469a mov sl, r3 4c38: 7823 ldrb r3, [r4, #0] 4c3a: e7df b.n 4bfc memset(secBuf, 0, BYTES_PER_SECTOR); 4c3c: f44f 7200 mov.w r2, #512 ; 0x200 4c40: 2100 movs r1, #0 4c42: 4620 mov r0, r4 4c44: 469b mov fp, r3 4c46: f008 ff73 bl db30 4c4a: 2200 movs r2, #0 4c4c: f10a 0a03 add.w sl, sl, #3 4c50: 4611 mov r1, r2 *reinterpret_cast(dst) = src; 4c52: 4623 mov r3, r4 4c54: e001 b.n 4c5a checksum = exFatChecksum(checksum, secBuf[i]); 4c56: f813 1f01 ldrb.w r1, [r3, #1]! for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { 4c5a: 4598 cmp r8, r3 return (sum << 31) + (sum >> 1) + data; 4c5c: eb01 0676 add.w r6, r1, r6, ror #1 4c60: d1f9 bne.n 4c56 if (!dev->writeSector(sector, secBuf) || 4c62: 682b ldr r3, [r5, #0] 4c64: 4622 mov r2, r4 4c66: 4659 mov r1, fp 4c68: 4628 mov r0, r5 4c6a: 6a5b ldr r3, [r3, #36] ; 0x24 4c6c: 4798 blx r3 4c6e: 2800 cmp r0, #0 4c70: d08a beq.n 4b88 !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { 4c72: 682b ldr r3, [r5, #0] 4c74: 4622 mov r2, r4 4c76: f10b 010c add.w r1, fp, #12 4c7a: 4628 mov r0, r5 4c7c: 6a5b ldr r3, [r3, #36] ; 0x24 4c7e: 4798 blx r3 if (!dev->writeSector(sector, secBuf) || 4c80: 2800 cmp r0, #0 4c82: d081 beq.n 4b88 sector++; 4c84: f10b 0101 add.w r1, fp, #1 for (int j = 0; j < 2; j++) { 4c88: 458a cmp sl, r1 4c8a: d16a bne.n 4d62 4c8c: 1f23 subs r3, r4, #4 4c8e: f504 72fe add.w r2, r4, #508 ; 0x1fc *reinterpret_cast(dst) = src; 4c92: f843 6f04 str.w r6, [r3, #4]! for (size_t i = 0; i < BYTES_PER_SECTOR; i += 4) { 4c96: 429a cmp r2, r3 4c98: d1fb bne.n 4c92 if (!dev->writeSector(sector, secBuf) || 4c9a: 682b ldr r3, [r5, #0] 4c9c: 4622 mov r2, r4 4c9e: 4628 mov r0, r5 4ca0: 6a5b ldr r3, [r3, #36] ; 0x24 4ca2: 4798 blx r3 4ca4: 2800 cmp r0, #0 4ca6: f43f af6f beq.w 4b88 !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { 4caa: 682b ldr r3, [r5, #0] 4cac: f10b 010d add.w r1, fp, #13 4cb0: 4622 mov r2, r4 4cb2: 4628 mov r0, r5 4cb4: 6a5b ldr r3, [r3, #36] ; 0x24 4cb6: 4798 blx r3 if (!dev->writeSector(sector, secBuf) || 4cb8: 2800 cmp r0, #0 4cba: f43f af65 beq.w 4b88 writeMsg(pr, "Writing FAT "); 4cbe: b12f cbz r7, 4ccc 4cc0: 683b ldr r3, [r7, #0] 4cc2: 220c movs r2, #12 4cc4: 496c ldr r1, [pc, #432] ; (4e78 ) 4cc6: 4638 mov r0, r7 4cc8: 685b ldr r3, [r3, #4] 4cca: 4798 blx r3 sector = partitionOffset + fatOffset; 4ccc: 9a06 ldr r2, [sp, #24] memset(secBuf, 0, BYTES_PER_SECTOR); 4cce: 2100 movs r1, #0 sector = partitionOffset + fatOffset; 4cd0: 9b01 ldr r3, [sp, #4] memset(secBuf, 0, BYTES_PER_SECTOR); 4cd2: 4620 mov r0, r4 for (uint32_t i = 0; i < ns; i++) { 4cd4: 2600 movs r6, #0 sector = partitionOffset + fatOffset; 4cd6: 4413 add r3, r2 memset(secBuf, 0, BYTES_PER_SECTOR); 4cd8: f44f 7200 mov.w r2, #512 ; 0x200 sector = partitionOffset + fatOffset; 4cdc: 4699 mov r9, r3 ns = ((clusterCount + 2)*4 + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; 4cde: 9b05 ldr r3, [sp, #20] 4ce0: ea4f 0883 mov.w r8, r3, lsl #2 memset(secBuf, 0, BYTES_PER_SECTOR); 4ce4: f008 ff24 bl db30 secBuf[0] = 0XF8; 4ce8: 4623 mov r3, r4 secBuf[i] = 0XFF; 4cea: f04f 32ff mov.w r2, #4294967295 ns = ((clusterCount + 2)*4 + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; 4cee: f208 2807 addw r8, r8, #519 ; 0x207 secBuf[0] = 0XF8; 4cf2: 21f8 movs r1, #248 ; 0xf8 writeMsg(pr, "."); 4cf4: f1b7 0b00 subs.w fp, r7, #0 ns = ((clusterCount + 2)*4 + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; 4cf8: ea4f 2a58 mov.w sl, r8, lsr #9 secBuf[0] = 0XF8; 4cfc: f803 1b01 strb.w r1, [r3], #1 if (i%(ns/32) == 0) { 4d00: ea4f 3898 mov.w r8, r8, lsr #14 secBuf[i] = 0XFF; 4d04: f8c4 2001 str.w r2, [r4, #1] writeMsg(pr, "."); 4d08: bf18 it ne 4d0a: f04f 0b01 movne.w fp, #1 secBuf[i] = 0XFF; 4d0e: 60da str r2, [r3, #12] 4d10: 605a str r2, [r3, #4] 4d12: 609a str r2, [r3, #8] 4d14: f8c3 200f str.w r2, [r3, #15] 4d18: e002 b.n 4d20 for (uint32_t i = 0; i < ns; i++) { 4d1a: 3601 adds r6, #1 4d1c: 45b2 cmp sl, r6 4d1e: d023 beq.n 4d68 if (i%(ns/32) == 0) { 4d20: fbb6 f3f8 udiv r3, r6, r8 4d24: fb08 6313 mls r3, r8, r3, r6 writeMsg(pr, "."); 4d28: b943 cbnz r3, 4d3c 4d2a: f1bb 0f00 cmp.w fp, #0 4d2e: d005 beq.n 4d3c 4d30: 683b ldr r3, [r7, #0] 4d32: 2201 movs r2, #1 4d34: 4951 ldr r1, [pc, #324] ; (4e7c ) 4d36: 4638 mov r0, r7 4d38: 685b ldr r3, [r3, #4] 4d3a: 4798 blx r3 if (!dev->writeSector(sector + i, secBuf)) { 4d3c: 682b ldr r3, [r5, #0] 4d3e: eb09 0106 add.w r1, r9, r6 4d42: 4622 mov r2, r4 4d44: 4628 mov r0, r5 4d46: 6a5b ldr r3, [r3, #36] ; 0x24 4d48: 4798 blx r3 4d4a: 2800 cmp r0, #0 4d4c: f43f af1c beq.w 4b88 if (i == 0) { 4d50: 2e00 cmp r6, #0 4d52: d1e2 bne.n 4d1a memset(secBuf, 0, BYTES_PER_SECTOR); 4d54: 4631 mov r1, r6 4d56: f44f 7200 mov.w r2, #512 ; 0x200 4d5a: 4620 mov r0, r4 4d5c: f008 fee8 bl db30 4d60: e7db b.n 4d1a checksum = exFatChecksum(checksum, secBuf[i]); 4d62: 468b mov fp, r1 4d64: 7821 ldrb r1, [r4, #0] 4d66: e774 b.n 4c52 writeMsg(pr, "\r\n"); 4d68: 2f00 cmp r7, #0 4d6a: d034 beq.n 4dd6 4d6c: 683b ldr r3, [r7, #0] 4d6e: 2202 movs r2, #2 4d70: 4943 ldr r1, [pc, #268] ; (4e80 ) 4d72: 4638 mov r0, r7 4d74: 685b ldr r3, [r3, #4] 4d76: 4798 blx r3 bitmapSize = (clusterCount + 7)/8; 4d78: 9e05 ldr r6, [sp, #20] if (ns > sectorsPerCluster) { 4d7a: 9a07 ldr r2, [sp, #28] bitmapSize = (clusterCount + 7)/8; 4d7c: 3607 adds r6, #7 4d7e: 08f6 lsrs r6, r6, #3 ns = (bitmapSize + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; 4d80: f206 13ff addw r3, r6, #511 ; 0x1ff if (ns > sectorsPerCluster) { 4d84: ebb2 2f53 cmp.w r2, r3, lsr #9 ns = (bitmapSize + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; 4d88: ea4f 2953 mov.w r9, r3, lsr #9 if (ns > sectorsPerCluster) { 4d8c: f4ff aefd bcc.w 4b8a memset(secBuf, 0, BYTES_PER_SECTOR); 4d90: f44f 7200 mov.w r2, #512 ; 0x200 4d94: 2100 movs r1, #0 4d96: 4620 mov r0, r4 4d98: f008 feca bl db30 secBuf[0] = 0X7; 4d9c: 2307 movs r3, #7 4d9e: 7023 strb r3, [r4, #0] for (uint32_t i = 0; i < ns; i++) { 4da0: f1b9 0f00 cmp.w r9, #0 4da4: f000 808a beq.w 4ebc 4da8: f04f 0800 mov.w r8, #0 4dac: e008 b.n 4dc0 if (i == 0) { 4dae: f1b8 0f00 cmp.w r8, #0 4db2: d101 bne.n 4db8 secBuf[0] = 0; 4db4: f884 8000 strb.w r8, [r4] for (uint32_t i = 0; i < ns; i++) { 4db8: f108 0801 add.w r8, r8, #1 4dbc: 45c1 cmp r9, r8 4dbe: d97b bls.n 4eb8 if (!dev->writeSector(sector + i, secBuf)) { 4dc0: 9a03 ldr r2, [sp, #12] 4dc2: 4628 mov r0, r5 4dc4: 682b ldr r3, [r5, #0] 4dc6: eb02 0108 add.w r1, r2, r8 4dca: 4622 mov r2, r4 4dcc: 6a5b ldr r3, [r3, #36] ; 0x24 4dce: 4798 blx r3 4dd0: 2800 cmp r0, #0 4dd2: d1ec bne.n 4dae 4dd4: e6d8 b.n 4b88 bitmapSize = (clusterCount + 7)/8; 4dd6: 9e05 ldr r6, [sp, #20] if (ns > sectorsPerCluster) { 4dd8: 9a07 ldr r2, [sp, #28] bitmapSize = (clusterCount + 7)/8; 4dda: 3607 adds r6, #7 4ddc: 08f6 lsrs r6, r6, #3 ns = (bitmapSize + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; 4dde: f206 13ff addw r3, r6, #511 ; 0x1ff if (ns > sectorsPerCluster) { 4de2: ebb2 2f53 cmp.w r2, r3, lsr #9 ns = (bitmapSize + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; 4de6: ea4f 2953 mov.w r9, r3, lsr #9 if (ns > sectorsPerCluster) { 4dea: f4ff aed4 bcc.w 4b96 memset(secBuf, 0, BYTES_PER_SECTOR); 4dee: f44f 7200 mov.w r2, #512 ; 0x200 4df2: 4639 mov r1, r7 4df4: 4620 mov r0, r4 4df6: f008 fe9b bl db30 secBuf[0] = 0X7; 4dfa: 2307 movs r3, #7 4dfc: 7023 strb r3, [r4, #0] for (uint32_t i = 0; i < ns; i++) { 4dfe: f1b9 0f00 cmp.w r9, #0 4e02: d1d1 bne.n 4da8 if (!writeUpcase(partitionOffset + clusterHeapOffset + sectorsPerCluster)) { 4e04: 9b03 ldr r3, [sp, #12] 4e06: 9a07 ldr r2, [sp, #28] 4e08: 9804 ldr r0, [sp, #16] 4e0a: 1899 adds r1, r3, r2 4e0c: f7ff fd9a bl 4944 4e10: 2800 cmp r0, #0 4e12: f43f aec0 beq.w 4b96 if (m_upcaseSize > BYTES_PER_SECTOR*sectorsPerCluster) { 4e16: 9a02 ldr r2, [sp, #8] 4e18: f44f 7300 mov.w r3, #512 ; 0x200 4e1c: 4093 lsls r3, r2 4e1e: 9a04 ldr r2, [sp, #16] 4e20: 6892 ldr r2, [r2, #8] 4e22: 429a cmp r2, r3 4e24: f63f aeb7 bhi.w 4b96 sector = partitionOffset + clusterHeapOffset + 2*sectorsPerCluster; 4e28: f04f 0802 mov.w r8, #2 4e2c: 9b02 ldr r3, [sp, #8] memset(secBuf, 0, BYTES_PER_SECTOR); 4e2e: f44f 7200 mov.w r2, #512 ; 0x200 4e32: 2100 movs r1, #0 sector = partitionOffset + clusterHeapOffset + 2*sectorsPerCluster; 4e34: fa08 f903 lsl.w r9, r8, r3 4e38: 9b03 ldr r3, [sp, #12] memset(secBuf, 0, BYTES_PER_SECTOR); 4e3a: 4620 mov r0, r4 sector = partitionOffset + clusterHeapOffset + 2*sectorsPerCluster; 4e3c: 4499 add r9, r3 memset(secBuf, 0, BYTES_PER_SECTOR); 4e3e: f008 fe77 bl db30 dbm->type = EXFAT_TYPE_BITMAP; 4e42: 2281 movs r2, #129 ; 0x81 label->type = EXFAT_TYPE_LABEL & 0X7F; 4e44: 2303 movs r3, #3 setLe32(dup->checksum, m_upcaseChecksum); 4e46: 9904 ldr r1, [sp, #16] 4e48: f109 39ff add.w r9, r9, #4294967295 dbm->type = EXFAT_TYPE_BITMAP; 4e4c: f884 2020 strb.w r2, [r4, #32] dup->type = EXFAT_TYPE_UPCASE; 4e50: 2282 movs r2, #130 ; 0x82 label->type = EXFAT_TYPE_LABEL & 0X7F; 4e52: 7023 strb r3, [r4, #0] dup->type = EXFAT_TYPE_UPCASE; 4e54: f884 2040 strb.w r2, [r4, #64] ; 0x40 setLe64(dbm->size, bitmapSize); 4e58: e9c4 860d strd r8, r6, [r4, #52] ; 0x34 setLe32(dup->checksum, m_upcaseChecksum); 4e5c: 684a ldr r2, [r1, #4] *reinterpret_cast(dst) = src; 4e5e: f04f 0801 mov.w r8, #1 *reinterpret_cast(dst) = src; 4e62: 6563 str r3, [r4, #84] ; 0x54 4e64: 6462 str r2, [r4, #68] ; 0x44 setLe64(dup->size, m_upcaseSize); 4e66: 688b ldr r3, [r1, #8] 4e68: 65a3 str r3, [r4, #88] ; 0x58 setLe64(dbm->size, bitmapSize); 4e6a: 2300 movs r3, #0 setLe64(dup->size, m_upcaseSize); 4e6c: 65e3 str r3, [r4, #92] ; 0x5c for (uint32_t i = 0; i < ns; i++) { 4e6e: e00e b.n 4e8e 4e70: 20000840 .word 0x20000840 4e74: 200007dc .word 0x200007dc 4e78: 200007f4 .word 0x200007f4 4e7c: 20000804 .word 0x20000804 4e80: 2000081c .word 0x2000081c 4e84: 9b07 ldr r3, [sp, #28] 4e86: 4598 cmp r8, r3 4e88: d23b bcs.n 4f02 4e8a: f108 0801 add.w r8, r8, #1 if (!dev->writeSector(sector + i, secBuf)) { 4e8e: 682b ldr r3, [r5, #0] 4e90: eb09 0108 add.w r1, r9, r8 4e94: 4622 mov r2, r4 4e96: 4628 mov r0, r5 4e98: 6a5b ldr r3, [r3, #36] ; 0x24 4e9a: 4798 blx r3 4e9c: 4606 mov r6, r0 4e9e: 2800 cmp r0, #0 4ea0: f43f ae72 beq.w 4b88 if (i == 0) { 4ea4: f1b8 0f01 cmp.w r8, #1 4ea8: d1ec bne.n 4e84 memset(secBuf, 0, BYTES_PER_SECTOR); 4eaa: f44f 7200 mov.w r2, #512 ; 0x200 4eae: 2100 movs r1, #0 4eb0: 4620 mov r0, r4 4eb2: f008 fe3d bl db30 for (uint32_t i = 0; i < ns; i++) { 4eb6: e7e8 b.n 4e8a writeMsg(pr, "Writing upcase table\r\n"); 4eb8: 2f00 cmp r7, #0 4eba: d0a3 beq.n 4e04 4ebc: 683b ldr r3, [r7, #0] 4ebe: 2216 movs r2, #22 4ec0: 4914 ldr r1, [pc, #80] ; (4f14 ) 4ec2: 4638 mov r0, r7 4ec4: 685b ldr r3, [r3, #4] 4ec6: 4798 blx r3 if (!writeUpcase(partitionOffset + clusterHeapOffset + sectorsPerCluster)) { 4ec8: 9b03 ldr r3, [sp, #12] 4eca: 9a07 ldr r2, [sp, #28] 4ecc: 9804 ldr r0, [sp, #16] 4ece: 1899 adds r1, r3, r2 4ed0: f7ff fd38 bl 4944 4ed4: 2800 cmp r0, #0 4ed6: f43f ae58 beq.w 4b8a if (m_upcaseSize > BYTES_PER_SECTOR*sectorsPerCluster) { 4eda: 9a02 ldr r2, [sp, #8] 4edc: f44f 7300 mov.w r3, #512 ; 0x200 4ee0: 4093 lsls r3, r2 4ee2: 9a04 ldr r2, [sp, #16] 4ee4: 6892 ldr r2, [r2, #8] 4ee6: 429a cmp r2, r3 4ee8: f63f ae4f bhi.w 4b8a writeMsg(pr, "Writing root\r\n"); 4eec: 490a ldr r1, [pc, #40] ; (4f18 ) 4eee: 4638 mov r0, r7 4ef0: f7ff fcba bl 4868 4ef4: e798 b.n 4e28 sectorsPerCluster = 1UL << sectorsPerClusterShift; 4ef6: f44f 7280 mov.w r2, #256 ; 0x100 4efa: f8cd 8008 str.w r8, [sp, #8] 4efe: 9207 str r2, [sp, #28] 4f00: e5a1 b.n 4a46 writeMsg(pr, "Format done\r\n"); 4f02: 2f00 cmp r7, #0 4f04: f43f ae48 beq.w 4b98 4f08: 4904 ldr r1, [pc, #16] ; (4f1c ) 4f0a: 4638 mov r0, r7 4f0c: f7ff fcac bl 4868 4f10: e642 b.n 4b98 4f12: bf00 nop 4f14: 20000808 .word 0x20000808 4f18: 20000820 .word 0x20000820 4f1c: 20000830 .word 0x20000830 00004f20 : hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); hash = ((hash << 15) | (hash >> 1)) + (c >> 8); return hash; } //------------------------------------------------------------------------------ bool ExFatFile::cmpName(const DirName_t* dirName, ExName_t* fname) { 4f20: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 4f24: 460c mov r4, r1 4f26: 4615 mov r5, r2 4f28: f101 081e add.w r8, r1, #30 return !ls && next == end; 4f2c: 89ab ldrh r3, [r5, #12] uint16_t u = getLe16(dirName->unicode + 2*i); if (fname->atEnd()) { return u == 0; } #if USE_UTF8_LONG_NAMES uint16_t cp = fname->get16(); 4f2e: 4628 mov r0, r5 return *reinterpret_cast(src); 4f30: f834 7f02 ldrh.w r7, [r4, #2]! 4f34: b91b cbnz r3, 4f3e 4f36: e9d5 2301 ldrd r2, r3, [r5, #4] 4f3a: 429a cmp r2, r3 4f3c: d00e beq.n 4f5c 4f3e: f005 f9dd bl a2fc if (toUpcase(cp) != toUpcase(u)) { 4f42: f005 faef bl a524 4f46: 4606 mov r6, r0 4f48: 4638 mov r0, r7 4f4a: f005 faeb bl a524 4f4e: 4286 cmp r6, r0 4f50: d109 bne.n 4f66 for (uint8_t i = 0; i < 15; i++) { 4f52: 4544 cmp r4, r8 4f54: d1ea bne.n 4f2c if (u >= 0x7F || toUpper(c) != toUpper(u)) { return false; } #endif // USE_UTF8_LONG_NAMES } return true; 4f56: 2001 movs r0, #1 } 4f58: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return u == 0; 4f5c: fab7 f087 clz r0, r7 4f60: 0940 lsrs r0, r0, #5 } 4f62: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return false; 4f66: 2000 movs r0, #0 } 4f68: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 00004f6c : fail: *name = 0; return 0; } //------------------------------------------------------------------------------ size_t ExFatFile::getName8(char* name, size_t count) { 4f6c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} char* str = name; char* ptr; DirName_t* dn; uint16_t hs = 0; uint32_t cp; if (!isOpen()) { 4f70: f890 3031 ldrb.w r3, [r0, #49] ; 0x31 size_t ExFatFile::getName8(char* name, size_t count) { 4f74: b083 sub sp, #12 4f76: 4688 mov r8, r1 if (!isOpen()) { 4f78: 2b00 cmp r3, #0 4f7a: d04f beq.n 501c DBG_FAIL_MACRO; goto fail; } for (uint8_t is = 2; is <= m_setCount; is++) { 4f7c: f890 3030 ldrb.w r3, [r0, #48] ; 0x30 4f80: 4607 mov r7, r0 4f82: 2b01 cmp r3, #1 4f84: d953 bls.n 502e } else { DBG_FAIL_MACRO; goto fail; } // Save space for zero byte. ptr = FsUtf::cpToMb(cp, str, end - 1); 4f86: 3a01 subs r2, #1 char* str = name; 4f88: 460b mov r3, r1 for (uint8_t is = 2; is <= m_setCount; is++) { 4f8a: f04f 0a02 mov.w sl, #2 uint16_t hs = 0; 4f8e: 2400 movs r4, #0 ptr = FsUtf::cpToMb(cp, str, end - 1); 4f90: 188e adds r6, r1, r2 * \param[in] hs high surrogate. * \param[in] ls low surrogate. * \return code point. */ inline uint32_t u16ToCp(uint16_t hs, uint16_t ls) { return 0X10000 + (((hs & 0X3FF) << 10) | (ls & 0X3FF)); 4f92: f8df b0a0 ldr.w fp, [pc, #160] ; 5034 (dirCache(is, FsCache::CACHE_FOR_READ)); 4f96: 2200 movs r2, #0 4f98: 4651 mov r1, sl 4f9a: 4638 mov r0, r7 4f9c: 9301 str r3, [sp, #4] 4f9e: f7fe faa3 bl 34e8 if (!dn || dn->type != EXFAT_TYPE_NAME) { 4fa2: 2800 cmp r0, #0 4fa4: d03a beq.n 501c 4fa6: 7802 ldrb r2, [r0, #0] 4fa8: 2ac1 cmp r2, #193 ; 0xc1 4faa: d137 bne.n 501c 4fac: 4605 mov r5, r0 4fae: f100 091e add.w r9, r0, #30 4fb2: 9b01 ldr r3, [sp, #4] 4fb4: f835 0f02 ldrh.w r0, [r5, #2]! if (hs) { 4fb8: b324 cbz r4, 5004 return 0XDC00 <= c && c <= 0XDFFF; 4fba: f500 5210 add.w r2, r0, #9216 ; 0x2400 if (!FsUtf::isLowSurrogate(c)) { 4fbe: b292 uxth r2, r2 4fc0: f5b2 6f80 cmp.w r2, #1024 ; 0x400 4fc4: d22a bcs.n 501c return 0X10000 + (((hs & 0X3FF) << 10) | (ls & 0X3FF)); 4fc6: ea0b 2484 and.w r4, fp, r4, lsl #10 4fca: f3c0 0009 ubfx r0, r0, #0, #10 4fce: 4320 orrs r0, r4 4fd0: f500 3080 add.w r0, r0, #65536 ; 0x10000 ptr = FsUtf::cpToMb(cp, str, end - 1); 4fd4: 4619 mov r1, r3 4fd6: 4632 mov r2, r6 4fd8: f005 fa06 bl a3e8 if (!ptr) { 4fdc: 4603 mov r3, r0 4fde: b1e8 cbz r0, 501c 4fe0: 2400 movs r4, #0 for (uint8_t in = 0; in < 15; in++) { 4fe2: 454d cmp r5, r9 4fe4: d1e6 bne.n 4fb4 for (uint8_t is = 2; is <= m_setCount; is++) { 4fe6: f10a 0a01 add.w sl, sl, #1 4fea: f897 2030 ldrb.w r2, [r7, #48] ; 0x30 4fee: fa5f fa8a uxtb.w sl, sl 4ff2: 4552 cmp r2, sl 4ff4: d2cf bcs.n 4f96 str = ptr; } } done: *str = '\0'; return str - name; 4ff6: eba3 0008 sub.w r0, r3, r8 4ffa: 4698 mov r8, r3 *str = '\0'; 4ffc: 2300 movs r3, #0 4ffe: f888 3000 strb.w r3, [r8] return str - name; 5002: e00f b.n 5024 return 0XD800 <= c && c <= 0XDFFF; 5004: f500 5220 add.w r2, r0, #10240 ; 0x2800 5008: b292 uxth r2, r2 } else if (!FsUtf::isSurrogate(c)) { 500a: f5b2 6f00 cmp.w r2, #2048 ; 0x800 500e: d302 bcc.n 5016 if (c == 0) { 5010: 2800 cmp r0, #0 5012: d1df bne.n 4fd4 5014: e7ef b.n 4ff6 } else if (FsUtf::isHighSurrogate(c)) { 5016: f5b2 6f80 cmp.w r2, #1024 ; 0x400 501a: d306 bcc.n 502a fail: *name = 0; 501c: 2300 movs r3, #0 return 0; 501e: 4618 mov r0, r3 *name = 0; 5020: f888 3000 strb.w r3, [r8] } 5024: b003 add sp, #12 5026: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 502a: 4604 mov r4, r0 502c: e7d9 b.n 4fe2 for (uint8_t is = 2; is <= m_setCount; is++) { 502e: 2000 movs r0, #0 5030: e7e4 b.n 4ffc 5032: bf00 nop 5034: 000ffc00 .word 0x000ffc00 00005038 : //------------------------------------------------------------------------------ bool ExFatFile::hashName(ExName_t* fname) { 5038: b570 push {r4, r5, r6, lr} 503a: 460c mov r4, r1 ls = 0; // lowSurrogate 503c: 2300 movs r3, #0 fname->reset(); #if USE_UTF8_LONG_NAMES fname->nameLength = 0; while (!fname->atEnd()) { uint16_t u = fname->get16(); if (u == 0XFFFF) { 503e: f64f 75ff movw r5, #65535 ; 0xffff next = begin; 5042: 6822 ldr r2, [r4, #0] while (!fname->atEnd()) { 5044: 4619 mov r1, r3 uint16_t hash = 0; 5046: 461e mov r6, r3 ls = 0; // lowSurrogate 5048: 81a3 strh r3, [r4, #12] fname->nameLength = 0; 504a: 6123 str r3, [r4, #16] next = begin; 504c: 6062 str r2, [r4, #4] while (!fname->atEnd()) { 504e: e017 b.n 5080 uint16_t u = fname->get16(); 5050: f005 f954 bl a2fc if (u == 0XFFFF) { 5054: 42a8 cmp r0, r5 5056: d022 beq.n 509e uint16_t c = toUpcase(u); 5058: f005 fa64 bl a524 DBG_FAIL_MACRO; goto fail; } hash = exFatHash(u, hash); fname->nameLength++; 505c: 6923 ldr r3, [r4, #16] hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); 505e: 03f2 lsls r2, r6, #15 return !ls && next == end; 5060: 89a1 ldrh r1, [r4, #12] fname->nameLength++; 5062: 3301 adds r3, #1 hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); 5064: ea42 0256 orr.w r2, r2, r6, lsr #1 hash = ((hash << 15) | (hash >> 1)) + (c >> 8); 5068: 0a06 lsrs r6, r0, #8 fname->nameLength++; 506a: 6123 str r3, [r4, #16] hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); 506c: fa52 f080 uxtab r0, r2, r0 5070: b283 uxth r3, r0 hash = ((hash << 15) | (hash >> 1)) + (c >> 8); 5072: f3c0 004e ubfx r0, r0, #1, #15 5076: ea40 30c3 orr.w r0, r0, r3, lsl #15 507a: fa16 f080 uxtah r0, r6, r0 507e: b286 uxth r6, r0 uint16_t u = fname->get16(); 5080: 4620 mov r0, r4 5082: 2900 cmp r1, #0 5084: d1e4 bne.n 5050 5086: e9d4 2301 ldrd r2, r3, [r4, #4] 508a: 429a cmp r2, r3 508c: d1e0 bne.n 5050 hash = exFatHash(c, hash); } fname->nameLength = fname->end - fname->begin; #endif // USE_UTF8_LONG_NAMES fname->nameHash = hash; if (!fname->nameLength || fname->nameLength > EXFAT_MAX_NAME_LENGTH) { 508e: 6920 ldr r0, [r4, #16] fname->nameHash = hash; 5090: 82a6 strh r6, [r4, #20] if (!fname->nameLength || fname->nameLength > EXFAT_MAX_NAME_LENGTH) { 5092: 3801 subs r0, #1 5094: 28fe cmp r0, #254 ; 0xfe 5096: bf8c ite hi 5098: 2000 movhi r0, #0 509a: 2001 movls r0, #1 } return true; fail: return false; } 509c: bd70 pop {r4, r5, r6, pc} return false; 509e: 2000 movs r0, #0 } 50a0: bd70 pop {r4, r5, r6, pc} 50a2: bf00 nop 000050a4 : #define DBG_FILE "ExFatPartition.cpp" #include "../common/DebugMacros.h" #include "ExFatLib.h" //------------------------------------------------------------------------------ // return 0 if error, 1 if no space, else start cluster. uint32_t ExFatPartition::bitmapFind(uint32_t cluster, uint32_t count) { 50a4: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} 50a8: 4607 mov r7, r0 uint32_t start = cluster ? cluster - 2 : m_bitmapStart; 50aa: 468a mov sl, r1 uint32_t ExFatPartition::bitmapFind(uint32_t cluster, uint32_t count) { 50ac: 4691 mov r9, r2 uint32_t start = cluster ? cluster - 2 : m_bitmapStart; 50ae: 2900 cmp r1, #0 50b0: d042 beq.n 5138 50b2: f1a1 0802 sub.w r8, r1, #2 if (start >= m_clusterCount) { 50b6: f8d7 3430 ldr.w r3, [r7, #1072] ; 0x430 50ba: 4543 cmp r3, r8 50bc: d942 bls.n 5144 uint32_t endAlloc = start; uint32_t bgnAlloc = start; uint16_t sectorSize = 1 << m_bytesPerSectorShift; size_t i = (start >> 3) & (sectorSize - 1); uint8_t* cache; uint8_t mask = 1 << (start & 7); 50be: f008 0307 and.w r3, r8, #7 50c2: 2501 movs r5, #1 size_t i = (start >> 3) & (sectorSize - 1); 50c4: f3c8 0bc8 ubfx fp, r8, #3, #9 uint8_t mask = 1 << (start & 7); 50c8: 409d lsls r5, r3 50ca: b2ed uxtb r5, r5 uint32_t bgnAlloc = start; 50cc: 4646 mov r6, r8 uint32_t endAlloc = start; 50ce: 4644 mov r4, r8 while (true) { uint32_t sector = m_clusterHeapStartSector + 50d0: f8d7 142c ldr.w r1, [r7, #1068] ; 0x42c return m_bitmapCache.prepare(sector, option); 50d4: 2200 movs r2, #0 50d6: 4638 mov r0, r7 50d8: eb01 3114 add.w r1, r1, r4, lsr #12 50dc: f005 f8d0 bl a280 (endAlloc >> (m_bytesPerSectorShift + 3)); cache = bitmapCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { 50e0: b1e8 cbz r0, 511e 50e2: f10b 3bff add.w fp, fp, #4294967295 50e6: 4483 add fp, r0 50e8: f200 10ff addw r0, r0, #511 ; 0x1ff return 0; } for (; i < sectorSize; i++) { for (; mask; mask <<= 1) { endAlloc++; if (!(mask & cache[i])) { 50ec: f81b 1f01 ldrb.w r1, [fp, #1]! 50f0: e00a b.n 5108 if ((endAlloc - bgnAlloc) == count) { 50f2: 454a cmp r2, r9 50f4: d02b beq.n 514e return bgnAlloc + 2; } } else { bgnAlloc = endAlloc; } if (endAlloc == start) { 50f6: 45a0 cmp r8, r4 50f8: d010 beq.n 511c return 1; } if (endAlloc >= m_clusterCount) { 50fa: f8d7 5430 ldr.w r5, [r7, #1072] ; 0x430 50fe: 42a5 cmp r5, r4 5100: d914 bls.n 512c for (; mask; mask <<= 1) { 5102: f013 05ff ands.w r5, r3, #255 ; 0xff 5106: d00c beq.n 5122 endAlloc++; 5108: 3401 adds r4, #1 if (!(mask & cache[i])) { 510a: 4229 tst r1, r5 for (; mask; mask <<= 1) { 510c: ea4f 0345 mov.w r3, r5, lsl #1 if ((endAlloc - bgnAlloc) == count) { 5110: eba4 0206 sub.w r2, r4, r6 if (!(mask & cache[i])) { 5114: d0ed beq.n 50f2 if (endAlloc == start) { 5116: 45a0 cmp r8, r4 endAlloc++; 5118: 4626 mov r6, r4 if (endAlloc == start) { 511a: d1ee bne.n 50fa return 1; 511c: 2001 movs r0, #1 mask = 1; } i = 0; } return 0; } 511e: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} for (; i < sectorSize; i++) { 5122: 4558 cmp r0, fp mask = 1; 5124: f04f 0501 mov.w r5, #1 for (; i < sectorSize; i++) { 5128: d1e0 bne.n 50ec 512a: e001 b.n 5130 endAlloc = bgnAlloc = 0; 512c: 2600 movs r6, #0 512e: 4634 mov r4, r6 uint32_t endAlloc = start; 5130: 2501 movs r5, #1 i = 0; 5132: f04f 0b00 mov.w fp, #0 5136: e7cb b.n 50d0 uint32_t start = cluster ? cluster - 2 : m_bitmapStart; 5138: f8d0 8420 ldr.w r8, [r0, #1056] ; 0x420 if (start >= m_clusterCount) { 513c: f8d7 3430 ldr.w r3, [r7, #1072] ; 0x430 5140: 4543 cmp r3, r8 5142: d8bc bhi.n 50be 5144: f04f 0800 mov.w r8, #0 5148: 2501 movs r5, #1 start = 0; 514a: 46c3 mov fp, r8 514c: e7be b.n 50cc if (cluster == 0 && count == 1) { 514e: f1ba 0f00 cmp.w sl, #0 5152: d104 bne.n 515e 5154: f1b9 0f01 cmp.w r9, #1 m_bitmapStart = bgnAlloc; 5158: bf08 it eq 515a: f8c7 6420 streq.w r6, [r7, #1056] ; 0x420 return bgnAlloc + 2; 515e: 1cb0 adds r0, r6, #2 } 5160: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} 00005164 : //------------------------------------------------------------------------------ bool ExFatPartition::bitmapModify(uint32_t cluster, uint32_t count, bool value) { 5164: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 5168: 4680 mov r8, r0 uint32_t sector; uint32_t start = cluster - 2; 516a: 1e88 subs r0, r1, #2 uint32_t count, bool value) { 516c: 4615 mov r5, r2 516e: 461e mov r6, r3 size_t i; uint8_t* cache; uint8_t mask; cluster -= 2; if ((start + count) > m_clusterCount) { 5170: 1883 adds r3, r0, r2 5172: f8d8 2430 ldr.w r2, [r8, #1072] ; 0x430 5176: 4293 cmp r3, r2 5178: d837 bhi.n 51ea DBG_FAIL_MACRO; goto fail; } if (value) { 517a: bbce cbnz r6, 51f0 if (start <= m_bitmapStart && m_bitmapStart < (start + count)) { m_bitmapStart = (start + count) < m_clusterCount ? start + count : 0; } } else { if (start < m_bitmapStart) { 517c: f8d8 3420 ldr.w r3, [r8, #1056] ; 0x420 5180: 4283 cmp r3, r0 m_bitmapStart = start; 5182: bf88 it hi 5184: f8c8 0420 strhi.w r0, [r8, #1056] ; 0x420 } } mask = 1 << (start & 7); 5188: f000 0307 and.w r3, r0, #7 518c: 2401 movs r4, #1 sector = m_clusterHeapStartSector + 518e: f8d8 742c ldr.w r7, [r8, #1068] ; 0x42c (start >> (m_bytesPerSectorShift + 3)); i = (start >> 3) & m_sectorMask; 5192: f3c0 09c8 ubfx r9, r0, #3, #9 mask = 1 << (start & 7); 5196: 409c lsls r4, r3 sector = m_clusterHeapStartSector + 5198: eb07 3110 add.w r1, r7, r0, lsr #12 mask = 1 << (start & 7); 519c: b2e4 uxtb r4, r4 519e: 2201 movs r2, #1 51a0: 4640 mov r0, r8 while (true) { cache = bitmapCachePrepare(sector++, FsCache::CACHE_FOR_WRITE); 51a2: 188f adds r7, r1, r2 51a4: f005 f86c bl a280 if (!cache) { 51a8: b1f8 cbz r0, 51ea 51aa: f109 3eff add.w lr, r9, #4294967295 51ae: 4486 add lr, r0 51b0: f200 10ff addw r0, r0, #511 ; 0x1ff DBG_FAIL_MACRO; goto fail; } for (; i < m_bytesPerSector; i++) { for (; mask; mask <<= 1) { if (value == static_cast(cache[i] & mask)) { 51b4: f81e cf01 ldrb.w ip, [lr, #1]! 51b8: ea1c 0f04 tst.w ip, r4 DBG_FAIL_MACRO; goto fail; } cache[i] ^= mask; 51bc: ea8c 0c04 eor.w ip, ip, r4 for (; mask; mask <<= 1) { 51c0: ea4f 0444 mov.w r4, r4, lsl #1 if (value == static_cast(cache[i] & mask)) { 51c4: bf14 ite ne 51c6: 2201 movne r2, #1 51c8: 2200 moveq r2, #0 51ca: 42b2 cmp r2, r6 51cc: d00d beq.n 51ea if (--count == 0) { 51ce: 3d01 subs r5, #1 cache[i] ^= mask; 51d0: f88e c000 strb.w ip, [lr] if (--count == 0) { 51d4: d018 beq.n 5208 for (; mask; mask <<= 1) { 51d6: f014 04ff ands.w r4, r4, #255 ; 0xff 51da: d1ed bne.n 51b8 for (; i < m_bytesPerSector; i++) { 51dc: 4570 cmp r0, lr return true; } } mask = 1; } i = 0; 51de: 46a1 mov r9, r4 51e0: f04f 0401 mov.w r4, #1 for (; i < m_bytesPerSector; i++) { 51e4: d1e6 bne.n 51b4 cache = bitmapCachePrepare(sector++, FsCache::CACHE_FOR_WRITE); 51e6: 4639 mov r1, r7 51e8: e7d9 b.n 519e } fail: return false; 51ea: 2000 movs r0, #0 } 51ec: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} if (start <= m_bitmapStart && m_bitmapStart < (start + count)) { 51f0: f8d8 1420 ldr.w r1, [r8, #1056] ; 0x420 51f4: 428b cmp r3, r1 51f6: d9c7 bls.n 5188 51f8: 4281 cmp r1, r0 51fa: d3c5 bcc.n 5188 m_bitmapStart = (start + count) < m_clusterCount ? start + count : 0; 51fc: 4293 cmp r3, r2 51fe: bf28 it cs 5200: 2300 movcs r3, #0 5202: f8c8 3420 str.w r3, [r8, #1056] ; 0x420 5206: e7bf b.n 5188 return true; 5208: 2001 movs r0, #1 } 520a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 520e: bf00 nop 00005210 : //------------------------------------------------------------------------------ uint32_t ExFatPartition::chainSize(uint32_t cluster) { 5210: b5f8 push {r3, r4, r5, r6, r7, lr} int8_t ExFatPartition::fatGet(uint32_t cluster, uint32_t* value) { uint8_t* cache; uint32_t next; uint32_t sector; if (cluster > (m_clusterCount + 1)) { 5212: f8d0 3430 ldr.w r3, [r0, #1072] ; 0x430 5216: 3301 adds r3, #1 5218: 428b cmp r3, r1 521a: d201 bcs.n 5220 if (status < 0) return 0; 521c: 2000 movs r0, #0 } 521e: bdf8 pop {r3, r4, r5, r6, r7, pc} 5220: 4607 mov r7, r0 5222: 460c mov r4, r1 return m_dataCache.prepare(sector, option); 5224: f500 7604 add.w r6, r0, #528 ; 0x210 uint32_t n = 0; 5228: 2500 movs r5, #0 522a: e005 b.n 5238 if (cluster > (m_clusterCount + 1)) { 522c: f8d7 3430 ldr.w r3, [r7, #1072] ; 0x430 n++; 5230: 3501 adds r5, #1 if (cluster > (m_clusterCount + 1)) { 5232: 3301 adds r3, #1 5234: 42a3 cmp r3, r4 5236: d3f1 bcc.n 521c DBG_FAIL_MACRO; return -1; } sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 5238: f8d7 1424 ldr.w r1, [r7, #1060] ; 0x424 523c: 2200 movs r2, #0 523e: 4630 mov r0, r6 5240: eb01 11d4 add.w r1, r1, r4, lsr #7 5244: f005 f81c bl a280 cache = dataCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { return -1; } next = getLe32(cache + ((cluster << 2) & m_sectorMask)); 5248: 00a4 lsls r4, r4, #2 if (!cache) { 524a: 2800 cmp r0, #0 524c: d0e6 beq.n 521c next = getLe32(cache + ((cluster << 2) & m_sectorMask)); 524e: f3c4 0408 ubfx r4, r4, #0, #9 return *reinterpret_cast(src); 5252: 5904 ldr r4, [r0, r4] if (next == EXFAT_EOC) { 5254: 1c63 adds r3, r4, #1 5256: d1e9 bne.n 522c n++; 5258: 1c68 adds r0, r5, #1 } 525a: bdf8 pop {r3, r4, r5, r6, r7, pc} 0000525c : uint8_t* ExFatPartition::dirCache(DirPos_t* pos, uint8_t options) { 525c: b538 push {r3, r4, r5, lr} 525e: 460c mov r4, r1 ((cluster - 2) << m_sectorsPerClusterShift); 5260: 680b ldr r3, [r1, #0] 5262: f890 c445 ldrb.w ip, [r0, #1093] ; 0x445 return m_dataCache.prepare(sector, option); 5266: f500 7004 add.w r0, r0, #528 ; 0x210 sector += (m_clusterMask & pos->position) >> m_bytesPerSectorShift; 526a: f8d0 1228 ldr.w r1, [r0, #552] ; 0x228 ((cluster - 2) << m_sectorsPerClusterShift); 526e: 3b02 subs r3, #2 5270: 6865 ldr r5, [r4, #4] 5272: fa03 f30c lsl.w r3, r3, ip 5276: 4029 ands r1, r5 5278: eb03 2351 add.w r3, r3, r1, lsr #9 527c: f8d0 121c ldr.w r1, [r0, #540] ; 0x21c return m_dataCache.prepare(sector, option); 5280: 4419 add r1, r3 5282: f004 fffd bl a280 return cache ? cache + (pos->position & m_sectorMask) : nullptr; 5286: b118 cbz r0, 5290 5288: 6863 ldr r3, [r4, #4] 528a: f3c3 0308 ubfx r3, r3, #0, #9 528e: 4418 add r0, r3 } 5290: bd38 pop {r3, r4, r5, pc} 5292: bf00 nop 00005294 : int8_t ExFatPartition::dirSeek(DirPos_t* pos, uint32_t offset) { 5294: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 5298: 460c mov r4, r1 uint32_t tmp = (m_clusterMask & pos->position) + offset; 529a: f8d0 3438 ldr.w r3, [r0, #1080] ; 0x438 529e: 6849 ldr r1, [r1, #4] 52a0: 400b ands r3, r1 pos->position += offset; 52a2: 4411 add r1, r2 52a4: 6061 str r1, [r4, #4] uint32_t tmp = (m_clusterMask & pos->position) + offset; 52a6: 4413 add r3, r2 return m_bytesPerSectorShift + m_sectorsPerClusterShift; 52a8: f890 1445 ldrb.w r1, [r0, #1093] ; 0x445 52ac: f101 0209 add.w r2, r1, #9 tmp >>= bytesPerClusterShift(); 52b0: b2d2 uxtb r2, r2 52b2: 40d3 lsrs r3, r2 while (tmp--) { 52b4: b32b cbz r3, 5302 52b6: 4680 mov r8, r0 52b8: 1e5d subs r5, r3, #1 return m_dataCache.prepare(sector, option); 52ba: f500 7904 add.w r9, r0, #528 ; 0x210 52be: e005 b.n 52cc pos->cluster++; 52c0: 6823 ldr r3, [r4, #0] while (tmp--) { 52c2: 3d01 subs r5, #1 pos->cluster++; 52c4: f103 0301 add.w r3, r3, #1 52c8: 6023 str r3, [r4, #0] while (tmp--) { 52ca: d31a bcc.n 5302 if (pos->isContiguous) { 52cc: 7a26 ldrb r6, [r4, #8] 52ce: 2e00 cmp r6, #0 52d0: d1f6 bne.n 52c0 if (cluster > (m_clusterCount + 1)) { 52d2: f8d8 3430 ldr.w r3, [r8, #1072] ; 0x430 52d6: 4632 mov r2, r6 status = fatGet(pos->cluster, &pos->cluster); 52d8: 6827 ldr r7, [r4, #0] 52da: 4648 mov r0, r9 if (cluster > (m_clusterCount + 1)) { 52dc: 3301 adds r3, #1 52de: 429f cmp r7, r3 52e0: d812 bhi.n 5308 sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 52e2: f8d8 1424 ldr.w r1, [r8, #1060] ; 0x424 52e6: eb01 11d7 add.w r1, r1, r7, lsr #7 52ea: f004 ffc9 bl a280 next = getLe32(cache + ((cluster << 2) & m_sectorMask)); 52ee: 00bf lsls r7, r7, #2 if (!cache) { 52f0: b150 cbz r0, 5308 next = getLe32(cache + ((cluster << 2) & m_sectorMask)); 52f2: f3c7 0708 ubfx r7, r7, #0, #9 52f6: 59c3 ldr r3, [r0, r7] if (next == EXFAT_EOC) { 52f8: 1c5a adds r2, r3, #1 52fa: d009 beq.n 5310 while (tmp--) { 52fc: 3d01 subs r5, #1 return 0; } *value = next; 52fe: 6023 str r3, [r4, #0] while (tmp--) { 5300: d2e4 bcs.n 52cc return 1; 5302: 2001 movs r0, #1 } 5304: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} return -1; 5308: f04f 30ff mov.w r0, #4294967295 } 530c: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} return 0; 5310: 4630 mov r0, r6 } 5312: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 5316: bf00 nop 00005318 : int8_t ExFatPartition::fatGet(uint32_t cluster, uint32_t* value) { 5318: b538 push {r3, r4, r5, lr} if (cluster > (m_clusterCount + 1)) { 531a: f8d0 3430 ldr.w r3, [r0, #1072] ; 0x430 531e: 3301 adds r3, #1 5320: 428b cmp r3, r1 5322: d202 bcs.n 532a return -1; 5324: f04f 30ff mov.w r0, #4294967295 return 1; } 5328: bd38 pop {r3, r4, r5, pc} 532a: 460c mov r4, r1 sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 532c: f8d0 1424 ldr.w r1, [r0, #1060] ; 0x424 5330: 4615 mov r5, r2 5332: f500 7004 add.w r0, r0, #528 ; 0x210 5336: 2200 movs r2, #0 5338: eb01 11d4 add.w r1, r1, r4, lsr #7 533c: f004 ffa0 bl a280 if (!cache) { 5340: 2800 cmp r0, #0 5342: d0ef beq.n 5324 next = getLe32(cache + ((cluster << 2) & m_sectorMask)); 5344: 00a4 lsls r4, r4, #2 5346: f3c4 0408 ubfx r4, r4, #0, #9 534a: 5903 ldr r3, [r0, r4] if (next == EXFAT_EOC) { 534c: 1c5a adds r2, r3, #1 534e: d002 beq.n 5356 return 1; 5350: 2001 movs r0, #1 *value = next; 5352: 602b str r3, [r5, #0] } 5354: bd38 pop {r3, r4, r5, pc} return 0; 5356: 2000 movs r0, #0 } 5358: bd38 pop {r3, r4, r5, pc} 535a: bf00 nop 0000535c : //------------------------------------------------------------------------------ bool ExFatPartition::fatPut(uint32_t cluster, uint32_t value) { uint32_t sector; uint8_t* cache; if (cluster < 2 || cluster > (m_clusterCount + 1)) { 535c: 2901 cmp r1, #1 535e: d91b bls.n 5398 bool ExFatPartition::fatPut(uint32_t cluster, uint32_t value) { 5360: b538 push {r3, r4, r5, lr} if (cluster < 2 || cluster > (m_clusterCount + 1)) { 5362: f8d0 3430 ldr.w r3, [r0, #1072] ; 0x430 5366: 460c mov r4, r1 5368: 3301 adds r3, #1 536a: 428b cmp r3, r1 536c: d201 bcs.n 5372 } setLe32(cache + ((cluster << 2) & m_sectorMask), value); return true; fail: return false; 536e: 2000 movs r0, #0 } 5370: bd38 pop {r3, r4, r5, pc} sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 5372: f8d0 1424 ldr.w r1, [r0, #1060] ; 0x424 5376: 4615 mov r5, r2 5378: f500 7004 add.w r0, r0, #528 ; 0x210 537c: 2201 movs r2, #1 537e: eb01 11d4 add.w r1, r1, r4, lsr #7 5382: f004 ff7d bl a280 if (!cache) { 5386: 4603 mov r3, r0 5388: 2800 cmp r0, #0 538a: d0f0 beq.n 536e setLe32(cache + ((cluster << 2) & m_sectorMask), value); 538c: 00a4 lsls r4, r4, #2 return true; 538e: 2001 movs r0, #1 setLe32(cache + ((cluster << 2) & m_sectorMask), value); 5390: f3c4 0408 ubfx r4, r4, #0, #9 *reinterpret_cast(dst) = src; 5394: 511d str r5, [r3, r4] } 5396: bd38 pop {r3, r4, r5, pc} return false; 5398: 2000 movs r0, #0 } 539a: 4770 bx lr 0000539c : if (cluster > (m_clusterCount + 1)) { 539c: f8d0 3430 ldr.w r3, [r0, #1072] ; 0x430 53a0: 3301 adds r3, #1 53a2: 4299 cmp r1, r3 53a4: d901 bls.n 53aa return true; fail: return false; } 53a6: 2000 movs r0, #0 53a8: 4770 bx lr bool ExFatPartition::freeChain(uint32_t cluster) { 53aa: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 53ae: 4605 mov r5, r0 53b0: b083 sub sp, #12 53b2: 460c mov r4, r1 53b4: f500 7904 add.w r9, r0, #528 ; 0x210 53b8: 460f mov r7, r1 53ba: f04f 0800 mov.w r8, #0 sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 53be: f8d5 1424 ldr.w r1, [r5, #1060] ; 0x424 53c2: 2200 movs r2, #0 53c4: 4648 mov r0, r9 53c6: ea4f 1bd4 mov.w fp, r4, lsr #7 53ca: eb01 11d4 add.w r1, r1, r4, lsr #7 53ce: f004 ff57 bl a280 if (!cache) { 53d2: b190 cbz r0, 53fa next = getLe32(cache + ((cluster << 2) & m_sectorMask)); 53d4: 00a3 lsls r3, r4, #2 53d6: f3c3 0308 ubfx r3, r3, #0, #9 return *reinterpret_cast(src); 53da: 58c2 ldr r2, [r0, r3] 53dc: 9301 str r3, [sp, #4] if (next == EXFAT_EOC) { 53de: 1c53 adds r3, r2, #1 53e0: bf16 itet ne 53e2: 4616 movne r6, r2 53e4: f04f 0a00 moveq.w sl, #0 53e8: f04f 0a01 movne.w sl, #1 if (cluster < 2 || cluster > (m_clusterCount + 1)) { 53ec: 2c01 cmp r4, #1 53ee: d904 bls.n 53fa 53f0: f8d5 2430 ldr.w r2, [r5, #1072] ; 0x430 53f4: 3201 adds r2, #1 53f6: 4294 cmp r4, r2 53f8: d903 bls.n 5402 } 53fa: 2000 movs r0, #0 53fc: b003 add sp, #12 53fe: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 5402: f8d5 1424 ldr.w r1, [r5, #1060] ; 0x424 5406: 2201 movs r2, #1 5408: 4648 mov r0, r9 540a: 4459 add r1, fp 540c: f004 ff38 bl a280 if (!cache) { 5410: 2800 cmp r0, #0 5412: d0f2 beq.n 53fa *reinterpret_cast(dst) = src; 5414: 9b01 ldr r3, [sp, #4] 5416: f840 8003 str.w r8, [r0, r3] if (status == 0 || (cluster + 1) != next) { 541a: f1ba 0f00 cmp.w sl, #0 541e: d012 beq.n 5446 5420: 3401 adds r4, #1 5422: 42b4 cmp r4, r6 5424: d008 beq.n 5438 if (!bitmapModify(start, cluster - start + 1, 0)) { 5426: 2300 movs r3, #0 5428: 1be2 subs r2, r4, r7 542a: 4639 mov r1, r7 542c: 4628 mov r0, r5 542e: f7ff fe99 bl 5164 5432: 2800 cmp r0, #0 5434: d0e1 beq.n 53fa 5436: 4637 mov r7, r6 if (cluster > (m_clusterCount + 1)) { 5438: f8d5 3430 ldr.w r3, [r5, #1072] ; 0x430 543c: 3301 adds r3, #1 543e: 42b3 cmp r3, r6 5440: d3db bcc.n 53fa 5442: 4634 mov r4, r6 5444: e7bb b.n 53be if (!bitmapModify(start, cluster - start + 1, 0)) { 5446: 1c62 adds r2, r4, #1 5448: 4653 mov r3, sl 544a: 4639 mov r1, r7 544c: 4628 mov r0, r5 544e: 1bd2 subs r2, r2, r7 } 5450: b003 add sp, #12 5452: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} if (!bitmapModify(start, cluster - start + 1, 0)) { 5456: f7ff be85 b.w 5164 545a: bf00 nop 0000545c : //------------------------------------------------------------------------------ uint32_t ExFatPartition::freeClusterCount() { 545c: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} uint32_t nc = 0; uint32_t sector = m_clusterHeapStartSector; uint32_t usedCount = 0; 5460: 2500 movs r5, #0 uint32_t ExFatPartition::freeClusterCount() { 5462: 4606 mov r6, r0 uint32_t sector = m_clusterHeapStartSector; 5464: f8d0 142c ldr.w r1, [r0, #1068] ; 0x42c 5468: f500 7804 add.w r8, r0, #528 ; 0x210 uint32_t nc = 0; 546c: 462c mov r4, r5 546e: 2200 movs r2, #0 5470: 4640 mov r0, r8 uint8_t* cache; while (true) { cache = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); 5472: 1c4f adds r7, r1, #1 5474: f004 ff04 bl a280 if (!cache) { 5478: b1a8 cbz r0, 54a6 547a: f100 3eff add.w lr, r0, #4294967295 547e: f504 5980 add.w r9, r4, #4096 ; 0x1000 usedCount++; } } } nc += 8; if (nc >= m_clusterCount) { 5482: f8d6 0430 ldr.w r0, [r6, #1072] ; 0x430 5486: e005 b.n 5494 } else if (cache[i]) { 5488: b979 cbnz r1, 54aa nc += 8; 548a: 3408 adds r4, #8 if (nc >= m_clusterCount) { 548c: 4284 cmp r4, r0 548e: d209 bcs.n 54a4 for (size_t i = 0; i < m_bytesPerSector; i++) { 5490: 454c cmp r4, r9 5492: d016 beq.n 54c2 if (cache[i] == 0XFF) { 5494: f81e 1f01 ldrb.w r1, [lr, #1]! 5498: 29ff cmp r1, #255 ; 0xff 549a: d1f5 bne.n 5488 nc += 8; 549c: 3408 adds r4, #8 usedCount+= 8; 549e: 3508 adds r5, #8 if (nc >= m_clusterCount) { 54a0: 4284 cmp r4, r0 54a2: d3f5 bcc.n 5490 return m_clusterCount - usedCount; 54a4: 1b40 subs r0, r0, r5 } } } } 54a6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 54aa: 2208 movs r2, #8 for (uint8_t mask = 1; mask ; mask <<=1) { 54ac: 2301 movs r3, #1 if ((mask & cache[i])) { 54ae: 4219 tst r1, r3 for (uint8_t mask = 1; mask ; mask <<=1) { 54b0: ea4f 0c43 mov.w ip, r3, lsl #1 usedCount++; 54b4: bf18 it ne 54b6: 3501 addne r5, #1 for (uint8_t mask = 1; mask ; mask <<=1) { 54b8: 3a01 subs r2, #1 54ba: fa5f f38c uxtb.w r3, ip 54be: d1f6 bne.n 54ae 54c0: e7e3 b.n 548a cache = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); 54c2: 4639 mov r1, r7 54c4: e7d3 b.n 546e 54c6: bf00 nop 000054c8 : //------------------------------------------------------------------------------ bool ExFatPartition::init(FsBlockDevice* dev, uint8_t part) { 54c8: b5f8 push {r3, r4, r5, r6, r7, lr} pbs_t* pbs; BpbExFat_t* bpb; MbrSector_t* mbr; MbrPart_t* mp; m_fatType = 0; 54ca: 2300 movs r3, #0 m_sector = 0XFFFFFFFF; 54cc: f04f 36ff mov.w r6, #4294967295 54d0: f500 7704 add.w r7, r0, #528 ; 0x210 bool ExFatPartition::init(FsBlockDevice* dev, uint8_t part) { 54d4: 4615 mov r5, r2 m_blockDev = dev; 54d6: f8c0 1440 str.w r1, [r0, #1088] ; 0x440 bool ExFatPartition::init(FsBlockDevice* dev, uint8_t part) { 54da: 4604 mov r4, r0 m_blockDev = blockDev; 54dc: 6041 str r1, [r0, #4] 54de: 461a mov r2, r3 54e0: f8c0 1214 str.w r1, [r0, #532] ; 0x214 54e4: 4619 mov r1, r3 m_fatType = 0; 54e6: f880 3444 strb.w r3, [r0, #1092] ; 0x444 m_status = 0; 54ea: 7003 strb r3, [r0, #0] m_sector = 0XFFFFFFFF; 54ec: 60c6 str r6, [r0, #12] m_status = 0; 54ee: f880 3210 strb.w r3, [r0, #528] ; 0x210 m_sector = 0XFFFFFFFF; 54f2: f8c0 621c str.w r6, [r0, #540] ; 0x21c 54f6: 4638 mov r0, r7 54f8: f004 fec2 bl a280 cacheInit(m_blockDev); cache = dataCachePrepare(0, FsCache::CACHE_FOR_READ); if (part > 4 || !cache) { 54fc: 2d04 cmp r5, #4 54fe: d80d bhi.n 551c 5500: 4606 mov r6, r0 5502: b158 cbz r0, 551c DBG_FAIL_MACRO; goto fail; } if (part >= 1) { 5504: b1bd cbz r5, 5536 mbr = reinterpret_cast(cache); mp = &mbr->part[part - 1]; 5506: 1e6b subs r3, r5, #1 if ((mp->boot != 0 && mp->boot != 0X80) || mp->type == 0) { 5508: eb00 1303 add.w r3, r0, r3, lsl #4 550c: f893 21be ldrb.w r2, [r3, #446] ; 0x1be 5510: f012 027f ands.w r2, r2, #127 ; 0x7f 5514: d102 bne.n 551c 5516: f893 31c2 ldrb.w r3, [r3, #450] ; 0x1c2 551a: b90b cbnz r3, 5520 bitmapFind(0, 1); m_fatType = FAT_TYPE_EXFAT; return true; fail: return false; 551c: 2000 movs r0, #0 } 551e: bdf8 pop {r3, r4, r5, r6, r7, pc} return *reinterpret_cast(src); 5520: eb00 1605 add.w r6, r0, r5, lsl #4 5524: 4638 mov r0, r7 5526: f8d6 51b6 ldr.w r5, [r6, #438] ; 0x1b6 552a: 4629 mov r1, r5 552c: f004 fea8 bl a280 if (!cache) { 5530: 4606 mov r6, r0 5532: 2800 cmp r0, #0 5534: d0f2 beq.n 551c if (strncmp(pbs->oemName, "EXFAT", 5)) { 5536: 2205 movs r2, #5 5538: 491a ldr r1, [pc, #104] ; (55a4 ) 553a: 1cf0 adds r0, r6, #3 553c: f008 fb4a bl dbd4 5540: 2800 cmp r0, #0 5542: d1eb bne.n 551c if (bpb->bytesPerSectorShift != m_bytesPerSectorShift) { 5544: f896 306c ldrb.w r3, [r6, #108] ; 0x6c 5548: 2b09 cmp r3, #9 554a: d1e7 bne.n 551c m_fatStartSector = volStart + getLe32(bpb->fatOffset); 554c: 6d33 ldr r3, [r6, #80] ; 0x50 bitmapFind(0, 1); 554e: 4601 mov r1, r0 m_fatStartSector = volStart + getLe32(bpb->fatOffset); 5550: 442b add r3, r5 5552: f8c4 3424 str.w r3, [r4, #1060] ; 0x424 5556: 6d73 ldr r3, [r6, #84] ; 0x54 m_fatLength = getLe32(bpb->fatLength); 5558: f8c4 3428 str.w r3, [r4, #1064] ; 0x428 m_clusterHeapStartSector = volStart + getLe32(bpb->clusterHeapOffset); 555c: 6db3 ldr r3, [r6, #88] ; 0x58 555e: 442b add r3, r5 m_bytesPerCluster = 1UL << (m_bytesPerSectorShift + m_sectorsPerClusterShift); 5560: 2501 movs r5, #1 m_clusterHeapStartSector = volStart + getLe32(bpb->clusterHeapOffset); 5562: f8c4 342c str.w r3, [r4, #1068] ; 0x42c 5566: 6df3 ldr r3, [r6, #92] ; 0x5c m_clusterCount = getLe32(bpb->clusterCount); 5568: f8c4 3430 str.w r3, [r4, #1072] ; 0x430 556c: 6e33 ldr r3, [r6, #96] ; 0x60 m_rootDirectoryCluster = getLe32(bpb->rootDirectoryCluster); 556e: f8c4 3434 str.w r3, [r4, #1076] ; 0x434 m_sectorsPerClusterShift = bpb->sectorsPerClusterShift; 5572: f896 206d ldrb.w r2, [r6, #109] ; 0x6d m_bitmapStart = 0; 5576: f8c4 0420 str.w r0, [r4, #1056] ; 0x420 bitmapFind(0, 1); 557a: 4620 mov r0, r4 m_bytesPerCluster = 1UL << (m_bytesPerSectorShift + m_sectorsPerClusterShift); 557c: f102 0309 add.w r3, r2, #9 m_sectorsPerClusterShift = bpb->sectorsPerClusterShift; 5580: f884 2445 strb.w r2, [r4, #1093] ; 0x445 m_bytesPerCluster = 1UL << (m_bytesPerSectorShift + m_sectorsPerClusterShift); 5584: fa05 f303 lsl.w r3, r5, r3 m_clusterMask = m_bytesPerCluster - 1; 5588: 1e5a subs r2, r3, #1 m_bytesPerCluster = 1UL << (m_bytesPerSectorShift + m_sectorsPerClusterShift); 558a: f8c4 343c str.w r3, [r4, #1084] ; 0x43c m_clusterMask = m_bytesPerCluster - 1; 558e: f8c4 2438 str.w r2, [r4, #1080] ; 0x438 bitmapFind(0, 1); 5592: 462a mov r2, r5 5594: f7ff fd86 bl 50a4 m_fatType = FAT_TYPE_EXFAT; 5598: 2340 movs r3, #64 ; 0x40 return true; 559a: 4628 mov r0, r5 m_fatType = FAT_TYPE_EXFAT; 559c: f884 3444 strb.w r3, [r4, #1092] ; 0x444 } 55a0: bdf8 pop {r3, r4, r5, r6, r7, pc} 55a2: bf00 nop 55a4: 20000850 .word 0x20000850 000055a8 : fail: return false; } //------------------------------------------------------------------------------ uint32_t ExFatPartition::rootLength() { 55a8: b510 push {r4, lr} 55aa: 4604 mov r4, r0 uint32_t nc = chainSize(m_rootDirectoryCluster); 55ac: f8d0 1434 ldr.w r1, [r0, #1076] ; 0x434 55b0: f7ff fe2e bl 5210 return m_bytesPerSectorShift + m_sectorsPerClusterShift; 55b4: f894 3445 ldrb.w r3, [r4, #1093] ; 0x445 55b8: 3309 adds r3, #9 return nc << bytesPerClusterShift(); 55ba: b2db uxtb r3, r3 } 55bc: 4098 lsls r0, r3 55be: bd10 pop {r4, pc} 000055c0 : fail: m_curCluster = tmp; return false; } //------------------------------------------------------------------------------ bool FatFile::sync() { 55c0: b570 push {r4, r5, r6, lr} uint16_t date, time; uint8_t ms10; if (!isOpen()) { return true; } if (m_flags & FILE_FLAG_DIR_DIRTY) { 55c2: f990 3002 ldrsb.w r3, [r0, #2] bool FatFile::sync() { 55c6: b082 sub sp, #8 55c8: 4604 mov r4, r0 if (m_flags & FILE_FLAG_DIR_DIRTY) { 55ca: 2b00 cmp r3, #0 55cc: db0d blt.n 55ea setLe16(dir->modifyTime, time); } // clear directory dirty m_flags &= ~FILE_FLAG_DIR_DIRTY; } if (m_vol->cacheSync()) { 55ce: 68a5 ldr r5, [r4, #8] uint8_t* fatCachePrepare(uint32_t sector, uint8_t options) { if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; return m_fatCache.prepare(sector, options); } bool cacheSync() { return m_cache.sync() && m_fatCache.sync() && syncDevice(); 55d0: f105 0028 add.w r0, r5, #40 ; 0x28 55d4: f004 fe28 bl a228 55d8: 2800 cmp r0, #0 55da: d13b bne.n 5654 return true; } DBG_FAIL_MACRO; fail: m_error |= WRITE_ERROR; 55dc: 7863 ldrb r3, [r4, #1] return false; 55de: 2000 movs r0, #0 m_error |= WRITE_ERROR; 55e0: f043 0301 orr.w r3, r3, #1 55e4: 7063 strb r3, [r4, #1] } 55e6: b002 add sp, #8 55e8: bd70 pop {r4, r5, r6, pc} bool cacheSync() { return m_cache.sync() && syncDevice(); } #endif // USE_SEPARATE_FAT_CACHE uint8_t* dataCachePrepare(uint32_t sector, uint8_t options) { return m_cache.prepare(sector, options); 55ea: 6880 ldr r0, [r0, #8] 55ec: 2201 movs r2, #1 55ee: 69a1 ldr r1, [r4, #24] 55f0: 3028 adds r0, #40 ; 0x28 55f2: f004 fe45 bl a280 if (!dir) { 55f6: 2800 cmp r0, #0 55f8: d0f0 beq.n 55dc return dir + (m_dirIndex & 0XF); 55fa: 88a5 ldrh r5, [r4, #4] 55fc: f005 050f and.w r5, r5, #15 5600: 016b lsls r3, r5, #5 5602: eb00 1545 add.w r5, r0, r5, lsl #5 if (!dir || dir->name[0] == FAT_NAME_DELETED) { 5606: 5cc3 ldrb r3, [r0, r3] 5608: 2be5 cmp r3, #229 ; 0xe5 560a: d0e7 beq.n 55dc if (isFile()) { 560c: 7823 ldrb r3, [r4, #0] 560e: 071b lsls r3, r3, #28 5610: d501 bpl.n 5616 setLe32(dir->fileSize, m_fileSize); 5612: 69e3 ldr r3, [r4, #28] *reinterpret_cast(dst) = src; 5614: 61eb str r3, [r5, #28] setLe16(dir->firstClusterLow, m_firstCluster & 0XFFFF); 5616: 6a23 ldr r3, [r4, #32] if (FsDateTime::callback) { 5618: 4915 ldr r1, [pc, #84] ; (5670 ) setLe16(dir->firstClusterHigh, m_firstCluster >> 16); 561a: 0c1a lsrs r2, r3, #16 setLe16(dir->firstClusterLow, m_firstCluster & 0XFFFF); 561c: 836b strh r3, [r5, #26] if (FsDateTime::callback) { 561e: 680e ldr r6, [r1, #0] setLe16(dir->firstClusterHigh, m_firstCluster >> 16); 5620: 82aa strh r2, [r5, #20] if (FsDateTime::callback) { 5622: b166 cbz r6, 563e FsDateTime::callback(&date, &time, &ms10); 5624: f10d 0203 add.w r2, sp, #3 5628: f10d 0106 add.w r1, sp, #6 562c: a801 add r0, sp, #4 562e: 47b0 blx r6 setLe16(dir->modifyDate, date); 5630: f8bd 3004 ldrh.w r3, [sp, #4] *reinterpret_cast(dst) = src; 5634: f8bd 2006 ldrh.w r2, [sp, #6] 5638: 832b strh r3, [r5, #24] 563a: 826b strh r3, [r5, #18] 563c: 82ea strh r2, [r5, #22] m_flags &= ~FILE_FLAG_DIR_DIRTY; 563e: 78a3 ldrb r3, [r4, #2] if (m_vol->cacheSync()) { 5640: 68a5 ldr r5, [r4, #8] m_flags &= ~FILE_FLAG_DIR_DIRTY; 5642: f003 037f and.w r3, r3, #127 ; 0x7f return m_cache.sync() && m_fatCache.sync() && syncDevice(); 5646: f105 0028 add.w r0, r5, #40 ; 0x28 564a: 70a3 strb r3, [r4, #2] 564c: f004 fdec bl a228 5650: 2800 cmp r0, #0 5652: d0c3 beq.n 55dc 5654: f505 700e add.w r0, r5, #568 ; 0x238 5658: f004 fde6 bl a228 565c: 2800 cmp r0, #0 565e: d0bd beq.n 55dc 5660: 6828 ldr r0, [r5, #0] return m_blockDev->syncDevice(); 5662: 6803 ldr r3, [r0, #0] 5664: 6a1b ldr r3, [r3, #32] 5666: 4798 blx r3 return m_cache.sync() && m_fatCache.sync() && syncDevice(); 5668: 2800 cmp r0, #0 566a: d0b7 beq.n 55dc 566c: e7bb b.n 55e6 566e: bf00 nop 5670: 2000244c .word 0x2000244c 00005674 : uint32_t cc = m_curCluster; 5674: 4602 mov r2, r0 bool FatFile::addCluster() { 5676: b538 push {r3, r4, r5, lr} uint32_t cc = m_curCluster; 5678: f852 5f10 ldr.w r5, [r2, #16]! bool FatFile::addCluster() { 567c: 4604 mov r4, r0 if (!m_vol->allocateCluster(m_curCluster, &m_curCluster)) { 567e: 6880 ldr r0, [r0, #8] 5680: 4629 mov r1, r5 5682: f002 f921 bl 78c8 5686: b150 cbz r0, 569e if (cc == 0) { 5688: b155 cbz r5, 56a0 } else if (m_curCluster != (cc + 1)) { 568a: 6923 ldr r3, [r4, #16] 568c: 3501 adds r5, #1 568e: 42ab cmp r3, r5 m_flags &= ~FILE_FLAG_CONTIGUOUS; 5690: 78a3 ldrb r3, [r4, #2] 5692: bf18 it ne 5694: f003 03bf andne.w r3, r3, #191 ; 0xbf m_flags |= FILE_FLAG_DIR_DIRTY; 5698: f063 037f orn r3, r3, #127 ; 0x7f 569c: 70a3 strb r3, [r4, #2] } 569e: bd38 pop {r3, r4, r5, pc} m_flags |= FILE_FLAG_CONTIGUOUS; 56a0: 78a3 ldrb r3, [r4, #2] 56a2: f043 0340 orr.w r3, r3, #64 ; 0x40 56a6: e7f7 b.n 5698 000056a8 : bool FatFile::addDirCluster() { 56a8: b5f8 push {r3, r4, r5, r6, r7, lr} if (isRootFixed()) { 56aa: 7804 ldrb r4, [r0, #0] 56ac: f014 0420 ands.w r4, r4, #32 56b0: d104 bne.n 56bc if (m_curPosition >= 512UL*4095) { 56b2: 4b1a ldr r3, [pc, #104] ; (571c ) 56b4: 4605 mov r5, r0 56b6: 6942 ldr r2, [r0, #20] 56b8: 429a cmp r2, r3 56ba: d302 bcc.n 56c2 return false; 56bc: 2700 movs r7, #0 } 56be: 4638 mov r0, r7 56c0: bdf8 pop {r3, r4, r5, r6, r7, pc} if (!addCluster()) { 56c2: f7ff ffd7 bl 5674 56c6: 4607 mov r7, r0 56c8: 2800 cmp r0, #0 56ca: d0f7 beq.n 56bc sector = m_vol->clusterStartSector(m_curCluster); 56cc: 68a8 ldr r0, [r5, #8] bool allocContiguous(uint32_t count, uint32_t* firstCluster); uint8_t sectorOfCluster(uint32_t position) const { return (position >> 9) & m_clusterSectorMask; } uint32_t clusterStartSector(uint32_t cluster) const { return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 56ce: 692e ldr r6, [r5, #16] 56d0: 7982 ldrb r2, [r0, #6] 56d2: 3e02 subs r6, #2 56d4: 6941 ldr r1, [r0, #20] 56d6: 4096 lsls r6, r2 56d8: 440e add r6, r1 for (uint8_t i = 0; i < m_vol->sectorsPerCluster(); i++) { 56da: 7901 ldrb r1, [r0, #4] 56dc: b1a9 cbz r1, 570a 56de: 4621 mov r1, r4 56e0: e006 b.n 56f0 memset(pc, 0, m_vol->bytesPerSector()); 56e2: f008 fa25 bl db30 for (uint8_t i = 0; i < m_vol->sectorsPerCluster(); i++) { 56e6: 68a8 ldr r0, [r5, #8] 56e8: b2e1 uxtb r1, r4 56ea: 7902 ldrb r2, [r0, #4] 56ec: 428a cmp r2, r1 56ee: d90b bls.n 5708 return m_cache.prepare(sector, options); 56f0: 4431 add r1, r6 56f2: 2205 movs r2, #5 56f4: 3028 adds r0, #40 ; 0x28 56f6: 3401 adds r4, #1 56f8: f004 fdc2 bl a280 memset(pc, 0, m_vol->bytesPerSector()); 56fc: f44f 7200 mov.w r2, #512 ; 0x200 5700: 2100 movs r1, #0 if (!pc) { 5702: 2800 cmp r0, #0 5704: d1ed bne.n 56e2 5706: e7d9 b.n 56bc return m_bytesPerSector << m_sectorsPerClusterShift; 5708: 7982 ldrb r2, [r0, #6] 570a: f44f 7300 mov.w r3, #512 ; 0x200 m_curPosition += m_vol->bytesPerCluster(); 570e: 6969 ldr r1, [r5, #20] } 5710: 4638 mov r0, r7 5712: 4093 lsls r3, r2 m_curPosition += m_vol->bytesPerCluster(); 5714: fa11 f383 uxtah r3, r1, r3 5718: 616b str r3, [r5, #20] } 571a: bdf8 pop {r3, r4, r5, r6, r7, pc} 571c: 001ffe00 .word 0x001ffe00 00005720 : DirFat_t* FatFile::cacheDirEntry(uint8_t action) { 5720: b510 push {r4, lr} 5722: 4604 mov r4, r0 return m_cache.prepare(sector, options); 5724: 6880 ldr r0, [r0, #8] 5726: 460a mov r2, r1 5728: 3028 adds r0, #40 ; 0x28 572a: 69a1 ldr r1, [r4, #24] 572c: f004 fda8 bl a280 if (!dir) { 5730: b120 cbz r0, 573c return dir + (m_dirIndex & 0XF); 5732: 88a3 ldrh r3, [r4, #4] 5734: f003 030f and.w r3, r3, #15 5738: eb00 1043 add.w r0, r0, r3, lsl #5 } 573c: bd10 pop {r4, pc} 573e: bf00 nop 00005740 : bool FatFile::close() { 5740: b510 push {r4, lr} if (!isOpen()) { 5742: 7803 ldrb r3, [r0, #0] bool FatFile::close() { 5744: 4604 mov r4, r0 if (!isOpen()) { 5746: b12b cbz r3, 5754 5748: f7ff ff3a bl 55c0 m_attributes = FILE_ATTR_CLOSED; 574c: 2300 movs r3, #0 574e: 7023 strb r3, [r4, #0] m_flags = 0; 5750: 70a3 strb r3, [r4, #2] } 5752: bd10 pop {r4, pc} m_attributes = FILE_ATTR_CLOSED; 5754: 2300 movs r3, #0 return true; 5756: 2001 movs r0, #1 m_attributes = FILE_ATTR_CLOSED; 5758: 7023 strb r3, [r4, #0] m_flags = 0; 575a: 70a3 strb r3, [r4, #2] } 575c: bd10 pop {r4, pc} 575e: bf00 nop 00005760 : bool FatFile::dirEntry(DirFat_t* dst) { 5760: b538 push {r3, r4, r5, lr} if (!isOpen()) { 5762: 7803 ldrb r3, [r0, #0] bool FatFile::dirEntry(DirFat_t* dst) { 5764: 4605 mov r5, r0 5766: 460c mov r4, r1 if (!isOpen()) { 5768: b113 cbz r3, 5770 576a: f7ff ff29 bl 55c0 if (!sync()) { 576e: b1f0 cbz r0, 57ae 5770: 68a8 ldr r0, [r5, #8] 5772: 2200 movs r2, #0 5774: 69a9 ldr r1, [r5, #24] 5776: 3028 adds r0, #40 ; 0x28 5778: f004 fd82 bl a280 if (!dir) { 577c: b1b8 cbz r0, 57ae return dir + (m_dirIndex & 0XF); 577e: 88aa ldrh r2, [r5, #4] 5780: f002 020f and.w r2, r2, #15 5784: eb00 1342 add.w r3, r0, r2, lsl #5 5788: 0152 lsls r2, r2, #5 memcpy(dst, dir, sizeof(DirFat_t)); 578a: 685d ldr r5, [r3, #4] 578c: 5880 ldr r0, [r0, r2] 578e: 6899 ldr r1, [r3, #8] 5790: 68da ldr r2, [r3, #12] 5792: 6020 str r0, [r4, #0] 5794: 6065 str r5, [r4, #4] 5796: 60a1 str r1, [r4, #8] 5798: 60e2 str r2, [r4, #12] 579a: 6918 ldr r0, [r3, #16] 579c: 695d ldr r5, [r3, #20] 579e: 6999 ldr r1, [r3, #24] 57a0: 69da ldr r2, [r3, #28] 57a2: 6120 str r0, [r4, #16] return true; 57a4: 2001 movs r0, #1 memcpy(dst, dir, sizeof(DirFat_t)); 57a6: 6165 str r5, [r4, #20] 57a8: 61a1 str r1, [r4, #24] 57aa: 61e2 str r2, [r4, #28] } 57ac: bd38 pop {r3, r4, r5, pc} return false; 57ae: 2000 movs r0, #0 } 57b0: bd38 pop {r3, r4, r5, pc} 57b2: bf00 nop 000057b4 : bool FatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { 57b4: b530 push {r4, r5, lr} 57b6: b089 sub sp, #36 ; 0x24 57b8: 460d mov r5, r1 57ba: 4614 mov r4, r2 if (!dirEntry(&dir)) { 57bc: 4669 mov r1, sp 57be: f7ff ffcf bl 5760 57c2: b128 cbz r0, 57d0 *pdate = getLe16(dir.createDate); 57c4: f8bd 2010 ldrh.w r2, [sp, #16] *ptime = getLe16(dir.createTime); 57c8: f8bd 300e ldrh.w r3, [sp, #14] *pdate = getLe16(dir.createDate); 57cc: 802a strh r2, [r5, #0] *ptime = getLe16(dir.createTime); 57ce: 8023 strh r3, [r4, #0] } 57d0: b009 add sp, #36 ; 0x24 57d2: bd30 pop {r4, r5, pc} 000057d4 : bool FatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { 57d4: b530 push {r4, r5, lr} 57d6: b089 sub sp, #36 ; 0x24 57d8: 460d mov r5, r1 57da: 4614 mov r4, r2 if (!dirEntry(&dir)) { 57dc: 4669 mov r1, sp 57de: f7ff ffbf bl 5760 57e2: b128 cbz r0, 57f0 *pdate = getLe16(dir.modifyDate); 57e4: f8bd 2018 ldrh.w r2, [sp, #24] *ptime = getLe16(dir.modifyTime); 57e8: f8bd 3016 ldrh.w r3, [sp, #22] *pdate = getLe16(dir.modifyDate); 57ec: 802a strh r2, [r5, #0] *ptime = getLe16(dir.modifyTime); 57ee: 8023 strh r3, [r4, #0] } 57f0: b009 add sp, #36 ; 0x24 57f2: bd30 pop {r4, r5, pc} 000057f4 : if (!parent->isDir()) { 57f4: 780b ldrb r3, [r1, #0] 57f6: f013 0f70 tst.w r3, #112 ; 0x70 57fa: d101 bne.n 5800 } 57fc: 2000 movs r0, #0 57fe: 4770 bx lr bool FatFile::mkdir(FatFile* parent, FatName_t* fname) { 5800: b5f0 push {r4, r5, r6, r7, lr} if (!open(parent, fname, O_CREAT | O_EXCL | O_RDWR)) { 5802: f640 2302 movw r3, #2562 ; 0xa02 bool FatFile::mkdir(FatFile* parent, FatName_t* fname) { 5806: b089 sub sp, #36 ; 0x24 5808: 460d mov r5, r1 580a: 4604 mov r4, r0 if (!open(parent, fname, O_CREAT | O_EXCL | O_RDWR)) { 580c: f001 f8f0 bl 69f0 5810: b138 cbz r0, 5822 m_flags = FILE_FLAG_READ; 5812: 2201 movs r2, #1 m_attributes = FILE_ATTR_SUBDIR; 5814: 2310 movs r3, #16 if (!addDirCluster()) { 5816: 4620 mov r0, r4 m_flags = FILE_FLAG_READ; 5818: 70a2 strb r2, [r4, #2] m_attributes = FILE_ATTR_SUBDIR; 581a: 7023 strb r3, [r4, #0] if (!addDirCluster()) { 581c: f7ff ff44 bl 56a8 5820: b910 cbnz r0, 5828 } 5822: 2000 movs r0, #0 5824: b009 add sp, #36 ; 0x24 5826: bdf0 pop {r4, r5, r6, r7, pc} m_firstCluster = m_curCluster; 5828: 6922 ldr r2, [r4, #16] if (!isOpen()) { 582a: 7823 ldrb r3, [r4, #0] m_firstCluster = m_curCluster; 582c: 6222 str r2, [r4, #32] if (!isOpen()) { 582e: b16b cbz r3, 584c if (pos == m_curPosition) { 5830: 6963 ldr r3, [r4, #20] 5832: b133 cbz r3, 5842 m_flags &= ~FILE_FLAG_PREALLOCATE; 5834: 78a3 ldrb r3, [r4, #2] m_curCluster = 0; 5836: 2200 movs r2, #0 m_flags &= ~FILE_FLAG_PREALLOCATE; 5838: f023 0320 bic.w r3, r3, #32 m_curPosition = pos; 583c: e9c4 2204 strd r2, r2, [r4, #16] m_flags &= ~FILE_FLAG_PREALLOCATE; 5840: 70a3 strb r3, [r4, #2] if (!isOpen()) { 5842: 4620 mov r0, r4 5844: f7ff febc bl 55c0 if (!sync()) { 5848: 2800 cmp r0, #0 584a: d0ea beq.n 5822 584c: 68a0 ldr r0, [r4, #8] 584e: 2201 movs r2, #1 5850: 69a1 ldr r1, [r4, #24] 5852: 3028 adds r0, #40 ; 0x28 5854: f004 fd14 bl a280 if (!dir) { 5858: 2800 cmp r0, #0 585a: d0e2 beq.n 5822 return dir + (m_dirIndex & 0XF); 585c: f8b4 c004 ldrh.w ip, [r4, #4] dir->attributes = FAT_ATTRIB_DIRECTORY; 5860: 2210 movs r2, #16 return dir + (m_dirIndex & 0XF); 5862: f00c 0c0f and.w ip, ip, #15 5866: ea4f 134c mov.w r3, ip, lsl #5 586a: eb00 1c4c add.w ip, r0, ip, lsl #5 dir->attributes = FAT_ATTRIB_DIRECTORY; 586e: f88c 200b strb.w r2, [ip, #11] memcpy(&dot, dir, sizeof(dot)); 5872: 58c0 ldr r0, [r0, r3] sector = m_vol->clusterStartSector(m_firstCluster); 5874: 68a7 ldr r7, [r4, #8] return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 5876: 6a23 ldr r3, [r4, #32] 5878: f897 e006 ldrb.w lr, [r7, #6] 587c: 1e9e subs r6, r3, #2 memcpy(&dot, dir, sizeof(dot)); 587e: f8dc 1004 ldr.w r1, [ip, #4] 5882: f8dc 2008 ldr.w r2, [ip, #8] 5886: f8dc 300c ldr.w r3, [ip, #12] 588a: fa06 f60e lsl.w r6, r6, lr 588e: 46ee mov lr, sp 5890: e8ae 000f stmia.w lr!, {r0, r1, r2, r3} 5894: f8dc 0010 ldr.w r0, [ip, #16] 5898: f8dc 1014 ldr.w r1, [ip, #20] 589c: f8dc 2018 ldr.w r2, [ip, #24] 58a0: f8dc 301c ldr.w r3, [ip, #28] 58a4: e8ae 000f stmia.w lr!, {r0, r1, r2, r3} return m_cache.prepare(sector, options); 58a8: 697b ldr r3, [r7, #20] 58aa: f107 0028 add.w r0, r7, #40 ; 0x28 58ae: 2201 movs r2, #1 58b0: 18f1 adds r1, r6, r3 dot.name[i] = ' '; 58b2: f04f 3320 mov.w r3, #538976288 ; 0x20202020 58b6: f8cd 3001 str.w r3, [sp, #1] 58ba: f8cd 3005 str.w r3, [sp, #5] 58be: f8ad 3009 strh.w r3, [sp, #9] 58c2: f004 fcdd bl a280 if (!dir) { 58c6: 4684 mov ip, r0 58c8: 2800 cmp r0, #0 58ca: d0aa beq.n 5822 memcpy(&dir[0], &dot, sizeof(dot)); 58cc: 272e movs r7, #46 ; 0x2e 58ce: 46ee mov lr, sp 58d0: f88d 7000 strb.w r7, [sp] memcpy(&dir[1], &dot, sizeof(dot)); 58d4: 4676 mov r6, lr memcpy(&dir[0], &dot, sizeof(dot)); 58d6: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 58da: f8cc 0000 str.w r0, [ip] 58de: f8cc 1004 str.w r1, [ip, #4] 58e2: f8cc 2008 str.w r2, [ip, #8] 58e6: f8cc 300c str.w r3, [ip, #12] dot.name[1] = '.'; 58ea: f88d 7001 strb.w r7, [sp, #1] memcpy(&dir[0], &dot, sizeof(dot)); 58ee: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 58f2: f8cc 0010 str.w r0, [ip, #16] 58f6: f8cc 1014 str.w r1, [ip, #20] 58fa: f8cc 2018 str.w r2, [ip, #24] 58fe: f8cc 301c str.w r3, [ip, #28] setLe16(dot.firstClusterLow, parent->m_firstCluster & 0XFFFF); 5902: 6a2b ldr r3, [r5, #32] setLe16(dot.firstClusterHigh, parent->m_firstCluster >> 16); 5904: 0c1a lsrs r2, r3, #16 setLe16(dot.firstClusterLow, parent->m_firstCluster & 0XFFFF); 5906: f8ad 301a strh.w r3, [sp, #26] setLe16(dot.firstClusterHigh, parent->m_firstCluster >> 16); 590a: f8ad 2014 strh.w r2, [sp, #20] memcpy(&dir[1], &dot, sizeof(dot)); 590e: ce0f ldmia r6!, {r0, r1, r2, r3} 5910: f8cc 0020 str.w r0, [ip, #32] 5914: f8cc 1024 str.w r1, [ip, #36] ; 0x24 5918: f8cc 2028 str.w r2, [ip, #40] ; 0x28 591c: f8cc 302c str.w r3, [ip, #44] ; 0x2c 5920: ce0f ldmia r6!, {r0, r1, r2, r3} 5922: f8cc 0030 str.w r0, [ip, #48] ; 0x30 5926: f8cc 1034 str.w r1, [ip, #52] ; 0x34 592a: f8cc 2038 str.w r2, [ip, #56] ; 0x38 592e: f8cc 303c str.w r3, [ip, #60] ; 0x3c return m_vol->cacheSync(); 5932: 68a4 ldr r4, [r4, #8] return m_cache.sync() && m_fatCache.sync() && syncDevice(); 5934: f104 0028 add.w r0, r4, #40 ; 0x28 5938: f004 fc76 bl a228 593c: 2800 cmp r0, #0 593e: f43f af70 beq.w 5822 5942: f504 700e add.w r0, r4, #568 ; 0x238 5946: f004 fc6f bl a228 594a: 2800 cmp r0, #0 594c: f43f af69 beq.w 5822 5950: 6820 ldr r0, [r4, #0] return m_blockDev->syncDevice(); 5952: 6803 ldr r3, [r0, #0] 5954: 6a1b ldr r3, [r3, #32] } 5956: b009 add sp, #36 ; 0x24 5958: e8bd 40f0 ldmia.w sp!, {r4, r5, r6, r7, lr} 595c: 4718 bx r3 595e: bf00 nop 00005960 : bool FatFile::mkdir(FatFile* parent, const char* path, bool pFlag) { 5960: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} class FsName { 5964: 2600 movs r6, #0 5966: b094 sub sp, #80 ; 0x50 5968: 4698 mov r8, r3 if (isOpen() || !parent->isDir()) { 596a: 7803 ldrb r3, [r0, #0] bool FatFile::mkdir(FatFile* parent, const char* path, bool pFlag) { 596c: 9201 str r2, [sp, #4] 596e: f8ad 6014 strh.w r6, [sp, #20] 5972: 960b str r6, [sp, #44] ; 0x2c if (isOpen() || !parent->isDir()) { 5974: 2b00 cmp r3, #0 5976: d141 bne.n 59fc 5978: 780b ldrb r3, [r1, #0] 597a: 460d mov r5, r1 597c: f013 0f70 tst.w r3, #112 ; 0x70 5980: d03c beq.n 59fc if (isDirSeparator(*path)) { 5982: 7813 ldrb r3, [r2, #0] 5984: 4604 mov r4, r0 5986: 4616 mov r6, r2 5988: 2b2f cmp r3, #47 ; 0x2f 598a: d03b beq.n 5a04 if (!open(parent, &fname, O_RDONLY)) { 598c: 2700 movs r7, #0 598e: e028 b.n 59e2 if (!*path) { 5990: 9e01 ldr r6, [sp, #4] 5992: 7836 ldrb r6, [r6, #0] 5994: 2e00 cmp r6, #0 5996: d050 beq.n 5a3a if (!open(parent, &fname, O_RDONLY)) { 5998: f001 f82a bl 69f0 599c: 4603 mov r3, r0 if (!pFlag || !mkdir(parent, &fname)) { 599e: aa02 add r2, sp, #8 59a0: 4629 mov r1, r5 59a2: 4620 mov r0, r4 if (!open(parent, &fname, O_RDONLY)) { 59a4: b92b cbnz r3, 59b2 if (!pFlag || !mkdir(parent, &fname)) { 59a6: f1b8 0f00 cmp.w r8, #0 59aa: d027 beq.n 59fc 59ac: f7ff ff22 bl 57f4 59b0: b320 cbz r0, 59fc tmpDir = *this; 59b2: 46a6 mov lr, r4 59b4: f10d 0c2c add.w ip, sp, #44 ; 0x2c 59b8: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 59bc: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 59c0: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 59c4: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 59c8: f8de 5000 ldr.w r5, [lr] 59cc: 4620 mov r0, r4 if (!isOpen()) { 59ce: 7823 ldrb r3, [r4, #0] tmpDir = *this; 59d0: f8cc 5000 str.w r5, [ip] if (!isOpen()) { 59d4: b10b cbz r3, 59da 59d6: f7ff fdf3 bl 55c0 if (!parsePathName(path, &fname, &path)) { 59da: 9e01 ldr r6, [sp, #4] parent = &tmpDir; 59dc: ad0b add r5, sp, #44 ; 0x2c m_attributes = FILE_ATTR_CLOSED; 59de: 7027 strb r7, [r4, #0] m_flags = 0; 59e0: 70a7 strb r7, [r4, #2] if (!parsePathName(path, &fname, &path)) { 59e2: 4631 mov r1, r6 59e4: ab01 add r3, sp, #4 59e6: aa02 add r2, sp, #8 59e8: 4620 mov r0, r4 59ea: f001 f94d bl 6c88 59ee: 4606 mov r6, r0 if (!open(parent, &fname, O_RDONLY)) { 59f0: aa02 add r2, sp, #8 59f2: 4629 mov r1, r5 59f4: 2300 movs r3, #0 59f6: 4620 mov r0, r4 if (!parsePathName(path, &fname, &path)) { 59f8: 2e00 cmp r6, #0 59fa: d1c9 bne.n 5990 switch (vol->fatType()) { 59fc: 2000 movs r0, #0 } 59fe: b014 add sp, #80 ; 0x50 5a00: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} path++; 5a04: 3601 adds r6, #1 5a06: 9601 str r6, [sp, #4] while (isDirSeparator(*path)) { 5a08: 7833 ldrb r3, [r6, #0] 5a0a: 2b2f cmp r3, #47 ; 0x2f 5a0c: d0fa beq.n 5a04 if (!tmpDir.openRoot(parent->m_vol)) { 5a0e: 68ad ldr r5, [r5, #8] memset(this, 0, sizeof(FatFile)); 5a10: 2224 movs r2, #36 ; 0x24 5a12: 2100 movs r1, #0 5a14: a80b add r0, sp, #44 ; 0x2c 5a16: f008 f88b bl db30 m_vol = vol; 5a1a: 950d str r5, [sp, #52] ; 0x34 return m_fatType; 5a1c: 79eb ldrb r3, [r5, #7] switch (vol->fatType()) { 5a1e: 2b10 cmp r3, #16 5a20: d003 beq.n 5a2a 5a22: 2b20 cmp r3, #32 5a24: d00f beq.n 5a46 5a26: 2b0c cmp r3, #12 5a28: d1e8 bne.n 59fc 5a2a: 2320 movs r3, #32 m_attributes = FILE_ATTR_ROOT_FIXED; 5a2c: f88d 302c strb.w r3, [sp, #44] ; 0x2c m_flags = FILE_FLAG_READ; 5a30: 2301 movs r3, #1 parent = &tmpDir; 5a32: ad0b add r5, sp, #44 ; 0x2c m_flags = FILE_FLAG_READ; 5a34: f88d 302e strb.w r3, [sp, #46] ; 0x2e return true; 5a38: e7a8 b.n 598c return mkdir(parent, &fname); 5a3a: aa02 add r2, sp, #8 5a3c: f7ff feda bl 57f4 } 5a40: b014 add sp, #80 ; 0x50 5a42: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} switch (vol->fatType()) { 5a46: 2340 movs r3, #64 ; 0x40 5a48: e7f0 b.n 5a2c 5a4a: bf00 nop 00005a4c : bool FatFile::open(FatFile* dirFile, const char* path, oflag_t oflag) { 5a4c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 5a50: 2500 movs r5, #0 5a52: b094 sub sp, #80 ; 0x50 5a54: 4698 mov r8, r3 if (isOpen() || !dirFile->isDir()) { 5a56: 7803 ldrb r3, [r0, #0] bool FatFile::open(FatFile* dirFile, const char* path, oflag_t oflag) { 5a58: 9201 str r2, [sp, #4] 5a5a: 9502 str r5, [sp, #8] 5a5c: f8ad 5038 strh.w r5, [sp, #56] ; 0x38 if (isOpen() || !dirFile->isDir()) { 5a60: 2b00 cmp r3, #0 5a62: d137 bne.n 5ad4 5a64: 780b ldrb r3, [r1, #0] 5a66: 460e mov r6, r1 5a68: f013 0f70 tst.w r3, #112 ; 0x70 5a6c: d032 beq.n 5ad4 if (isDirSeparator(*path)) { 5a6e: 7813 ldrb r3, [r2, #0] 5a70: 4604 mov r4, r0 5a72: 4615 mov r5, r2 5a74: 2b2f cmp r3, #47 ; 0x2f 5a76: d031 beq.n 5adc if (!open(dirFile, &fname, O_RDONLY)) { 5a78: 2700 movs r7, #0 5a7a: e01e b.n 5aba if (*path == 0) { 5a7c: 9d01 ldr r5, [sp, #4] 5a7e: 782d ldrb r5, [r5, #0] 5a80: 2d00 cmp r5, #0 5a82: d040 beq.n 5b06 if (!open(dirFile, &fname, O_RDONLY)) { 5a84: f000 ffb4 bl 69f0 tmpDir = *this; 5a88: 46a6 mov lr, r4 5a8a: f10d 0c08 add.w ip, sp, #8 if (!open(dirFile, &fname, O_RDONLY)) { 5a8e: b308 cbz r0, 5ad4 dirFile = &tmpDir; 5a90: 4666 mov r6, ip if (!isOpen()) { 5a92: 7825 ldrb r5, [r4, #0] tmpDir = *this; 5a94: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 5a98: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 5a9c: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 5aa0: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 5aa4: f8de 3000 ldr.w r3, [lr] 5aa8: 4620 mov r0, r4 5aaa: f8cc 3000 str.w r3, [ip] if (!isOpen()) { 5aae: b10d cbz r5, 5ab4 5ab0: f7ff fd86 bl 55c0 if (!parsePathName(path, &fname, &path)) { 5ab4: 9d01 ldr r5, [sp, #4] m_attributes = FILE_ATTR_CLOSED; 5ab6: 7027 strb r7, [r4, #0] m_flags = 0; 5ab8: 70a7 strb r7, [r4, #2] if (!parsePathName(path, &fname, &path)) { 5aba: 4629 mov r1, r5 5abc: ab01 add r3, sp, #4 5abe: aa0b add r2, sp, #44 ; 0x2c 5ac0: 4620 mov r0, r4 5ac2: f001 f8e1 bl 6c88 5ac6: 4605 mov r5, r0 if (!open(dirFile, &fname, O_RDONLY)) { 5ac8: aa0b add r2, sp, #44 ; 0x2c 5aca: 4631 mov r1, r6 5acc: 2300 movs r3, #0 5ace: 4620 mov r0, r4 if (!parsePathName(path, &fname, &path)) { 5ad0: 2d00 cmp r5, #0 5ad2: d1d3 bne.n 5a7c return false; 5ad4: 2000 movs r0, #0 } 5ad6: b014 add sp, #80 ; 0x50 5ad8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} path++; 5adc: 3501 adds r5, #1 5ade: 9501 str r5, [sp, #4] while (isDirSeparator(*path)) { 5ae0: 7829 ldrb r1, [r5, #0] 5ae2: 292f cmp r1, #47 ; 0x2f 5ae4: d0fa beq.n 5adc if (*path == 0) { 5ae6: b9a9 cbnz r1, 5b14 return openRoot(dirFile->m_vol); 5ae8: 68b5 ldr r5, [r6, #8] memset(this, 0, sizeof(FatFile)); 5aea: 2224 movs r2, #36 ; 0x24 5aec: 4620 mov r0, r4 5aee: f008 f81f bl db30 m_vol = vol; 5af2: 60a5 str r5, [r4, #8] 5af4: 79eb ldrb r3, [r5, #7] switch (vol->fatType()) { 5af6: 2b10 cmp r3, #16 5af8: d003 beq.n 5b02 5afa: 2b20 cmp r3, #32 5afc: d022 beq.n 5b44 5afe: 2b0c cmp r3, #12 5b00: d1e8 bne.n 5ad4 5b02: 2220 movs r2, #32 5b04: e01f b.n 5b46 return open(dirFile, &fname, oflag); 5b06: 4643 mov r3, r8 5b08: aa0b add r2, sp, #44 ; 0x2c 5b0a: f000 ff71 bl 69f0 } 5b0e: b014 add sp, #80 ; 0x50 5b10: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!tmpDir.openRoot(dirFile->m_vol)) { 5b14: 68b6 ldr r6, [r6, #8] memset(this, 0, sizeof(FatFile)); 5b16: 2224 movs r2, #36 ; 0x24 5b18: 2100 movs r1, #0 5b1a: a802 add r0, sp, #8 5b1c: f008 f808 bl db30 m_vol = vol; 5b20: 9604 str r6, [sp, #16] 5b22: 79f3 ldrb r3, [r6, #7] switch (vol->fatType()) { 5b24: 2b10 cmp r3, #16 5b26: d003 beq.n 5b30 5b28: 2b20 cmp r3, #32 5b2a: d003 beq.n 5b34 5b2c: 2b0c cmp r3, #12 5b2e: d1d1 bne.n 5ad4 5b30: 2320 movs r3, #32 5b32: e000 b.n 5b36 5b34: 2340 movs r3, #64 ; 0x40 m_attributes = FILE_ATTR_ROOT_FIXED; 5b36: f88d 3008 strb.w r3, [sp, #8] m_flags = FILE_FLAG_READ; 5b3a: 2301 movs r3, #1 dirFile = &tmpDir; 5b3c: ae02 add r6, sp, #8 m_flags = FILE_FLAG_READ; 5b3e: f88d 300a strb.w r3, [sp, #10] return true; 5b42: e799 b.n 5a78 switch (vol->fatType()) { 5b44: 2240 movs r2, #64 ; 0x40 m_flags = FILE_FLAG_READ; 5b46: 2301 movs r3, #1 m_attributes = FILE_ATTR_ROOT_FIXED; 5b48: 7022 strb r2, [r4, #0] return true; 5b4a: 4618 mov r0, r3 m_flags = FILE_FLAG_READ; 5b4c: 70a3 strb r3, [r4, #2] return true; 5b4e: e7c2 b.n 5ad6 00005b50 : return vol && open(vol->vwd(), path, oflag); 5b50: b119 cbz r1, 5b5a 5b52: f501 6189 add.w r1, r1, #1096 ; 0x448 5b56: f7ff bf79 b.w 5a4c } 5b5a: 4608 mov r0, r1 5b5c: 4770 bx lr 5b5e: bf00 nop 00005b60 : if (file->m_dirCluster == 0) { 5b60: 68cb ldr r3, [r1, #12] bool FatFile::openCluster(FatFile* file) { 5b62: b570 push {r4, r5, r6, lr} 5b64: 460d mov r5, r1 5b66: 4604 mov r4, r0 if (file->m_dirCluster == 0) { 5b68: b993 cbnz r3, 5b90 if (isOpen()) { 5b6a: 7806 ldrb r6, [r0, #0] 5b6c: b10e cbz r6, 5b72 return false; 5b6e: 4618 mov r0, r3 } 5b70: bd70 pop {r4, r5, r6, pc} return openRoot(file->m_vol); 5b72: 688d ldr r5, [r1, #8] memset(this, 0, sizeof(FatFile)); 5b74: 2224 movs r2, #36 ; 0x24 5b76: 4631 mov r1, r6 5b78: f007 ffda bl db30 m_vol = vol; 5b7c: 60a5 str r5, [r4, #8] 5b7e: 79eb ldrb r3, [r5, #7] switch (vol->fatType()) { 5b80: 2b10 cmp r3, #16 5b82: d018 beq.n 5bb6 5b84: 2b20 cmp r3, #32 5b86: d010 beq.n 5baa 5b88: 2b0c cmp r3, #12 5b8a: d014 beq.n 5bb6 5b8c: 4630 mov r0, r6 } 5b8e: bd70 pop {r4, r5, r6, pc} memset(this, 0, sizeof(FatFile)); 5b90: 2224 movs r2, #36 ; 0x24 5b92: 2100 movs r1, #0 5b94: f007 ffcc bl db30 m_flags = FILE_FLAG_READ; 5b98: 2001 movs r0, #1 m_attributes = FILE_ATTR_SUBDIR; 5b9a: 2310 movs r3, #16 m_flags = FILE_FLAG_READ; 5b9c: 70a0 strb r0, [r4, #2] m_attributes = FILE_ATTR_SUBDIR; 5b9e: 7023 strb r3, [r4, #0] m_firstCluster = file->m_dirCluster; 5ba0: e9d5 2302 ldrd r2, r3, [r5, #8] m_vol = file->m_vol; 5ba4: 60a2 str r2, [r4, #8] m_firstCluster = file->m_dirCluster; 5ba6: 6223 str r3, [r4, #32] } 5ba8: bd70 pop {r4, r5, r6, pc} switch (vol->fatType()) { 5baa: 2240 movs r2, #64 ; 0x40 m_flags = FILE_FLAG_READ; 5bac: 2301 movs r3, #1 m_attributes = FILE_ATTR_ROOT_FIXED; 5bae: 7022 strb r2, [r4, #0] return true; 5bb0: 4618 mov r0, r3 m_flags = FILE_FLAG_READ; 5bb2: 70a3 strb r3, [r4, #2] } 5bb4: bd70 pop {r4, r5, r6, pc} switch (vol->fatType()) { 5bb6: 2220 movs r2, #32 5bb8: e7f8 b.n 5bac 5bba: bf00 nop 00005bbc : bool FatFile::openRoot(FatVolume* vol) { 5bbc: b570 push {r4, r5, r6, lr} if (isOpen()) { 5bbe: 7805 ldrb r5, [r0, #0] 5bc0: b10d cbz r5, 5bc6 return false; 5bc2: 2000 movs r0, #0 } 5bc4: bd70 pop {r4, r5, r6, pc} 5bc6: 460e mov r6, r1 5bc8: 4604 mov r4, r0 memset(this, 0, sizeof(FatFile)); 5bca: 2224 movs r2, #36 ; 0x24 5bcc: 4629 mov r1, r5 5bce: f007 ffaf bl db30 m_vol = vol; 5bd2: 60a6 str r6, [r4, #8] 5bd4: 79f3 ldrb r3, [r6, #7] switch (vol->fatType()) { 5bd6: 2b10 cmp r3, #16 5bd8: d00b beq.n 5bf2 5bda: 2b20 cmp r3, #32 5bdc: d003 beq.n 5be6 5bde: 2b0c cmp r3, #12 5be0: d007 beq.n 5bf2 5be2: 4628 mov r0, r5 } 5be4: bd70 pop {r4, r5, r6, pc} switch (vol->fatType()) { 5be6: 2240 movs r2, #64 ; 0x40 m_flags = FILE_FLAG_READ; 5be8: 2301 movs r3, #1 m_attributes = FILE_ATTR_ROOT_FIXED; 5bea: 7022 strb r2, [r4, #0] return true; 5bec: 4618 mov r0, r3 m_flags = FILE_FLAG_READ; 5bee: 70a3 strb r3, [r4, #2] } 5bf0: bd70 pop {r4, r5, r6, pc} switch (vol->fatType()) { 5bf2: 2220 movs r2, #32 5bf4: e7f8 b.n 5be8 5bf6: bf00 nop 00005bf8 : int FatFile::read(void* buf, size_t nbyte) { 5bf8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 5bfc: ed2d 8b02 vpush {d8} bool isReadable() const {return m_flags & FILE_FLAG_READ;} 5c00: 7883 ldrb r3, [r0, #2] 5c02: b083 sub sp, #12 5c04: 4605 mov r5, r0 if (!isReadable()) { 5c06: 07df lsls r7, r3, #31 5c08: f140 808c bpl.w 5d24 bool isFile() const {return m_attributes & FILE_ATTR_FILE;} 5c0c: 4688 mov r8, r1 5c0e: 7801 ldrb r1, [r0, #0] 5c10: 4692 mov sl, r2 if (isFile()) { 5c12: 070e lsls r6, r1, #28 5c14: f100 8091 bmi.w 5d3a } else if (isRootFixed()) { 5c18: 068c lsls r4, r1, #26 5c1a: d508 bpl.n 5c2e FS_DIR_SIZE*m_vol->m_rootDirEntryCount - (uint16_t)m_curPosition; 5c1c: 6883 ldr r3, [r0, #8] 5c1e: 895a ldrh r2, [r3, #10] 5c20: 6943 ldr r3, [r0, #20] uint16_t tmp16 = 5c22: ebc3 1342 rsb r3, r3, r2, lsl #5 if (nbyte > tmp16) { 5c26: b29b uxth r3, r3 5c28: 459a cmp sl, r3 5c2a: bf28 it cs 5c2c: 469a movcs sl, r3 while (toRead) { 5c2e: f1ba 0f00 cmp.w sl, #0 5c32: f000 80af beq.w 5d94 uint32_t tmp32 = m_fileSize - m_curPosition; 5c36: 696a ldr r2, [r5, #20] fg = m_vol->fatGet(m_curCluster, &m_curCluster); 5c38: f105 0310 add.w r3, r5, #16 if (isRootFixed()) { 5c3c: 0688 lsls r0, r1, #26 uint32_t tmp32 = m_fileSize - m_curPosition; 5c3e: 4656 mov r6, sl uint8_t sectorOfCluster = 0; 5c40: f04f 0900 mov.w r9, #0 fg = m_vol->fatGet(m_curCluster, &m_curCluster); 5c44: ee08 3a10 vmov s16, r3 offset = m_curPosition & m_vol->sectorMask(); // offset in sector 5c48: 68af ldr r7, [r5, #8] 5c4a: f3c2 0b08 ubfx fp, r2, #0, #9 if (isRootFixed()) { 5c4e: d53d bpl.n 5ccc sector = m_vol->rootDirStart() 5c50: 6a39 ldr r1, [r7, #32] 5c52: eb01 2152 add.w r1, r1, r2, lsr #9 || sector == m_vol->cacheSectorNumber()) { 5c56: f1bb 0f00 cmp.w fp, #0 5c5a: d151 bne.n 5d00 if (offset != 0 || toRead < m_vol->bytesPerSector() 5c5c: f5b6 7f00 cmp.w r6, #512 ; 0x200 5c60: d34e bcc.n 5d00 return m_sector; 5c62: 6b7a ldr r2, [r7, #52] ; 0x34 || sector == m_vol->cacheSectorNumber()) { 5c64: 4291 cmp r1, r2 5c66: d04b beq.n 5d00 } else if (toRead >= 2*m_vol->bytesPerSector()) { 5c68: f5b6 6f80 cmp.w r6, #1024 ; 0x400 5c6c: f0c0 8082 bcc.w 5d74 if (!isRootFixed()) { 5c70: 7828 ldrb r0, [r5, #0] uint32_t ns = toRead >> m_vol->bytesPerSectorShift(); 5c72: 0a73 lsrs r3, r6, #9 if (!isRootFixed()) { 5c74: 0680 lsls r0, r0, #26 5c76: d405 bmi.n 5c84 uint32_t mb = m_vol->sectorsPerCluster() - sectorOfCluster; 5c78: 7938 ldrb r0, [r7, #4] 5c7a: eba0 0009 sub.w r0, r0, r9 5c7e: 4283 cmp r3, r0 5c80: bf28 it cs 5c82: 4603 movcs r3, r0 return sector <= m_sector && m_sector < (sector + count); 5c84: 4291 cmp r1, r2 n = ns << m_vol->bytesPerSectorShift(); 5c86: ea4f 2443 mov.w r4, r3, lsl #9 5c8a: d80c bhi.n 5ca6 5c8c: 18c8 adds r0, r1, r3 5c8e: 4282 cmp r2, r0 5c90: d209 bcs.n 5ca6 if (isCached(sector, count) && !sync()) { 5c92: f107 0028 add.w r0, r7, #40 ; 0x28 5c96: e9cd 1300 strd r1, r3, [sp] 5c9a: f004 fac5 bl a228 5c9e: e9dd 1300 ldrd r1, r3, [sp] 5ca2: 2800 cmp r0, #0 5ca4: d03e beq.n 5d24 return m_blockDev->readSectors(sector, dst, count); 5ca6: 6af8 ldr r0, [r7, #44] ; 0x2c 5ca8: 6802 ldr r2, [r0, #0] 5caa: 6957 ldr r7, [r2, #20] 5cac: 4642 mov r2, r8 5cae: 47b8 blx r7 if (!m_vol->cacheSafeRead(sector, dst, ns)) { 5cb0: 2800 cmp r0, #0 5cb2: d037 beq.n 5d24 m_curPosition += n; 5cb4: 696a ldr r2, [r5, #20] while (toRead) { 5cb6: 1b36 subs r6, r6, r4 dst += n; 5cb8: 44a0 add r8, r4 m_curPosition += n; 5cba: 4422 add r2, r4 5cbc: 616a str r2, [r5, #20] while (toRead) { 5cbe: d069 beq.n 5d94 bool isRootFixed() const {return m_attributes & FILE_ATTR_ROOT_FIXED;} 5cc0: 7829 ldrb r1, [r5, #0] offset = m_curPosition & m_vol->sectorMask(); // offset in sector 5cc2: f3c2 0b08 ubfx fp, r2, #0, #9 5cc6: 68af ldr r7, [r5, #8] if (isRootFixed()) { 5cc8: 0688 lsls r0, r1, #26 5cca: d4c1 bmi.n 5c50 return (position >> 9) & m_clusterSectorMask; 5ccc: f897 9005 ldrb.w r9, [r7, #5] 5cd0: ea09 2952 and.w r9, r9, r2, lsr #9 if (offset == 0 && sectorOfCluster == 0) { 5cd4: f1bb 0f00 cmp.w fp, #0 5cd8: d136 bne.n 5d48 5cda: f1b9 0f00 cmp.w r9, #0 5cde: d133 bne.n 5d48 if (m_curPosition == 0) { 5ce0: 2a00 cmp r2, #0 5ce2: d133 bne.n 5d4c m_curCluster = isRoot32() ? m_vol->rootDirStart() : m_firstCluster; 5ce4: 064a lsls r2, r1, #25 return m_rootDirStart; 5ce6: bf4c ite mi 5ce8: 6a3a ldrmi r2, [r7, #32] 5cea: 6a2a ldrpl r2, [r5, #32] m_curCluster++; 5cec: 612a str r2, [r5, #16] return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 5cee: 3a02 subs r2, #2 5cf0: 79b8 ldrb r0, [r7, #6] sector = m_vol->clusterStartSector(m_curCluster) + sectorOfCluster; 5cf2: 6979 ldr r1, [r7, #20] 5cf4: 4082 lsls r2, r0 5cf6: 4449 add r1, r9 5cf8: 4411 add r1, r2 || sector == m_vol->cacheSectorNumber()) { 5cfa: f1bb 0f00 cmp.w fp, #0 5cfe: d0ad beq.n 5c5c n = m_vol->bytesPerSector() - offset; 5d00: f5cb 7400 rsb r4, fp, #512 ; 0x200 return m_cache.prepare(sector, options); 5d04: 2200 movs r2, #0 5d06: f107 0028 add.w r0, r7, #40 ; 0x28 5d0a: 42b4 cmp r4, r6 5d0c: bf28 it cs 5d0e: 4634 movcs r4, r6 5d10: f004 fab6 bl a280 if (!pc) { 5d14: b130 cbz r0, 5d24 memcpy(dst, src, n); 5d16: eb00 010b add.w r1, r0, fp 5d1a: 4622 mov r2, r4 5d1c: 4640 mov r0, r8 5d1e: f005 fb3d bl b39c 5d22: e7c7 b.n 5cb4 m_error |= READ_ERROR; 5d24: 786b ldrb r3, [r5, #1] return -1; 5d26: f04f 30ff mov.w r0, #4294967295 m_error |= READ_ERROR; 5d2a: f043 0302 orr.w r3, r3, #2 5d2e: 706b strb r3, [r5, #1] } 5d30: b003 add sp, #12 5d32: ecbd 8b02 vpop {d8} 5d36: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} uint32_t tmp32 = m_fileSize - m_curPosition; 5d3a: 69c3 ldr r3, [r0, #28] 5d3c: 6942 ldr r2, [r0, #20] 5d3e: 1a9b subs r3, r3, r2 5d40: 459a cmp sl, r3 5d42: bf28 it cs 5d44: 469a movcs sl, r3 5d46: e772 b.n 5c2e m_curCluster++; 5d48: 692a ldr r2, [r5, #16] 5d4a: e7d0 b.n 5cee } else if (isFile() && isContiguous()) { 5d4c: 070b lsls r3, r1, #28 5d4e: d505 bpl.n 5d5c 5d50: 78aa ldrb r2, [r5, #2] 5d52: 0654 lsls r4, r2, #25 5d54: d502 bpl.n 5d5c m_curCluster++; 5d56: 692a ldr r2, [r5, #16] 5d58: 3201 adds r2, #1 5d5a: e7c7 b.n 5cec fg = m_vol->fatGet(m_curCluster, &m_curCluster); 5d5c: ee18 2a10 vmov r2, s16 5d60: 4638 mov r0, r7 5d62: 6929 ldr r1, [r5, #16] 5d64: f001 fdfe bl 7964 if (fg < 0) { 5d68: 2800 cmp r0, #0 5d6a: dbdb blt.n 5d24 if (fg == 0) { 5d6c: d00c beq.n 5d88 sector = m_vol->clusterStartSector(m_curCluster) + sectorOfCluster; 5d6e: 68af ldr r7, [r5, #8] 5d70: 692a ldr r2, [r5, #16] 5d72: e7bc b.n 5cee return m_blockDev->readSector(sector, dst); 5d74: 6af8 ldr r0, [r7, #44] ; 0x2c 5d76: 4642 mov r2, r8 5d78: 6803 ldr r3, [r0, #0] 5d7a: 691b ldr r3, [r3, #16] 5d7c: 4798 blx r3 if (!m_vol->cacheSafeRead(sector, dst)) { 5d7e: 2800 cmp r0, #0 5d80: d0d0 beq.n 5d24 n = m_vol->bytesPerSector(); 5d82: f44f 7400 mov.w r4, #512 ; 0x200 5d86: e795 b.n 5cb4 if (isDir()) { 5d88: 782b ldrb r3, [r5, #0] 5d8a: f013 0f70 tst.w r3, #112 ; 0x70 5d8e: d0c9 beq.n 5d24 return nbyte - toRead; 5d90: ebaa 0a06 sub.w sl, sl, r6 5d94: 4650 mov r0, sl } 5d96: b003 add sp, #12 5d98: ecbd 8b02 vpop {d8} 5d9c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 00005da0 : int FatFile::peek() { 5da0: b570 push {r4, r5, r6, lr} 5da2: b082 sub sp, #8 return read(&b, 1) == 1 ? b : -1; 5da4: 2201 movs r2, #1 5da6: 4604 mov r4, r0 5da8: f10d 0107 add.w r1, sp, #7 uint32_t curCluster = m_curCluster; 5dac: e9d0 5604 ldrd r5, r6, [r0, #16] 5db0: f7ff ff22 bl 5bf8 5db4: 2801 cmp r0, #1 5db6: bf0c ite eq 5db8: f89d 0007 ldrbeq.w r0, [sp, #7] 5dbc: f04f 30ff movne.w r0, #4294967295 m_curCluster = curCluster; 5dc0: e9c4 5604 strd r5, r6, [r4, #16] } 5dc4: b002 add sp, #8 5dc6: bd70 pop {r4, r5, r6, pc} 00005dc8 : uint8_t i = (m_curPosition >> 5) & 0XF; 5dc8: 6943 ldr r3, [r0, #20] if (i == 0 || !skipReadOk) { 5dca: f413 7ff0 tst.w r3, #480 ; 0x1e0 DirFat_t* FatFile::readDirCache(bool skipReadOk) { 5dce: b530 push {r4, r5, lr} 5dd0: 4604 mov r4, r0 5dd2: b083 sub sp, #12 uint8_t i = (m_curPosition >> 5) & 0XF; 5dd4: f3c3 1543 ubfx r5, r3, #5, #4 if (i == 0 || !skipReadOk) { 5dd8: d009 beq.n 5dee 5dda: 2901 cmp r1, #1 5ddc: d107 bne.n 5dee m_curPosition += FS_DIR_SIZE; 5dde: 3320 adds r3, #32 5de0: 6143 str r3, [r0, #20] return m_buffer; 5de2: 68a0 ldr r0, [r4, #8] 5de4: 3038 adds r0, #56 ; 0x38 return reinterpret_cast(m_vol->cacheAddress()) + i; 5de6: eb00 1045 add.w r0, r0, r5, lsl #5 } 5dea: b003 add sp, #12 5dec: bd30 pop {r4, r5, pc} int8_t n = read(&n, 1); 5dee: 2201 movs r2, #1 5df0: f10d 0107 add.w r1, sp, #7 5df4: 4620 mov r0, r4 5df6: f7ff feff bl 5bf8 if (n != 1) { 5dfa: b240 sxtb r0, r0 5dfc: 2801 cmp r0, #1 5dfe: d103 bne.n 5e08 m_curPosition += FS_DIR_SIZE - 1; 5e00: 6963 ldr r3, [r4, #20] 5e02: 331f adds r3, #31 5e04: 6163 str r3, [r4, #20] 5e06: e7ec b.n 5de2 return nullptr; 5e08: 2000 movs r0, #0 5e0a: e7ee b.n 5dea 00005e0c : bool FatFile::rename(FatFile* dirFile, const char* newPath) { 5e0c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} if (!(isFile() || isSubDir())) { 5e10: 7803 ldrb r3, [r0, #0] bool FatFile::rename(FatFile* dirFile, const char* newPath) { 5e12: b09a sub sp, #104 ; 0x68 FatFile() {} 5e14: 2600 movs r6, #0 if (!(isFile() || isSubDir())) { 5e16: f013 0f18 tst.w r3, #24 5e1a: 9608 str r6, [sp, #32] 5e1c: 9611 str r6, [sp, #68] ; 0x44 5e1e: d006 beq.n 5e2e 5e20: 4617 mov r7, r2 if (m_vol != dirFile->m_vol) { 5e22: 6883 ldr r3, [r0, #8] 5e24: 688a ldr r2, [r1, #8] 5e26: 4604 mov r4, r0 5e28: 460d mov r5, r1 5e2a: 429a cmp r2, r3 5e2c: d003 beq.n 5e36 return false; 5e2e: 2000 movs r0, #0 } 5e30: b01a add sp, #104 ; 0x68 5e32: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 5e36: f7ff fbc3 bl 55c0 oldFile = *this; 5e3a: 46a6 mov lr, r4 5e3c: f10d 0c44 add.w ip, sp, #68 ; 0x44 5e40: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 5e44: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 5e48: e8be 000f ldmia.w lr!, {r0, r1, r2, r3} 5e4c: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 5e50: f8de 3000 ldr.w r3, [lr] 5e54: 4632 mov r2, r6 5e56: 69a1 ldr r1, [r4, #24] 5e58: f8cc 3000 str.w r3, [ip] 5e5c: 68a3 ldr r3, [r4, #8] 5e5e: f103 0028 add.w r0, r3, #40 ; 0x28 5e62: f004 fa0d bl a280 if (!dir) { 5e66: 2800 cmp r0, #0 5e68: d0e1 beq.n 5e2e return dir + (m_dirIndex & 0XF); 5e6a: 88a2 ldrh r2, [r4, #4] memcpy(&entry, dir, sizeof(entry)); 5e6c: 46ec mov ip, sp if (isFile()) { 5e6e: f894 8000 ldrb.w r8, [r4] return dir + (m_dirIndex & 0XF); 5e72: f002 020f and.w r2, r2, #15 memcpy(&entry, dir, sizeof(entry)); 5e76: eb00 1e42 add.w lr, r0, r2, lsl #5 5e7a: 0152 lsls r2, r2, #5 5e7c: f8de 1004 ldr.w r1, [lr, #4] 5e80: 5880 ldr r0, [r0, r2] 5e82: f8de 300c ldr.w r3, [lr, #12] 5e86: f8de 2008 ldr.w r2, [lr, #8] 5e8a: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 5e8e: f8de 1014 ldr.w r1, [lr, #20] 5e92: f8de 2018 ldr.w r2, [lr, #24] 5e96: f8de 301c ldr.w r3, [lr, #28] 5e9a: f8de 0010 ldr.w r0, [lr, #16] 5e9e: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} if (isFile()) { 5ea2: f018 0308 ands.w r3, r8, #8 if (!file.open(dirFile, newPath, O_CREAT | O_EXCL | O_WRONLY)) { 5ea6: 463a mov r2, r7 5ea8: 4629 mov r1, r5 if (isFile()) { 5eaa: f040 809b bne.w 5fe4 if (!file.mkdir(dirFile, newPath, false)) { 5eae: a808 add r0, sp, #32 5eb0: f7ff fd56 bl 5960 5eb4: 2800 cmp r0, #0 5eb6: d0ba beq.n 5e2e dirCluster = file.m_firstCluster; 5eb8: 9e10 ldr r6, [sp, #64] ; 0x40 m_dirIndex = file.m_dirIndex; 5eba: f8bd 3024 ldrh.w r3, [sp, #36] ; 0x24 file.m_attributes = FILE_ATTR_CLOSED; 5ebe: 2500 movs r5, #0 m_dirSector = file.m_dirSector; 5ec0: 990e ldr r1, [sp, #56] ; 0x38 5ec2: 2201 movs r2, #1 m_dirIndex = file.m_dirIndex; 5ec4: 80a3 strh r3, [r4, #4] m_lfnOrd = file.m_lfnOrd; 5ec6: f89d 3023 ldrb.w r3, [sp, #35] ; 0x23 5eca: 68a0 ldr r0, [r4, #8] 5ecc: 70e3 strb r3, [r4, #3] m_dirCluster = file.m_dirCluster; 5ece: 9b0b ldr r3, [sp, #44] ; 0x2c 5ed0: 3028 adds r0, #40 ; 0x28 m_dirSector = file.m_dirSector; 5ed2: 61a1 str r1, [r4, #24] m_dirCluster = file.m_dirCluster; 5ed4: 60e3 str r3, [r4, #12] file.m_attributes = FILE_ATTR_CLOSED; 5ed6: f88d 5020 strb.w r5, [sp, #32] file.m_flags = 0; 5eda: f88d 5022 strb.w r5, [sp, #34] ; 0x22 5ede: f004 f9cf bl a280 if (!dir) { 5ee2: 2800 cmp r0, #0 5ee4: d0a3 beq.n 5e2e return dir + (m_dirIndex & 0XF); 5ee6: 88a3 ldrh r3, [r4, #4] 5ee8: f003 030f and.w r3, r3, #15 5eec: eb00 1043 add.w r0, r0, r3, lsl #5 memcpy(&dir->createTimeMs, &entry.createTimeMs, 5ef0: f8dd 300d ldr.w r3, [sp, #13] 5ef4: f8c0 300d str.w r3, [r0, #13] 5ef8: f8dd 3011 ldr.w r3, [sp, #17] 5efc: f8c0 3011 str.w r3, [r0, #17] 5f00: f8dd 3015 ldr.w r3, [sp, #21] 5f04: f8c0 3015 str.w r3, [r0, #21] 5f08: f8dd 3019 ldr.w r3, [sp, #25] 5f0c: f8c0 3019 str.w r3, [r0, #25] 5f10: f8bd 301d ldrh.w r3, [sp, #29] 5f14: f8a0 301d strh.w r3, [r0, #29] 5f18: f89d 301f ldrb.w r3, [sp, #31] 5f1c: 77c3 strb r3, [r0, #31] dir->attributes = entry.attributes; 5f1e: f89d 300b ldrb.w r3, [sp, #11] 5f22: 72c3 strb r3, [r0, #11] if (dirCluster) { 5f24: 2e00 cmp r6, #0 5f26: d03b beq.n 5fa0 uint32_t sector = m_vol->clusterStartSector(dirCluster); 5f28: 68a0 ldr r0, [r4, #8] return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 5f2a: 1eb3 subs r3, r6, #2 return m_cache.prepare(sector, options); 5f2c: 462a mov r2, r5 return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 5f2e: 7981 ldrb r1, [r0, #6] return m_cache.prepare(sector, options); 5f30: 3028 adds r0, #40 ; 0x28 return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 5f32: 408b lsls r3, r1 5f34: f850 1c14 ldr.w r1, [r0, #-20] return m_cache.prepare(sector, options); 5f38: 4419 add r1, r3 5f3a: f004 f9a1 bl a280 if (!dir) { 5f3e: 4605 mov r5, r0 5f40: 2800 cmp r0, #0 5f42: f43f af74 beq.w 5e2e memcpy(&entry, &dir[1], sizeof(entry)); 5f46: 6a00 ldr r0, [r0, #32] 5f48: 466f mov r7, sp 5f4a: 6a69 ldr r1, [r5, #36] ; 0x24 5f4c: 6aaa ldr r2, [r5, #40] ; 0x28 5f4e: 6aeb ldr r3, [r5, #44] ; 0x2c 5f50: c70f stmia r7!, {r0, r1, r2, r3} 5f52: 6b28 ldr r0, [r5, #48] ; 0x30 5f54: 6b69 ldr r1, [r5, #52] ; 0x34 5f56: 6baa ldr r2, [r5, #56] ; 0x38 5f58: 6beb ldr r3, [r5, #60] ; 0x3c 5f5a: c70f stmia r7!, {r0, r1, r2, r3} if (!m_vol->freeChain(dirCluster)) { 5f5c: 4631 mov r1, r6 5f5e: 68a0 ldr r0, [r4, #8] 5f60: f001 fd22 bl 79a8 5f64: 2800 cmp r0, #0 5f66: f43f af62 beq.w 5e2e sector = m_vol->clusterStartSector(m_firstCluster); 5f6a: 68a0 ldr r0, [r4, #8] return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 5f6c: 6a23 ldr r3, [r4, #32] 5f6e: 7982 ldrb r2, [r0, #6] return m_cache.prepare(sector, options); 5f70: 3028 adds r0, #40 ; 0x28 return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 5f72: 3b02 subs r3, #2 5f74: f850 1c14 ldr.w r1, [r0, #-20] 5f78: 4093 lsls r3, r2 return m_cache.prepare(sector, options); 5f7a: 2201 movs r2, #1 5f7c: 4419 add r1, r3 5f7e: f004 f97f bl a280 if (!dir) { 5f82: 4606 mov r6, r0 5f84: 2800 cmp r0, #0 5f86: f43f af52 beq.w 5e2e memcpy(&dir[1], &entry, sizeof(entry)); 5f8a: 466d mov r5, sp 5f8c: cd0f ldmia r5!, {r0, r1, r2, r3} 5f8e: 6230 str r0, [r6, #32] 5f90: 6271 str r1, [r6, #36] ; 0x24 5f92: 62b2 str r2, [r6, #40] ; 0x28 5f94: 62f3 str r3, [r6, #44] ; 0x2c 5f96: cd0f ldmia r5!, {r0, r1, r2, r3} 5f98: 6330 str r0, [r6, #48] ; 0x30 5f9a: 6371 str r1, [r6, #52] ; 0x34 5f9c: 63b2 str r2, [r6, #56] ; 0x38 5f9e: 63f3 str r3, [r6, #60] ; 0x3c oldFile.m_firstCluster = 0; 5fa0: 2100 movs r1, #0 oldFile.m_flags = FILE_FLAG_WRITE; 5fa2: 2202 movs r2, #2 oldFile.m_attributes = FILE_ATTR_FILE; 5fa4: 2308 movs r3, #8 if (!oldFile.remove()) { 5fa6: a811 add r0, sp, #68 ; 0x44 oldFile.m_firstCluster = 0; 5fa8: 9119 str r1, [sp, #100] ; 0x64 oldFile.m_flags = FILE_FLAG_WRITE; 5faa: f88d 2046 strb.w r2, [sp, #70] ; 0x46 oldFile.m_attributes = FILE_ATTR_FILE; 5fae: f88d 3044 strb.w r3, [sp, #68] ; 0x44 if (!oldFile.remove()) { 5fb2: f000 fed3 bl 6d5c 5fb6: 2800 cmp r0, #0 5fb8: f43f af39 beq.w 5e2e return m_vol->cacheSync(); 5fbc: 68a4 ldr r4, [r4, #8] return m_cache.sync() && m_fatCache.sync() && syncDevice(); 5fbe: f104 0028 add.w r0, r4, #40 ; 0x28 5fc2: f004 f931 bl a228 5fc6: 2800 cmp r0, #0 5fc8: f43f af31 beq.w 5e2e 5fcc: f504 700e add.w r0, r4, #568 ; 0x238 5fd0: f004 f92a bl a228 5fd4: 2800 cmp r0, #0 5fd6: f43f af2a beq.w 5e2e 5fda: 6820 ldr r0, [r4, #0] return m_blockDev->syncDevice(); 5fdc: 6803 ldr r3, [r0, #0] 5fde: 6a1b ldr r3, [r3, #32] 5fe0: 4798 blx r3 5fe2: e725 b.n 5e30 if (!file.open(dirFile, newPath, O_CREAT | O_EXCL | O_WRONLY)) { 5fe4: f640 2301 movw r3, #2561 ; 0xa01 5fe8: 4660 mov r0, ip 5fea: f7ff fd2f bl 5a4c 5fee: 2800 cmp r0, #0 5ff0: f47f af63 bne.w 5eba 5ff4: e71b b.n 5e2e 5ff6: bf00 nop 00005ff8 : if (!isSubDir() || (!USE_LONG_FILE_NAMES && isLFN())) { 5ff8: 7803 ldrb r3, [r0, #0] 5ffa: 06da lsls r2, r3, #27 5ffc: d401 bmi.n 6002 } 5ffe: 2000 movs r0, #0 6000: 4770 bx lr if (pos == m_curPosition) { 6002: 6943 ldr r3, [r0, #20] bool FatFile::rmdir() { 6004: b530 push {r4, r5, lr} 6006: 4604 mov r4, r0 6008: b083 sub sp, #12 if (pos == m_curPosition) { 600a: b133 cbz r3, 601a m_flags &= ~FILE_FLAG_PREALLOCATE; 600c: 7883 ldrb r3, [r0, #2] m_curCluster = 0; 600e: 2200 movs r2, #0 m_flags &= ~FILE_FLAG_PREALLOCATE; 6010: f023 0320 bic.w r3, r3, #32 m_curPosition = pos; 6014: e9c0 2204 strd r2, r2, [r0, #16] m_flags &= ~FILE_FLAG_PREALLOCATE; 6018: 7083 strb r3, [r0, #2] bool FatFile::rmdir() { 601a: 2300 movs r3, #0 601c: e00f b.n 603e m_curPosition += FS_DIR_SIZE; 601e: 6163 str r3, [r4, #20] 6020: 68a3 ldr r3, [r4, #8] return reinterpret_cast(m_vol->cacheAddress()) + i; 6022: 016a lsls r2, r5, #5 6024: 3338 adds r3, #56 ; 0x38 if (dir->name[0] == FAT_NAME_FREE) { 6026: 5c9a ldrb r2, [r3, r2] return reinterpret_cast(m_vol->cacheAddress()) + i; 6028: eb03 1345 add.w r3, r3, r5, lsl #5 if (dir->name[0] == FAT_NAME_FREE) { 602c: b1ea cbz r2, 606a if (dir->name[0] == FAT_NAME_DELETED || dir->name[0] == '.') { 602e: 2ae5 cmp r2, #229 ; 0xe5 6030: d004 beq.n 603c 6032: 2a2e cmp r2, #46 ; 0x2e 6034: d002 beq.n 603c if (isFileOrSubdir(dir)) { 6036: 7adb ldrb r3, [r3, #11] 6038: 071b lsls r3, r3, #28 603a: d522 bpl.n 6082 uint8_t i = (m_curPosition >> 5) & 0XF; 603c: 6963 ldr r3, [r4, #20] if (i == 0 || !skipReadOk) { 603e: f413 7ff0 tst.w r3, #480 ; 0x1e0 uint8_t i = (m_curPosition >> 5) & 0XF; 6042: f3c3 1543 ubfx r5, r3, #5, #4 m_curPosition += FS_DIR_SIZE; 6046: f103 0320 add.w r3, r3, #32 if (i == 0 || !skipReadOk) { 604a: d1e8 bne.n 601e int8_t n = read(&n, 1); 604c: 2201 movs r2, #1 604e: f10d 0107 add.w r1, sp, #7 6052: 4620 mov r0, r4 6054: f7ff fdd0 bl 5bf8 if (n != 1) { 6058: b240 sxtb r0, r0 605a: 2801 cmp r0, #1 605c: d103 bne.n 6066 m_curPosition += FS_DIR_SIZE - 1; 605e: 6963 ldr r3, [r4, #20] 6060: 331f adds r3, #31 6062: 6163 str r3, [r4, #20] 6064: e7dc b.n 6020 if (!getError()) { 6066: 7863 ldrb r3, [r4, #1] 6068: b95b cbnz r3, 6082 m_flags |= FILE_FLAG_WRITE; 606a: 78a3 ldrb r3, [r4, #2] m_attributes = FILE_ATTR_FILE; 606c: 2208 movs r2, #8 return remove(); 606e: 4620 mov r0, r4 m_flags |= FILE_FLAG_WRITE; 6070: f043 0302 orr.w r3, r3, #2 m_attributes = FILE_ATTR_FILE; 6074: 7022 strb r2, [r4, #0] m_flags |= FILE_FLAG_WRITE; 6076: 70a3 strb r3, [r4, #2] } 6078: b003 add sp, #12 607a: e8bd 4030 ldmia.w sp!, {r4, r5, lr} return remove(); 607e: f000 be6d b.w 6d5c } 6082: 2000 movs r0, #0 6084: b003 add sp, #12 6086: bd30 pop {r4, r5, pc} 00006088 : bool FatFile::seekSet(uint32_t pos) { 6088: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} bool isOpen() const {return m_attributes;} 608c: 7803 ldrb r3, [r0, #0] 608e: 4604 mov r4, r0 uint32_t tmp = m_curCluster; 6090: 6907 ldr r7, [r0, #16] if (!isOpen()) { 6092: 2b00 cmp r3, #0 6094: d039 beq.n 610a 6096: 460d mov r5, r1 if (pos == m_curPosition) { 6098: 6941 ldr r1, [r0, #20] 609a: 42a9 cmp r1, r5 609c: d042 beq.n 6124 if (pos == 0) { 609e: 2d00 cmp r5, #0 60a0: d037 beq.n 6112 if (isFile()) { 60a2: 0718 lsls r0, r3, #28 60a4: d52a bpl.n 60fc if (pos > m_fileSize) { 60a6: 69e2 ldr r2, [r4, #28] 60a8: 42aa cmp r2, r5 60aa: d32e bcc.n 610a nNew = (pos - 1) >> (m_vol->bytesPerClusterShift()); 60ac: f8d4 c008 ldr.w ip, [r4, #8] 60b0: 1e6e subs r6, r5, #1 bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} 60b2: 78a2 ldrb r2, [r4, #2] return m_sectorsPerClusterShift + m_bytesPerSectorShift; 60b4: f89c 0006 ldrb.w r0, [ip, #6] if (isContiguous()) { 60b8: f012 0f40 tst.w r2, #64 ; 0x40 60bc: f100 0009 add.w r0, r0, #9 nNew = (pos - 1) >> (m_vol->bytesPerClusterShift()); 60c0: b2c0 uxtb r0, r0 60c2: fa26 f600 lsr.w r6, r6, r0 if (isContiguous()) { 60c6: d130 bne.n 612a nCur = (m_curPosition - 1) >> (m_vol->bytesPerClusterShift()); 60c8: 1e4a subs r2, r1, #1 60ca: 40c2 lsrs r2, r0 if (nNew < nCur || m_curPosition == 0) { 60cc: b109 cbz r1, 60d2 60ce: 4296 cmp r6, r2 60d0: d22f bcs.n 6132 m_curCluster = isRoot32() ? m_vol->rootDirStart() : m_firstCluster; 60d2: 065b lsls r3, r3, #25 return m_rootDirStart; 60d4: bf4c ite mi 60d6: f8dc 3020 ldrmi.w r3, [ip, #32] 60da: 6a23 ldrpl r3, [r4, #32] 60dc: 6123 str r3, [r4, #16] if (m_vol->fatGet(m_curCluster, &m_curCluster) <= 0) { 60de: f104 0810 add.w r8, r4, #16 60e2: e006 b.n 60f2 60e4: 6921 ldr r1, [r4, #16] 60e6: 3e01 subs r6, #1 60e8: 68a0 ldr r0, [r4, #8] 60ea: f001 fc3b bl 7964 60ee: 2800 cmp r0, #0 60f0: dd0b ble.n 610a 60f2: 4642 mov r2, r8 while (nNew--) { 60f4: 2e00 cmp r6, #0 60f6: d1f5 bne.n 60e4 m_flags &= ~FILE_FLAG_PREALLOCATE; 60f8: 78a2 ldrb r2, [r4, #2] 60fa: e00c b.n 6116 } else if (isRootFixed()) { 60fc: 069a lsls r2, r3, #26 60fe: d5d5 bpl.n 60ac return m_rootDirEntryCount; 6100: 68a3 ldr r3, [r4, #8] if (pos <= FS_DIR_SIZE*m_vol->rootDirEntryCount()) { 6102: 895b ldrh r3, [r3, #10] 6104: ebb5 1f43 cmp.w r5, r3, lsl #5 6108: d9f6 bls.n 60f8 return false; 610a: 2000 movs r0, #0 m_curCluster = tmp; 610c: 6127 str r7, [r4, #16] } 610e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 6112: 7882 ldrb r2, [r0, #2] m_curCluster = 0; 6114: 6105 str r5, [r0, #16] m_flags &= ~FILE_FLAG_PREALLOCATE; 6116: f022 0220 bic.w r2, r2, #32 return true; 611a: 2001 movs r0, #1 m_curPosition = pos; 611c: 6165 str r5, [r4, #20] m_flags &= ~FILE_FLAG_PREALLOCATE; 611e: 70a2 strb r2, [r4, #2] } 6120: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return true; 6124: 2001 movs r0, #1 } 6126: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_curCluster = m_firstCluster + nNew; 612a: 6a23 ldr r3, [r4, #32] 612c: 4433 add r3, r6 612e: 6123 str r3, [r4, #16] goto done; 6130: e7f1 b.n 6116 nNew -= nCur; 6132: 1ab6 subs r6, r6, r2 6134: e7d3 b.n 60de 6136: bf00 nop 00006138 : oflag_t oflag, uint8_t lfnOrd) { 6138: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 613c: 460e mov r6, r1 613e: 4615 mov r5, r2 memset(this, 0, sizeof(FatFile)); 6140: 2100 movs r1, #0 6142: 2224 movs r2, #36 ; 0x24 oflag_t oflag, uint8_t lfnOrd) { 6144: 4604 mov r4, r0 6146: 4698 mov r8, r3 6148: f89d 7018 ldrb.w r7, [sp, #24] memset(this, 0, sizeof(FatFile)); 614c: f007 fcf0 bl db30 m_vol = dirFile->m_vol; 6150: 68b0 ldr r0, [r6, #8] m_dirCluster = dirFile->m_firstCluster; 6152: 6a33 ldr r3, [r6, #32] 6154: f100 0238 add.w r2, r0, #56 ; 0x38 m_dirIndex = dirIndex; 6158: 80a5 strh r5, [r4, #4] dir += 0XF & dirIndex; 615a: f005 050f and.w r5, r5, #15 615e: eb02 1245 add.w r2, r2, r5, lsl #5 m_vol = dirFile->m_vol; 6162: e9c4 0302 strd r0, r3, [r4, #8] return (dir->attributes & FAT_ATTRIB_LABEL) == 0; 6166: 7ad1 ldrb r1, [r2, #11] if (!isFileOrSubdir(dir)) { 6168: 070b lsls r3, r1, #28 616a: d411 bmi.n 6190 m_attributes = dir->attributes & FILE_ATTR_COPY; 616c: f001 0117 and.w r1, r1, #23 6170: 7021 strb r1, [r4, #0] if (isFileDir(dir)) { 6172: 7ad3 ldrb r3, [r2, #11] 6174: f013 0f18 tst.w r3, #24 6178: d102 bne.n 6180 m_attributes |= FILE_ATTR_FILE; 617a: f041 0108 orr.w r1, r1, #8 617e: 7021 strb r1, [r4, #0] switch (oflag & O_ACCMODE) { 6180: f008 0303 and.w r3, r8, #3 m_lfnOrd = lfnOrd; 6184: 70e7 strb r7, [r4, #3] switch (oflag & O_ACCMODE) { 6186: 2b01 cmp r3, #1 6188: d038 beq.n 61fc 618a: 2b02 cmp r3, #2 618c: d006 beq.n 619c 618e: b1f3 cbz r3, 61ce m_attributes = FILE_ATTR_CLOSED; 6190: 2300 movs r3, #0 return false; 6192: 4618 mov r0, r3 m_attributes = FILE_ATTR_CLOSED; 6194: 7023 strb r3, [r4, #0] m_flags = 0; 6196: 70a3 strb r3, [r4, #2] } 6198: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} switch (oflag & O_ACCMODE) { 619c: 2303 movs r3, #3 bool isSubDir() const {return m_attributes & FILE_ATTR_SUBDIR;} 619e: 7821 ldrb r1, [r4, #0] if (isSubDir() || isReadOnly()) { 61a0: 06cd lsls r5, r1, #27 61a2: d4f5 bmi.n 6190 61a4: 07ce lsls r6, r1, #31 61a6: d4f3 bmi.n 6190 m_flags |= (oflag & O_APPEND ? FILE_FLAG_APPEND : 0); 61a8: f008 0108 and.w r1, r8, #8 if (oflag & O_TRUNC) { 61ac: f418 6f80 tst.w r8, #1024 ; 0x400 m_flags |= (oflag & O_APPEND ? FILE_FLAG_APPEND : 0); 61b0: ea43 0301 orr.w r3, r3, r1 61b4: 70a3 strb r3, [r4, #2] return m_sector; 61b6: 6b41 ldr r1, [r0, #52] ; 0x34 firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) 61b8: 8a95 ldrh r5, [r2, #20] m_dirSector = m_vol->cacheSectorNumber(); 61ba: 61a1 str r1, [r4, #24] | getLe16(dir->firstClusterLow); 61bc: 8b51 ldrh r1, [r2, #26] firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) 61be: ea41 4105 orr.w r1, r1, r5, lsl #16 if (oflag & O_TRUNC) { 61c2: d012 beq.n 61ea if (firstCluster && !m_vol->freeChain(firstCluster)) { 61c4: bb19 cbnz r1, 620e m_flags |= FILE_FLAG_DIR_DIRTY; 61c6: f063 037f orn r3, r3, #127 ; 0x7f 61ca: 70a3 strb r3, [r4, #2] 61cc: e010 b.n 61f0 if (oflag & O_TRUNC) { 61ce: f418 6f80 tst.w r8, #1024 ; 0x400 61d2: d1dd bne.n 6190 m_flags |= (oflag & O_APPEND ? FILE_FLAG_APPEND : 0); 61d4: f008 0308 and.w r3, r8, #8 61d8: f043 0301 orr.w r3, r3, #1 61dc: 70a3 strb r3, [r4, #2] 61de: 6b41 ldr r1, [r0, #52] ; 0x34 firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) 61e0: 8a93 ldrh r3, [r2, #20] m_dirSector = m_vol->cacheSectorNumber(); 61e2: 61a1 str r1, [r4, #24] | getLe16(dir->firstClusterLow); 61e4: 8b51 ldrh r1, [r2, #26] firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) 61e6: ea41 4103 orr.w r1, r1, r3, lsl #16 m_firstCluster = firstCluster; 61ea: 6221 str r1, [r4, #32] return *reinterpret_cast(src); 61ec: 69d3 ldr r3, [r2, #28] m_fileSize = getLe32(dir->fileSize); 61ee: 61e3 str r3, [r4, #28] if ((oflag & O_AT_END) && !seekSet(m_fileSize)) { 61f0: f418 4f80 tst.w r8, #16384 ; 0x4000 61f4: d104 bne.n 6200 return true; 61f6: 2001 movs r0, #1 } 61f8: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} switch (oflag & O_ACCMODE) { 61fc: 2302 movs r3, #2 61fe: e7ce b.n 619e if ((oflag & O_AT_END) && !seekSet(m_fileSize)) { 6200: 69e1 ldr r1, [r4, #28] 6202: 4620 mov r0, r4 6204: f7ff ff40 bl 6088 6208: 2800 cmp r0, #0 620a: d1f4 bne.n 61f6 620c: e7c0 b.n 6190 if (firstCluster && !m_vol->freeChain(firstCluster)) { 620e: f001 fbcb bl 79a8 6212: 2800 cmp r0, #0 6214: d0bc beq.n 6190 m_flags |= FILE_FLAG_DIR_DIRTY; 6216: 78a3 ldrb r3, [r4, #2] 6218: e7d5 b.n 61c6 621a: bf00 nop 0000621c : bool isOpen() const {return m_attributes;} 621c: 7803 ldrb r3, [r0, #0] if (isOpen() || !dirFile->isDir() || (dirFile->curPosition() & 0X1F)) { 621e: 2b00 cmp r3, #0 6220: d145 bne.n 62ae bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { 6222: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} if (isOpen() || !dirFile->isDir() || (dirFile->curPosition() & 0X1F)) { 6226: 780b ldrb r3, [r1, #0] bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { 6228: b084 sub sp, #16 622a: 460c mov r4, r1 if (isOpen() || !dirFile->isDir() || (dirFile->curPosition() & 0X1F)) { 622c: f013 0f70 tst.w r3, #112 ; 0x70 6230: d030 beq.n 6294 uint32_t curPosition() const {return m_curPosition;} 6232: 694b ldr r3, [r1, #20] 6234: f013 051f ands.w r5, r3, #31 6238: d12c bne.n 6294 623a: 4606 mov r6, r0 623c: 4690 mov r8, r2 623e: 46a9 mov r9, r5 int8_t n = read(&n, 1); 6240: 2201 movs r2, #1 6242: f10d 010f add.w r1, sp, #15 6246: 4620 mov r0, r4 uint8_t i = (m_curPosition >> 5) & 0XF; 6248: f3c3 1a43 ubfx sl, r3, #5, #4 index = dirFile->curPosition()/FS_DIR_SIZE; 624c: 095f lsrs r7, r3, #5 int8_t n = read(&n, 1); 624e: f7ff fcd3 bl 5bf8 if (n != 1) { 6252: b240 sxtb r0, r0 return reinterpret_cast(m_vol->cacheAddress()) + i; 6254: ea4f 124a mov.w r2, sl, lsl #5 if (n != 1) { 6258: 2801 cmp r0, #1 625a: d11b bne.n 6294 m_curPosition += FS_DIR_SIZE - 1; 625c: 6963 ldr r3, [r4, #20] return m_buffer; 625e: 68a1 ldr r1, [r4, #8] 6260: 331f adds r3, #31 6262: f101 0c38 add.w ip, r1, #56 ; 0x38 6266: 6163 str r3, [r4, #20] if (dir->name[0] == FAT_NAME_FREE) { 6268: f81c 2002 ldrb.w r2, [ip, r2] return reinterpret_cast(m_vol->cacheAddress()) + i; 626c: eb0c 1c4a add.w ip, ip, sl, lsl #5 if (dir->name[0] == FAT_NAME_FREE) { 6270: b182 cbz r2, 6294 if (dir->name[0] == '.' || dir->name[0] == FAT_NAME_DELETED) { 6272: 2a2e cmp r2, #46 ; 0x2e 6274: d012 beq.n 629c 6276: f1a2 00e5 sub.w r0, r2, #229 ; 0xe5 627a: fab0 f080 clz r0, r0 627e: 0940 lsrs r0, r0, #5 6280: b960 cbnz r0, 629c return (dir->attributes & FAT_ATTRIB_LABEL) == 0; 6282: f89c 100b ldrb.w r1, [ip, #11] } else if (isFileOrSubdir(dir)) { 6286: f011 0e08 ands.w lr, r1, #8 628a: d012 beq.n 62b2 } else if (isLongName(dir)) { 628c: 290f cmp r1, #15 628e: d007 beq.n 62a0 lfnOrd = 0; 6290: 4605 mov r5, r0 6292: e7d5 b.n 6240 return false; 6294: 2000 movs r0, #0 } 6296: b004 add sp, #16 6298: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} lfnOrd = 0; 629c: 2500 movs r5, #0 629e: e7cf b.n 6240 if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { 62a0: 0651 lsls r1, r2, #25 62a2: d5cd bpl.n 6240 lfnOrd = ldir->order & 0X1F; 62a4: f002 051f and.w r5, r2, #31 checksum = ldir->checksum; 62a8: f89c 900d ldrb.w r9, [ip, #13] 62ac: e7c8 b.n 6240 return false; 62ae: 2000 movs r0, #0 } 62b0: 4770 bx lr if (lfnOrd && checksum != lfnChecksum(dir->name)) { 62b2: b185 cbz r5, 62d6 bool cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd); bool createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd); uint16_t getLfnChar(DirLfn_t* ldir, uint8_t i); uint8_t lfnChecksum(uint8_t* name) { uint8_t sum = 0; for (uint8_t i = 0; i < 11; i++) { 62b4: f10c 010a add.w r1, ip, #10 62b8: e001 b.n 62be sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 62ba: f81c 2f01 ldrb.w r2, [ip, #1]! 62be: ea4f 13ce mov.w r3, lr, lsl #7 for (uint8_t i = 0; i < 11; i++) { 62c2: 4561 cmp r1, ip sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 62c4: ea43 035e orr.w r3, r3, lr, lsr #1 62c8: fa52 f383 uxtab r3, r2, r3 62cc: fa5f fe83 uxtb.w lr, r3 for (uint8_t i = 0; i < 11; i++) { 62d0: d1f3 bne.n 62ba 62d2: 45ce cmp lr, r9 62d4: d1de bne.n 6294 if (!openCachedEntry(dirFile, index, oflag, lfnOrd)) { 62d6: 4643 mov r3, r8 62d8: b2ba uxth r2, r7 62da: 4621 mov r1, r4 62dc: 4630 mov r0, r6 62de: 9500 str r5, [sp, #0] 62e0: f7ff ff2a bl 6138 62e4: e7d7 b.n 6296 62e6: bf00 nop 000062e8 : if (!isOpen()) { 62e8: 7803 ldrb r3, [r0, #0] 62ea: b10b cbz r3, 62f0 62ec: f7ff b968 b.w 55c0 } 62f0: 2001 movs r0, #1 62f2: 4770 bx lr 000062f4 : //------------------------------------------------------------------------------ bool FatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { 62f4: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 62f8: 460e mov r6, r1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 59) { 62fa: 7801 ldrb r1, [r0, #0] uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { 62fc: b082 sub sp, #8 || second > 59) { 62fe: 0709 lsls r1, r1, #28 uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { 6300: f89d 7028 ldrb.w r7, [sp, #40] ; 0x28 6304: f89d 902c ldrb.w r9, [sp, #44] ; 0x2c 6308: f89d a030 ldrb.w sl, [sp, #48] ; 0x30 630c: f89d 8034 ldrb.w r8, [sp, #52] ; 0x34 || second > 59) { 6310: d518 bpl.n 6344 || year > 2107 6312: f2a2 72bc subw r2, r2, #1980 ; 0x7bc 6316: b294 uxth r4, r2 6318: 2c7f cmp r4, #127 ; 0x7f 631a: d813 bhi.n 6344 || month > 12 631c: 1e5a subs r2, r3, #1 631e: 9301 str r3, [sp, #4] 6320: 2a0b cmp r2, #11 6322: d80f bhi.n 6344 || day > 31 6324: 1e7a subs r2, r7, #1 6326: 2a1e cmp r2, #30 6328: d80c bhi.n 6344 || second > 59) { 632a: f1ba 0f3b cmp.w sl, #59 ; 0x3b 632e: bf98 it ls 6330: f1b9 0f17 cmpls.w r9, #23 6334: d806 bhi.n 6344 6336: f1b8 0f3b cmp.w r8, #59 ; 0x3b 633a: d803 bhi.n 6344 DBG_FAIL_MACRO; goto fail; } // update directory entry if (!sync()) { 633c: 4605 mov r5, r0 if (!isOpen()) { 633e: f7ff f93f bl 55c0 if (!sync()) { 6342: b918 cbnz r0, 634c } return m_vol->cacheSync(); fail: return false; } 6344: 2000 movs r0, #0 6346: b002 add sp, #8 6348: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} return m_cache.prepare(sector, options); 634c: 68a8 ldr r0, [r5, #8] 634e: 2201 movs r2, #1 6350: 69a9 ldr r1, [r5, #24] 6352: 3028 adds r0, #40 ; 0x28 6354: f003 ff94 bl a280 if (!dir) { 6358: 2800 cmp r0, #0 635a: d0f3 beq.n 6344 year << 9 | month << 5 | day; 635c: 9b01 ldr r3, [sp, #4] hour << 11 | minute << 5 | second >> 1; 635e: ea4f 0258 mov.w r2, r8, lsr #1 return dir + (m_dirIndex & 0XF); 6362: 88a9 ldrh r1, [r5, #4] year << 9 | month << 5 | day; 6364: ea47 1343 orr.w r3, r7, r3, lsl #5 if (flags & T_ACCESS) { 6368: 07f7 lsls r7, r6, #31 return dir + (m_dirIndex & 0XF); 636a: f001 010f and.w r1, r1, #15 hour << 11 | minute << 5 | second >> 1; 636e: ea42 124a orr.w r2, r2, sl, lsl #5 year << 9 | month << 5 | day; 6372: ea43 2344 orr.w r3, r3, r4, lsl #9 6376: eb00 1041 add.w r0, r0, r1, lsl #5 637a: b29b uxth r3, r3 hour << 11 | minute << 5 | second >> 1; 637c: ea42 22c9 orr.w r2, r2, r9, lsl #11 *reinterpret_cast(dst) = src; 6380: bf48 it mi 6382: 8243 strhmi r3, [r0, #18] if (flags & T_CREATE) { 6384: 07b4 lsls r4, r6, #30 6386: b292 uxth r2, r2 6388: d508 bpl.n 639c dir->createTimeMs = second & 1 ? 100 : 0; 638a: f018 0801 ands.w r8, r8, #1 638e: 8203 strh r3, [r0, #16] 6390: 81c2 strh r2, [r0, #14] 6392: bf18 it ne 6394: f04f 0864 movne.w r8, #100 ; 0x64 6398: f880 800d strb.w r8, [r0, #13] if (flags & T_WRITE) { 639c: 0771 lsls r1, r6, #29 639e: d501 bpl.n 63a4 63a0: 8303 strh r3, [r0, #24] 63a2: 82c2 strh r2, [r0, #22] return m_vol->cacheSync(); 63a4: 68ac ldr r4, [r5, #8] return m_cache.sync() && m_fatCache.sync() && syncDevice(); 63a6: f104 0028 add.w r0, r4, #40 ; 0x28 63aa: f003 ff3d bl a228 63ae: 2800 cmp r0, #0 63b0: d0c8 beq.n 6344 63b2: f504 700e add.w r0, r4, #568 ; 0x238 63b6: f003 ff37 bl a228 63ba: 2800 cmp r0, #0 63bc: d0c2 beq.n 6344 63be: 6820 ldr r0, [r4, #0] return m_blockDev->syncDevice(); 63c0: 6803 ldr r3, [r0, #0] 63c2: 6a1b ldr r3, [r3, #32] } 63c4: b002 add sp, #8 63c6: e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 63ca: 4718 bx r3 000063cc : //------------------------------------------------------------------------------ bool FatFile::truncate() { uint32_t toFree; // error if not a normal file or read-only if (!isWritable()) { 63cc: 7883 ldrb r3, [r0, #2] 63ce: 079b lsls r3, r3, #30 63d0: d527 bpl.n 6422 DBG_FAIL_MACRO; goto fail; } if (m_firstCluster == 0) { 63d2: 6a03 ldr r3, [r0, #32] bool FatFile::truncate() { 63d4: b510 push {r4, lr} 63d6: 4604 mov r4, r0 63d8: b082 sub sp, #8 if (m_firstCluster == 0) { 63da: b1ab cbz r3, 6408 return true; } if (m_curCluster) { 63dc: 6901 ldr r1, [r0, #16] 63de: bb11 cbnz r1, 6426 DBG_FAIL_MACRO; goto fail; } } } else { toFree = m_firstCluster; 63e0: 9301 str r3, [sp, #4] m_firstCluster = 0; 63e2: 6201 str r1, [r0, #32] } if (toFree) { if (!m_vol->freeChain(toFree)) { 63e4: 4619 mov r1, r3 63e6: 68a0 ldr r0, [r4, #8] 63e8: f001 fade bl 79a8 63ec: b1b0 cbz r0, 641c } } m_fileSize = m_curPosition; // need to update directory entry m_flags |= FILE_FLAG_DIR_DIRTY; 63ee: 78a3 ldrb r3, [r4, #2] m_fileSize = m_curPosition; 63f0: 6961 ldr r1, [r4, #20] m_flags |= FILE_FLAG_DIR_DIRTY; 63f2: f063 037f orn r3, r3, #127 ; 0x7f if (!isOpen()) { 63f6: 7822 ldrb r2, [r4, #0] m_fileSize = m_curPosition; 63f8: 61e1 str r1, [r4, #28] m_flags |= FILE_FLAG_DIR_DIRTY; 63fa: 70a3 strb r3, [r4, #2] if (!isOpen()) { 63fc: b122 cbz r2, 6408 63fe: 4620 mov r0, r4 6400: f7ff f8de bl 55c0 return sync(); fail: return false; } 6404: b002 add sp, #8 6406: bd10 pop {r4, pc} return true; 6408: 2001 movs r0, #1 } 640a: b002 add sp, #8 640c: bd10 pop {r4, pc} } int8_t fatGet(uint32_t cluster, uint32_t* value); bool fatPut(uint32_t cluster, uint32_t value); bool fatPutEOC(uint32_t cluster) { return fatPut(cluster, 0x0FFFFFFF); 640e: f06f 4270 mvn.w r2, #4026531840 ; 0xf0000000 6412: 6921 ldr r1, [r4, #16] 6414: 68a0 ldr r0, [r4, #8] 6416: f001 fab7 bl 7988 if (!m_vol->fatPutEOC(m_curCluster)) { 641a: b968 cbnz r0, 6438 return false; 641c: 2000 movs r0, #0 } 641e: b002 add sp, #8 6420: bd10 pop {r4, pc} return false; 6422: 2000 movs r0, #0 } 6424: 4770 bx lr toFree = 0; 6426: 2300 movs r3, #0 int8_t fg = m_vol->fatGet(m_curCluster, &toFree); 6428: aa01 add r2, sp, #4 642a: 6880 ldr r0, [r0, #8] toFree = 0; 642c: 9301 str r3, [sp, #4] int8_t fg = m_vol->fatGet(m_curCluster, &toFree); 642e: f001 fa99 bl 7964 if (fg < 0) { 6432: 2800 cmp r0, #0 6434: dbf2 blt.n 641c if (fg) { 6436: d1ea bne.n 640e if (toFree) { 6438: 9b01 ldr r3, [sp, #4] 643a: 2b00 cmp r3, #0 643c: d0d7 beq.n 63ee 643e: e7d1 b.n 63e4 00006440 : //------------------------------------------------------------------------------ size_t FatFile::write(const void* buf, size_t nbyte) { 6440: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} bool isWritable() const {return m_flags & FILE_FLAG_WRITE;} 6444: 7883 ldrb r3, [r0, #2] 6446: 4605 mov r5, r0 uint8_t cacheOption; // number of bytes left to write - must be before goto statements size_t nToWrite = nbyte; size_t n; // error if not a normal file or is read-only if (!isWritable()) { 6448: 079c lsls r4, r3, #30 644a: d577 bpl.n 653c DBG_FAIL_MACRO; goto fail; } // seek to end of file if append flag if ((m_flags & FILE_FLAG_APPEND)) { 644c: 4688 mov r8, r1 644e: 0719 lsls r1, r3, #28 6450: 4691 mov r9, r2 6452: f100 80b5 bmi.w 65c0 DBG_FAIL_MACRO; goto fail; } } // Don't exceed max fileSize. if (nbyte > (0XFFFFFFFF - m_curPosition)) { 6456: 696b ldr r3, [r5, #20] 6458: eb13 0209 adds.w r2, r3, r9 645c: d26e bcs.n 653c DBG_FAIL_MACRO; goto fail; } while (nToWrite) { 645e: f1b9 0f00 cmp.w r9, #0 6462: d040 beq.n 64e6 6464: 464f mov r7, r9 m_status = 0; 6466: f04f 0a00 mov.w sl, #0 uint8_t sectorOfCluster = m_vol->sectorOfCluster(m_curPosition); 646a: 68a8 ldr r0, [r5, #8] uint16_t sectorOffset = m_curPosition & m_vol->sectorMask(); 646c: f3c3 0608 ubfx r6, r3, #0, #9 if (sectorOfCluster == 0 && sectorOffset == 0) { // start of new cluster if (m_curCluster != 0) { 6470: 6929 ldr r1, [r5, #16] return (position >> 9) & m_clusterSectorMask; 6472: 7944 ldrb r4, [r0, #5] if (sectorOfCluster == 0 && sectorOffset == 0) { 6474: ea14 2453 ands.w r4, r4, r3, lsr #9 6478: d13f bne.n 64fa 647a: 2e00 cmp r6, #0 647c: d13d bne.n 64fa if (m_curCluster != 0) { 647e: 2900 cmp r1, #0 6480: d06e beq.n 6560 #if USE_FAT_FILE_FLAG_CONTIGUOUS int8_t fg; if (isContiguous() && m_fileSize > m_curPosition) { 6482: 78aa ldrb r2, [r5, #2] 6484: 0652 lsls r2, r2, #25 6486: d576 bpl.n 6576 6488: 69ea ldr r2, [r5, #28] 648a: 429a cmp r2, r3 648c: d973 bls.n 6576 m_curCluster++; 648e: 3101 adds r1, #1 6490: 6129 str r1, [r5, #16] return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); 6492: 3902 subs r1, #2 6494: 7982 ldrb r2, [r0, #6] 6496: 6943 ldr r3, [r0, #20] 6498: 4091 lsls r1, r2 649a: 4419 add r1, r3 } // sector for data write uint32_t sector = m_vol->clusterStartSector(m_curCluster) + sectorOfCluster; if (sectorOffset != 0 || nToWrite < m_vol->bytesPerSector()) { 649c: f5b7 7f00 cmp.w r7, #512 ; 0x200 64a0: d353 bcc.n 654a DBG_FAIL_MACRO; goto fail; } } #if USE_MULTI_SECTOR_IO } else if (nToWrite >= 2*m_vol->bytesPerSector()) { 64a2: f5b7 6f80 cmp.w r7, #1024 ; 0x400 64a6: d370 bcc.n 658a // use multiple sector write command uint32_t maxSectors = m_vol->sectorsPerCluster() - sectorOfCluster; 64a8: 7903 ldrb r3, [r0, #4] uint32_t nSector = nToWrite >> m_vol->bytesPerSectorShift(); 64aa: 0a7a lsrs r2, r7, #9 uint32_t maxSectors = m_vol->sectorsPerCluster() - sectorOfCluster; 64ac: 1b1b subs r3, r3, r4 64ae: 4293 cmp r3, r2 64b0: bf28 it cs 64b2: 4613 movcs r3, r2 return sector <= m_sector && m_sector < (sector + count); 64b4: 6b42 ldr r2, [r0, #52] ; 0x34 64b6: 428a cmp r2, r1 if (nSector > maxSectors) { nSector = maxSectors; } n = nSector << m_vol->bytesPerSectorShift(); 64b8: ea4f 2443 mov.w r4, r3, lsl #9 64bc: d307 bcc.n 64ce 64be: 185e adds r6, r3, r1 64c0: 42b2 cmp r2, r6 64c2: d204 bcs.n 64ce m_sector = 0XFFFFFFFF; 64c4: f04f 32ff mov.w r2, #4294967295 m_status = 0; 64c8: f880 a028 strb.w sl, [r0, #40] ; 0x28 m_sector = 0XFFFFFFFF; 64cc: 6342 str r2, [r0, #52] ; 0x34 return m_blockDev->writeSectors(sector, src, count); 64ce: 6ac0 ldr r0, [r0, #44] ; 0x2c 64d0: 4642 mov r2, r8 64d2: 6806 ldr r6, [r0, #0] 64d4: 6ab6 ldr r6, [r6, #40] ; 0x28 64d6: 47b0 blx r6 if (!m_vol->cacheSafeWrite(sector, src, nSector)) { 64d8: b380 cbz r0, 653c if (!m_vol->cacheSafeWrite(sector, src)) { DBG_FAIL_MACRO; goto fail; } } m_curPosition += n; 64da: 696b ldr r3, [r5, #20] while (nToWrite) { 64dc: 1b3f subs r7, r7, r4 src += n; 64de: 44a0 add r8, r4 m_curPosition += n; 64e0: 4423 add r3, r4 64e2: 616b str r3, [r5, #20] while (nToWrite) { 64e4: d1c1 bne.n 646a nToWrite -= n; } if (m_curPosition > m_fileSize) { 64e6: 69ea ldr r2, [r5, #28] 64e8: 429a cmp r2, r3 64ea: d276 bcs.n 65da // update fileSize and insure sync will update dir entry m_fileSize = m_curPosition; m_flags |= FILE_FLAG_DIR_DIRTY; 64ec: 78aa ldrb r2, [r5, #2] 64ee: 4648 mov r0, r9 m_fileSize = m_curPosition; 64f0: 61eb str r3, [r5, #28] m_flags |= FILE_FLAG_DIR_DIRTY; 64f2: f062 037f orn r3, r2, #127 ; 0x7f 64f6: 70ab strb r3, [r5, #2] 64f8: e025 b.n 6546 64fa: 7982 ldrb r2, [r0, #6] 64fc: 3902 subs r1, #2 64fe: 6943 ldr r3, [r0, #20] 6500: 4091 lsls r1, r2 6502: 4419 add r1, r3 + sectorOfCluster; 6504: 4421 add r1, r4 if (sectorOffset != 0 || nToWrite < m_vol->bytesPerSector()) { 6506: 2e00 cmp r6, #0 6508: d0c8 beq.n 649c n = m_vol->bytesPerSector() - sectorOffset; 650a: f5c6 7400 rsb r4, r6, #512 ; 0x200 cacheOption = FsCache::CACHE_FOR_WRITE; 650e: 2201 movs r2, #1 6510: 42bc cmp r4, r7 6512: bf28 it cs 6514: 463c movcs r4, r7 return m_cache.prepare(sector, options); 6516: 3028 adds r0, #40 ; 0x28 6518: f003 feb2 bl a280 if (!pc) { 651c: b170 cbz r0, 653c memcpy(dst, src, n); 651e: 4430 add r0, r6 if (m_vol->bytesPerSector() == (n + sectorOffset)) { 6520: 4426 add r6, r4 memcpy(dst, src, n); 6522: 4622 mov r2, r4 6524: 4641 mov r1, r8 6526: f004 ff39 bl b39c if (m_vol->bytesPerSector() == (n + sectorOffset)) { 652a: f5b6 7f00 cmp.w r6, #512 ; 0x200 652e: 68a8 ldr r0, [r5, #8] 6530: d1d3 bne.n 64da return m_cache.sync(); 6532: 3028 adds r0, #40 ; 0x28 6534: f003 fe78 bl a228 if (!m_vol->cacheSyncData()) { 6538: 2800 cmp r0, #0 653a: d1ce bne.n 64da } return nbyte; fail: // return for write error m_error |= WRITE_ERROR; 653c: 786b ldrb r3, [r5, #1] return 0; 653e: 2000 movs r0, #0 m_error |= WRITE_ERROR; 6540: f043 0301 orr.w r3, r3, #1 6544: 706b strb r3, [r5, #1] } 6546: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} n = m_vol->bytesPerSector() - sectorOffset; 654a: f5c6 7400 rsb r4, r6, #512 ; 0x200 if (sectorOffset == 0 && 654e: 696a ldr r2, [r5, #20] 6550: 69eb ldr r3, [r5, #28] 6552: 42bc cmp r4, r7 6554: bf28 it cs 6556: 463c movcs r4, r7 6558: 429a cmp r2, r3 655a: d305 bcc.n 6568 cacheOption = FsCache::CACHE_RESERVE_FOR_WRITE; 655c: 2205 movs r2, #5 655e: e7da b.n 6516 if (m_firstCluster == 0) { 6560: 6a29 ldr r1, [r5, #32] 6562: b321 cbz r1, 65ae m_curCluster = m_firstCluster; 6564: 6129 str r1, [r5, #16] 6566: e794 b.n 6492 (m_curPosition >= m_fileSize || m_flags & FILE_FLAG_PREALLOCATE)) { 6568: 78ab ldrb r3, [r5, #2] cacheOption = FsCache::CACHE_FOR_WRITE; 656a: f013 0f20 tst.w r3, #32 656e: bf14 ite ne 6570: 2205 movne r2, #5 6572: 2201 moveq r2, #1 6574: e7cf b.n 6516 fg = m_vol->fatGet(m_curCluster, &m_curCluster); 6576: f105 0210 add.w r2, r5, #16 657a: f001 f9f3 bl 7964 if (fg < 0) { 657e: 2800 cmp r0, #0 6580: dbdc blt.n 653c if (fg == 0) { 6582: d024 beq.n 65ce uint32_t sector = m_vol->clusterStartSector(m_curCluster) 6584: 68a8 ldr r0, [r5, #8] 6586: 6929 ldr r1, [r5, #16] 6588: e783 b.n 6492 if (isCached(sector)) { 658a: 6b43 ldr r3, [r0, #52] ; 0x34 658c: 428b cmp r3, r1 658e: d104 bne.n 659a m_sector = 0XFFFFFFFF; 6590: f04f 33ff mov.w r3, #4294967295 m_status = 0; 6594: f880 a028 strb.w sl, [r0, #40] ; 0x28 m_sector = 0XFFFFFFFF; 6598: 6343 str r3, [r0, #52] ; 0x34 return m_blockDev->writeSector(sector, src); 659a: 6ac0 ldr r0, [r0, #44] ; 0x2c 659c: 4642 mov r2, r8 659e: 6803 ldr r3, [r0, #0] 65a0: 6a5b ldr r3, [r3, #36] ; 0x24 65a2: 4798 blx r3 if (!m_vol->cacheSafeWrite(sector, src)) { 65a4: 2800 cmp r0, #0 65a6: d0c9 beq.n 653c n = m_vol->bytesPerSector(); 65a8: f44f 7400 mov.w r4, #512 ; 0x200 65ac: e795 b.n 64da if (!addCluster()) { 65ae: 4628 mov r0, r5 65b0: f7ff f860 bl 5674 65b4: 2800 cmp r0, #0 65b6: d0c1 beq.n 653c m_firstCluster = m_curCluster; 65b8: 6929 ldr r1, [r5, #16] uint32_t sector = m_vol->clusterStartSector(m_curCluster) 65ba: 68a8 ldr r0, [r5, #8] m_firstCluster = m_curCluster; 65bc: 6229 str r1, [r5, #32] 65be: e768 b.n 6492 if (!seekSet(m_fileSize)) { 65c0: 69c1 ldr r1, [r0, #28] 65c2: f7ff fd61 bl 6088 65c6: 2800 cmp r0, #0 65c8: f47f af45 bne.w 6456 65cc: e7b6 b.n 653c if (!addCluster()) { 65ce: 4628 mov r0, r5 65d0: f7ff f850 bl 5674 65d4: 2800 cmp r0, #0 65d6: d1d5 bne.n 6584 65d8: e7b0 b.n 653c } else if (FsDateTime::callback) { 65da: 4b05 ldr r3, [pc, #20] ; (65f0 ) 65dc: 681b ldr r3, [r3, #0] 65de: b12b cbz r3, 65ec m_flags |= FILE_FLAG_DIR_DIRTY; 65e0: 78ab ldrb r3, [r5, #2] 65e2: 4648 mov r0, r9 65e4: f063 037f orn r3, r3, #127 ; 0x7f 65e8: 70ab strb r3, [r5, #2] 65ea: e7ac b.n 6546 65ec: 4648 mov r0, r9 65ee: e7aa b.n 6546 65f0: 2000244c .word 0x2000244c 000065f4 : hash = ((hash << 5) + hash) ^ (*bgn++); } return hash; } //============================================================================== bool FatFile::cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { 65f4: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} FatFile dir = *this; 65f8: 4684 mov ip, r0 bool FatFile::cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { 65fa: b08d sub sp, #52 ; 0x34 65fc: 4614 mov r4, r2 next = begin; 65fe: 6815 ldr r5, [r2, #0] DirLfn_t* ldir; fname->reset(); for (uint8_t order = 1; order <= lfnOrd; order++) { 6600: 4698 mov r8, r3 bool FatFile::cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { 6602: 4606 mov r6, r0 6604: 4689 mov r9, r1 FatFile dir = *this; 6606: af03 add r7, sp, #12 for (uint8_t order = 1; order <= lfnOrd; order++) { 6608: 9301 str r3, [sp, #4] ls = 0; // lowSurrogate 660a: f04f 0e00 mov.w lr, #0 FatFile dir = *this; 660e: e8bc 000f ldmia.w ip!, {r0, r1, r2, r3} 6612: c70f stmia r7!, {r0, r1, r2, r3} 6614: e8bc 000f ldmia.w ip!, {r0, r1, r2, r3} 6618: c70f stmia r7!, {r0, r1, r2, r3} 661a: f8dc 3000 ldr.w r3, [ip] next = begin; 661e: 6065 str r5, [r4, #4] 6620: 603b str r3, [r7, #0] for (uint8_t order = 1; order <= lfnOrd; order++) { 6622: 4643 mov r3, r8 ls = 0; // lowSurrogate 6624: f8a4 e00c strh.w lr, [r4, #12] 6628: 2b00 cmp r3, #0 662a: d03f beq.n 66ac 662c: f04f 0a01 mov.w sl, #1 ldir = reinterpret_cast(dir.cacheDir(index - order)); 6630: eba9 010a sub.w r1, r9, sl return seekSet(32UL*index) ? readDirCache() : nullptr; 6634: a803 add r0, sp, #12 6636: b289 uxth r1, r1 6638: 0149 lsls r1, r1, #5 663a: f7ff fd25 bl 6088 663e: b350 cbz r0, 6696 6640: 2100 movs r1, #0 6642: a803 add r0, sp, #12 6644: f7ff fbc0 bl 5dc8 if (!ldir) { 6648: 4607 mov r7, r0 664a: b320 cbz r0, 6696 664c: 2500 movs r5, #0 664e: e00d b.n 666c uint16_t u = getLfnChar(ldir, i); if (fname->atEnd()) { return u == 0; } #if USE_UTF8_LONG_NAMES uint16_t cp = fname->get16(); 6650: f003 fe54 bl a2fc 6654: 4680 mov r8, r0 // Make sure caller checked for valid UTF-8. DBG_HALT_IF(cp == 0XFFFF); if (toUpcase(u) != toUpcase(cp)) { 6656: 4658 mov r0, fp 6658: f003 ff64 bl a524 665c: 4683 mov fp, r0 665e: 4640 mov r0, r8 6660: f003 ff60 bl a524 6664: 4583 cmp fp, r0 6666: d116 bne.n 6696 for (uint8_t i = 0; i < 13; i++) { 6668: 2d0d cmp r5, #13 666a: d018 beq.n 669e uint16_t u = getLfnChar(ldir, i); 666c: b2ea uxtb r2, r5 666e: 4639 mov r1, r7 6670: 4630 mov r0, r6 for (uint8_t i = 0; i < 13; i++) { 6672: 3501 adds r5, #1 uint16_t u = getLfnChar(ldir, i); 6674: f000 fee4 bl 7440 return !ls && next == end; 6678: 89a3 ldrh r3, [r4, #12] 667a: 4683 mov fp, r0 uint16_t cp = fname->get16(); 667c: 4620 mov r0, r4 667e: 2b00 cmp r3, #0 6680: d1e6 bne.n 6650 6682: e9d4 3201 ldrd r3, r2, [r4, #4] 6686: 4293 cmp r3, r2 6688: d1e2 bne.n 6650 return u == 0; 668a: fabb f08b clz r0, fp 668e: 0940 lsrs r0, r0, #5 } return true; fail: return false; } 6690: b00d add sp, #52 ; 0x34 6692: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} return false; 6696: 2000 movs r0, #0 } 6698: b00d add sp, #52 ; 0x34 669a: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} for (uint8_t order = 1; order <= lfnOrd; order++) { 669e: f10a 0a01 add.w sl, sl, #1 66a2: 9b01 ldr r3, [sp, #4] 66a4: fa5f fa8a uxtb.w sl, sl 66a8: 4553 cmp r3, sl 66aa: d2c1 bcs.n 6630 return true; 66ac: 2001 movs r0, #1 66ae: e7ef b.n 6690 000066b0 : //------------------------------------------------------------------------------ bool FatFile::createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { 66b0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} FatFile dir = *this; 66b4: 4607 mov r7, r0 bool FatFile::createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { 66b6: b08d sub sp, #52 ; 0x34 66b8: 4616 mov r6, r2 66ba: 469a mov sl, r3 FatFile dir = *this; 66bc: f10d 0c0c add.w ip, sp, #12 66c0: f102 0415 add.w r4, r2, #21 66c4: f102 0520 add.w r5, r2, #32 bool FatFile::createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { 66c8: 9101 str r1, [sp, #4] uint8_t sum = 0; 66ca: f04f 0900 mov.w r9, #0 FatFile dir = *this; 66ce: cf0f ldmia r7!, {r0, r1, r2, r3} 66d0: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 66d4: cf0f ldmia r7!, {r0, r1, r2, r3} 66d6: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 66da: 683b ldr r3, [r7, #0] 66dc: f8cc 3000 str.w r3, [ip] sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 66e0: ea4f 13c9 mov.w r3, r9, lsl #7 66e4: f814 2f01 ldrb.w r2, [r4, #1]! 66e8: ea43 0359 orr.w r3, r3, r9, lsr #1 for (uint8_t i = 0; i < 11; i++) { 66ec: 42a5 cmp r5, r4 sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 66ee: fa52 f383 uxtab r3, r2, r3 66f2: fa5f f983 uxtb.w r9, r3 for (uint8_t i = 0; i < 11; i++) { 66f6: d1f3 bne.n 66e0 next = begin; 66f8: 6833 ldr r3, [r6, #0] ls = 0; // lowSurrogate 66fa: f04f 0800 mov.w r8, #0 next = begin; 66fe: 6073 str r3, [r6, #4] ls = 0; // lowSurrogate 6700: f8a6 800c strh.w r8, [r6, #12] DirLfn_t* ldir; uint8_t checksum = lfnChecksum(fname->sfn); uint8_t fc = 0; fname->reset(); for (uint8_t order = 1; order <= lfnOrd; order++) { 6704: f1ba 0f00 cmp.w sl, #0 6708: d04e beq.n 67a8 670a: 2701 movs r7, #1 ldir = reinterpret_cast(dir.cacheDir(index - order)); 670c: 9b01 ldr r3, [sp, #4] return seekSet(32UL*index) ? readDirCache() : nullptr; 670e: a803 add r0, sp, #12 6710: 1bd9 subs r1, r3, r7 6712: b289 uxth r1, r1 6714: 0149 lsls r1, r1, #5 6716: f7ff fcb7 bl 6088 671a: 2800 cmp r0, #0 671c: d055 beq.n 67ca 671e: 2100 movs r1, #0 6720: a803 add r0, sp, #12 6722: f7ff fb51 bl 5dc8 if (!ldir) { 6726: 2800 cmp r0, #0 6728: d04f beq.n 67ca DBG_FAIL_MACRO; goto fail; } dir.m_vol->cacheDirty(); 672a: 9a05 ldr r2, [sp, #20] ldir->order = order == lfnOrd ? FAT_ORDER_LAST_LONG_ENTRY | order : order; 672c: 4557 cmp r7, sl 672e: f100 0b01 add.w fp, r0, #1 6732: f04f 0401 mov.w r4, #1 m_status |= CACHE_STATUS_DIRTY; 6736: f892 3028 ldrb.w r3, [r2, #40] ; 0x28 673a: f04f 0500 mov.w r5, #0 673e: f043 0301 orr.w r3, r3, #1 6742: f882 3028 strb.w r3, [r2, #40] ; 0x28 ldir->attributes = FAT_ATTRIB_LONG_NAME; 6746: f04f 030f mov.w r3, #15 ldir->order = order == lfnOrd ? FAT_ORDER_LAST_LONG_ENTRY | order : order; 674a: bf0c ite eq 674c: f047 0240 orreq.w r2, r7, #64 ; 0x40 6750: 463a movne r2, r7 ldir->attributes = FAT_ATTRIB_LONG_NAME; 6752: 72c3 strb r3, [r0, #11] ldir->mustBeZero1 = 0; 6754: f04f 0300 mov.w r3, #0 ldir->order = order == lfnOrd ? FAT_ORDER_LAST_LONG_ENTRY | order : order; 6758: 7002 strb r2, [r0, #0] ldir->mustBeZero1 = 0; 675a: 7303 strb r3, [r0, #12] 675c: f04f 0300 mov.w r3, #0 ldir->checksum = checksum; 6760: f880 900d strb.w r9, [r0, #13] 6764: 8343 strh r3, [r0, #26] setLe16(ldir->mustBeZero2, 0); for (uint8_t i = 0; i < 13; i++) { 6766: e006 b.n 6776 6768: f8ab 0000 strh.w r0, [fp] 676c: 3401 adds r4, #1 676e: 3501 adds r5, #1 6770: f10b 0b02 add.w fp, fp, #2 6774: b2e4 uxtb r4, r4 return !ls && next == end; 6776: 89b0 ldrh r0, [r6, #12] 6778: b918 cbnz r0, 6782 677a: e9d6 2301 ldrd r2, r3, [r6, #4] 677e: 429a cmp r2, r3 6780: d016 beq.n 67b0 uint16_t cp; if (fname->atEnd()) { cp = fc++ ? 0XFFFF : 0; } else { cp = fname->get16(); 6782: 4630 mov r0, r6 6784: f003 fdba bl a2fc if (i < 5) { 6788: 2d04 cmp r5, #4 678a: b2eb uxtb r3, r5 678c: d9ec bls.n 6768 } else if (i < 11) { 678e: 2b0a cmp r3, #10 6790: d802 bhi.n 6798 6792: f8ab 0003 strh.w r0, [fp, #3] } 6796: e7e9 b.n 676c for (uint8_t i = 0; i < 13; i++) { 6798: 2c0d cmp r4, #13 *reinterpret_cast(dst) = src; 679a: f8ab 0005 strh.w r0, [fp, #5] 679e: d1e5 bne.n 676c for (uint8_t order = 1; order <= lfnOrd; order++) { 67a0: 3701 adds r7, #1 67a2: b2ff uxtb r7, r7 67a4: 45ba cmp sl, r7 67a6: d2b1 bcs.n 670c DBG_HALT_IF(cp == 0XFFFF); } putLfnChar(ldir, i, cp); } } return true; 67a8: 2001 movs r0, #1 fail: return false; } 67aa: b00d add sp, #52 ; 0x34 67ac: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} cp = fc++ ? 0XFFFF : 0; 67b0: f1b8 0f00 cmp.w r8, #0 67b4: d006 beq.n 67c4 67b6: f108 0801 add.w r8, r8, #1 67ba: f64f 70ff movw r0, #65535 ; 0xffff 67be: fa5f f888 uxtb.w r8, r8 67c2: e7e1 b.n 6788 67c4: f04f 0801 mov.w r8, #1 67c8: e7de b.n 6788 return false; 67ca: 2000 movs r0, #0 } 67cc: b00d add sp, #52 ; 0x34 67ce: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 67d2: bf00 nop 000067d4 : uint8_t uc = 0; uint8_t i = 0; uint8_t in = 7; const char* dot; const char* end = fname->end; const char* ptr = fname->begin; 67d4: 4602 mov r2, r0 // Assume blanks removed from start and end. DBG_HALT_IF(*ptr == ' ' || *(end - 1) == ' ' || *(end - 1) == '.'); // Blank file short name. for (uint8_t k = 0; k < 11; k++) { fname->sfn[k] = ' '; 67d6: f04f 3120 mov.w r1, #538976288 ; 0x20202020 const char* ptr = fname->begin; 67da: f852 3b16 ldr.w r3, [r2], #22 bool FatFile::makeSFN(FatLfn_t* fname) { 67de: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} fname->sfn[k] = ' '; 67e2: f8c0 1016 str.w r1, [r0, #22] bool FatFile::makeSFN(FatLfn_t* fname) { 67e6: 4686 mov lr, r0 const char* end = fname->end; 67e8: 6884 ldr r4, [r0, #8] fname->sfn[k] = ' '; 67ea: 6051 str r1, [r2, #4] 67ec: f8c2 1007 str.w r1, [r2, #7] } // Not 8.3 if starts with dot. is83 = *ptr == '.' ? false : true; 67f0: 781a ldrb r2, [r3, #0] 67f2: 2a2e cmp r2, #46 ; 0x2e 67f4: bf14 ite ne 67f6: 2001 movne r0, #1 67f8: 2000 moveq r0, #0 // Skip leading dots. for (; *ptr == '.'; ptr++) {} 67fa: d103 bne.n 6804 67fc: f813 2f01 ldrb.w r2, [r3, #1]! 6800: 2a2e cmp r2, #46 ; 0x2e 6802: d0fb beq.n 67fc // Find last dot. for (dot = end - 1; dot > ptr && *dot != '.'; dot--) {} 6804: 1e61 subs r1, r4, #1 6806: 4299 cmp r1, r3 6808: d90b bls.n 6822 680a: 460a mov r2, r1 680c: e002 b.n 6814 680e: 4293 cmp r3, r2 6810: 4611 mov r1, r2 6812: d006 beq.n 6822 6814: 4611 mov r1, r2 6816: 3a01 subs r2, #1 6818: f891 c000 ldrb.w ip, [r1] 681c: f1bc 0f2e cmp.w ip, #46 ; 0x2e 6820: d1f5 bne.n 680e for (; ptr < end; ptr++) { 6822: 429c cmp r4, r3 6824: f04f 0500 mov.w r5, #0 6828: f240 8086 bls.w 6938 682c: 2607 movs r6, #7 682e: 2708 movs r7, #8 6830: 46a9 mov r9, r5 6832: 46a8 mov r8, r5 6834: e006 b.n 6844 6836: 3301 adds r3, #1 c = *ptr; if (c == '.' && ptr == dot) { in = 10; // Max index for full 8.3 name. 6838: 260a movs r6, #10 i = 8; // Place for extension. 683a: f04f 0908 mov.w r9, #8 bit = FAT_CASE_LC_EXT; // bit for extension. 683e: 2710 movs r7, #16 for (; ptr < end; ptr++) { 6840: 429c cmp r4, r3 6842: d95b bls.n 68fc c = *ptr; 6844: 781a ldrb r2, [r3, #0] if (c == '.' && ptr == dot) { 6846: 2a2e cmp r2, #46 ; 0x2e 6848: bf08 it eq 684a: 4299 cmpeq r1, r3 684c: d0f3 beq.n 6836 if (c == '"' || c == '|' || c == '[' || c == '\\' || c == ']') { 684e: 2a22 cmp r2, #34 ; 0x22 6850: d00d beq.n 686e 6852: 2a7c cmp r2, #124 ; 0x7c 6854: d00b beq.n 686e 6856: f1a2 0c5b sub.w ip, r2, #91 ; 0x5b 685a: f1bc 0f02 cmp.w ip, #2 685e: d906 bls.n 686e if ((0X2A <= c && c <= 0X2F && c != 0X2D) || (0X3A <= c && c <= 0X3F)) { 6860: f1a2 0c2a sub.w ip, r2, #42 ; 0x2a 6864: f1bc 0f05 cmp.w ip, #5 6868: d821 bhi.n 68ae 686a: 2a2d cmp r2, #45 ; 0x2d 686c: d01f beq.n 68ae } else { if (sfnReservedChar(c)) { is83 = false; // Skip UTF-8 trailing characters. if ((c & 0XC0) == 0X80) { 686e: f002 02c0 and.w r2, r2, #192 ; 0xc0 6872: 2a80 cmp r2, #128 ; 0x80 6874: d05d beq.n 6932 continue; } c = '_'; } if (i > in) { 6876: 454e cmp r6, r9 6878: d22f bcs.n 68da is83 = false; if (in == 10 || ptr > dot) { 687a: 4299 cmp r1, r3 687c: bf2c ite cs 687e: 2000 movcs r0, #0 6880: 2001 movcc r0, #1 6882: 2e0a cmp r6, #10 6884: bf08 it eq 6886: f040 0001 orreq.w r0, r0, #1 688a: 2800 cmp r0, #0 688c: d047 beq.n 691e if (i < 7) { fname->seqPos = i; } } } if (fname->sfn[0] == ' ') { 688e: f89e 3016 ldrb.w r3, [lr, #22] 6892: 2b20 cmp r3, #32 6894: d040 beq.n 6918 } if (is83) { fname->flags = lc & uc ? FNAME_FLAG_MIXED_CASE : lc; } else { fname->flags = FNAME_FLAG_LOST_CHARS; fname->sfn[fname->seqPos] = '~'; 6896: f89e 3014 ldrb.w r3, [lr, #20] fname->flags = FNAME_FLAG_LOST_CHARS; 689a: 2001 movs r0, #1 fname->sfn[fname->seqPos] = '~'; 689c: 217e movs r1, #126 ; 0x7e fname->sfn[fname->seqPos + 1] = '1'; 689e: 2231 movs r2, #49 ; 0x31 fname->sfn[fname->seqPos] = '~'; 68a0: 4473 add r3, lr fname->flags = FNAME_FLAG_LOST_CHARS; 68a2: f88e 0015 strb.w r0, [lr, #21] fname->sfn[fname->seqPos] = '~'; 68a6: 7599 strb r1, [r3, #22] fname->sfn[fname->seqPos + 1] = '1'; 68a8: 75da strb r2, [r3, #23] } return true; fail: return false; } 68aa: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} 68ae: f1a2 0c3a sub.w ip, r2, #58 ; 0x3a 68b2: f1bc 0f05 cmp.w ip, #5 68b6: d9da bls.n 686e if (sfnReservedChar(c)) { 68b8: f1a2 0c21 sub.w ip, r2, #33 ; 0x21 68bc: f1bc 0f5d cmp.w ip, #93 ; 0x5d 68c0: d8d5 bhi.n 686e if (i > in) { 68c2: 454e cmp r6, r9 68c4: d3d9 bcc.n 687a if (isLower(c)) { 68c6: f1a2 0c61 sub.w ip, r2, #97 ; 0x61 68ca: f1bc 0f19 cmp.w ip, #25 68ce: d828 bhi.n 6922 c += 'A' - 'a'; 68d0: 3a20 subs r2, #32 lc |= bit; 68d2: 433d orrs r5, r7 c += 'A' - 'a'; 68d4: b2d2 uxtb r2, r2 lc |= bit; 68d6: b2ed uxtb r5, r5 68d8: e001 b.n 68de is83 = false; 68da: 2000 movs r0, #0 c = '_'; 68dc: 225f movs r2, #95 ; 0x5f fname->sfn[i++] = c; 68de: f109 0c01 add.w ip, r9, #1 68e2: 44f1 add r9, lr for (; ptr < end; ptr++) { 68e4: 3301 adds r3, #1 fname->sfn[i++] = c; 68e6: f889 2016 strb.w r2, [r9, #22] 68ea: fa5f f28c uxtb.w r2, ip if (i < 7) { 68ee: 2a06 cmp r2, #6 fname->seqPos = i; 68f0: 4691 mov r9, r2 68f2: bf98 it ls 68f4: f88e 2014 strbls.w r2, [lr, #20] for (; ptr < end; ptr++) { 68f8: 429c cmp r4, r3 68fa: d8a3 bhi.n 6844 if (fname->sfn[0] == ' ') { 68fc: f89e 3016 ldrb.w r3, [lr, #22] 6900: 2b20 cmp r3, #32 6902: d009 beq.n 6918 if (is83) { 6904: 2800 cmp r0, #0 6906: d0c6 beq.n 6896 fname->flags = lc & uc ? FNAME_FLAG_MIXED_CASE : lc; 6908: ea18 0f05 tst.w r8, r5 690c: bf18 it ne 690e: 2502 movne r5, #2 6910: f88e 5015 strb.w r5, [lr, #21] } 6914: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} return false; 6918: 2000 movs r0, #0 } 691a: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} 691e: 460b mov r3, r1 6920: e78e b.n 6840 } else if (isUpper(c)) { 6922: f1a2 0c41 sub.w ip, r2, #65 ; 0x41 6926: f1bc 0f19 cmp.w ip, #25 uc |= bit; 692a: bf98 it ls 692c: ea47 0808 orrls.w r8, r7, r8 6930: e7d5 b.n 68de for (; ptr < end; ptr++) { 6932: 3301 adds r3, #1 is83 = false; 6934: 2000 movs r0, #0 6936: e783 b.n 6840 for (; ptr < end; ptr++) { 6938: 46a8 mov r8, r5 693a: e7df b.n 68fc 0000693c : //------------------------------------------------------------------------------ bool FatFile::makeUniqueSfn(FatLfn_t* fname) { 693c: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} const uint8_t FIRST_HASH_SEQ = 2; // min value is 2 uint8_t pos = fname->seqPos; 6940: f04f 0962 mov.w r9, #98 ; 0x62 DirFat_t* dir; uint16_t hex = 0; 6944: 2500 movs r5, #0 bool FatFile::makeUniqueSfn(FatLfn_t* fname) { 6946: 460f mov r7, r1 6948: 4604 mov r4, r0 694a: f8df b0a0 ldr.w fp, [pc, #160] ; 69ec for (uint8_t i = pos + 4 ; i > pos; i--) { uint8_t h = hex & 0XF; fname->sfn[i] = h < 10 ? h + '0' : h + 'A' - 10; hex >>= 4; } fname->sfn[pos] = '~'; 694e: f04f 0a7e mov.w sl, #126 ; 0x7e uint8_t pos = fname->seqPos; 6952: f891 8014 ldrb.w r8, [r1, #20] goto fail; } if (dir->name[0] == FAT_NAME_FREE) { goto done; } if (isFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { 6956: f101 0616 add.w r6, r1, #22 return systick_millis_count; 695a: f1b8 0f03 cmp.w r8, #3 695e: f8db 3000 ldr.w r3, [fp] 6962: bf28 it cs 6964: f04f 0803 movcs.w r8, #3 hex += millis(); 6968: 442b add r3, r5 696a: b29d uxth r5, r3 for (uint8_t i = pos + 4 ; i > pos; i--) { 696c: f108 0304 add.w r3, r8, #4 6970: b2db uxtb r3, r3 uint8_t h = hex & 0XF; 6972: f005 020f and.w r2, r5, #15 for (uint8_t i = pos + 4 ; i > pos; i--) { 6976: 1e58 subs r0, r3, #1 hex >>= 4; 6978: 092d lsrs r5, r5, #4 fname->sfn[i] = h < 10 ? h + '0' : h + 'A' - 10; 697a: 2a09 cmp r2, #9 697c: f102 0137 add.w r1, r2, #55 ; 0x37 6980: bf98 it ls 6982: f102 0130 addls.w r1, r2, #48 ; 0x30 6986: 18fa adds r2, r7, r3 for (uint8_t i = pos + 4 ; i > pos; i--) { 6988: b2c3 uxtb r3, r0 fname->sfn[i] = h < 10 ? h + '0' : h + 'A' - 10; 698a: 7591 strb r1, [r2, #22] for (uint8_t i = pos + 4 ; i > pos; i--) { 698c: 4598 cmp r8, r3 698e: d1f0 bne.n 6972 fname->sfn[pos] = '~'; 6990: eb07 0308 add.w r3, r7, r8 seekSet(0); 6994: 2100 movs r1, #0 6996: 4620 mov r0, r4 6998: f883 a016 strb.w sl, [r3, #22] 699c: f7ff fb74 bl 6088 dir = readDirCache(true); 69a0: 2101 movs r1, #1 69a2: 4620 mov r0, r4 69a4: f7ff fa10 bl 5dc8 69a8: 4603 mov r3, r0 if (isFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { 69aa: 220b movs r2, #11 69ac: 4630 mov r0, r6 if (!dir) { 69ae: b19b cbz r3, 69d8 if (dir->name[0] == FAT_NAME_FREE) { 69b0: f893 c000 ldrb.w ip, [r3] if (isFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { 69b4: 4619 mov r1, r3 if (dir->name[0] == FAT_NAME_FREE) { 69b6: f1bc 0f00 cmp.w ip, #0 69ba: d013 beq.n 69e4 if (isFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { 69bc: 7adb ldrb r3, [r3, #11] 69be: 071b lsls r3, r3, #28 69c0: d4ee bmi.n 69a0 69c2: f007 f885 bl dad0 69c6: 2800 cmp r0, #0 69c8: d1ea bne.n 69a0 for (uint8_t seq = FIRST_HASH_SEQ; seq < 100; seq++) { 69ca: f109 39ff add.w r9, r9, #4294967295 69ce: f019 09ff ands.w r9, r9, #255 ; 0xff 69d2: d1c2 bne.n 695a } // fall inti fail - too many tries. DBG_FAIL_MACRO; fail: return false; 69d4: 4648 mov r0, r9 fail: 69d6: e003 b.n 69e0 if (!getError()) { 69d8: 7860 ldrb r0, [r4, #1] 69da: fab0 f080 clz r0, r0 69de: 0940 lsrs r0, r0, #5 done: return true; } 69e0: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} return true; 69e4: 2001 movs r0, #1 } 69e6: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} 69ea: bf00 nop 69ec: 20002d90 .word 0x20002d90 000069f0 : //------------------------------------------------------------------------------ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { 69f0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 69f4: ed2d 8b02 vpush {d8} 69f8: b08b sub sp, #44 ; 0x2c 69fa: e9cd 0302 strd r0, r3, [sp, #8] uint16_t curIndex; uint16_t date; uint16_t time; DirFat_t* dir; DirLfn_t* ldir; auto vol = dirFile->m_vol; 69fe: 688b ldr r3, [r1, #8] 6a00: 9307 str r3, [sp, #28] if (!dirFile->isDir() || isOpen()) { 6a02: 780b ldrb r3, [r1, #0] 6a04: f013 0f70 tst.w r3, #112 ; 0x70 6a08: d053 beq.n 6ab2 bool isOpen() const {return m_attributes;} 6a0a: 9b02 ldr r3, [sp, #8] 6a0c: 781b ldrb r3, [r3, #0] 6a0e: 2b00 cmp r3, #0 6a10: d14f bne.n 6ab2 DBG_FAIL_MACRO; goto fail; } // Number of directory entries needed. nameOrd = (fname->len + 12)/13; 6a12: 6913 ldr r3, [r2, #16] 6a14: 4690 mov r8, r2 6a16: 4a9a ldr r2, [pc, #616] ; (6c80 ) 6a18: 460e mov r6, r1 6a1a: 330c adds r3, #12 6a1c: fba2 2303 umull r2, r3, r2, r3 6a20: f3c3 0287 ubfx r2, r3, #2, #8 freeNeed = fname->flags & FNAME_FLAG_NEED_LFN ? 1 + nameOrd : 1; 6a24: f898 3015 ldrb.w r3, [r8, #21] 6a28: 0798 lsls r0, r3, #30 nameOrd = (fname->len + 12)/13; 6a2a: 9204 str r2, [sp, #16] freeNeed = fname->flags & FNAME_FLAG_NEED_LFN ? 1 + nameOrd : 1; 6a2c: f000 80a7 beq.w 6b7e 6a30: 1c57 adds r7, r2, #1 6a32: b2ff uxtb r7, r7 uint8_t checksum = 0; 6a34: 2300 movs r3, #0 seekSet(0); 6a36: 4630 mov r0, r6 6a38: 4619 mov r1, r3 6a3a: 461c mov r4, r3 6a3c: 9306 str r3, [sp, #24] 6a3e: f7ff fb23 bl 6088 goto found; } DBG_FAIL_MACRO; goto fail; } if (!memcmp(dir->name, fname->sfn, sizeof(fname->sfn))) { 6a42: f108 0316 add.w r3, r8, #22 uint8_t order = 0; 6a46: 46a3 mov fp, r4 uint8_t lfnOrd = 0; 6a48: 46a1 mov r9, r4 uint16_t freeIndex = 0; 6a4a: 46a2 mov sl, r4 if (!memcmp(dir->name, fname->sfn, sizeof(fname->sfn))) { 6a4c: ee08 3a10 vmov s16, r3 bool fnameFound = false; 6a50: 9405 str r4, [sp, #20] curIndex = dirFile->m_curPosition/FS_DIR_SIZE; 6a52: 6975 ldr r5, [r6, #20] dir = dirFile->readDirCache(); 6a54: 2100 movs r1, #0 6a56: 4630 mov r0, r6 6a58: f7ff f9b6 bl 5dc8 curIndex = dirFile->m_curPosition/FS_DIR_SIZE; 6a5c: f3c5 154f ubfx r5, r5, #5, #16 if (!dir) { 6a60: 4603 mov r3, r0 6a62: b320 cbz r0, 6aae if (dir->name[0] == FAT_NAME_DELETED || dir->name[0] == FAT_NAME_FREE) { 6a64: 7802 ldrb r2, [r0, #0] 6a66: 2ae5 cmp r2, #229 ; 0xe5 6a68: d029 beq.n 6abe 6a6a: b342 cbz r2, 6abe freeFound = 0; 6a6c: 42bc cmp r4, r7 6a6e: bf38 it cc 6a70: 2400 movcc r4, #0 if (dir->name[0] == FAT_NAME_DELETED || dir->name[0] == '.') { 6a72: 2a2e cmp r2, #46 ; 0x2e 6a74: d02b beq.n 6ace return dir->attributes == FAT_ATTRIB_LONG_NAME; 6a76: f890 c00b ldrb.w ip, [r0, #11] } else if (isLongName(dir)) { 6a7a: f1bc 0f0f cmp.w ip, #15 6a7e: d054 beq.n 6b2a } else if (isFileOrSubdir(dir)) { 6a80: f01c 0c08 ands.w ip, ip, #8 6a84: d123 bne.n 6ace if (lfnOrd) { 6a86: f1b9 0f00 cmp.w r9, #0 6a8a: f040 80d5 bne.w 6c38 if (!memcmp(dir->name, fname->sfn, sizeof(fname->sfn))) { 6a8e: 220b movs r2, #11 6a90: ee18 1a10 vmov r1, s16 6a94: f007 f81c bl dad0 6a98: 2800 cmp r0, #0 6a9a: d1da bne.n 6a52 if (!(fname->flags & FNAME_FLAG_LOST_CHARS)) { 6a9c: f898 3015 ldrb.w r3, [r8, #21] 6aa0: f013 0301 ands.w r3, r3, #1 6aa4: f000 80e4 beq.w 6c70 goto found; } fnameFound = true; 6aa8: 2301 movs r3, #1 6aaa: 9305 str r3, [sp, #20] 6aac: e7d1 b.n 6a52 if (dirFile->getError()) { 6aae: 7873 ldrb r3, [r6, #1] 6ab0: b183 cbz r3, 6ad4 goto fail; } return true; fail: return false; 6ab2: 2000 movs r0, #0 } 6ab4: b00b add sp, #44 ; 0x2c 6ab6: ecbd 8b02 vpop {d8} 6aba: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} curIndex = dirFile->m_curPosition/FS_DIR_SIZE; 6abe: 2c00 cmp r4, #0 6ac0: bf08 it eq 6ac2: 46aa moveq sl, r5 if (freeFound < freeNeed) { 6ac4: 42bc cmp r4, r7 6ac6: d201 bcs.n 6acc freeFound++; 6ac8: 3401 adds r4, #1 6aca: b2e4 uxtb r4, r4 if (dir->name[0] == FAT_NAME_FREE) { 6acc: b112 cbz r2, 6ad4 lfnOrd = 0; 6ace: f04f 0900 mov.w r9, #0 6ad2: e7be b.n 6a52 if (!(oflag & O_CREAT) || !isWriteMode(oflag)) { 6ad4: 9b03 ldr r3, [sp, #12] 6ad6: 059a lsls r2, r3, #22 6ad8: d5eb bpl.n 6ab2 #define O_READ O_RDONLY #define O_WRITE O_WRONLY inline bool isWriteMode(oflag_t oflag) { oflag &= O_ACCMODE; 6ada: f003 0303 and.w r3, r3, #3 return oflag == O_WRONLY || oflag == O_RDWR; 6ade: 3b01 subs r3, #1 6ae0: 2b01 cmp r3, #1 6ae2: d8e6 bhi.n 6ab2 if (freeFound == 0) { 6ae4: 2c00 cmp r4, #0 6ae6: bf08 it eq 6ae8: 46aa moveq sl, r5 while (freeFound < freeNeed) { 6aea: 42bc cmp r4, r7 6aec: d303 bcc.n 6af6 6aee: e048 b.n 6b82 freeFound++; 6af0: b2dc uxtb r4, r3 while (freeFound < freeNeed) { 6af2: 42a7 cmp r7, r4 6af4: d045 beq.n 6b82 dir = dirFile->readDirCache(); 6af6: 2100 movs r1, #0 6af8: 4630 mov r0, r6 6afa: f7ff f965 bl 5dc8 freeFound++; 6afe: 1c63 adds r3, r4, #1 if (!dir) { 6b00: 2800 cmp r0, #0 6b02: d1f5 bne.n 6af0 if (dirFile->getError()) { 6b04: 7873 ldrb r3, [r6, #1] 6b06: 2b00 cmp r3, #0 6b08: d1d3 bne.n 6ab2 while (freeFound < freeNeed) { 6b0a: 42a7 cmp r7, r4 6b0c: d939 bls.n 6b82 6b0e: 9d07 ldr r5, [sp, #28] 6b10: e005 b.n 6b1e return m_sectorsPerCluster*(m_bytesPerSector/FS_DIR_SIZE); 6b12: 792b ldrb r3, [r5, #4] freeFound += vol->dirEntriesPerCluster(); 6b14: eb04 1403 add.w r4, r4, r3, lsl #4 6b18: b2e4 uxtb r4, r4 while (freeFound < freeNeed) { 6b1a: 42a7 cmp r7, r4 6b1c: d931 bls.n 6b82 if (!dirFile->addDirCluster()) { 6b1e: 4630 mov r0, r6 6b20: f7fe fdc2 bl 56a8 6b24: 2800 cmp r0, #0 6b26: d1f4 bne.n 6b12 6b28: e7c3 b.n 6ab2 if (!lfnOrd) { 6b2a: f1b9 0f00 cmp.w r9, #0 6b2e: d119 bne.n 6b64 order = ldir->order & 0X1F; 6b30: f002 0b1f and.w fp, r2, #31 if (order != nameOrd || 6b34: 9904 ldr r1, [sp, #16] 6b36: 4559 cmp r1, fp 6b38: d18b bne.n 6a52 6b3a: f012 0940 ands.w r9, r2, #64 ; 0x40 6b3e: d088 beq.n 6a52 checksum = ldir->checksum; 6b40: 7b43 ldrb r3, [r0, #13] 6b42: 4689 mov r9, r1 6b44: 9306 str r3, [sp, #24] if (order == 1) { 6b46: f1bb 0f01 cmp.w fp, #1 6b4a: d182 bne.n 6a52 if (!dirFile->cmpName(curIndex + 1, fname, lfnOrd)) { 6b4c: 1c69 adds r1, r5, #1 6b4e: 464b mov r3, r9 6b50: 4642 mov r2, r8 6b52: 4630 mov r0, r6 6b54: b289 uxth r1, r1 6b56: f7ff fd4d bl 65f4 lfnOrd = 0; 6b5a: 2800 cmp r0, #0 6b5c: bf08 it eq 6b5e: f04f 0900 moveq.w r9, #0 6b62: e776 b.n 6a52 } else if (ldir->order != --order || checksum != ldir->checksum) { 6b64: f10b 3bff add.w fp, fp, #4294967295 6b68: fa5f fb8b uxtb.w fp, fp 6b6c: 455a cmp r2, fp 6b6e: d1ae bne.n 6ace 6b70: 7b43 ldrb r3, [r0, #13] 6b72: 9a06 ldr r2, [sp, #24] 6b74: 4293 cmp r3, r2 6b76: d0e6 beq.n 6b46 lfnOrd = 0; 6b78: f04f 0900 mov.w r9, #0 6b7c: e769 b.n 6a52 freeNeed = fname->flags & FNAME_FLAG_NEED_LFN ? 1 + nameOrd : 1; 6b7e: 2701 movs r7, #1 6b80: e758 b.n 6a34 if (fnameFound) { 6b82: 9b05 ldr r3, [sp, #20] 6b84: b12b cbz r3, 6b92 if (!dirFile->makeUniqueSfn(fname)) { 6b86: 4641 mov r1, r8 6b88: 4630 mov r0, r6 6b8a: f7ff fed7 bl 693c 6b8e: 2800 cmp r0, #0 6b90: d08f beq.n 6ab2 lfnOrd = freeNeed - 1; 6b92: 3f01 subs r7, #1 if (!dirFile->createLFN(curIndex, fname, lfnOrd)) { 6b94: 4642 mov r2, r8 6b96: 4630 mov r0, r6 lfnOrd = freeNeed - 1; 6b98: b2fb uxtb r3, r7 curIndex = freeIndex + lfnOrd; 6b9a: eb0a 0503 add.w r5, sl, r3 lfnOrd = freeNeed - 1; 6b9e: 461f mov r7, r3 curIndex = freeIndex + lfnOrd; 6ba0: b2ad uxth r5, r5 if (!dirFile->createLFN(curIndex, fname, lfnOrd)) { 6ba2: 4629 mov r1, r5 6ba4: f7ff fd84 bl 66b0 6ba8: 2800 cmp r0, #0 6baa: d082 beq.n 6ab2 return seekSet(32UL*index) ? readDirCache() : nullptr; 6bac: 0169 lsls r1, r5, #5 6bae: 4630 mov r0, r6 6bb0: f7ff fa6a bl 6088 6bb4: 2800 cmp r0, #0 6bb6: f43f af7c beq.w 6ab2 6bba: 2100 movs r1, #0 6bbc: 4630 mov r0, r6 6bbe: f7ff f903 bl 5dc8 if (!dir) { 6bc2: 4604 mov r4, r0 6bc4: 2800 cmp r0, #0 6bc6: f43f af74 beq.w 6ab2 memset(dir, 0, sizeof(DirFat_t)); 6bca: 2220 movs r2, #32 6bcc: 2100 movs r1, #0 6bce: f006 ffaf bl db30 memcpy(dir->name, fname->sfn, 11); 6bd2: f8d8 2016 ldr.w r2, [r8, #22] 6bd6: f8d8 301a ldr.w r3, [r8, #26] 6bda: 6022 str r2, [r4, #0] 6bdc: 6063 str r3, [r4, #4] 6bde: f898 3020 ldrb.w r3, [r8, #32] 6be2: f8b8 201e ldrh.w r2, [r8, #30] 6be6: 72a3 strb r3, [r4, #10] 6be8: 8122 strh r2, [r4, #8] dir->caseFlags = (FAT_CASE_LC_BASE | FAT_CASE_LC_EXT) & fname->flags; 6bea: f898 3015 ldrb.w r3, [r8, #21] 6bee: f003 0318 and.w r3, r3, #24 6bf2: 7323 strb r3, [r4, #12] if (FsDateTime::callback) { 6bf4: 4b23 ldr r3, [pc, #140] ; (6c84 ) 6bf6: 681b ldr r3, [r3, #0] 6bf8: 2b00 cmp r3, #0 6bfa: d03b beq.n 6c74 FsDateTime::callback(&date, &time, &ms10); 6bfc: f10d 0223 add.w r2, sp, #35 ; 0x23 6c00: f10d 0126 add.w r1, sp, #38 ; 0x26 6c04: a809 add r0, sp, #36 ; 0x24 6c06: 4798 blx r3 *reinterpret_cast(dst) = src; 6c08: f8bd 3024 ldrh.w r3, [sp, #36] ; 0x24 6c0c: 8223 strh r3, [r4, #16] 6c0e: f8bd 3026 ldrh.w r3, [sp, #38] ; 0x26 6c12: 81e3 strh r3, [r4, #14] dir->createTimeMs = ms10; 6c14: f89d 3023 ldrb.w r3, [sp, #35] ; 0x23 6c18: 7363 strb r3, [r4, #13] 6c1a: 9a07 ldr r2, [sp, #28] 6c1c: f892 3028 ldrb.w r3, [r2, #40] ; 0x28 6c20: f043 0301 orr.w r3, r3, #1 6c24: f882 3028 strb.w r3, [r2, #40] ; 0x28 if (!openCachedEntry(dirFile, curIndex, oflag, lfnOrd)) { 6c28: 9b03 ldr r3, [sp, #12] 6c2a: 462a mov r2, r5 6c2c: 4631 mov r1, r6 6c2e: 9802 ldr r0, [sp, #8] 6c30: 9700 str r7, [sp, #0] 6c32: f7ff fa81 bl 6138 6c36: e73d b.n 6ab4 if (1 == order && lfnChecksum(dir->name) == checksum) { 6c38: f1bb 0f01 cmp.w fp, #1 6c3c: f47f af39 bne.w 6ab2 for (uint8_t i = 0; i < 11; i++) { 6c40: 300a adds r0, #10 6c42: e001 b.n 6c48 sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 6c44: f813 2f01 ldrb.w r2, [r3, #1]! 6c48: ea4f 11cc mov.w r1, ip, lsl #7 for (uint8_t i = 0; i < 11; i++) { 6c4c: 4298 cmp r0, r3 sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 6c4e: ea41 015c orr.w r1, r1, ip, lsr #1 6c52: fa52 f281 uxtab r2, r2, r1 6c56: fa5f fc82 uxtb.w ip, r2 for (uint8_t i = 0; i < 11; i++) { 6c5a: d1f3 bne.n 6c44 6c5c: 9b06 ldr r3, [sp, #24] 6c5e: 4563 cmp r3, ip 6c60: f47f af27 bne.w 6ab2 6c64: 464f mov r7, r9 if (oflag & O_EXCL) { 6c66: 9b03 ldr r3, [sp, #12] 6c68: 0519 lsls r1, r3, #20 6c6a: f53f af22 bmi.w 6ab2 6c6e: e7db b.n 6c28 6c70: 461f mov r7, r3 6c72: e7f8 b.n 6c66 6c74: f645 4321 movw r3, #23585 ; 0x5c21 6c78: 8223 strh r3, [r4, #16] 6c7a: 8323 strh r3, [r4, #24] 6c7c: 8263 strh r3, [r4, #18] if (FS_DEFAULT_TIME) { 6c7e: e7cc b.n 6c1a 6c80: 4ec4ec4f .word 0x4ec4ec4f 6c84: 2000244c .word 0x2000244c 00006c88 : //------------------------------------------------------------------------------ bool FatFile::parsePathName(const char* path, FatLfn_t* fname, const char** ptr) { 6c88: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 6c8c: 461f mov r7, r3 size_t len = 0; // Skip leading spaces. while (*path == ' ') { 6c8e: 780b ldrb r3, [r1, #0] FatLfn_t* fname, const char** ptr) { 6c90: b082 sub sp, #8 6c92: 460c mov r4, r1 while (*path == ' ') { 6c94: 2b20 cmp r3, #32 FatLfn_t* fname, const char** ptr) { 6c96: 4615 mov r5, r2 while (*path == ' ') { 6c98: d103 bne.n 6ca2 6c9a: f814 3f01 ldrb.w r3, [r4, #1]! 6c9e: 2b20 cmp r3, #32 6ca0: d0fb beq.n 6c9a path++; } fname->begin = path; 6ca2: 602c str r4, [r5, #0] while (*path && !isDirSeparator(*path)) { 6ca4: 7823 ldrb r3, [r4, #0] 6ca6: b363 cbz r3, 6d02 6ca8: 2b2f cmp r3, #47 ; 0x2f 6caa: d02a beq.n 6d02 size_t len = 0; 6cac: f04f 0800 mov.w r8, #0 6cb0: 4e29 ldr r6, [pc, #164] ; (6d58 ) #if USE_UTF8_LONG_NAMES uint32_t cp; // Allow end = path + 4 since path is zero terminated. path = FsUtf::mbToCp(path, path + 4, &cp); 6cb2: 1d21 adds r1, r4, #4 6cb4: 4620 mov r0, r4 6cb6: aa01 add r2, sp, #4 6cb8: f003 fbe8 bl a48c if (!path) { 6cbc: 4604 mov r4, r0 6cbe: b170 cbz r0, 6cde DBG_FAIL_MACRO; goto fail; } len += cp <= 0XFFFF ? 1 : 2; 6cc0: 9b01 ldr r3, [sp, #4] 6cc2: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 6cc6: d240 bcs.n 6d4a if (cp < 0X80 && lfnReservedChar(cp)) { 6cc8: 2b7f cmp r3, #127 ; 0x7f len += cp <= 0XFFFF ? 1 : 2; 6cca: f108 0801 add.w r8, r8, #1 if (cp < 0X80 && lfnReservedChar(cp)) { 6cce: d831 bhi.n 6d34 6cd0: 2b3c cmp r3, #60 ; 0x3c 6cd2: b2d9 uxtb r1, r3 6cd4: d829 bhi.n 6d2a 6cd6: 2921 cmp r1, #33 ; 0x21 6cd8: d805 bhi.n 6ce6 6cda: 291f cmp r1, #31 6cdc: d809 bhi.n 6cf2 *ptr = path; return makeSFN(fname); fail: return false; } 6cde: 2000 movs r0, #0 6ce0: b002 add sp, #8 6ce2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 6ce6: 3922 subs r1, #34 ; 0x22 6ce8: b2c9 uxtb r1, r1 6cea: fa26 f101 lsr.w r1, r6, r1 6cee: 07ca lsls r2, r1, #31 6cf0: d4f5 bmi.n 6cde if (cp != '.' && cp != ' ') { 6cf2: 2b2e cmp r3, #46 ; 0x2e 6cf4: d001 beq.n 6cfa 6cf6: 2b20 cmp r3, #32 6cf8: d11c bne.n 6d34 while (*path && !isDirSeparator(*path)) { 6cfa: 7823 ldrb r3, [r4, #0] 6cfc: b10b cbz r3, 6d02 6cfe: 2b2f cmp r3, #47 ; 0x2f 6d00: d1d7 bne.n 6cb2 if (!fname->len || fname->len > FAT_MAX_LFN_LENGTH) { 6d02: 692b ldr r3, [r5, #16] 6d04: 3b01 subs r3, #1 6d06: 2bfe cmp r3, #254 ; 0xfe 6d08: d8e9 bhi.n 6cde for (; *path == ' ' || isDirSeparator(*path); path++) {} 6d0a: 7823 ldrb r3, [r4, #0] 6d0c: 2b20 cmp r3, #32 6d0e: d103 bne.n 6d18 6d10: f814 3f01 ldrb.w r3, [r4, #1]! 6d14: 2b20 cmp r3, #32 6d16: d0fb beq.n 6d10 6d18: 2b2f cmp r3, #47 ; 0x2f 6d1a: d0f9 beq.n 6d10 return makeSFN(fname); 6d1c: 4628 mov r0, r5 *ptr = path; 6d1e: 603c str r4, [r7, #0] } 6d20: b002 add sp, #8 6d22: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} return makeSFN(fname); 6d26: f7ff bd55 b.w 67d4 6d2a: 295c cmp r1, #92 ; 0x5c 6d2c: d0d7 beq.n 6cde 6d2e: d905 bls.n 6d3c 6d30: 297c cmp r1, #124 ; 0x7c 6d32: d0d4 beq.n 6cde fname->len = len; 6d34: f8c5 8010 str.w r8, [r5, #16] fname->end = path; 6d38: 60ac str r4, [r5, #8] 6d3a: e7de b.n 6cfa 6d3c: 393e subs r1, #62 ; 0x3e 6d3e: 2901 cmp r1, #1 6d40: d8f8 bhi.n 6d34 } 6d42: 2000 movs r0, #0 6d44: b002 add sp, #8 6d46: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} len += cp <= 0XFFFF ? 1 : 2; 6d4a: f108 0802 add.w r8, r8, #2 fname->end = path; 6d4e: 60ac str r4, [r5, #8] fname->len = len; 6d50: f8c5 8010 str.w r8, [r5, #16] fname->end = path; 6d54: e7d1 b.n 6cfa 6d56: bf00 nop 6d58: 05002101 .word 0x05002101 00006d5c : //------------------------------------------------------------------------------ bool FatFile::remove() { 6d5c: b5f0 push {r4, r5, r6, r7, lr} FatFile() {} 6d5e: 2300 movs r3, #0 6d60: b08b sub sp, #44 ; 0x2c 6d62: 9301 str r3, [sp, #4] FatFile dirFile; DirFat_t* dir; DirLfn_t* ldir; // Cant' remove not open for write. if (!isWritable()) { 6d64: 7883 ldrb r3, [r0, #2] 6d66: 079a lsls r2, r3, #30 6d68: d524 bpl.n 6db4 DBG_FAIL_MACRO; goto fail; } // Free any clusters. if (m_firstCluster && !m_vol->freeChain(m_firstCluster)) { 6d6a: 6a01 ldr r1, [r0, #32] 6d6c: 4605 mov r5, r0 6d6e: b119 cbz r1, 6d78 6d70: 6880 ldr r0, [r0, #8] 6d72: f000 fe19 bl 79a8 6d76: b1e8 cbz r0, 6db4 DBG_FAIL_MACRO; goto fail; } // Cache directory entry. dir = cacheDirEntry(FsCache::CACHE_FOR_WRITE); 6d78: 2101 movs r1, #1 6d7a: 4628 mov r0, r5 6d7c: f7fe fcd0 bl 5720 if (!dir) { 6d80: b1c0 cbz r0, 6db4 for (uint8_t i = 0; i < 11; i++) { 6d82: 1e42 subs r2, r0, #1 6d84: f100 0c0a add.w ip, r0, #10 uint8_t sum = 0; 6d88: 2400 movs r4, #0 sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 6d8a: 01e3 lsls r3, r4, #7 6d8c: f812 1f01 ldrb.w r1, [r2, #1]! 6d90: ea43 0354 orr.w r3, r3, r4, lsr #1 for (uint8_t i = 0; i < 11; i++) { 6d94: 4594 cmp ip, r2 sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; 6d96: fa51 f383 uxtab r3, r1, r3 6d9a: b2dc uxtb r4, r3 for (uint8_t i = 0; i < 11; i++) { 6d9c: d1f5 bne.n 6d8a goto fail; } checksum = lfnChecksum(dir->name); // Mark entry deleted. dir->name[0] = FAT_NAME_DELETED; 6d9e: 26e5 movs r6, #229 ; 0xe5 // Set this file closed. m_attributes = FILE_ATTR_CLOSED; 6da0: 2300 movs r3, #0 dir->name[0] = FAT_NAME_DELETED; 6da2: 7006 strb r6, [r0, #0] m_flags = 0; // Write entry to device. if (!m_vol->cacheSync()) { 6da4: 68af ldr r7, [r5, #8] m_attributes = FILE_ATTR_CLOSED; 6da6: 702b strb r3, [r5, #0] return m_cache.sync() && m_fatCache.sync() && syncDevice(); 6da8: f107 0028 add.w r0, r7, #40 ; 0x28 m_flags = 0; 6dac: 70ab strb r3, [r5, #2] 6dae: f003 fa3b bl a228 6db2: b910 cbnz r0, 6dba } // Fall into fail. DBG_FAIL_MACRO; fail: return false; 6db4: 2000 movs r0, #0 } 6db6: b00b add sp, #44 ; 0x2c 6db8: bdf0 pop {r4, r5, r6, r7, pc} 6dba: f507 700e add.w r0, r7, #568 ; 0x238 6dbe: f003 fa33 bl a228 6dc2: 2800 cmp r0, #0 6dc4: d0f6 beq.n 6db4 6dc6: 6838 ldr r0, [r7, #0] return m_blockDev->syncDevice(); 6dc8: 6803 ldr r3, [r0, #0] 6dca: 6a1b ldr r3, [r3, #32] 6dcc: 4798 blx r3 return m_cache.sync() && m_fatCache.sync() && syncDevice(); 6dce: 2800 cmp r0, #0 6dd0: d0f0 beq.n 6db4 if (!isLFN()) { 6dd2: 78eb ldrb r3, [r5, #3] 6dd4: 2b00 cmp r3, #0 6dd6: d0ee beq.n 6db6 if (!dirFile.openCluster(this)) { 6dd8: 4629 mov r1, r5 6dda: a801 add r0, sp, #4 6ddc: f7fe fec0 bl 5b60 6de0: 2800 cmp r0, #0 6de2: d0e7 beq.n 6db4 for (uint8_t order = 1; order <= m_lfnOrd; order++) { 6de4: 78eb ldrb r3, [r5, #3] 6de6: 2b00 cmp r3, #0 6de8: d0e4 beq.n 6db4 6dea: 2701 movs r7, #1 6dec: e021 b.n 6e32 return seekSet(32UL*index) ? readDirCache() : nullptr; 6dee: a801 add r0, sp, #4 6df0: f7fe ffea bl 5dc8 6df4: 1c7b adds r3, r7, #1 if (ldir->attributes != FAT_ATTRIB_LONG_NAME || 6df6: b2f9 uxtb r1, r7 if (!ldir) { 6df8: 2800 cmp r0, #0 6dfa: d0db beq.n 6db4 if (ldir->attributes != FAT_ATTRIB_LONG_NAME || 6dfc: 7ac2 ldrb r2, [r0, #11] 6dfe: 2a0f cmp r2, #15 6e00: d1d8 bne.n 6db4 order != (ldir->order & 0X1F) || 6e02: 7802 ldrb r2, [r0, #0] for (uint8_t order = 1; order <= m_lfnOrd; order++) { 6e04: fa5f fc83 uxtb.w ip, r3 6e08: b29f uxth r7, r3 if (ldir->attributes != FAT_ATTRIB_LONG_NAME || 6e0a: f002 031f and.w r3, r2, #31 6e0e: 428b cmp r3, r1 6e10: d1d0 bne.n 6db4 order != (ldir->order & 0X1F) || 6e12: 7b43 ldrb r3, [r0, #13] 6e14: 42a3 cmp r3, r4 6e16: d1cd bne.n 6db4 ldir->order = FAT_NAME_DELETED; 6e18: 7006 strb r6, [r0, #0] m_vol->cacheDirty(); 6e1a: 68a9 ldr r1, [r5, #8] 6e1c: f891 3028 ldrb.w r3, [r1, #40] ; 0x28 6e20: f043 0301 orr.w r3, r3, #1 6e24: f881 3028 strb.w r3, [r1, #40] ; 0x28 if (last) { 6e28: 0653 lsls r3, r2, #25 6e2a: d40d bmi.n 6e48 for (uint8_t order = 1; order <= m_lfnOrd; order++) { 6e2c: 78eb ldrb r3, [r5, #3] 6e2e: 4563 cmp r3, ip 6e30: d3c0 bcc.n 6db4 ldir = reinterpret_cast(dirFile.cacheDir(m_dirIndex - order)); 6e32: 88a9 ldrh r1, [r5, #4] 6e34: a801 add r0, sp, #4 6e36: 1bc9 subs r1, r1, r7 6e38: b289 uxth r1, r1 6e3a: 0149 lsls r1, r1, #5 6e3c: f7ff f924 bl 6088 6e40: 2100 movs r1, #0 6e42: 2800 cmp r0, #0 6e44: d1d3 bne.n 6dee 6e46: e7b5 b.n 6db4 if (!m_vol->cacheSync()) { 6e48: 68ac ldr r4, [r5, #8] 6e4a: f104 0028 add.w r0, r4, #40 ; 0x28 6e4e: f003 f9eb bl a228 6e52: 2800 cmp r0, #0 6e54: d0ae beq.n 6db4 6e56: f504 700e add.w r0, r4, #568 ; 0x238 6e5a: f003 f9e5 bl a228 6e5e: 2800 cmp r0, #0 6e60: d0a8 beq.n 6db4 6e62: 6820 ldr r0, [r4, #0] return m_blockDev->syncDevice(); 6e64: 6803 ldr r3, [r0, #0] 6e66: 6a1b ldr r3, [r3, #32] 6e68: 4798 blx r3 6e6a: e7a4 b.n 6db6 00006e6c : * \param[in] ns Number of sectors to be written. * \param[in] callback Function to be called for each sector's data * \param[in] context Context to pass to callback function * \return true for success or false for failure. */ virtual bool writeSectorsCallback(uint32_t sector, size_t ns, 6e6c: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 6e70: f8dd 9020 ldr.w r9, [sp, #32] const uint8_t * (*callback)(uint32_t sector, void *context), void *context) { for (size_t i = 0; i < ns; i++) { 6e74: b1a2 cbz r2, 6ea0 6e76: 4605 mov r5, r0 6e78: 460c mov r4, r1 6e7a: 4698 mov r8, r3 6e7c: 1857 adds r7, r2, r1 6e7e: e001 b.n 6e84 6e80: 42bc cmp r4, r7 6e82: d00d beq.n 6ea0 if (!writeSector(sector + i, callback(sector + i, context))) return false; 6e84: 682b ldr r3, [r5, #0] 6e86: 4620 mov r0, r4 6e88: 4649 mov r1, r9 6e8a: 6a5e ldr r6, [r3, #36] ; 0x24 6e8c: 47c0 blx r8 6e8e: 4621 mov r1, r4 6e90: 4602 mov r2, r0 6e92: 4628 mov r0, r5 for (size_t i = 0; i < ns; i++) { 6e94: 3401 adds r4, #1 if (!writeSector(sector + i, callback(sector + i, context))) return false; 6e96: 47b0 blx r6 6e98: 2800 cmp r0, #0 6e9a: d1f1 bne.n 6e80 } return true; } 6e9c: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} return true; 6ea0: 2001 movs r0, #1 } 6ea2: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 6ea6: bf00 nop 00006ea8 : uint16_t count; uint16_t dotcount; }; static const uint8_t * initFatDirCallback(uint32_t sector, void *context) { struct initFatDirState * state = (struct initFatDirState *)context; if (state->pr && ++state->count >= state->dotcount) { 6ea8: 6848 ldr r0, [r1, #4] static const uint8_t * initFatDirCallback(uint32_t sector, void *context) { 6eaa: b510 push {r4, lr} 6eac: 460c mov r4, r1 if (state->pr && ++state->count >= state->dotcount) { 6eae: b130 cbz r0, 6ebe 6eb0: 890b ldrh r3, [r1, #8] 6eb2: 894a ldrh r2, [r1, #10] 6eb4: 3301 adds r3, #1 6eb6: b29b uxth r3, r3 6eb8: 429a cmp r2, r3 6eba: 810b strh r3, [r1, #8] 6ebc: d901 bls.n 6ec2 state->pr->write("."); state->count = 0; } return state->buffer; } 6ebe: 6820 ldr r0, [r4, #0] 6ec0: bd10 pop {r4, pc} 6ec2: 6803 ldr r3, [r0, #0] 6ec4: 2201 movs r2, #1 6ec6: 4903 ldr r1, [pc, #12] ; (6ed4 ) 6ec8: 685b ldr r3, [r3, #4] 6eca: 4798 blx r3 state->count = 0; 6ecc: 2300 movs r3, #0 } 6ece: 6820 ldr r0, [r4, #0] state->count = 0; 6ed0: 8123 strh r3, [r4, #8] } 6ed2: bd10 pop {r4, pc} 6ed4: 20000804 .word 0x20000804 00006ed8 : bool FatFormatter::initFatDir(uint8_t fatType, uint32_t sectorCount) { 6ed8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} 6edc: 4605 mov r5, r0 6ede: b087 sub sp, #28 6ee0: 4688 mov r8, r1 6ee2: 4692 mov sl, r2 size_t n; memset(m_secBuf, 0, BYTES_PER_SECTOR); 6ee4: 2100 movs r1, #0 6ee6: f44f 7200 mov.w r2, #512 ; 0x200 6eea: 6a40 ldr r0, [r0, #36] ; 0x24 6eec: f006 fe20 bl db30 writeMsg("Writing FAT "); 6ef0: 6a28 ldr r0, [r5, #32] 6ef2: b128 cbz r0, 6f00 6ef4: 6803 ldr r3, [r0, #0] 6ef6: 220c movs r2, #12 6ef8: 493a ldr r1, [pc, #232] ; (6fe4 ) 6efa: 685b ldr r3, [r3, #4] 6efc: 4798 blx r3 struct initFatDirState state; state.buffer = m_secBuf; state.pr = m_pr; 6efe: 6a28 ldr r0, [r5, #32] state.buffer = m_secBuf; 6f00: 6a6b ldr r3, [r5, #36] ; 0x24 state.count = 0; 6f02: f04f 0900 mov.w r9, #0 state.dotcount = sectorCount/32; if (!m_dev->writeSectorsCallback(m_fatStart + 1, sectorCount - 1, initFatDirCallback, &state)) { 6f06: 69ee ldr r6, [r5, #28] 6f08: f10a 32ff add.w r2, sl, #4294967295 6f0c: f8df c0e0 ldr.w ip, [pc, #224] ; 6ff0 6f10: 68e9 ldr r1, [r5, #12] state.count = 0; 6f12: f8ad 9014 strh.w r9, [sp, #20] if (!m_dev->writeSectorsCallback(m_fatStart + 1, sectorCount - 1, initFatDirCallback, &state)) { 6f16: 1c4c adds r4, r1, #1 state.buffer = m_secBuf; 6f18: e9cd 3003 strd r3, r0, [sp, #12] state.dotcount = sectorCount/32; 6f1c: ea4f 135a mov.w r3, sl, lsr #5 6f20: f8ad 3016 strh.w r3, [sp, #22] if (!m_dev->writeSectorsCallback(m_fatStart + 1, sectorCount - 1, initFatDirCallback, &state)) { 6f24: 6833 ldr r3, [r6, #0] 6f26: 6adf ldr r7, [r3, #44] ; 0x2c 6f28: 4567 cmp r7, ip 6f2a: d126 bne.n 6f7a for (size_t i = 0; i < ns; i++) { 6f2c: b36a cbz r2, 6f8a 6f2e: eb01 070a add.w r7, r1, sl 6f32: f8df a0c0 ldr.w sl, [pc, #192] ; 6ff4 6f36: e00a b.n 6f4e if (!writeSector(sector + i, callback(sector + i, context))) return false; 6f38: 4621 mov r1, r4 6f3a: 9a03 ldr r2, [sp, #12] 6f3c: 4630 mov r0, r6 for (size_t i = 0; i < ns; i++) { 6f3e: 3401 adds r4, #1 if (!writeSector(sector + i, callback(sector + i, context))) return false; 6f40: 47d8 blx fp 6f42: 2800 cmp r0, #0 6f44: d03f beq.n 6fc6 for (size_t i = 0; i < ns; i++) { 6f46: 42a7 cmp r7, r4 6f48: d01e beq.n 6f88 if (!writeSector(sector + i, callback(sector + i, context))) return false; 6f4a: 6833 ldr r3, [r6, #0] if (state->pr && ++state->count >= state->dotcount) { 6f4c: 9804 ldr r0, [sp, #16] 6f4e: f8d3 b024 ldr.w fp, [r3, #36] ; 0x24 6f52: 2800 cmp r0, #0 6f54: d0f0 beq.n 6f38 6f56: f8bd 3014 ldrh.w r3, [sp, #20] 6f5a: f8bd 2016 ldrh.w r2, [sp, #22] 6f5e: 3301 adds r3, #1 6f60: b29b uxth r3, r3 6f62: 429a cmp r2, r3 6f64: f8ad 3014 strh.w r3, [sp, #20] 6f68: d8e6 bhi.n 6f38 6f6a: 6803 ldr r3, [r0, #0] 6f6c: 4651 mov r1, sl 6f6e: 2201 movs r2, #1 6f70: 685b ldr r3, [r3, #4] 6f72: 4798 blx r3 state->count = 0; 6f74: f8ad 9014 strh.w r9, [sp, #20] 6f78: e7de b.n 6f38 if (!m_dev->writeSectorsCallback(m_fatStart + 1, sectorCount - 1, initFatDirCallback, &state)) { 6f7a: ab03 add r3, sp, #12 6f7c: 4621 mov r1, r4 6f7e: 4630 mov r0, r6 6f80: 9300 str r3, [sp, #0] 6f82: 4b19 ldr r3, [pc, #100] ; (6fe8 ) 6f84: 47b8 blx r7 6f86: b1f0 cbz r0, 6fc6 return false; } writeMsg("\r\n"); 6f88: 6a28 ldr r0, [r5, #32] 6f8a: b120 cbz r0, 6f96 6f8c: 6803 ldr r3, [r0, #0] 6f8e: 2202 movs r2, #2 6f90: 4916 ldr r1, [pc, #88] ; (6fec ) 6f92: 685b ldr r3, [r3, #4] 6f94: 4798 blx r3 // Allocate reserved clusters and root for FAT32. m_secBuf[0] = 0XF8; n = fatType == 16 ? 4 : 12; 6f96: f1b8 0f10 cmp.w r8, #16 m_secBuf[0] = 0XF8; 6f9a: f04f 01f8 mov.w r1, #248 ; 0xf8 6f9e: 6a6a ldr r2, [r5, #36] ; 0x24 for (size_t i = 1; i < n; i++) { 6fa0: f04f 0301 mov.w r3, #1 n = fatType == 16 ? 4 : 12; 6fa4: bf0c ite eq 6fa6: 2004 moveq r0, #4 6fa8: 200c movne r0, #12 m_secBuf[0] = 0XF8; 6faa: 7011 strb r1, [r2, #0] m_secBuf[i] = 0XFF; 6fac: 21ff movs r1, #255 ; 0xff 6fae: 6a6a ldr r2, [r5, #36] ; 0x24 6fb0: 54d1 strb r1, [r2, r3] for (size_t i = 1; i < n; i++) { 6fb2: 3301 adds r3, #1 6fb4: 4298 cmp r0, r3 6fb6: d1fa bne.n 6fae } return m_dev->writeSector(m_fatStart, m_secBuf) && 6fb8: 69e8 ldr r0, [r5, #28] 6fba: 6a6a ldr r2, [r5, #36] ; 0x24 6fbc: 6803 ldr r3, [r0, #0] 6fbe: 68e9 ldr r1, [r5, #12] 6fc0: 6a5b ldr r3, [r3, #36] ; 0x24 6fc2: 4798 blx r3 6fc4: b918 cbnz r0, 6fce return false; 6fc6: 2000 movs r0, #0 m_dev->writeSector(m_fatStart + m_fatSize, m_secBuf); } 6fc8: b007 add sp, #28 6fca: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} m_dev->writeSector(m_fatStart + m_fatSize, m_secBuf); 6fce: e9d5 3102 ldrd r3, r1, [r5, #8] 6fd2: 69e8 ldr r0, [r5, #28] 6fd4: 4419 add r1, r3 6fd6: 6a6a ldr r2, [r5, #36] ; 0x24 6fd8: 6803 ldr r3, [r0, #0] 6fda: 6a5b ldr r3, [r3, #36] ; 0x24 6fdc: 4798 blx r3 } 6fde: b007 add sp, #28 6fe0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 6fe4: 200007f4 .word 0x200007f4 6fe8: 00006ea9 .word 0x00006ea9 6fec: 2000081c .word 0x2000081c 6ff0: 00006e6d .word 0x00006e6d 6ff4: 20000804 .word 0x20000804 00006ff8 : //------------------------------------------------------------------------------ void FatFormatter::initPbs() { 6ff8: b538 push {r3, r4, r5, lr} PbsFat_t* pbs = reinterpret_cast(m_secBuf); 6ffa: 6a43 ldr r3, [r0, #36] ; 0x24 memset(m_secBuf, 0, BYTES_PER_SECTOR); 6ffc: f44f 7500 mov.w r5, #512 ; 0x200 void FatFormatter::initPbs() { 7000: 4604 mov r4, r0 memset(m_secBuf, 0, BYTES_PER_SECTOR); 7002: 2100 movs r1, #0 7004: 462a mov r2, r5 7006: 4618 mov r0, r3 7008: f006 fd92 bl db30 pbs->jmpInstruction[0] = 0XEB; pbs->jmpInstruction[1] = 0X76; pbs->jmpInstruction[2] = 0X90; for (uint8_t i = 0; i < sizeof(pbs->oemName); i++) { pbs->oemName[i] = ' '; 700c: f04f 3120 mov.w r1, #538976288 ; 0x20202020 pbs->jmpInstruction[0] = 0XEB; 7010: 22eb movs r2, #235 ; 0xeb 7012: f8a0 500b strh.w r5, [r0, #11] pbs->oemName[i] = ' '; 7016: f8c0 1003 str.w r1, [r0, #3] memset(m_secBuf, 0, BYTES_PER_SECTOR); 701a: 4603 mov r3, r0 pbs->oemName[i] = ' '; 701c: f8c0 1007 str.w r1, [r0, #7] pbs->jmpInstruction[2] = 0X90; 7020: 2190 movs r1, #144 ; 0x90 pbs->jmpInstruction[0] = 0XEB; 7022: 7002 strb r2, [r0, #0] pbs->jmpInstruction[1] = 0X76; 7024: 2076 movs r0, #118 ; 0x76 pbs->jmpInstruction[2] = 0X90; 7026: 7099 strb r1, [r3, #2] } setLe16(pbs->bpb.bpb16.bytesPerSector, BYTES_PER_SECTOR); pbs->bpb.bpb16.sectorsPerCluster = m_sectorsPerCluster; setLe16(pbs->bpb.bpb16.reservedSectorCount, m_reservedSectorCount); pbs->bpb.bpb16.fatCount = 2; 7028: 2202 movs r2, #2 pbs->jmpInstruction[1] = 0X76; 702a: 7058 strb r0, [r3, #1] pbs->bpb.bpb16.sectorsPerCluster = m_sectorsPerCluster; 702c: f894 102b ldrb.w r1, [r4, #43] ; 0x2b 7030: 7359 strb r1, [r3, #13] 7032: f64a 2155 movw r1, #43605 ; 0xaa55 setLe16(pbs->bpb.bpb16.reservedSectorCount, m_reservedSectorCount); 7036: 8d20 ldrh r0, [r4, #40] ; 0x28 pbs->bpb.bpb16.fatCount = 2; 7038: 741a strb r2, [r3, #16] // skip rootDirEntryCount // skip totalSectors16 pbs->bpb.bpb16.mediaType = 0XF8; 703a: 22f8 movs r2, #248 ; 0xf8 703c: 81d8 strh r0, [r3, #14] 703e: 755a strb r2, [r3, #21] // skip sectorsPerFat16 // skip sectorsPerTrack // skip headCount setLe32(pbs->bpb.bpb16.hidddenSectors, m_relativeSectors); 7040: 6922 ldr r2, [r4, #16] *reinterpret_cast(dst) = src; 7042: 61da str r2, [r3, #28] setLe32(pbs->bpb.bpb16.totalSectors32, m_totalSectors); 7044: 69a2 ldr r2, [r4, #24] *reinterpret_cast(dst) = src; 7046: f8a3 11fe strh.w r1, [r3, #510] ; 0x1fe *reinterpret_cast(dst) = src; 704a: 621a str r2, [r3, #32] // skip rest of bpb setLe16(pbs->signature, PBR_SIGNATURE); } 704c: bd38 pop {r3, r4, r5, pc} 704e: bf00 nop 00007050 : return false; } return initFatDir(32, 2*m_fatSize + m_sectorsPerCluster); } //------------------------------------------------------------------------------ bool FatFormatter::writeMbr() { 7050: b570 push {r4, r5, r6, lr} 7052: 4604 mov r4, r0 memset(m_secBuf, 0, BYTES_PER_SECTOR); 7054: f44f 7200 mov.w r2, #512 ; 0x200 7058: 2100 movs r1, #0 705a: 6a40 ldr r0, [r0, #36] ; 0x24 705c: f006 fd68 bl db30 MbrSector_t* mbr = reinterpret_cast(m_secBuf); 7060: 6a65 ldr r5, [r4, #36] ; 0x24 #if USE_LBA_TO_CHS lbaToMbrChs(mbr->part->beginCHS, m_capacityMB, m_relativeSectors); 7062: 6922 ldr r2, [r4, #16] 7064: 6821 ldr r1, [r4, #0] 7066: f205 10bf addw r0, r5, #447 ; 0x1bf 706a: f003 f96d bl a348 lbaToMbrChs(mbr->part->endCHS, m_capacityMB, m_relativeSectors + m_totalSectors -1); 706e: 69a3 ldr r3, [r4, #24] 7070: 6922 ldr r2, [r4, #16] lbaToMbrChs(mbr->part->endCHS, m_capacityMB, 7072: f205 10c3 addw r0, r5, #451 ; 0x1c3 7076: 6821 ldr r1, [r4, #0] m_relativeSectors + m_totalSectors -1); 7078: 441a add r2, r3 lbaToMbrChs(mbr->part->endCHS, m_capacityMB, 707a: 3a01 subs r2, #1 707c: f003 f964 bl a348 mbr->part->endCHS[0] = 0XFE; mbr->part->endCHS[1] = 0XFF; mbr->part->endCHS[2] = 0XFF; #endif // USE_LBA_TO_CHS mbr->part->type = m_partType; 7080: f894 202a ldrb.w r2, [r4, #42] ; 0x2a *reinterpret_cast(dst) = src; 7084: f64a 2355 movw r3, #43605 ; 0xaa55 7088: f885 21c2 strb.w r2, [r5, #450] ; 0x1c2 setLe32(mbr->part->relativeSectors, m_relativeSectors); 708c: 6922 ldr r2, [r4, #16] setLe32(mbr->part->totalSectors, m_totalSectors); setLe16(mbr->signature, MBR_SIGNATURE); return m_dev->writeSector(0, m_secBuf); 708e: 69e0 ldr r0, [r4, #28] *reinterpret_cast(dst) = src; 7090: f8c5 21c6 str.w r2, [r5, #454] ; 0x1c6 7094: 6a62 ldr r2, [r4, #36] ; 0x24 setLe32(mbr->part->totalSectors, m_totalSectors); 7096: 69a1 ldr r1, [r4, #24] *reinterpret_cast(dst) = src; 7098: f8a5 31fe strh.w r3, [r5, #510] ; 0x1fe return m_dev->writeSector(0, m_secBuf); 709c: 6803 ldr r3, [r0, #0] *reinterpret_cast(dst) = src; 709e: f8c5 11ca str.w r1, [r5, #458] ; 0x1ca 70a2: 2100 movs r1, #0 70a4: 6a5b ldr r3, [r3, #36] ; 0x24 } 70a6: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} return m_dev->writeSector(0, m_secBuf); 70aa: 4718 bx r3 000070ac : bool FatFormatter::makeFat16() { 70ac: b570 push {r4, r5, r6, lr} nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 70ae: 6946 ldr r6, [r0, #20] for (m_dataStart = 2*BU16; ; m_dataStart += BU16) { 70b0: f44f 7380 mov.w r3, #256 ; 0x100 nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 70b4: f890 e02b ldrb.w lr, [r0, #43] ; 0x2b bool FatFormatter::makeFat16() { 70b8: 4604 mov r4, r0 nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 70ba: f5a6 7280 sub.w r2, r6, #256 ; 0x100 PbsFat_t* pbs = reinterpret_cast(m_secBuf); 70be: 6a45 ldr r5, [r0, #36] ; 0x24 for (m_dataStart = 2*BU16; ; m_dataStart += BU16) { 70c0: 6043 str r3, [r0, #4] nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 70c2: fbb2 f2fe udiv r2, r2, lr m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/2) - 1)/(BYTES_PER_SECTOR/2); 70c6: f202 1c01 addw ip, r2, #257 ; 0x101 70ca: ea4f 211c mov.w r1, ip, lsr #8 r = BU16 + 1 + 2*m_fatSize + FAT16_ROOT_SECTOR_COUNT; 70ce: ea4f 0c41 mov.w ip, r1, lsl #1 m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/2) - 1)/(BYTES_PER_SECTOR/2); 70d2: 6081 str r1, [r0, #8] r = BU16 + 1 + 2*m_fatSize + FAT16_ROOT_SECTOR_COUNT; 70d4: f10c 00a1 add.w r0, ip, #161 ; 0xa1 if (m_dataStart >= r) { 70d8: 4298 cmp r0, r3 70da: d90e bls.n 70fa for (m_dataStart = 2*BU16; ; m_dataStart += BU16) { 70dc: 3380 adds r3, #128 ; 0x80 nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 70de: 1af2 subs r2, r6, r3 70e0: fbb2 f2fe udiv r2, r2, lr m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/2) - 1)/(BYTES_PER_SECTOR/2); 70e4: f202 1101 addw r1, r2, #257 ; 0x101 70e8: 0a09 lsrs r1, r1, #8 r = BU16 + 1 + 2*m_fatSize + FAT16_ROOT_SECTOR_COUNT; 70ea: ea4f 0c41 mov.w ip, r1, lsl #1 70ee: f10c 00a1 add.w r0, ip, #161 ; 0xa1 if (m_dataStart >= r) { 70f2: 4283 cmp r3, r0 70f4: d3f2 bcc.n 70dc 70f6: e9c4 3101 strd r3, r1, [r4, #4] m_relativeSectors = m_dataStart - r + BU16; 70fa: 1a1b subs r3, r3, r0 if (nc < 4085 || nc >= 65525) { 70fc: f6a2 71f5 subw r1, r2, #4085 ; 0xff5 m_relativeSectors = m_dataStart - r + BU16; 7100: f103 0080 add.w r0, r3, #128 ; 0x80 if (nc < 4085 || nc >= 65525) { 7104: f5b1 4f70 cmp.w r1, #61440 ; 0xf000 m_relativeSectors = m_dataStart - r + BU16; 7108: 6120 str r0, [r4, #16] if (nc < 4085 || nc >= 65525) { 710a: d24f bcs.n 71ac + 2*m_fatSize + m_reservedSectorCount + 32; 710c: f10c 0c21 add.w ip, ip, #33 ; 0x21 m_fatStart = m_relativeSectors + m_reservedSectorCount; 7110: 3381 adds r3, #129 ; 0x81 if (!writeMbr()) { 7112: 4620 mov r0, r4 + 2*m_fatSize + m_reservedSectorCount + 32; 7114: fb02 c20e mla r2, r2, lr, ip m_fatStart = m_relativeSectors + m_reservedSectorCount; 7118: 60e3 str r3, [r4, #12] m_partType = 0X06; 711a: f5b2 3f80 cmp.w r2, #65536 ; 0x10000 m_totalSectors = nc*m_sectorsPerCluster 711e: 61a2 str r2, [r4, #24] m_partType = 0X06; 7120: bf34 ite cc 7122: 2304 movcc r3, #4 7124: 2306 movcs r3, #6 7126: f884 302a strb.w r3, [r4, #42] ; 0x2a m_reservedSectorCount = 1; 712a: 2301 movs r3, #1 712c: 8523 strh r3, [r4, #40] ; 0x28 if (!writeMbr()) { 712e: f7ff ff8f bl 7050 7132: b908 cbnz r0, 7138 } 7134: 2000 movs r0, #0 7136: bd70 pop {r4, r5, r6, pc} initPbs(); 7138: 4620 mov r0, r4 713a: f7ff ff5d bl 6ff8 pbs->bpb.bpb16.extSignature = EXTENDED_BOOT_SIGNATURE; 713e: 2229 movs r2, #41 ; 0x29 setLe16(pbs->bpb.bpb16.sectorsPerFat16, m_fatSize); 7140: 68a1 ldr r1, [r4, #8] pbs->bpb.bpb16.volumeLabel[i] = ' '; 7142: f04f 3320 mov.w r3, #538976288 ; 0x20202020 pbs->bpb.bpb16.extSignature = EXTENDED_BOOT_SIGNATURE; 7146: f885 2026 strb.w r2, [r5, #38] ; 0x26 pbs->bpb.bpb16.volumeType[0] = 'F'; 714a: 2246 movs r2, #70 ; 0x46 pbs->bpb.bpb16.volumeLabel[i] = ' '; 714c: f8c5 302f str.w r3, [r5, #47] ; 0x2f pbs->bpb.bpb16.physicalDriveNumber = 0X80; 7150: 2080 movs r0, #128 ; 0x80 pbs->bpb.bpb16.volumeType[0] = 'F'; 7152: f885 2036 strb.w r2, [r5, #54] ; 0x36 pbs->bpb.bpb16.volumeType[2] = 'T'; 7156: 2254 movs r2, #84 ; 0x54 pbs->bpb.bpb16.volumeLabel[i] = ' '; 7158: f8c5 302b str.w r3, [r5, #43] ; 0x2b 715c: f8c5 3032 str.w r3, [r5, #50] ; 0x32 pbs->bpb.bpb16.volumeType[3] = '1'; 7160: 2331 movs r3, #49 ; 0x31 pbs->bpb.bpb16.volumeType[2] = 'T'; 7162: f885 2038 strb.w r2, [r5, #56] ; 0x38 pbs->bpb.bpb16.volumeType[4] = '6'; 7166: 2236 movs r2, #54 ; 0x36 setLe16(pbs->bpb.bpb16.sectorsPerFat16, m_fatSize); 7168: 82e9 strh r1, [r5, #22] pbs->bpb.bpb16.volumeType[1] = 'A'; 716a: 2141 movs r1, #65 ; 0x41 pbs->bpb.bpb16.volumeType[3] = '1'; 716c: f885 3039 strb.w r3, [r5, #57] ; 0x39 pbs->bpb.bpb16.volumeType[1] = 'A'; 7170: f885 1037 strb.w r1, [r5, #55] ; 0x37 *reinterpret_cast(dst) = src; 7174: f44f 7100 mov.w r1, #512 ; 0x200 pbs->bpb.bpb16.physicalDriveNumber = 0X80; 7178: f885 0024 strb.w r0, [r5, #36] ; 0x24 pbs->bpb.bpb16.volumeType[4] = '6'; 717c: f885 203a strb.w r2, [r5, #58] ; 0x3a *reinterpret_cast(dst) = src; 7180: 4b0f ldr r3, [pc, #60] ; (71c0 ) if (!m_dev->writeSector(m_relativeSectors, m_secBuf)) { 7182: 69e0 ldr r0, [r4, #28] 7184: f8c5 3027 str.w r3, [r5, #39] ; 0x27 7188: 6803 ldr r3, [r0, #0] *reinterpret_cast(dst) = src; 718a: f8a5 1011 strh.w r1, [r5, #17] 718e: 6a62 ldr r2, [r4, #36] ; 0x24 7190: 6921 ldr r1, [r4, #16] 7192: 6a5b ldr r3, [r3, #36] ; 0x24 7194: 4798 blx r3 7196: 2800 cmp r0, #0 7198: d0cc beq.n 7134 return initFatDir(16, m_dataStart - m_fatStart); 719a: 6862 ldr r2, [r4, #4] 719c: 4620 mov r0, r4 719e: 68e3 ldr r3, [r4, #12] 71a0: 2110 movs r1, #16 71a2: 1ad2 subs r2, r2, r3 } 71a4: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} return initFatDir(16, m_dataStart - m_fatStart); 71a8: f7ff be96 b.w 6ed8 writeMsg("Bad cluster count\r\n"); 71ac: 6a20 ldr r0, [r4, #32] 71ae: 2800 cmp r0, #0 71b0: d0c0 beq.n 7134 71b2: 6803 ldr r3, [r0, #0] 71b4: 2213 movs r2, #19 71b6: 4903 ldr r1, [pc, #12] ; (71c4 ) 71b8: 685b ldr r3, [r3, #4] 71ba: 4798 blx r3 } 71bc: 2000 movs r0, #0 71be: bd70 pop {r4, r5, r6, pc} 71c0: 0012d687 .word 0x0012d687 71c4: 200007c8 .word 0x200007c8 000071c8 : bool FatFormatter::makeFat32() { 71c8: b5f8 push {r3, r4, r5, r6, r7, lr} nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 71ca: 6946 ldr r6, [r0, #20] m_relativeSectors = BU32; 71cc: f44f 5300 mov.w r3, #8192 ; 0x2000 nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 71d0: f890 c02b ldrb.w ip, [r0, #43] ; 0x2b for (m_dataStart = 2*BU32; ; m_dataStart += BU32) { 71d4: f44f 4280 mov.w r2, #16384 ; 0x4000 nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 71d8: f5a6 4180 sub.w r1, r6, #16384 ; 0x4000 m_relativeSectors = BU32; 71dc: 6103 str r3, [r0, #16] r = m_relativeSectors + 9 + 2*m_fatSize; 71de: f242 0e09 movw lr, #8201 ; 0x2009 bool FatFormatter::makeFat32() { 71e2: 4604 mov r4, r0 PbsFat_t* pbs = reinterpret_cast(m_secBuf); 71e4: 6a45 ldr r5, [r0, #36] ; 0x24 for (m_dataStart = 2*BU32; ; m_dataStart += BU32) { 71e6: 6042 str r2, [r0, #4] nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 71e8: fbb1 f1fc udiv r1, r1, ip m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/4) - 1)/(BYTES_PER_SECTOR/4); 71ec: f101 0381 add.w r3, r1, #129 ; 0x81 71f0: 09db lsrs r3, r3, #7 71f2: 6083 str r3, [r0, #8] r = m_relativeSectors + 9 + 2*m_fatSize; 71f4: eb0e 0043 add.w r0, lr, r3, lsl #1 if (m_dataStart >= r) { 71f8: 4290 cmp r0, r2 71fa: f240 80b6 bls.w 736a for (m_dataStart = 2*BU32; ; m_dataStart += BU32) { 71fe: f502 5200 add.w r2, r2, #8192 ; 0x2000 nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; 7202: 1ab1 subs r1, r6, r2 7204: fbb1 f1fc udiv r1, r1, ip m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/4) - 1)/(BYTES_PER_SECTOR/4); 7208: f101 0381 add.w r3, r1, #129 ; 0x81 720c: 09db lsrs r3, r3, #7 r = m_relativeSectors + 9 + 2*m_fatSize; 720e: eb0e 0043 add.w r0, lr, r3, lsl #1 7212: 005f lsls r7, r3, #1 if (m_dataStart >= r) { 7214: 4282 cmp r2, r0 7216: d3f2 bcc.n 71fe 7218: e9c4 2301 strd r2, r3, [r4, #4] if (nc < 65525) { 721c: f64f 73f4 movw r3, #65524 ; 0xfff4 7220: 4299 cmp r1, r3 7222: f240 8097 bls.w 7354 m_totalSectors = nc*m_sectorsPerCluster + m_dataStart - m_relativeSectors; 7226: fb01 2c0c mla ip, r1, ip, r2 m_reservedSectorCount = m_dataStart - m_relativeSectors - 2*m_fatSize; 722a: f5a2 5200 sub.w r2, r2, #8192 ; 0x2000 if (!writeMbr()) { 722e: 4620 mov r0, r4 m_reservedSectorCount = m_dataStart - m_relativeSectors - 2*m_fatSize; 7230: 1bd2 subs r2, r2, r7 7232: b292 uxth r2, r2 m_fatStart = m_relativeSectors + m_reservedSectorCount; 7234: f502 5300 add.w r3, r2, #8192 ; 0x2000 m_reservedSectorCount = m_dataStart - m_relativeSectors - 2*m_fatSize; 7238: 8522 strh r2, [r4, #40] ; 0x28 if ((m_relativeSectors + m_totalSectors) <= 16450560) { 723a: 4a4d ldr r2, [pc, #308] ; (7370 ) m_fatStart = m_relativeSectors + m_reservedSectorCount; 723c: 60e3 str r3, [r4, #12] m_totalSectors = nc*m_sectorsPerCluster + m_dataStart - m_relativeSectors; 723e: f5ac 5300 sub.w r3, ip, #8192 ; 0x2000 m_partType = 0X0C; 7242: 4594 cmp ip, r2 7244: bf94 ite ls 7246: f04f 0c0b movls.w ip, #11 724a: f04f 0c0c movhi.w ip, #12 m_totalSectors = nc*m_sectorsPerCluster + m_dataStart - m_relativeSectors; 724e: 61a3 str r3, [r4, #24] if ((m_relativeSectors + m_totalSectors) <= 16450560) { 7250: f884 c02a strb.w ip, [r4, #42] ; 0x2a if (!writeMbr()) { 7254: f7ff fefc bl 7050 7258: b908 cbnz r0, 725e } 725a: 2000 movs r0, #0 725c: bdf8 pop {r3, r4, r5, r6, r7, pc} initPbs(); 725e: 4620 mov r0, r4 7260: f7ff feca bl 6ff8 setLe32(pbs->bpb.bpb32.sectorsPerFat32, m_fatSize); 7264: 68a1 ldr r1, [r4, #8] pbs->bpb.bpb32.extSignature = EXTENDED_BOOT_SIGNATURE; 7266: 2229 movs r2, #41 ; 0x29 pbs->bpb.bpb32.volumeLabel[i] = ' '; 7268: f04f 3320 mov.w r3, #538976288 ; 0x20202020 pbs->bpb.bpb32.physicalDriveNumber = 0X80; 726c: 2080 movs r0, #128 ; 0x80 *reinterpret_cast(dst) = src; 726e: 6269 str r1, [r5, #36] ; 0x24 pbs->bpb.bpb32.extSignature = EXTENDED_BOOT_SIGNATURE; 7270: f885 2042 strb.w r2, [r5, #66] ; 0x42 pbs->bpb.bpb32.volumeType[2] = 'T'; 7274: 2154 movs r1, #84 ; 0x54 pbs->bpb.bpb32.volumeType[0] = 'F'; 7276: 2246 movs r2, #70 ; 0x46 pbs->bpb.bpb32.volumeLabel[i] = ' '; 7278: f8c5 304b str.w r3, [r5, #75] ; 0x4b pbs->bpb.bpb32.physicalDriveNumber = 0X80; 727c: f885 0040 strb.w r0, [r5, #64] ; 0x40 pbs->bpb.bpb32.volumeType[1] = 'A'; 7280: 2041 movs r0, #65 ; 0x41 pbs->bpb.bpb32.volumeLabel[i] = ' '; 7282: f8c5 3047 str.w r3, [r5, #71] ; 0x47 7286: f8c5 304e str.w r3, [r5, #78] ; 0x4e 728a: 2302 movs r3, #2 pbs->bpb.bpb32.volumeType[0] = 'F'; 728c: f885 2052 strb.w r2, [r5, #82] ; 0x52 pbs->bpb.bpb32.volumeType[3] = '3'; 7290: 2233 movs r2, #51 ; 0x33 pbs->bpb.bpb32.volumeType[2] = 'T'; 7292: f885 1054 strb.w r1, [r5, #84] ; 0x54 pbs->bpb.bpb32.volumeType[4] = '2'; 7296: 2132 movs r1, #50 ; 0x32 pbs->bpb.bpb32.volumeType[3] = '3'; 7298: f885 2055 strb.w r2, [r5, #85] ; 0x55 pbs->bpb.bpb32.volumeType[1] = 'A'; 729c: f885 0053 strb.w r0, [r5, #83] ; 0x53 pbs->bpb.bpb32.volumeType[4] = '2'; 72a0: f885 1056 strb.w r1, [r5, #86] ; 0x56 72a4: 62eb str r3, [r5, #44] ; 0x2c if (!m_dev->writeSector(m_relativeSectors, m_secBuf) || 72a6: 69e0 ldr r0, [r4, #28] *reinterpret_cast(dst) = src; 72a8: 4b32 ldr r3, [pc, #200] ; (7374 ) *reinterpret_cast(dst) = src; 72aa: 4a33 ldr r2, [pc, #204] ; (7378 ) *reinterpret_cast(dst) = src; 72ac: 632b str r3, [r5, #48] ; 0x30 72ae: 6803 ldr r3, [r0, #0] *reinterpret_cast(dst) = src; 72b0: f8c5 2043 str.w r2, [r5, #67] ; 0x43 72b4: 6a5b ldr r3, [r3, #36] ; 0x24 72b6: 6a62 ldr r2, [r4, #36] ; 0x24 72b8: 6921 ldr r1, [r4, #16] 72ba: 4798 blx r3 72bc: 2800 cmp r0, #0 72be: d0cc beq.n 725a !m_dev->writeSector(m_relativeSectors + 6, m_secBuf)) { 72c0: 69e0 ldr r0, [r4, #28] 72c2: 6921 ldr r1, [r4, #16] 72c4: 6803 ldr r3, [r0, #0] 72c6: 3106 adds r1, #6 72c8: 6a62 ldr r2, [r4, #36] ; 0x24 72ca: 6a5b ldr r3, [r3, #36] ; 0x24 72cc: 4798 blx r3 if (!m_dev->writeSector(m_relativeSectors, m_secBuf) || 72ce: 2800 cmp r0, #0 72d0: d0c3 beq.n 725a memset(m_secBuf, 0 , BYTES_PER_SECTOR); 72d2: f44f 7200 mov.w r2, #512 ; 0x200 72d6: 2100 movs r1, #0 72d8: 6a60 ldr r0, [r4, #36] ; 0x24 72da: f006 fc29 bl db30 if (!m_dev->writeSector(m_relativeSectors + 2, m_secBuf) || 72de: 69e0 ldr r0, [r4, #28] 72e0: 4a26 ldr r2, [pc, #152] ; (737c ) 72e2: 6803 ldr r3, [r0, #0] 72e4: f8c5 21fc str.w r2, [r5, #508] ; 0x1fc 72e8: 6921 ldr r1, [r4, #16] 72ea: 6a5b ldr r3, [r3, #36] ; 0x24 72ec: 3102 adds r1, #2 72ee: 6a62 ldr r2, [r4, #36] ; 0x24 72f0: 4798 blx r3 72f2: 2800 cmp r0, #0 72f4: d0b1 beq.n 725a !m_dev->writeSector(m_relativeSectors + 8, m_secBuf)) { 72f6: 69e0 ldr r0, [r4, #28] 72f8: 6921 ldr r1, [r4, #16] 72fa: 6803 ldr r3, [r0, #0] 72fc: 3108 adds r1, #8 72fe: 6a62 ldr r2, [r4, #36] ; 0x24 7300: 6a5b ldr r3, [r3, #36] ; 0x24 7302: 4798 blx r3 if (!m_dev->writeSector(m_relativeSectors + 2, m_secBuf) || 7304: 2800 cmp r0, #0 7306: d0a8 beq.n 725a 7308: f04f 33ff mov.w r3, #4294967295 if (!m_dev->writeSector(m_relativeSectors + 1, m_secBuf) || 730c: 69e0 ldr r0, [r4, #28] 730e: 4a1c ldr r2, [pc, #112] ; (7380 ) 7310: e9c5 337a strd r3, r3, [r5, #488] ; 0x1e8 7314: 4b1b ldr r3, [pc, #108] ; (7384 ) 7316: 602a str r2, [r5, #0] 7318: f8c5 31e4 str.w r3, [r5, #484] ; 0x1e4 731c: 6803 ldr r3, [r0, #0] 731e: 6921 ldr r1, [r4, #16] 7320: 6a62 ldr r2, [r4, #36] ; 0x24 7322: 6a5b ldr r3, [r3, #36] ; 0x24 7324: 3101 adds r1, #1 7326: 4798 blx r3 7328: 2800 cmp r0, #0 732a: d096 beq.n 725a !m_dev->writeSector(m_relativeSectors + 7, m_secBuf)) { 732c: 69e0 ldr r0, [r4, #28] 732e: 6921 ldr r1, [r4, #16] 7330: 6803 ldr r3, [r0, #0] 7332: 6a62 ldr r2, [r4, #36] ; 0x24 7334: 3107 adds r1, #7 7336: 6a5b ldr r3, [r3, #36] ; 0x24 7338: 4798 blx r3 if (!m_dev->writeSector(m_relativeSectors + 1, m_secBuf) || 733a: 2800 cmp r0, #0 733c: d08d beq.n 725a return initFatDir(32, 2*m_fatSize + m_sectorsPerCluster); 733e: 68a2 ldr r2, [r4, #8] 7340: 4620 mov r0, r4 7342: f894 302b ldrb.w r3, [r4, #43] ; 0x2b 7346: 2120 movs r1, #32 7348: eb03 0242 add.w r2, r3, r2, lsl #1 } 734c: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} return initFatDir(32, 2*m_fatSize + m_sectorsPerCluster); 7350: f7ff bdc2 b.w 6ed8 writeMsg("Bad cluster count\r\n"); 7354: 6a20 ldr r0, [r4, #32] 7356: 2800 cmp r0, #0 7358: f43f af7f beq.w 725a 735c: 6803 ldr r3, [r0, #0] 735e: 2213 movs r2, #19 7360: 4909 ldr r1, [pc, #36] ; (7388 ) 7362: 685b ldr r3, [r3, #4] 7364: 4798 blx r3 } 7366: 2000 movs r0, #0 7368: bdf8 pop {r3, r4, r5, r6, r7, pc} 736a: 005f lsls r7, r3, #1 736c: e756 b.n 721c 736e: bf00 nop 7370: 00fb0400 .word 0x00fb0400 7374: 00060001 .word 0x00060001 7378: 0012d687 .word 0x0012d687 737c: aa550000 .word 0xaa550000 7380: 41615252 .word 0x41615252 7384: 61417272 .word 0x61417272 7388: 200007c8 .word 0x200007c8 0000738c : bool FatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { 738c: b538 push {r3, r4, r5, lr} 738e: 4604 mov r4, r0 m_sectorCount = m_dev->sectorCount(); 7390: 680d ldr r5, [r1, #0] m_dev = dev; 7392: 61c1 str r1, [r0, #28] m_sectorCount = m_dev->sectorCount(); 7394: 4608 mov r0, r1 m_secBuf = secBuf; 7396: 6262 str r2, [r4, #36] ; 0x24 m_sectorCount = m_dev->sectorCount(); 7398: 69ea ldr r2, [r5, #28] m_pr = pr; 739a: 6223 str r3, [r4, #32] m_sectorCount = m_dev->sectorCount(); 739c: 4790 blx r2 m_capacityMB = (m_sectorCount + SECTORS_PER_MB - 1)/SECTORS_PER_MB; 739e: f200 73ff addw r3, r0, #2047 ; 0x7ff m_sectorCount = m_dev->sectorCount(); 73a2: 6160 str r0, [r4, #20] m_capacityMB = (m_sectorCount + SECTORS_PER_MB - 1)/SECTORS_PER_MB; 73a4: 0adb lsrs r3, r3, #11 if (m_capacityMB <= 6) { 73a6: 2b06 cmp r3, #6 m_capacityMB = (m_sectorCount + SECTORS_PER_MB - 1)/SECTORS_PER_MB; 73a8: 6023 str r3, [r4, #0] if (m_capacityMB <= 6) { 73aa: d924 bls.n 73f6 } else if (m_capacityMB <= 16) { 73ac: 2b10 cmp r3, #16 73ae: d813 bhi.n 73d8 73b0: 2302 movs r3, #2 rtn = m_sectorCount < 0X400000 ? makeFat16() : makeFat32(); 73b2: f5b0 0f80 cmp.w r0, #4194304 ; 0x400000 m_sectorsPerCluster = 2; 73b6: f884 302b strb.w r3, [r4, #43] ; 0x2b rtn = m_sectorCount < 0X400000 ? makeFat16() : makeFat32(); 73ba: 4620 mov r0, r4 73bc: d22e bcs.n 741c 73be: f7ff fe75 bl 70ac 73c2: 4605 mov r5, r0 writeMsg("Format Done\r\n"); 73c4: 6a20 ldr r0, [r4, #32] if (rtn) { 73c6: b305 cbz r5, 740a writeMsg("Format Done\r\n"); 73c8: b120 cbz r0, 73d4 73ca: 6803 ldr r3, [r0, #0] 73cc: 220d movs r2, #13 73ce: 4919 ldr r1, [pc, #100] ; (7434 ) 73d0: 685b ldr r3, [r3, #4] 73d2: 4798 blx r3 } 73d4: 4628 mov r0, r5 73d6: bd38 pop {r3, r4, r5, pc} } else if (m_capacityMB <= 32) { 73d8: 2b20 cmp r3, #32 73da: d923 bls.n 7424 } else if (m_capacityMB <= 64) { 73dc: 2b40 cmp r3, #64 ; 0x40 73de: d923 bls.n 7428 } else if (m_capacityMB <= 128) { 73e0: 2b80 cmp r3, #128 ; 0x80 73e2: d923 bls.n 742c } else if (m_capacityMB <= 1024) { 73e4: f5b3 6f80 cmp.w r3, #1024 ; 0x400 73e8: d922 bls.n 7430 } else if (m_capacityMB <= 32768) { 73ea: f5b3 4f00 cmp.w r3, #32768 ; 0x8000 73ee: bf8c ite hi 73f0: 2380 movhi r3, #128 ; 0x80 73f2: 2340 movls r3, #64 ; 0x40 73f4: e7dd b.n 73b2 writeMsg("Card is too small.\r\n"); 73f6: 6a20 ldr r0, [r4, #32] 73f8: b120 cbz r0, 7404 73fa: 6803 ldr r3, [r0, #0] 73fc: 2214 movs r2, #20 73fe: 490e ldr r1, [pc, #56] ; (7438 ) 7400: 685b ldr r3, [r3, #4] 7402: 4798 blx r3 return false; 7404: 2500 movs r5, #0 } 7406: 4628 mov r0, r5 7408: bd38 pop {r3, r4, r5, pc} writeMsg("Format Failed\r\n"); 740a: 2800 cmp r0, #0 740c: d0fa beq.n 7404 740e: 6803 ldr r3, [r0, #0] 7410: 220f movs r2, #15 7412: 490a ldr r1, [pc, #40] ; (743c ) 7414: 685b ldr r3, [r3, #4] 7416: 4798 blx r3 } 7418: 4628 mov r0, r5 741a: bd38 pop {r3, r4, r5, pc} rtn = m_sectorCount < 0X400000 ? makeFat16() : makeFat32(); 741c: f7ff fed4 bl 71c8 7420: 4605 mov r5, r0 7422: e7cf b.n 73c4 7424: 2304 movs r3, #4 7426: e7c4 b.n 73b2 7428: 2308 movs r3, #8 742a: e7c2 b.n 73b2 742c: 2310 movs r3, #16 742e: e7c0 b.n 73b2 7430: 2320 movs r3, #32 7432: e7be b.n 73b2 7434: 200007a8 .word 0x200007a8 7438: 20000790 .word 0x20000790 743c: 200007b8 .word 0x200007b8 00007440 : #include "../common/DebugMacros.h" #include "../common/FsUtf.h" #include "FatLib.h" //------------------------------------------------------------------------------ uint16_t FatFile::getLfnChar(DirLfn_t* ldir, uint8_t i) { if (i < 5) { 7440: 2a04 cmp r2, #4 7442: d804 bhi.n 744e return *reinterpret_cast(src); 7444: eb01 0242 add.w r2, r1, r2, lsl #1 7448: f8b2 0001 ldrh.w r0, [r2, #1] return getLe16(ldir->unicode1 + 2*i); 744c: 4770 bx lr } else if (i < 11) { 744e: 2a0a cmp r2, #10 7450: d803 bhi.n 745a return getLe16(ldir->unicode2 + 2*i - 10); 7452: eb01 0242 add.w r2, r1, r2, lsl #1 7456: 8890 ldrh r0, [r2, #4] 7458: 4770 bx lr } else if (i < 13) { 745a: 2a0c cmp r2, #12 745c: d803 bhi.n 7466 return getLe16(ldir->unicode3 + 2*i - 22); 745e: eb01 0142 add.w r1, r1, r2, lsl #1 7462: 88c8 ldrh r0, [r1, #6] 7464: 4770 bx lr } DBG_HALT_IF(i >= 13); return 0; 7466: 2000 movs r0, #0 } 7468: 4770 bx lr 746a: bf00 nop 0000746c : fail: *name = 0; return 0; } //------------------------------------------------------------------------------ size_t FatFile::getSFN(char* name, size_t size) { 746c: b5f8 push {r3, r4, r5, r6, r7, lr} bool isOpen() const {return m_attributes;} 746e: 7804 ldrb r4, [r0, #0] 7470: 460e mov r6, r1 char c; uint8_t j = 0; uint8_t lcBit = FAT_CASE_LC_BASE; uint8_t* ptr; DirFat_t* dir; if (!isOpen()) { 7472: b17c cbz r4, 7494 DBG_FAIL_MACRO; goto fail; } if (isRoot()) { 7474: f014 0460 ands.w r4, r4, #96 ; 0x60 7478: 4617 mov r7, r2 747a: d007 beq.n 748c if (size < 2) { 747c: 2a01 cmp r2, #1 747e: d909 bls.n 7494 DBG_FAIL_MACRO; goto fail; } name[0] = '/'; 7480: 222f movs r2, #47 ; 0x2f name[1] = '\0'; 7482: 2300 movs r3, #0 return 1; 7484: 2001 movs r0, #1 name[0] = '/'; 7486: 700a strb r2, [r1, #0] name[1] = '\0'; 7488: 704b strb r3, [r1, #1] return j; fail: name[0] = '\0'; return 0; } 748a: bdf8 pop {r3, r4, r5, r6, r7, pc} dir = cacheDirEntry(FsCache::CACHE_FOR_READ); 748c: 4621 mov r1, r4 748e: f7fe f947 bl 5720 if (!dir) { 7492: b918 cbnz r0, 749c name[0] = '\0'; 7494: 2300 movs r3, #0 return 0; 7496: 4618 mov r0, r3 name[0] = '\0'; 7498: 7033 strb r3, [r6, #0] } 749a: bdf8 pop {r3, r4, r5, r6, r7, pc} ptr = dir->name; 749c: 4603 mov r3, r0 749e: 46a4 mov ip, r4 uint8_t lcBit = FAT_CASE_LC_BASE; 74a0: 2108 movs r1, #8 74a2: e011 b.n 74c8 if ('A' <= c && c <= 'Z' && (lcBit & dir->caseFlags)) { 74a4: 7b02 ldrb r2, [r0, #12] 74a6: 4211 tst r1, r2 74a8: d003 beq.n 74b2 c += 'a' - 'A'; 74aa: f10e 0e20 add.w lr, lr, #32 74ae: fa5f fe8e uxtb.w lr, lr if ((j + 1u) >= size) { 74b2: 1c65 adds r5, r4, #1 74b4: 42bd cmp r5, r7 74b6: d2ed bcs.n 7494 for (uint8_t i = 0; i < 12; i++) { 74b8: f10c 0c01 add.w ip, ip, #1 name[j++] = c; 74bc: f806 e004 strb.w lr, [r6, r4] 74c0: b2ec uxtb r4, r5 for (uint8_t i = 0; i < 12; i++) { 74c2: f1bc 0f0c cmp.w ip, #12 74c6: d010 beq.n 74ea if (i == 8) { 74c8: f1bc 0f08 cmp.w ip, #8 74cc: d011 beq.n 74f2 c = *ptr++; 74ce: f813 eb01 ldrb.w lr, [r3], #1 if ('A' <= c && c <= 'Z' && (lcBit & dir->caseFlags)) { 74d2: f1ae 0241 sub.w r2, lr, #65 ; 0x41 74d6: 2a19 cmp r2, #25 74d8: d9e4 bls.n 74a4 if (c == ' ') { 74da: f1be 0f20 cmp.w lr, #32 74de: d1e8 bne.n 74b2 for (uint8_t i = 0; i < 12; i++) { 74e0: f10c 0c01 add.w ip, ip, #1 74e4: f1bc 0f0c cmp.w ip, #12 74e8: d1ee bne.n 74c8 name[j] = '\0'; 74ea: 2300 movs r3, #0 74ec: 4620 mov r0, r4 74ee: 5533 strb r3, [r6, r4] } 74f0: bdf8 pop {r3, r4, r5, r6, r7, pc} if (*ptr == ' ') { 74f2: 781a ldrb r2, [r3, #0] 74f4: 2a20 cmp r2, #32 74f6: d0f8 beq.n 74ea lcBit = FAT_CASE_LC_EXT; 74f8: 2110 movs r1, #16 c = '.'; 74fa: f04f 0e2e mov.w lr, #46 ; 0x2e 74fe: e7d8 b.n 74b2 00007500 : size_t FatFile::getName8(char* name, size_t size) { 7500: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} FatFile() {} 7504: 2400 movs r4, #0 7506: b08b sub sp, #44 ; 0x2c if (!isOpen()) { 7508: 7803 ldrb r3, [r0, #0] size_t FatFile::getName8(char* name, size_t size) { 750a: 4689 mov r9, r1 750c: 9401 str r4, [sp, #4] if (!isOpen()) { 750e: 2b00 cmp r3, #0 7510: d055 beq.n 75be if (!isLFN()) { 7512: 78c3 ldrb r3, [r0, #3] 7514: 4606 mov r6, r0 7516: 2b00 cmp r3, #0 7518: d058 beq.n 75cc if (!dir.openCluster(this)) { 751a: 4601 mov r1, r0 751c: a801 add r0, sp, #4 751e: 4690 mov r8, r2 7520: f7fe fb1e bl 5b60 7524: 2800 cmp r0, #0 7526: d04a beq.n 75be for (uint8_t order = 1; order <= m_lfnOrd; order++) { 7528: 78f0 ldrb r0, [r6, #3] 752a: 2800 cmp r0, #0 752c: d043 beq.n 75b6 ptr = FsUtf::cpToMb(cp, str, end - 1); 752e: f108 38ff add.w r8, r8, #4294967295 char* str = name; 7532: 46cb mov fp, r9 for (uint8_t order = 1; order <= m_lfnOrd; order++) { 7534: f04f 0a01 mov.w sl, #1 ptr = FsUtf::cpToMb(cp, str, end - 1); 7538: 44c8 add r8, r9 ldir = reinterpret_cast(dir.cacheDir(m_dirIndex - order)); 753a: 88b1 ldrh r1, [r6, #4] return seekSet(32UL*index) ? readDirCache() : nullptr; 753c: a801 add r0, sp, #4 753e: eba1 010a sub.w r1, r1, sl 7542: b289 uxth r1, r1 7544: 0149 lsls r1, r1, #5 7546: f7fe fd9f bl 6088 754a: b3c0 cbz r0, 75be 754c: 2100 movs r1, #0 754e: a801 add r0, sp, #4 7550: f7fe fc3a bl 5dc8 if (!ldir) { 7554: b398 cbz r0, 75be if (ldir->attributes != FAT_ATTRIB_LONG_NAME || 7556: 7ac3 ldrb r3, [r0, #11] 7558: 2b0f cmp r3, #15 755a: d130 bne.n 75be 755c: 7803 ldrb r3, [r0, #0] 755e: fa5f f18a uxtb.w r1, sl 7562: f003 031f and.w r3, r3, #31 7566: 428b cmp r3, r1 7568: d129 bne.n 75be 756a: 1c47 adds r7, r0, #1 756c: 2500 movs r5, #0 if (i < 5) { 756e: 2d04 cmp r5, #4 7570: b2eb uxtb r3, r5 7572: d83f bhi.n 75f4 7574: 883b ldrh r3, [r7, #0] if (hs) { 7576: bb74 cbnz r4, 75d6 7578: f503 5120 add.w r1, r3, #10240 ; 0x2800 757c: b289 uxth r1, r1 } else if (!FsUtf::isSurrogate(c)) { 757e: f5b1 6f00 cmp.w r1, #2048 ; 0x800 7582: d33e bcc.n 7602 if (c == 0) { 7584: b1a3 cbz r3, 75b0 cp = c; 7586: 4618 mov r0, r3 ptr = FsUtf::cpToMb(cp, str, end - 1); 7588: 4659 mov r1, fp 758a: 4642 mov r2, r8 758c: f002 ff2c bl a3e8 if (!ptr) { 7590: 4683 mov fp, r0 7592: b1a0 cbz r0, 75be 7594: 2400 movs r4, #0 for (uint8_t i = 0; i < 13; i++) { 7596: 3501 adds r5, #1 7598: 3702 adds r7, #2 759a: 2d0d cmp r5, #13 759c: d1e7 bne.n 756e for (uint8_t order = 1; order <= m_lfnOrd; order++) { 759e: f10a 0a01 add.w sl, sl, #1 75a2: 78f1 ldrb r1, [r6, #3] 75a4: fa5f f38a uxtb.w r3, sl 75a8: fa1f fa8a uxth.w sl, sl 75ac: 4299 cmp r1, r3 75ae: d2c4 bcs.n 753a return str - name; 75b0: ebab 0009 sub.w r0, fp, r9 75b4: 46d9 mov r9, fp *str = '\0'; 75b6: 2300 movs r3, #0 75b8: f889 3000 strb.w r3, [r9] return str - name; 75bc: e003 b.n 75c6 *name = 0; 75be: 2300 movs r3, #0 return 0; 75c0: 4618 mov r0, r3 *name = 0; 75c2: f889 3000 strb.w r3, [r9] } 75c6: b00b add sp, #44 ; 0x2c 75c8: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} return getSFN(name, size); 75cc: f7ff ff4e bl 746c } 75d0: b00b add sp, #44 ; 0x2c 75d2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} return 0XDC00 <= c && c <= 0XDFFF; 75d6: f503 5110 add.w r1, r3, #9216 ; 0x2400 if (!FsUtf::isLowSurrogate(c)) { 75da: b289 uxth r1, r1 75dc: f5b1 6f80 cmp.w r1, #1024 ; 0x400 75e0: d2ed bcs.n 75be return 0X10000 + (((hs & 0X3FF) << 10) | (ls & 0X3FF)); 75e2: 4a0a ldr r2, [pc, #40] ; (760c ) 75e4: f3c3 0309 ubfx r3, r3, #0, #10 75e8: ea02 2084 and.w r0, r2, r4, lsl #10 75ec: 4318 orrs r0, r3 75ee: f500 3080 add.w r0, r0, #65536 ; 0x10000 hs = 0; 75f2: e7c9 b.n 7588 } else if (i < 11) { 75f4: 2b0a cmp r3, #10 75f6: bf94 ite ls 75f8: f8b7 3003 ldrhls.w r3, [r7, #3] 75fc: f8b7 3005 ldrhhi.w r3, [r7, #5] return getLe16(ldir->unicode3 + 2*i - 22); 7600: e7b9 b.n 7576 } else if (FsUtf::isHighSurrogate(c)) { 7602: f5b1 6f80 cmp.w r1, #1024 ; 0x400 7606: d2da bcs.n 75be 7608: 461c mov r4, r3 760a: e7c4 b.n 7596 760c: 000ffc00 .word 0x000ffc00 00007610 : return getName8(name, size); 7610: f7ff bf76 b.w 7500 00007614 : virtual bool readSectorsCallback(uint32_t sector, uint8_t* dst, size_t ns, 7614: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 7618: e9dd 8708 ldrd r8, r7, [sp, #32] for (size_t i = 0; i < ns; i++) { 761c: b1c3 cbz r3, 7650 761e: 4681 mov r9, r0 7620: 460c mov r4, r1 7622: 4615 mov r5, r2 7624: 185e adds r6, r3, r1 7626: e002 b.n 762e callback(sector + i, dst, context); 7628: 47c0 blx r8 for (size_t i = 0; i < ns; i++) { 762a: 42b4 cmp r4, r6 762c: d010 beq.n 7650 if (!readSector(sector + i, dst)) return false; 762e: f8d9 3000 ldr.w r3, [r9] 7632: 4621 mov r1, r4 7634: 462a mov r2, r5 7636: 4648 mov r0, r9 7638: 691b ldr r3, [r3, #16] 763a: 4798 blx r3 763c: 4603 mov r3, r0 callback(sector + i, dst, context); 763e: 463a mov r2, r7 7640: 4620 mov r0, r4 7642: 4629 mov r1, r5 for (size_t i = 0; i < ns; i++) { 7644: 3401 adds r4, #1 if (!readSector(sector + i, dst)) return false; 7646: 2b00 cmp r3, #0 7648: d1ee bne.n 7628 } 764a: 4618 mov r0, r3 764c: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} return true; 7650: 2301 movs r3, #1 } 7652: 4618 mov r0, r3 7654: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 00007658 : uint32_t clusters_to_do; uint32_t free_count; }; //------------------------------------------------------------------------------ void FatPartition::freeClusterCount_cb_fat16(uint32_t sector, uint8_t *buf, void *context) { 7658: b410 push {r4} struct FreeClusterCountStruct *state = (struct FreeClusterCountStruct *)context; uint16_t *p = (uint16_t *)buf; unsigned int n = state->clusters_to_do; 765a: 6814 ldr r4, [r2, #0] if (n > 256) n = 256; 765c: f5b4 7f80 cmp.w r4, #256 ; 0x100 7660: 46a4 mov ip, r4 7662: bf28 it cs 7664: f44f 7c80 movcs.w ip, #256 ; 0x100 uint16_t *e = p + n; 7668: eb01 004c add.w r0, r1, ip, lsl #1 while (p < e) { 766c: 4281 cmp r1, r0 766e: d207 bcs.n 7680 if (*p++ == 0) state->free_count++; 7670: f831 3b02 ldrh.w r3, [r1], #2 7674: b913 cbnz r3, 767c 7676: 6853 ldr r3, [r2, #4] 7678: 3301 adds r3, #1 767a: 6053 str r3, [r2, #4] while (p < e) { 767c: 4288 cmp r0, r1 767e: d8f7 bhi.n 7670 } state->clusters_to_do -= n; 7680: eba4 040c sub.w r4, r4, ip 7684: 6014 str r4, [r2, #0] } 7686: f85d 4b04 ldr.w r4, [sp], #4 768a: 4770 bx lr 0000768c : //------------------------------------------------------------------------------ void FatPartition::freeClusterCount_cb_fat32(uint32_t sector, uint8_t *buf, void *context) { 768c: b410 push {r4} struct FreeClusterCountStruct *state = (struct FreeClusterCountStruct *)context; uint32_t *p = (uint32_t *)buf; unsigned int n = state->clusters_to_do; 768e: 6814 ldr r4, [r2, #0] if (n > 128) n = 128; 7690: 2c80 cmp r4, #128 ; 0x80 7692: 46a4 mov ip, r4 7694: bf28 it cs 7696: f04f 0c80 movcs.w ip, #128 ; 0x80 uint32_t *e = p + n; 769a: eb01 008c add.w r0, r1, ip, lsl #2 while (p < e) { 769e: 4281 cmp r1, r0 76a0: d207 bcs.n 76b2 if (*p++ == 0) state->free_count++; 76a2: f851 3b04 ldr.w r3, [r1], #4 76a6: b913 cbnz r3, 76ae 76a8: 6853 ldr r3, [r2, #4] 76aa: 3301 adds r3, #1 76ac: 6053 str r3, [r2, #4] while (p < e) { 76ae: 4288 cmp r0, r1 76b0: d8f7 bhi.n 76a2 } state->clusters_to_do -= n; 76b2: eba4 040c sub.w r4, r4, ip 76b6: 6014 str r4, [r2, #0] } 76b8: f85d 4b04 ldr.w r4, [sp], #4 76bc: 4770 bx lr 76be: bf00 nop 000076c0 : int8_t FatPartition::fatGet(uint32_t cluster, uint32_t* value) { 76c0: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} return m_fatType; 76c4: 79c3 ldrb r3, [r0, #7] 76c6: 4604 mov r4, r0 76c8: 460d mov r5, r1 76ca: 4617 mov r7, r2 if (fatType() == 32) { 76cc: 2b20 cmp r3, #32 76ce: d059 beq.n 7784 } else if (fatType() == 16) { 76d0: 2b10 cmp r3, #16 76d2: d030 beq.n 7736 } else if (FAT12_SUPPORT && fatType() == 12) { 76d4: 2b0c cmp r3, #12 76d6: d151 bne.n 777c if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 76d8: 7a02 ldrb r2, [r0, #8] index += index >> 1; 76da: f3c1 014e ubfx r1, r1, #1, #15 sector = m_fatStartSector + (index >> m_bytesPerSectorShift); 76de: 6983 ldr r3, [r0, #24] return m_fatCache.prepare(sector, options); 76e0: f500 790e add.w r9, r0, #568 ; 0x238 index += index >> 1; 76e4: fa11 f185 uxtah r1, r1, r5 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 76e8: f1a2 0202 sub.w r2, r2, #2 return m_fatCache.prepare(sector, options); 76ec: 4648 mov r0, r9 76ee: b28e uxth r6, r1 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 76f0: fab2 f282 clz r2, r2 sector = m_fatStartSector + (index >> m_bytesPerSectorShift); 76f4: f3c1 2146 ubfx r1, r1, #9, #7 76f8: 0952 lsrs r2, r2, #5 76fa: eb01 0803 add.w r8, r1, r3 return m_fatCache.prepare(sector, options); 76fe: 0052 lsls r2, r2, #1 7700: 4641 mov r1, r8 7702: f002 fdbd bl a280 if (!pc) { 7706: 2800 cmp r0, #0 7708: d038 beq.n 777c index &= m_sectorMask; 770a: f3c6 0608 ubfx r6, r6, #0, #9 index++; 770e: 1c73 adds r3, r6, #1 uint16_t tmp = pc[index]; 7710: 5d86 ldrb r6, [r0, r6] if (index == m_bytesPerSector) { 7712: f5b3 7f00 cmp.w r3, #512 ; 0x200 7716: d023 beq.n 7760 tmp |= pc[index] << 8; 7718: 4418 add r0, r3 771a: 7803 ldrb r3, [r0, #0] next = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; 771c: 07ea lsls r2, r5, #31 if (isEOC(next)) { 771e: 69e2 ldr r2, [r4, #28] tmp |= pc[index] << 8; 7720: ea46 2303 orr.w r3, r6, r3, lsl #8 next = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; 7724: bf4c ite mi 7726: 091b lsrmi r3, r3, #4 7728: f3c3 030b ubfxpl r3, r3, #0, #12 if (isEOC(next)) { 772c: 429a cmp r2, r3 772e: d240 bcs.n 77b2 return 0; 7730: 2000 movs r0, #0 } 7732: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7736: 7a02 ldrb r2, [r0, #8] sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1) ); 7738: f3c1 2107 ubfx r1, r1, #8, #8 773c: 6983 ldr r3, [r0, #24] return m_fatCache.prepare(sector, options); 773e: f500 700e add.w r0, r0, #568 ; 0x238 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7742: f1a2 0202 sub.w r2, r2, #2 return m_fatCache.prepare(sector, options); 7746: 4419 add r1, r3 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7748: fab2 f282 clz r2, r2 774c: 0952 lsrs r2, r2, #5 return m_fatCache.prepare(sector, options); 774e: 0052 lsls r2, r2, #1 7750: f002 fd96 bl a280 if (!pc) { 7754: b190 cbz r0, 777c uint16_t offset = (cluster << 1) & m_sectorMask; 7756: 006d lsls r5, r5, #1 next = getLe16(pc + offset); 7758: f405 75ff and.w r5, r5, #510 ; 0x1fe 775c: 5b43 ldrh r3, [r0, r5] 775e: e025 b.n 77ac if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7760: 7a22 ldrb r2, [r4, #8] return m_fatCache.prepare(sector, options); 7762: f108 0101 add.w r1, r8, #1 7766: 4648 mov r0, r9 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7768: f1a2 0202 sub.w r2, r2, #2 776c: fab2 f282 clz r2, r2 7770: 0952 lsrs r2, r2, #5 return m_fatCache.prepare(sector, options); 7772: 0052 lsls r2, r2, #1 7774: f002 fd84 bl a280 if (!pc) { 7778: 2800 cmp r0, #0 777a: d1ce bne.n 771a return -1; 777c: f04f 30ff mov.w r0, #4294967295 } 7780: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7784: 7a02 ldrb r2, [r0, #8] sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 7786: 6981 ldr r1, [r0, #24] return m_fatCache.prepare(sector, options); 7788: f500 700e add.w r0, r0, #568 ; 0x238 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 778c: f1a2 0202 sub.w r2, r2, #2 return m_fatCache.prepare(sector, options); 7790: eb01 11d5 add.w r1, r1, r5, lsr #7 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7794: fab2 f282 clz r2, r2 7798: 0952 lsrs r2, r2, #5 return m_fatCache.prepare(sector, options); 779a: 0052 lsls r2, r2, #1 779c: f002 fd70 bl a280 if (!pc) { 77a0: 2800 cmp r0, #0 77a2: d0eb beq.n 777c uint16_t offset = (cluster << 2) & m_sectorMask; 77a4: 00ad lsls r5, r5, #2 next = getLe32(pc + offset); 77a6: f405 75fe and.w r5, r5, #508 ; 0x1fc return *reinterpret_cast(src); 77aa: 5943 ldr r3, [r0, r5] if (isEOC(next)) { 77ac: 69e2 ldr r2, [r4, #28] 77ae: 429a cmp r2, r3 77b0: d3be bcc.n 7730 return 1; 77b2: 2001 movs r0, #1 *value = next; 77b4: 603b str r3, [r7, #0] } 77b6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 77ba: bf00 nop 000077bc : bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { 77bc: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} return m_fatType; 77c0: 79c3 ldrb r3, [r0, #7] 77c2: 4605 mov r5, r0 77c4: 460c mov r4, r1 77c6: 4616 mov r6, r2 if (fatType() == 32) { 77c8: 2b20 cmp r3, #32 77ca: d048 beq.n 785e if (fatType() == 16) { 77cc: 2b10 cmp r3, #16 77ce: d02d beq.n 782c if (FAT12_SUPPORT && fatType() == 12) { 77d0: 2b0c cmp r3, #12 77d2: d141 bne.n 7858 index += index >> 1; 77d4: f3c1 014e ubfx r1, r1, #1, #15 sector = m_fatStartSector + (index >> m_bytesPerSectorShift); 77d8: 6983 ldr r3, [r0, #24] return m_fatCache.prepare(sector, options); 77da: f500 790e add.w r9, r0, #568 ; 0x238 index += index >> 1; 77de: fa11 f184 uxtah r1, r1, r4 77e2: fa1f f881 uxth.w r8, r1 sector = m_fatStartSector + (index >> m_bytesPerSectorShift); 77e6: f3c1 2146 ubfx r1, r1, #9, #7 77ea: 18cf adds r7, r1, r3 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 77ec: 7a03 ldrb r3, [r0, #8] return m_fatCache.prepare(sector, options); 77ee: 4648 mov r0, r9 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 77f0: 2b02 cmp r3, #2 return m_fatCache.prepare(sector, options); 77f2: 4639 mov r1, r7 77f4: bf14 ite ne 77f6: 2201 movne r2, #1 77f8: 2203 moveq r2, #3 77fa: f002 fd41 bl a280 if (!pc) { 77fe: b358 cbz r0, 7858 if (cluster & 1) { 7800: f014 0401 ands.w r4, r4, #1 index &= m_sectorMask; 7804: f3c8 0308 ubfx r3, r8, #0, #9 if (cluster & 1) { 7808: d03f beq.n 788a tmp = (pc[index] & 0XF) | tmp << 4; 780a: 5cc2 ldrb r2, [r0, r3] 780c: f002 020f and.w r2, r2, #15 7810: ea42 1206 orr.w r2, r2, r6, lsl #4 pc[index] = tmp; 7814: 54c2 strb r2, [r0, r3] index++; 7816: 3301 adds r3, #1 if (index == m_bytesPerSector) { 7818: f5b3 7f00 cmp.w r3, #512 ; 0x200 781c: d03a beq.n 7894 tmp = value >> 4; 781e: f3c6 1207 ubfx r2, r6, #4, #8 pc[index] = tmp; 7822: 4403 add r3, r0 return true; 7824: 2001 movs r0, #1 pc[index] = tmp; 7826: 701a strb r2, [r3, #0] } 7828: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 782c: 7a02 ldrb r2, [r0, #8] sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1) ); 782e: f3c1 2107 ubfx r1, r1, #8, #8 7832: 6983 ldr r3, [r0, #24] return m_fatCache.prepare(sector, options); 7834: f500 700e add.w r0, r0, #568 ; 0x238 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7838: 2a02 cmp r2, #2 return m_fatCache.prepare(sector, options); 783a: 4419 add r1, r3 783c: bf14 ite ne 783e: 2201 movne r2, #1 7840: 2203 moveq r2, #3 7842: f002 fd1d bl a280 if (!pc) { 7846: 4603 mov r3, r0 7848: b130 cbz r0, 7858 uint16_t offset = (cluster << 1) & m_sectorMask; 784a: 0064 lsls r4, r4, #1 return true; 784c: 2001 movs r0, #1 setLe16(pc + offset, value); 784e: f404 74ff and.w r4, r4, #510 ; 0x1fe 7852: 531e strh r6, [r3, r4] } 7854: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} return false; 7858: 2000 movs r0, #0 } 785a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 785e: 7a03 ldrb r3, [r0, #8] sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); 7860: 6981 ldr r1, [r0, #24] return m_fatCache.prepare(sector, options); 7862: f500 700e add.w r0, r0, #568 ; 0x238 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7866: 2b02 cmp r3, #2 return m_fatCache.prepare(sector, options); 7868: eb01 11d4 add.w r1, r1, r4, lsr #7 786c: bf14 ite ne 786e: 2201 movne r2, #1 7870: 2203 moveq r2, #3 7872: f002 fd05 bl a280 if (!pc) { 7876: 4603 mov r3, r0 7878: 2800 cmp r0, #0 787a: d0ed beq.n 7858 uint16_t offset = (cluster << 2) & m_sectorMask; 787c: 00a4 lsls r4, r4, #2 return true; 787e: 2001 movs r0, #1 setLe32(pc + offset, value); 7880: f404 74fe and.w r4, r4, #508 ; 0x1fc *reinterpret_cast(dst) = src; 7884: 511e str r6, [r3, r4] } 7886: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} uint8_t tmp = value; 788a: 54c6 strb r6, [r0, r3] index++; 788c: 3301 adds r3, #1 if (index == m_bytesPerSector) { 788e: f5b3 7f00 cmp.w r3, #512 ; 0x200 7892: d115 bne.n 78c0 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 7894: 7a2b ldrb r3, [r5, #8] return m_fatCache.prepare(sector, options); 7896: 1c79 adds r1, r7, #1 7898: 4648 mov r0, r9 if (m_fatCount == 2) options |= FsCache::CACHE_STATUS_MIRROR_FAT; 789a: 2b02 cmp r3, #2 return m_fatCache.prepare(sector, options); 789c: bf14 ite ne 789e: 2201 movne r2, #1 78a0: 2203 moveq r2, #3 78a2: f002 fced bl a280 if (!pc) { 78a6: 4603 mov r3, r0 78a8: 2800 cmp r0, #0 78aa: d0d5 beq.n 7858 tmp = value >> 4; 78ac: f3c6 1207 ubfx r2, r6, #4, #8 if (!(cluster & 1)) { 78b0: 2c00 cmp r4, #0 78b2: d1b7 bne.n 7824 tmp = ((pc[index] & 0XF0)) | tmp >> 4; 78b4: 7819 ldrb r1, [r3, #0] 78b6: f021 010f bic.w r1, r1, #15 78ba: ea41 1212 orr.w r2, r1, r2, lsr #4 78be: e7b1 b.n 7824 tmp = value >> 4; 78c0: f3c6 1207 ubfx r2, r6, #4, #8 pc[index] = tmp; 78c4: 4403 add r3, r0 78c6: e7f5 b.n 78b4 000078c8 : bool FatPartition::allocateCluster(uint32_t current, uint32_t* next) { 78c8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} if (m_allocSearchStart < current) { 78cc: 68c4 ldr r4, [r0, #12] bool FatPartition::allocateCluster(uint32_t current, uint32_t* next) { 78ce: b082 sub sp, #8 78d0: 4605 mov r5, r0 78d2: 460e mov r6, r1 if (m_allocSearchStart < current) { 78d4: 428c cmp r4, r1 bool FatPartition::allocateCluster(uint32_t current, uint32_t* next) { 78d6: 4690 mov r8, r2 if (m_allocSearchStart < current) { 78d8: d340 bcc.n 795c setStart = true; 78da: 2701 movs r7, #1 find++; 78dc: 3401 adds r4, #1 if (find > m_lastCluster) { 78de: 69eb ldr r3, [r5, #28] 78e0: aa01 add r2, sp, #4 78e2: 4628 mov r0, r5 78e4: 42a3 cmp r3, r4 78e6: d205 bcs.n 78f4 if (setStart) { 78e8: bb9f cbnz r7, 7952 find = m_allocSearchStart; 78ea: 68ec ldr r4, [r5, #12] setStart = true; 78ec: 2701 movs r7, #1 find++; 78ee: 443c add r4, r7 if (find > m_lastCluster) { 78f0: 42a3 cmp r3, r4 78f2: d32e bcc.n 7952 if (cluster < 2 || cluster > m_lastCluster) { 78f4: 42a6 cmp r6, r4 78f6: bf18 it ne 78f8: 2c01 cmpne r4, #1 78fa: 4621 mov r1, r4 78fc: d929 bls.n 7952 78fe: f7ff fedf bl 76c0 if (fg < 0) { 7902: 2800 cmp r0, #0 7904: db25 blt.n 7952 if (fg && f == 0) { 7906: d0e9 beq.n 78dc 7908: 9b01 ldr r3, [sp, #4] 790a: 2b00 cmp r3, #0 790c: d1e6 bne.n 78dc if (setStart) { 790e: b107 cbz r7, 7912 m_allocSearchStart = find; 7910: 60ec str r4, [r5, #12] if (cluster < 2 || cluster > m_lastCluster) { 7912: 69eb ldr r3, [r5, #28] 7914: 42a3 cmp r3, r4 7916: d31c bcc.n 7952 7918: f06f 4270 mvn.w r2, #4026531840 ; 0xf0000000 791c: 4621 mov r1, r4 791e: 4628 mov r0, r5 7920: f7ff ff4c bl 77bc if (!fatPutEOC(find)) { 7924: 4607 mov r7, r0 7926: b1a0 cbz r0, 7952 if (current) { 7928: b93e cbnz r6, 793a if (m_freeClusterCount >= 0) { 792a: 6a6b ldr r3, [r5, #36] ; 0x24 792c: 2b00 cmp r3, #0 792e: db01 blt.n 7934 m_freeClusterCount += change; 7930: 3b01 subs r3, #1 7932: 626b str r3, [r5, #36] ; 0x24 *next = find; 7934: f8c8 4000 str.w r4, [r8] return true; 7938: e00c b.n 7954 if (cluster < 2 || cluster > m_lastCluster) { 793a: 2e01 cmp r6, #1 793c: d009 beq.n 7952 793e: 69eb ldr r3, [r5, #28] 7940: 429e cmp r6, r3 7942: d806 bhi.n 7952 7944: 4631 mov r1, r6 7946: 4622 mov r2, r4 7948: 4628 mov r0, r5 794a: f7ff ff37 bl 77bc if (!fatPut(current, find)) { 794e: 2800 cmp r0, #0 7950: d1eb bne.n 792a return false; 7952: 2700 movs r7, #0 } 7954: 4638 mov r0, r7 7956: b002 add sp, #8 7958: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 795c: 460c mov r4, r1 setStart = false; 795e: 2700 movs r7, #0 7960: e7bc b.n 78dc 7962: bf00 nop 00007964 : if (cluster < 2 || cluster > m_lastCluster) { 7964: 2901 cmp r1, #1 7966: d90c bls.n 7982 int8_t FatPartition::fatGet(uint32_t cluster, uint32_t* value) { 7968: b410 push {r4} if (cluster < 2 || cluster > m_lastCluster) { 796a: 69c4 ldr r4, [r0, #28] 796c: 428c cmp r4, r1 796e: d303 bcc.n 7978 } 7970: f85d 4b04 ldr.w r4, [sp], #4 7974: f7ff bea4 b.w 76c0 7978: f04f 30ff mov.w r0, #4294967295 797c: f85d 4b04 ldr.w r4, [sp], #4 7980: 4770 bx lr 7982: f04f 30ff mov.w r0, #4294967295 7986: 4770 bx lr 00007988 : if (cluster < 2 || cluster > m_lastCluster) { 7988: 2901 cmp r1, #1 798a: d90b bls.n 79a4 bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { 798c: b410 push {r4} if (cluster < 2 || cluster > m_lastCluster) { 798e: 69c4 ldr r4, [r0, #28] 7990: 428c cmp r4, r1 7992: d303 bcc.n 799c } 7994: f85d 4b04 ldr.w r4, [sp], #4 7998: f7ff bf10 b.w 77bc 799c: 2000 movs r0, #0 799e: f85d 4b04 ldr.w r4, [sp], #4 79a2: 4770 bx lr 79a4: 2000 movs r0, #0 79a6: 4770 bx lr 000079a8 : bool FatPartition::freeChain(uint32_t cluster) { 79a8: b570 push {r4, r5, r6, lr} 79aa: 4605 mov r5, r0 79ac: b082 sub sp, #8 79ae: 460c mov r4, r1 79b0: e01d b.n 79ee if (cluster < 2 || cluster > m_lastCluster) { 79b2: 69eb ldr r3, [r5, #28] 79b4: 429c cmp r4, r3 79b6: d81f bhi.n 79f8 79b8: f7ff fe82 bl 76c0 if (cluster < 2 || cluster > m_lastCluster) { 79bc: 4606 mov r6, r0 if (fg < 0) { 79be: 4621 mov r1, r4 79c0: 2200 movs r2, #0 79c2: 2e00 cmp r6, #0 79c4: 4628 mov r0, r5 79c6: db17 blt.n 79f8 if (cluster < 2 || cluster > m_lastCluster) { 79c8: 69eb ldr r3, [r5, #28] 79ca: 429c cmp r4, r3 79cc: d814 bhi.n 79f8 79ce: f7ff fef5 bl 77bc m_allocSearchStart = cluster - 1; 79d2: 1e62 subs r2, r4, #1 if (!fatPut(cluster, 0)) { 79d4: b180 cbz r0, 79f8 if (m_freeClusterCount >= 0) { 79d6: 6a6b ldr r3, [r5, #36] ; 0x24 79d8: 2b00 cmp r3, #0 m_freeClusterCount += change; 79da: f103 0301 add.w r3, r3, #1 79de: bfa8 it ge 79e0: 626b strge r3, [r5, #36] ; 0x24 if (cluster < m_allocSearchStart) { 79e2: 68eb ldr r3, [r5, #12] 79e4: 42a3 cmp r3, r4 cluster = next; 79e6: 9c01 ldr r4, [sp, #4] m_allocSearchStart = cluster - 1; 79e8: bf88 it hi 79ea: 60ea strhi r2, [r5, #12] } while (fg); 79ec: b12e cbz r6, 79fa if (cluster < 2 || cluster > m_lastCluster) { 79ee: 2c01 cmp r4, #1 79f0: 4621 mov r1, r4 79f2: aa01 add r2, sp, #4 79f4: 4628 mov r0, r5 79f6: d8dc bhi.n 79b2 return false; 79f8: 2000 movs r0, #0 } 79fa: b002 add sp, #8 79fc: bd70 pop {r4, r5, r6, pc} 79fe: bf00 nop 00007a00 : //------------------------------------------------------------------------------ int32_t FatPartition::freeClusterCount() { 7a00: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 7a04: 4606 mov r6, r0 #if MAINTAIN_FREE_CLUSTER_COUNT if (m_freeClusterCount >= 0) { 7a06: 6a40 ldr r0, [r0, #36] ; 0x24 int32_t FatPartition::freeClusterCount() { 7a08: b084 sub sp, #16 if (m_freeClusterCount >= 0) { 7a0a: 2800 cmp r0, #0 7a0c: da1b bge.n 7a46 return m_fatType; 7a0e: 79f2 ldrb r2, [r6, #7] return m_freeClusterCount; } #endif // MAINTAIN_FREE_CLUSTER_COUNT if (FAT12_SUPPORT && fatType() == 12) { 7a10: 2a0c cmp r2, #12 7a12: d11b bne.n 7a4c uint32_t free = 0; uint32_t todo = m_lastCluster + 1; 7a14: 69f7 ldr r7, [r6, #28] 7a16: 1c7b adds r3, r7, #1 for (unsigned i = 2; i < todo; i++) { 7a18: 2b02 cmp r3, #2 7a1a: f240 80cd bls.w 7bb8 7a1e: 2402 movs r4, #2 uint32_t free = 0; 7a20: 2500 movs r5, #0 7a22: 4621 mov r1, r4 7a24: aa02 add r2, sp, #8 7a26: 4630 mov r0, r6 7a28: f7ff fe4a bl 76c0 uint32_t c; int8_t fg = fatGet(i, &c); if (fg < 0) { 7a2c: 2800 cmp r0, #0 for (unsigned i = 2; i < todo; i++) { 7a2e: f104 0301 add.w r3, r4, #1 if (fg < 0) { 7a32: db06 blt.n 7a42 DBG_FAIL_MACRO; return -1; } if (fg && c == 0) { 7a34: d157 bne.n 7ae6 for (unsigned i = 2; i < todo; i++) { 7a36: 42a7 cmp r7, r4 7a38: 461c mov r4, r3 7a3a: d05c beq.n 7af6 if (cluster < 2 || cluster > m_lastCluster) { 7a3c: 69f2 ldr r2, [r6, #28] 7a3e: 4293 cmp r3, r2 7a40: d9ef bls.n 7a22 #if USE_SEPARATE_FAT_CACHE uint8_t *buf = m_fatCache.clear(); // will clear out anything and return buffer #else uint8_t *buf = m_cache.clear(); // will clear out anything and return buffer #endif // USE_SEPARATE_FAT_CACHE if (buf == nullptr) return -1; 7a42: f04f 30ff mov.w r0, #4294967295 if (!m_blockDev->readSectorsCallback(m_fatStartSector, buf, num_sectors, freeClusterCount_cb_fat16, &state)) return -1; } setFreeClusterCount(state.free_count); return state.free_count; } 7a46: b004 add sp, #16 7a48: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} state.clusters_to_do = m_lastCluster + 1; 7a4c: 69f1 ldr r1, [r6, #28] state.free_count = 0; 7a4e: 2000 movs r0, #0 return m_status & CACHE_STATUS_DIRTY; 7a50: f896 3238 ldrb.w r3, [r6, #568] ; 0x238 state.clusters_to_do = m_lastCluster + 1; 7a54: 3101 adds r1, #1 num_sectors = m_sectorsPerFat; 7a56: 6934 ldr r4, [r6, #16] if (isDirty() && !sync()) { 7a58: 07db lsls r3, r3, #31 state.clusters_to_do = m_lastCluster + 1; 7a5a: e9cd 1002 strd r1, r0, [sp, #8] 7a5e: f100 8085 bmi.w 7b6c m_status = 0; 7a62: 2100 movs r1, #0 m_sector = 0XFFFFFFFF; 7a64: f04f 33ff mov.w r3, #4294967295 if (fatType() == FAT_TYPE_FAT32) { 7a68: 2a20 cmp r2, #32 return m_buffer; 7a6a: f506 7712 add.w r7, r6, #584 ; 0x248 m_status = 0; 7a6e: f886 1238 strb.w r1, [r6, #568] ; 0x238 m_sector = 0XFFFFFFFF; 7a72: f8c6 3244 str.w r3, [r6, #580] ; 0x244 7a76: d042 beq.n 7afe if (!m_blockDev->readSectorsCallback(m_fatStartSector, buf, num_sectors, freeClusterCount_cb_fat16, &state)) return -1; 7a78: f8d6 8000 ldr.w r8, [r6] 7a7c: 4b4f ldr r3, [pc, #316] ; (7bbc ) 7a7e: f8d8 2000 ldr.w r2, [r8] 7a82: f8d6 a018 ldr.w sl, [r6, #24] 7a86: 6995 ldr r5, [r2, #24] 7a88: 429d cmp r5, r3 7a8a: d178 bne.n 7b7e for (size_t i = 0; i < ns; i++) { 7a8c: 2c00 cmp r4, #0 7a8e: f000 8082 beq.w 7b96 7a92: eb0a 0904 add.w r9, sl, r4 if (!readSector(sector + i, dst)) return false; 7a96: 6913 ldr r3, [r2, #16] 7a98: 4651 mov r1, sl 7a9a: 463a mov r2, r7 7a9c: 4640 mov r0, r8 7a9e: 4798 blx r3 7aa0: 2800 cmp r0, #0 7aa2: d0ce beq.n 7a42 unsigned int n = state->clusters_to_do; 7aa4: 9902 ldr r1, [sp, #8] if (n > 256) n = 256; 7aa6: f5b1 7f80 cmp.w r1, #256 ; 0x100 7aaa: 468e mov lr, r1 7aac: bf28 it cs 7aae: f44f 7e80 movcs.w lr, #256 ; 0x100 uint16_t *e = p + n; 7ab2: eb07 0c4e add.w ip, r7, lr, lsl #1 while (p < e) { 7ab6: 45bc cmp ip, r7 7ab8: d90b bls.n 7ad2 7aba: 9d03 ldr r5, [sp, #12] 7abc: 463b mov r3, r7 7abe: 2200 movs r2, #0 if (*p++ == 0) state->free_count++; 7ac0: f833 4b02 ldrh.w r4, [r3], #2 7ac4: b90c cbnz r4, 7aca 7ac6: 3501 adds r5, #1 7ac8: 4602 mov r2, r0 while (p < e) { 7aca: 459c cmp ip, r3 7acc: d8f8 bhi.n 7ac0 7ace: b102 cbz r2, 7ad2 7ad0: 9503 str r5, [sp, #12] for (size_t i = 0; i < ns; i++) { 7ad2: f10a 0a01 add.w sl, sl, #1 state->clusters_to_do -= n; 7ad6: eba1 010e sub.w r1, r1, lr 7ada: 45d1 cmp r9, sl 7adc: 9102 str r1, [sp, #8] 7ade: d05a beq.n 7b96 if (!readSector(sector + i, dst)) return false; 7ae0: f8d8 2000 ldr.w r2, [r8] 7ae4: e7d7 b.n 7a96 if (fg && c == 0) { 7ae6: 9a02 ldr r2, [sp, #8] 7ae8: 2a00 cmp r2, #0 7aea: d1a4 bne.n 7a36 for (unsigned i = 2; i < todo; i++) { 7aec: 42a7 cmp r7, r4 free++; 7aee: f105 0501 add.w r5, r5, #1 for (unsigned i = 2; i < todo; i++) { 7af2: 461c mov r4, r3 7af4: d1a2 bne.n 7a3c return free; 7af6: 4628 mov r0, r5 } 7af8: b004 add sp, #16 7afa: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} if (!m_blockDev->readSectorsCallback(m_fatStartSector, buf, num_sectors, freeClusterCount_cb_fat32, &state)) return -1; 7afe: f8d6 a000 ldr.w sl, [r6] 7b02: 4b2e ldr r3, [pc, #184] ; (7bbc ) 7b04: f8da 2000 ldr.w r2, [sl] 7b08: f8d6 9018 ldr.w r9, [r6, #24] 7b0c: 6995 ldr r5, [r2, #24] 7b0e: 429d cmp r5, r3 7b10: d146 bne.n 7ba0 for (size_t i = 0; i < ns; i++) { 7b12: 2c00 cmp r4, #0 7b14: d03f beq.n 7b96 7b16: eb09 0804 add.w r8, r9, r4 if (!readSector(sector + i, dst)) return false; 7b1a: 6913 ldr r3, [r2, #16] 7b1c: 4649 mov r1, r9 7b1e: 463a mov r2, r7 7b20: 4650 mov r0, sl 7b22: 4798 blx r3 7b24: 2800 cmp r0, #0 7b26: d08c beq.n 7a42 unsigned int n = state->clusters_to_do; 7b28: f8dd c008 ldr.w ip, [sp, #8] if (n > 128) n = 128; 7b2c: f1bc 0f80 cmp.w ip, #128 ; 0x80 7b30: 46e6 mov lr, ip 7b32: bf28 it cs 7b34: f04f 0e80 movcs.w lr, #128 ; 0x80 uint32_t *e = p + n; 7b38: eb07 028e add.w r2, r7, lr, lsl #2 while (p < e) { 7b3c: 42ba cmp r2, r7 7b3e: d90b bls.n 7b58 7b40: 9d03 ldr r5, [sp, #12] 7b42: 463b mov r3, r7 7b44: 2100 movs r1, #0 if (*p++ == 0) state->free_count++; 7b46: f853 4b04 ldr.w r4, [r3], #4 7b4a: b90c cbnz r4, 7b50 7b4c: 3501 adds r5, #1 7b4e: 4601 mov r1, r0 while (p < e) { 7b50: 429a cmp r2, r3 7b52: d8f8 bhi.n 7b46 7b54: b101 cbz r1, 7b58 7b56: 9503 str r5, [sp, #12] for (size_t i = 0; i < ns; i++) { 7b58: f109 0901 add.w r9, r9, #1 state->clusters_to_do -= n; 7b5c: ebac 030e sub.w r3, ip, lr 7b60: 45c8 cmp r8, r9 7b62: 9302 str r3, [sp, #8] 7b64: d017 beq.n 7b96 if (!readSector(sector + i, dst)) return false; 7b66: f8da 2000 ldr.w r2, [sl] 7b6a: e7d6 b.n 7b1a if (isDirty() && !sync()) { 7b6c: f506 700e add.w r0, r6, #568 ; 0x238 7b70: f002 fb5a bl a228 7b74: 2800 cmp r0, #0 7b76: f43f af64 beq.w 7a42 7b7a: 79f2 ldrb r2, [r6, #7] 7b7c: e771 b.n 7a62 if (!m_blockDev->readSectorsCallback(m_fatStartSector, buf, num_sectors, freeClusterCount_cb_fat16, &state)) return -1; 7b7e: 4623 mov r3, r4 7b80: ac02 add r4, sp, #8 7b82: 463a mov r2, r7 7b84: 4651 mov r1, sl 7b86: 9401 str r4, [sp, #4] 7b88: 4640 mov r0, r8 7b8a: 4c0d ldr r4, [pc, #52] ; (7bc0 ) 7b8c: 9400 str r4, [sp, #0] 7b8e: 47a8 blx r5 7b90: 2800 cmp r0, #0 7b92: f43f af56 beq.w 7a42 setFreeClusterCount(state.free_count); 7b96: 9803 ldr r0, [sp, #12] m_freeClusterCount = value; 7b98: 6270 str r0, [r6, #36] ; 0x24 } 7b9a: b004 add sp, #16 7b9c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} if (!m_blockDev->readSectorsCallback(m_fatStartSector, buf, num_sectors, freeClusterCount_cb_fat32, &state)) return -1; 7ba0: 4623 mov r3, r4 7ba2: ac02 add r4, sp, #8 7ba4: 463a mov r2, r7 7ba6: 4649 mov r1, r9 7ba8: 9401 str r4, [sp, #4] 7baa: 4650 mov r0, sl 7bac: 4c05 ldr r4, [pc, #20] ; (7bc4 ) 7bae: 9400 str r4, [sp, #0] 7bb0: 47a8 blx r5 7bb2: 2800 cmp r0, #0 7bb4: d1ef bne.n 7b96 7bb6: e744 b.n 7a42 for (unsigned i = 2; i < todo; i++) { 7bb8: 2000 movs r0, #0 7bba: e744 b.n 7a46 7bbc: 00007615 .word 0x00007615 7bc0: 00007659 .word 0x00007659 7bc4: 0000768d .word 0x0000768d 00007bc8 : //------------------------------------------------------------------------------ bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { 7bc8: b570 push {r4, r5, r6, lr} m_blockDev = dev; pbs_t* pbs; BpbFat32_t* bpb; MbrSector_t* mbr; uint8_t tmp; m_fatType = 0; 7bca: 2300 movs r3, #0 bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { 7bcc: 4604 mov r4, r0 #if USE_SEPARATE_FAT_CACHE m_fatCache.init(dev); #endif // USE_SEPARATE_FAT_CACHE // if part == 0 assume super floppy with FAT boot sector in sector zero // if part > 0 assume mbr volume with partition table if (part) { 7bce: 4615 mov r5, r2 m_allocSearchStart = 1; 7bd0: 2001 movs r0, #1 m_sector = 0XFFFFFFFF; 7bd2: f04f 32ff mov.w r2, #4294967295 m_cache.init(dev); 7bd6: f104 0628 add.w r6, r4, #40 ; 0x28 m_blockDev = dev; 7bda: 6021 str r1, [r4, #0] m_fatType = 0; 7bdc: 71e3 strb r3, [r4, #7] m_allocSearchStart = 1; 7bde: 60e0 str r0, [r4, #12] m_blockDev = blockDev; 7be0: 62e1 str r1, [r4, #44] ; 0x2c 7be2: f8c4 123c str.w r1, [r4, #572] ; 0x23c m_status = 0; 7be6: f884 3028 strb.w r3, [r4, #40] ; 0x28 7bea: f884 3238 strb.w r3, [r4, #568] ; 0x238 m_sector = 0XFFFFFFFF; 7bee: 6362 str r2, [r4, #52] ; 0x34 7bf0: f8c4 2244 str.w r2, [r4, #580] ; 0x244 if (part) { 7bf4: b1cd cbz r5, 7c2a if (part > 4) { 7bf6: 2d04 cmp r5, #4 7bf8: d901 bls.n 7bfe m_fatCache.setMirrorOffset(m_sectorsPerFat); #endif // USE_SEPARATE_FAT_CACHE return true; fail: return false; 7bfa: 2000 movs r0, #0 } 7bfc: bd70 pop {r4, r5, r6, pc} return m_cache.prepare(sector, options); 7bfe: 461a mov r2, r3 7c00: 4619 mov r1, r3 7c02: 4630 mov r0, r6 7c04: f002 fb3c bl a280 MbrPart_t* mp = mbr->part + part - 1; 7c08: f06f 4370 mvn.w r3, #4026531840 ; 0xf0000000 7c0c: f500 72df add.w r2, r0, #446 ; 0x1be 7c10: 442b add r3, r5 7c12: 011d lsls r5, r3, #4 7c14: eb02 1303 add.w r3, r2, r3, lsl #4 if (!mbr || mp->type == 0 || (mp->boot != 0 && mp->boot != 0X80)) { 7c18: 2800 cmp r0, #0 7c1a: d0ee beq.n 7bfa 7c1c: 7919 ldrb r1, [r3, #4] 7c1e: 2900 cmp r1, #0 7c20: d0eb beq.n 7bfa 7c22: 5d52 ldrb r2, [r2, r5] 7c24: 0652 lsls r2, r2, #25 7c26: d1e8 bne.n 7bfa return *reinterpret_cast(src); 7c28: 689d ldr r5, [r3, #8] 7c2a: 2200 movs r2, #0 7c2c: 4629 mov r1, r5 7c2e: 4630 mov r0, r6 7c30: f002 fb26 bl a280 if (!pbs || getLe16(bpb->bytesPerSector) != m_bytesPerSector) { 7c34: 2800 cmp r0, #0 7c36: d0e0 beq.n 7bfa 7c38: f8b0 300b ldrh.w r3, [r0, #11] 7c3c: f5b3 7f00 cmp.w r3, #512 ; 0x200 7c40: d1db bne.n 7bfa m_fatCount = bpb->fatCount; 7c42: 7c03 ldrb r3, [r0, #16] if ((m_fatCount != 1) && (m_fatCount != 2)) { 7c44: 1e5a subs r2, r3, #1 m_fatCount = bpb->fatCount; 7c46: 7223 strb r3, [r4, #8] if ((m_fatCount != 1) && (m_fatCount != 2)) { 7c48: 2a01 cmp r2, #1 7c4a: d8d6 bhi.n 7bfa m_sectorsPerCluster = bpb->sectorsPerCluster; 7c4c: 7b41 ldrb r1, [r0, #13] m_clusterSectorMask = m_sectorsPerCluster - 1; 7c4e: 1e4b subs r3, r1, #1 for (tmp = 1; m_sectorsPerCluster != tmp; tmp <<= 1) { 7c50: 2901 cmp r1, #1 m_sectorsPerCluster = bpb->sectorsPerCluster; 7c52: 7121 strb r1, [r4, #4] m_clusterSectorMask = m_sectorsPerCluster - 1; 7c54: 7163 strb r3, [r4, #5] m_sectorsPerClusterShift = 0; 7c56: f04f 0300 mov.w r3, #0 7c5a: 71a3 strb r3, [r4, #6] for (tmp = 1; m_sectorsPerCluster != tmp; tmp <<= 1) { 7c5c: d044 beq.n 7ce8 7c5e: 2201 movs r2, #1 7c60: 0052 lsls r2, r2, #1 m_sectorsPerClusterShift++; 7c62: 3301 adds r3, #1 for (tmp = 1; m_sectorsPerCluster != tmp; tmp <<= 1) { 7c64: b2d2 uxtb r2, r2 m_sectorsPerClusterShift++; 7c66: b2db uxtb r3, r3 for (tmp = 1; m_sectorsPerCluster != tmp; tmp <<= 1) { 7c68: 4291 cmp r1, r2 7c6a: d004 beq.n 7c76 if (tmp == 0) { 7c6c: 2b08 cmp r3, #8 7c6e: d1f7 bne.n 7c60 return false; 7c70: 2000 movs r0, #0 7c72: 71a3 strb r3, [r4, #6] } 7c74: bd70 pop {r4, r5, r6, pc} clusterCount >>= m_sectorsPerClusterShift; 7c76: 461e mov r6, r3 7c78: 71a3 strb r3, [r4, #6] m_sectorsPerFat = getLe16(bpb->sectorsPerFat16); 7c7a: 8ac1 ldrh r1, [r0, #22] 7c7c: 6121 str r1, [r4, #16] if (m_sectorsPerFat == 0) { 7c7e: b909 cbnz r1, 7c84 7c80: 6a41 ldr r1, [r0, #36] ; 0x24 m_sectorsPerFat = getLe32(bpb->sectorsPerFat32); 7c82: 6121 str r1, [r4, #16] m_fatStartSector = volumeStartSector + getLe16(bpb->reservedSectorCount); 7c84: 89c2 ldrh r2, [r0, #14] return *reinterpret_cast(src); 7c86: f8b0 3011 ldrh.w r3, [r0, #17] 7c8a: 442a add r2, r5 m_rootDirEntryCount = getLe16(bpb->rootDirEntryCount); 7c8c: 8163 strh r3, [r4, #10] ((FS_DIR_SIZE*m_rootDirEntryCount + m_bytesPerSector - 1)/m_bytesPerSector); 7c8e: 015b lsls r3, r3, #5 m_fatStartSector = volumeStartSector + getLe16(bpb->reservedSectorCount); 7c90: 61a2 str r2, [r4, #24] m_rootDirStart = m_fatStartSector + bpb->fatCount * m_sectorsPerFat; 7c92: f890 c010 ldrb.w ip, [r0, #16] ((FS_DIR_SIZE*m_rootDirEntryCount + m_bytesPerSector - 1)/m_bytesPerSector); 7c96: f203 13ff addw r3, r3, #511 ; 0x1ff m_rootDirStart = m_fatStartSector + bpb->fatCount * m_sectorsPerFat; 7c9a: fb01 220c mla r2, r1, ip, r2 m_dataStartSector = m_rootDirStart + 7c9e: eb02 2353 add.w r3, r2, r3, lsr #9 m_rootDirStart = m_fatStartSector + bpb->fatCount * m_sectorsPerFat; 7ca2: 6222 str r2, [r4, #32] totalSectors = getLe16(bpb->totalSectors16); 7ca4: f8b0 2013 ldrh.w r2, [r0, #19] m_dataStartSector = m_rootDirStart + 7ca8: 6163 str r3, [r4, #20] if (totalSectors == 0) { 7caa: b902 cbnz r2, 7cae return *reinterpret_cast(src); 7cac: 6a02 ldr r2, [r0, #32] clusterCount = totalSectors - (m_dataStartSector - volumeStartSector); 7cae: 1aed subs r5, r5, r3 7cb0: 18ab adds r3, r5, r2 clusterCount >>= m_sectorsPerClusterShift; 7cb2: 40f3 lsrs r3, r6 m_lastCluster = clusterCount + 1; 7cb4: 1c5a adds r2, r3, #1 7cb6: 61e2 str r2, [r4, #28] m_freeClusterCount = value; 7cb8: f04f 32ff mov.w r2, #4294967295 7cbc: 6262 str r2, [r4, #36] ; 0x24 if (clusterCount < 4085) { 7cbe: f640 72f4 movw r2, #4084 ; 0xff4 7cc2: 4293 cmp r3, r2 7cc4: d90c bls.n 7ce0 } else if (clusterCount < 65525) { 7cc6: f64f 72f4 movw r2, #65524 ; 0xfff4 7cca: 4293 cmp r3, r2 7ccc: d90a bls.n 7ce4 7cce: 6ac2 ldr r2, [r0, #44] ; 0x2c m_rootDirStart = getLe32(bpb->fat32RootCluster); 7cd0: 2320 movs r3, #32 7cd2: 6222 str r2, [r4, #32] return true; 7cd4: 2001 movs r0, #1 m_fatType = 12; 7cd6: 71e3 strb r3, [r4, #7] } /** Set the offset to the second FAT for mirroring. * \param[in] offset Sector offset to second FAT. */ void setMirrorOffset(uint32_t offset) { m_mirrorOffset = offset; 7cd8: 6321 str r1, [r4, #48] ; 0x30 7cda: f8c4 1240 str.w r1, [r4, #576] ; 0x240 } 7cde: bd70 pop {r4, r5, r6, pc} 7ce0: 230c movs r3, #12 7ce2: e7f7 b.n 7cd4 7ce4: 2310 movs r3, #16 7ce6: e7f5 b.n 7cd4 for (tmp = 1; m_sectorsPerCluster != tmp; tmp <<= 1) { 7ce8: 461e mov r6, r3 7cea: e7c6 b.n 7c7a 00007cec : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "FsLib.h" //------------------------------------------------------------------------------ FsBaseFile::FsBaseFile(const FsBaseFile& from) { 7cec: b5f8 push {r3, r4, r5, r6, r7, lr} 7cee: 2600 movs r6, #0 m_fFile = nullptr; m_xFile = nullptr; if (from.m_fFile) { 7cf0: 6b8f ldr r7, [r1, #56] ; 0x38 FsBaseFile::FsBaseFile(const FsBaseFile& from) { 7cf2: 460d mov r5, r1 7cf4: 4604 mov r4, r0 7cf6: e9c0 660e strd r6, r6, [r0, #56] ; 0x38 if (from.m_fFile) { 7cfa: b19f cbz r7, 7d24 m_fFile = new (m_fileMem) FatFile; 7cfc: 4601 mov r1, r0 7cfe: 2024 movs r0, #36 ; 0x24 7d00: f000 f8dc bl 7ebc FatFile() {} 7d04: 8006 strh r6, [r0, #0] 7d06: 7086 strb r6, [r0, #2] *m_fFile = *from.m_fFile; 7d08: 4684 mov ip, r0 7d0a: 6bad ldr r5, [r5, #56] ; 0x38 m_fFile = new (m_fileMem) FatFile; 7d0c: 63a0 str r0, [r4, #56] ; 0x38 *m_fFile = *from.m_fFile; 7d0e: cd0f ldmia r5!, {r0, r1, r2, r3} 7d10: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 7d14: cd0f ldmia r5!, {r0, r1, r2, r3} 7d16: e8ac 000f stmia.w ip!, {r0, r1, r2, r3} 7d1a: 682b ldr r3, [r5, #0] 7d1c: f8cc 3000 str.w r3, [ip] } else if (from.m_xFile) { m_xFile = new (m_fileMem) ExFatFile; *m_xFile = *from.m_xFile; } } 7d20: 4620 mov r0, r4 7d22: bdf8 pop {r3, r4, r5, r6, r7, pc} } else if (from.m_xFile) { 7d24: 6bcb ldr r3, [r1, #60] ; 0x3c 7d26: 2b00 cmp r3, #0 7d28: d0fa beq.n 7d20 m_xFile = new (m_fileMem) ExFatFile; 7d2a: 4601 mov r1, r0 7d2c: 2038 movs r0, #56 ; 0x38 7d2e: f000 f8c5 bl 7ebc ExFatFile() {} 7d32: f880 7031 strb.w r7, [r0, #49] ; 0x31 7d36: 8647 strh r7, [r0, #50] ; 0x32 *m_xFile = *from.m_xFile; 7d38: 4602 mov r2, r0 7d3a: 6beb ldr r3, [r5, #60] ; 0x3c m_xFile = new (m_fileMem) ExFatFile; 7d3c: 63e0 str r0, [r4, #60] ; 0x3c *m_xFile = *from.m_xFile; 7d3e: f103 0730 add.w r7, r3, #48 ; 0x30 7d42: 681e ldr r6, [r3, #0] 7d44: 3310 adds r3, #16 7d46: f853 5c0c ldr.w r5, [r3, #-12] 7d4a: 3210 adds r2, #16 7d4c: f853 0c08 ldr.w r0, [r3, #-8] 7d50: f853 1c04 ldr.w r1, [r3, #-4] 7d54: 42bb cmp r3, r7 7d56: f842 6c10 str.w r6, [r2, #-16] 7d5a: f842 5c0c str.w r5, [r2, #-12] 7d5e: f842 0c08 str.w r0, [r2, #-8] 7d62: f842 1c04 str.w r1, [r2, #-4] 7d66: d1ec bne.n 7d42 7d68: 681b ldr r3, [r3, #0] } 7d6a: 4620 mov r0, r4 *m_xFile = *from.m_xFile; 7d6c: 6013 str r3, [r2, #0] } 7d6e: bdf8 pop {r3, r4, r5, r6, r7, pc} 00007d70 : *m_xFile = *from.m_xFile; } return *this; } //------------------------------------------------------------------------------ bool FsBaseFile::close() { 7d70: b510 push {r4, lr} 7d72: 4604 mov r4, r0 if (m_fFile && m_fFile->close()) { 7d74: 6b80 ldr r0, [r0, #56] ; 0x38 7d76: b110 cbz r0, 7d7e 7d78: f7fd fce2 bl 5740 7d7c: b930 cbnz r0, 7d8c m_fFile = nullptr; return true; } if (m_xFile && m_xFile->close()) { 7d7e: 6be0 ldr r0, [r4, #60] ; 0x3c 7d80: b110 cbz r0, 7d88 7d82: f7fb fbcf bl 3524 7d86: b920 cbnz r0, 7d92 m_xFile = nullptr; return true; } return false; 7d88: 2000 movs r0, #0 } 7d8a: bd10 pop {r4, pc} m_fFile = nullptr; 7d8c: 2300 movs r3, #0 7d8e: 63a3 str r3, [r4, #56] ; 0x38 } 7d90: bd10 pop {r4, pc} m_xFile = nullptr; 7d92: 2300 movs r3, #0 7d94: 63e3 str r3, [r4, #60] ; 0x3c } 7d96: bd10 pop {r4, pc} 00007d98 : } return false; } //------------------------------------------------------------------------------ bool FsBaseFile::open(FsVolume* vol, const char* path, oflag_t oflag) { if (!vol) { 7d98: 2900 cmp r1, #0 7d9a: d052 beq.n 7e42 bool FsBaseFile::open(FsVolume* vol, const char* path, oflag_t oflag) { 7d9c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 7da0: 4604 mov r4, r0 if (m_fFile && m_fFile->close()) { 7da2: 6b80 ldr r0, [r0, #56] ; 0x38 7da4: 460d mov r5, r1 7da6: 4617 mov r7, r2 7da8: 461e mov r6, r3 7daa: b110 cbz r0, 7db2 7dac: f7fd fcc8 bl 5740 7db0: bba0 cbnz r0, 7e1c if (m_xFile && m_xFile->close()) { 7db2: 6be0 ldr r0, [r4, #60] ; 0x3c 7db4: b110 cbz r0, 7dbc 7db6: f7fb fbb5 bl 3524 7dba: bbb8 cbnz r0, 7e2c return false; } close(); if (vol->m_fVol) { 7dbc: f8d5 8480 ldr.w r8, [r5, #1152] ; 0x480 7dc0: f1b8 0f00 cmp.w r8, #0 7dc4: d011 beq.n 7dea m_fFile = new (m_fileMem) FatFile; 7dc6: 4621 mov r1, r4 7dc8: 2024 movs r0, #36 ; 0x24 7dca: f000 f877 bl 7ebc if (m_fFile && m_fFile->open(vol->m_fVol, path, oflag)) { 7dce: 4633 mov r3, r6 7dd0: 2600 movs r6, #0 7dd2: 463a mov r2, r7 7dd4: 8006 strh r6, [r0, #0] 7dd6: 7086 strb r6, [r0, #2] m_fFile = new (m_fileMem) FatFile; 7dd8: 63a0 str r0, [r4, #56] ; 0x38 if (m_fFile && m_fFile->open(vol->m_fVol, path, oflag)) { 7dda: f8d5 1480 ldr.w r1, [r5, #1152] ; 0x480 7dde: f7fd feb7 bl 5b50 7de2: bb58 cbnz r0, 7e3c return true; } m_fFile = nullptr; 7de4: 63a0 str r0, [r4, #56] ; 0x38 return true; } m_xFile = nullptr; } return false; } 7de6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} } else if (vol->m_xVol) { 7dea: f8d5 3484 ldr.w r3, [r5, #1156] ; 0x484 7dee: b193 cbz r3, 7e16 m_xFile = new (m_fileMem) ExFatFile; 7df0: 4621 mov r1, r4 7df2: 2038 movs r0, #56 ; 0x38 7df4: f000 f862 bl 7ebc if (m_xFile && m_xFile->open(vol->m_xVol, path, oflag)) { 7df8: 4633 mov r3, r6 7dfa: f880 8031 strb.w r8, [r0, #49] ; 0x31 7dfe: 463a mov r2, r7 7e00: f8a0 8032 strh.w r8, [r0, #50] ; 0x32 m_xFile = new (m_fileMem) ExFatFile; 7e04: 63e0 str r0, [r4, #60] ; 0x3c if (m_xFile && m_xFile->open(vol->m_xVol, path, oflag)) { 7e06: f8d5 1484 ldr.w r1, [r5, #1156] ; 0x484 7e0a: f7fb ffbf bl 3d8c 7e0e: b9a8 cbnz r0, 7e3c m_xFile = nullptr; 7e10: 63e0 str r0, [r4, #60] ; 0x3c } 7e12: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return false; 7e16: 2000 movs r0, #0 } 7e18: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_fFile = nullptr; 7e1c: 2300 movs r3, #0 if (vol->m_fVol) { 7e1e: f8d5 8480 ldr.w r8, [r5, #1152] ; 0x480 m_fFile = nullptr; 7e22: 63a3 str r3, [r4, #56] ; 0x38 if (vol->m_fVol) { 7e24: f1b8 0f00 cmp.w r8, #0 7e28: d1cd bne.n 7dc6 7e2a: e7de b.n 7dea m_xFile = nullptr; 7e2c: 2300 movs r3, #0 if (vol->m_fVol) { 7e2e: f8d5 8480 ldr.w r8, [r5, #1152] ; 0x480 m_xFile = nullptr; 7e32: 63e3 str r3, [r4, #60] ; 0x3c if (vol->m_fVol) { 7e34: f1b8 0f00 cmp.w r8, #0 7e38: d1c5 bne.n 7dc6 7e3a: e7d6 b.n 7dea return true; 7e3c: 2001 movs r0, #1 } 7e3e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return false; 7e42: 2000 movs r0, #0 } 7e44: 4770 bx lr 7e46: bf00 nop 00007e48 : m_xFile = nullptr; } return false; } //------------------------------------------------------------------------------ bool FsBaseFile::openNext(FsBaseFile* dir, oflag_t oflag) { 7e48: b5f8 push {r3, r4, r5, r6, r7, lr} 7e4a: 4604 mov r4, r0 if (m_fFile && m_fFile->close()) { 7e4c: 6b80 ldr r0, [r0, #56] ; 0x38 bool FsBaseFile::openNext(FsBaseFile* dir, oflag_t oflag) { 7e4e: 460d mov r5, r1 7e50: 4617 mov r7, r2 if (m_fFile && m_fFile->close()) { 7e52: b110 cbz r0, 7e5a 7e54: f7fd fc74 bl 5740 7e58: bb38 cbnz r0, 7eaa if (m_xFile && m_xFile->close()) { 7e5a: 6be0 ldr r0, [r4, #60] ; 0x3c 7e5c: b110 cbz r0, 7e64 7e5e: f7fb fb61 bl 3524 7e62: bb38 cbnz r0, 7eb4 close(); if (dir->m_fFile) { 7e64: 6bae ldr r6, [r5, #56] ; 0x38 7e66: b176 cbz r6, 7e86 m_fFile = new (m_fileMem) FatFile; 7e68: 4621 mov r1, r4 7e6a: 2024 movs r0, #36 ; 0x24 7e6c: f000 f826 bl 7ebc 7e70: 2100 movs r1, #0 if (m_fFile->openNext(dir->m_fFile, oflag)) { 7e72: 463a mov r2, r7 7e74: 8001 strh r1, [r0, #0] 7e76: 7081 strb r1, [r0, #2] m_fFile = new (m_fileMem) FatFile; 7e78: 63a0 str r0, [r4, #56] ; 0x38 if (m_fFile->openNext(dir->m_fFile, oflag)) { 7e7a: 6ba9 ldr r1, [r5, #56] ; 0x38 7e7c: f7fe f9ce bl 621c 7e80: b988 cbnz r0, 7ea6 return true; } m_fFile = nullptr; 7e82: 63a0 str r0, [r4, #56] ; 0x38 return true; } m_xFile = nullptr; } return false; } 7e84: bdf8 pop {r3, r4, r5, r6, r7, pc} } else if (dir->m_xFile) { 7e86: 6be8 ldr r0, [r5, #60] ; 0x3c 7e88: 2800 cmp r0, #0 7e8a: d0fb beq.n 7e84 m_xFile = new (m_fileMem) ExFatFile; 7e8c: 4621 mov r1, r4 7e8e: 2038 movs r0, #56 ; 0x38 7e90: f000 f814 bl 7ebc if (m_xFile->openNext(dir->m_xFile, oflag)) { 7e94: 463a mov r2, r7 7e96: f880 6031 strb.w r6, [r0, #49] ; 0x31 7e9a: 8646 strh r6, [r0, #50] ; 0x32 m_xFile = new (m_fileMem) ExFatFile; 7e9c: 63e0 str r0, [r4, #60] ; 0x3c if (m_xFile->openNext(dir->m_xFile, oflag)) { 7e9e: 6be9 ldr r1, [r5, #60] ; 0x3c 7ea0: f7fb ff7c bl 3d9c 7ea4: b120 cbz r0, 7eb0 return true; 7ea6: 2001 movs r0, #1 } 7ea8: bdf8 pop {r3, r4, r5, r6, r7, pc} m_fFile = nullptr; 7eaa: 2300 movs r3, #0 7eac: 63a3 str r3, [r4, #56] ; 0x38 return true; 7eae: e7d9 b.n 7e64 m_xFile = nullptr; 7eb0: 63e0 str r0, [r4, #60] ; 0x3c } 7eb2: bdf8 pop {r3, r4, r5, r6, r7, pc} m_xFile = nullptr; 7eb4: 2300 movs r3, #0 7eb6: 63e3 str r3, [r4, #60] ; 0x3c return true; 7eb8: e7d4 b.n 7e64 7eba: bf00 nop 00007ebc : */ #include "FsNew.h" void* operator new(size_t size, newalign_t* ptr) { (void)size; return ptr; } 7ebc: 4608 mov r0, r1 7ebe: 4770 bx lr 00007ec0 : * DEALINGS IN THE SOFTWARE. */ #include "FsLib.h" FsVolume* FsVolume::m_cwv = nullptr; //------------------------------------------------------------------------------ bool FsVolume::begin(FsBlockDevice* blockDev, bool setCwv, uint8_t part) { 7ec0: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} m_blockDev = blockDev; m_fVol = nullptr; 7ec4: 2600 movs r6, #0 bool FsVolume::begin(FsBlockDevice* blockDev, bool setCwv, uint8_t part) { 7ec6: 4604 mov r4, r0 7ec8: 4698 mov r8, r3 m_blockDev = blockDev; 7eca: f8c0 1488 str.w r1, [r0, #1160] ; 0x488 m_fVol = nullptr; 7ece: f8c0 6480 str.w r6, [r0, #1152] ; 0x480 m_xVol = new (m_volMem) ExFatVolume; 7ed2: 4601 mov r1, r0 7ed4: f44f 6090 mov.w r0, #1152 ; 0x480 bool FsVolume::begin(FsBlockDevice* blockDev, bool setCwv, uint8_t part) { 7ed8: 4617 mov r7, r2 m_xVol = new (m_volMem) ExFatVolume; 7eda: f7ff ffef bl 7ebc if (!init(dev, part)) { 7ede: 4642 mov r2, r8 ExFatPartition() {} 7ee0: f880 6444 strb.w r6, [r0, #1092] ; 0x444 7ee4: 4605 mov r5, r0 7ee6: f880 6479 strb.w r6, [r0, #1145] ; 0x479 7eea: f8a0 647a strh.w r6, [r0, #1146] ; 0x47a 7eee: f8c4 0484 str.w r0, [r4, #1156] ; 0x484 7ef2: f8d4 1488 ldr.w r1, [r4, #1160] ; 0x488 7ef6: f7fd fae7 bl 54c8 7efa: bba0 cbnz r0, 7f66 if (m_xVol && m_xVol->begin(m_blockDev, false, part)) { goto done; } m_xVol = nullptr; 7efc: 2600 movs r6, #0 m_fVol = new (m_volMem) FatVolume; 7efe: 4621 mov r1, r4 7f00: f240 406c movw r0, #1132 ; 0x46c m_xVol = nullptr; 7f04: f8c4 6484 str.w r6, [r4, #1156] ; 0x484 m_fVol = new (m_volMem) FatVolume; 7f08: f7ff ffd8 bl 7ebc FatPartition() {} 7f0c: 2302 movs r3, #2 7f0e: 71c6 strb r6, [r0, #7] if (!init(dev, part)) { 7f10: 4642 mov r2, r8 7f12: f8a0 6448 strh.w r6, [r0, #1096] ; 0x448 7f16: 4605 mov r5, r0 7f18: f880 644a strb.w r6, [r0, #1098] ; 0x44a 7f1c: 7203 strb r3, [r0, #8] 7f1e: f8c4 0480 str.w r0, [r4, #1152] ; 0x480 7f22: f8d4 1488 ldr.w r1, [r4, #1160] ; 0x488 7f26: f7ff fe4f bl 7bc8 7f2a: b938 cbnz r0, 7f3c if (m_fVol && m_fVol->begin(m_blockDev, false, part)) { goto done; } m_cwv = nullptr; 7f2c: 2300 movs r3, #0 7f2e: 4a1a ldr r2, [pc, #104] ; (7f98 ) m_fVol = nullptr; return false; 7f30: 4618 mov r0, r3 m_cwv = nullptr; 7f32: 6013 str r3, [r2, #0] m_fVol = nullptr; 7f34: f8c4 3480 str.w r3, [r4, #1152] ; 0x480 done: if (setCwv || !m_cwv) { m_cwv = this; } return true; } 7f38: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_vwd.close(); 7f3c: f505 6689 add.w r6, r5, #1096 ; 0x448 7f40: 4630 mov r0, r6 7f42: f7fd fbfd bl 5740 return m_vwd.openRoot(this); 7f46: 4629 mov r1, r5 7f48: 4630 mov r0, r6 7f4a: f7fd fe37 bl 5bbc if (!chdir()) { 7f4e: 2800 cmp r0, #0 7f50: d0ec beq.n 7f2c if (setCwv || !m_cwv) { 7f52: 4b12 ldr r3, [pc, #72] ; (7f9c ) 7f54: 681a ldr r2, [r3, #0] 7f56: b9aa cbnz r2, 7f84 m_cwv = this; 7f58: 601d str r5, [r3, #0] if (setCwv || !m_cwv) { 7f5a: 4b0f ldr r3, [pc, #60] ; (7f98 ) 7f5c: b1af cbz r7, 7f8a return true; 7f5e: 2001 movs r0, #1 m_cwv = this; 7f60: 601c str r4, [r3, #0] } 7f62: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_vwd.close(); 7f66: f505 6689 add.w r6, r5, #1096 ; 0x448 7f6a: 4630 mov r0, r6 7f6c: f7fb fada bl 3524 return m_vwd.openRoot(this); 7f70: 4629 mov r1, r5 7f72: 4630 mov r0, r6 7f74: f7fb fb04 bl 3580 if (!chdir()) { 7f78: 2800 cmp r0, #0 7f7a: d0bf beq.n 7efc if (setCwv || !m_cwv) { 7f7c: 4b08 ldr r3, [pc, #32] ; (7fa0 ) 7f7e: 681a ldr r2, [r3, #0] 7f80: 2a00 cmp r2, #0 7f82: d0e9 beq.n 7f58 if (setCwv || !m_cwv) { 7f84: 4b04 ldr r3, [pc, #16] ; (7f98 ) 7f86: 2f00 cmp r7, #0 7f88: d1e9 bne.n 7f5e 7f8a: 681a ldr r2, [r3, #0] 7f8c: 2a00 cmp r2, #0 7f8e: d0e6 beq.n 7f5e return true; 7f90: 2001 movs r0, #1 } 7f92: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 7f96: bf00 nop 7f98: 200025fc .word 0x200025fc 7f9c: 20002600 .word 0x20002600 7fa0: 200024d0 .word 0x200024d0 00007fa4 : bool FsVolume::ls(print_t* pr, const char* path, uint8_t flags) { FsBaseFile dir; return dir.open(this, path, O_RDONLY) && dir.ls(pr, flags); } //------------------------------------------------------------------------------ FsFile FsVolume::open(const char *path, oflag_t oflag) { 7fa4: b570 push {r4, r5, r6, lr} constexpr Print() : write_error(0) {} 7fa6: 2500 movs r5, #0 7fa8: f44f 767a mov.w r6, #1000 ; 0x3e8 7fac: 4604 mov r4, r0 7fae: 6045 str r5, [r0, #4] 7fb0: 7305 strb r5, [r0, #12] 7fb2: 6086 str r6, [r0, #8] FsBaseFile() {} 7fb4: e9c0 5512 strd r5, r5, [r0, #72] ; 0x48 class FsFile : public StreamFile { 7fb8: 4d03 ldr r5, [pc, #12] ; (7fc8 ) 7fba: f840 5b10 str.w r5, [r0], #16 FsFile tmpFile; tmpFile.open(this, path, oflag); 7fbe: f7ff feeb bl 7d98 return tmpFile; } 7fc2: 4620 mov r0, r4 7fc4: bd70 pop {r4, r5, r6, pc} 7fc6: bf00 nop 7fc8: 200009dc .word 0x200009dc 00007fcc : * \return The number of 512 byte data sectors in the card * or zero if an error occurs. */ virtual uint32_t sectorCount() = 0; /** \return card status. */ virtual uint32_t status() {return 0XFFFFFFFF;} 7fcc: f04f 30ff mov.w r0, #4294967295 7fd0: 4770 bx lr 7fd2: bf00 nop 00007fd4 : } 7fd4: 7c40 ldrb r0, [r0, #17] 7fd6: 4770 bx lr 00007fd8 : } 7fd8: 7d00 ldrb r0, [r0, #20] 7fda: 4770 bx lr 00007fdc : } 7fdc: 7d40 ldrb r0, [r0, #21] 7fde: 4770 bx lr 00007fe0 : * \param[in] spiConfig SPI card configuration. * \return true for success or false for failure. */ bool begin(SdSpiConfig spiConfig); /** \return true, can be in dedicaded state. */ bool hasDedicatedSpi() {return true;} 7fe0: 2001 movs r0, #1 7fe2: 4770 bx lr 00007fe4 : /** \return true if in dedicated SPI state. */ bool isDedicatedSpi() {return m_dedicatedSpi;} 7fe4: 7f00 ldrb r0, [r0, #28] 7fe6: 4770 bx lr 00007fe8 : fail: return false; } //------------------------------------------------------------------------------ bool DedicatedSpiCard::writeSectorsCallback(uint32_t sector, size_t ns, const uint8_t * (*callback)(uint32_t sector, void *context), void *context) { 7fe8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 7fec: 461e mov r6, r3 if (sdState() != WRITE_STATE || m_curSector != sector) { 7fee: 7cc3 ldrb r3, [r0, #19] const uint8_t * (*callback)(uint32_t sector, void *context), void *context) { 7ff0: 4605 mov r5, r0 7ff2: 460c mov r4, r1 if (sdState() != WRITE_STATE || m_curSector != sector) { 7ff4: 2b02 cmp r3, #2 const uint8_t * (*callback)(uint32_t sector, void *context), void *context) { 7ff6: 4691 mov r9, r2 7ff8: 9f08 ldr r7, [sp, #32] if (sdState() != WRITE_STATE || m_curSector != sector) { 7ffa: d028 beq.n 804e if (!writeStart(sector)) { 7ffc: 682b ldr r3, [r5, #0] 7ffe: 4621 mov r1, r4 8000: 4628 mov r0, r5 8002: 6e1b ldr r3, [r3, #96] ; 0x60 8004: 4798 blx r3 8006: b198 cbz r0, 8030 goto fail; } m_curSector = sector; 8008: 61ac str r4, [r5, #24] } for (size_t i = 0; i < ns; i++) { 800a: f1b9 0f00 cmp.w r9, #0 800e: d012 beq.n 8036 8010: eb04 0809 add.w r8, r4, r9 8014: e001 b.n 801a 8016: 45a0 cmp r8, r4 8018: d00d beq.n 8036 const uint8_t *src = callback(sector + i, context); 801a: 4639 mov r1, r7 801c: 4620 mov r0, r4 801e: 47b0 blx r6 if (!writeData(src)) { 8020: 682b ldr r3, [r5, #0] const uint8_t *src = callback(sector + i, context); 8022: 4601 mov r1, r0 if (!writeData(src)) { 8024: 4628 mov r0, r5 8026: 6ddb ldr r3, [r3, #92] ; 0x5c for (size_t i = 0; i < ns; i++) { 8028: 3401 adds r4, #1 if (!writeData(src)) { 802a: 4798 blx r3 802c: 2800 cmp r0, #0 802e: d1f2 bne.n 8016 } m_curSector += ns; return m_dedicatedSpi ? true : writeStop(); fail: return false; 8030: 2000 movs r0, #0 } 8032: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} m_curSector += ns; 8036: 69ab ldr r3, [r5, #24] return m_dedicatedSpi ? true : writeStop(); 8038: 7f28 ldrb r0, [r5, #28] m_curSector += ns; 803a: 444b add r3, r9 803c: 61ab str r3, [r5, #24] return m_dedicatedSpi ? true : writeStop(); 803e: 2800 cmp r0, #0 8040: d1f7 bne.n 8032 8042: 682b ldr r3, [r5, #0] 8044: 4628 mov r0, r5 8046: 6e5b ldr r3, [r3, #100] ; 0x64 } 8048: e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr} return m_dedicatedSpi ? true : writeStop(); 804c: 4718 bx r3 if (sdState() != WRITE_STATE || m_curSector != sector) { 804e: 6983 ldr r3, [r0, #24] 8050: 428b cmp r3, r1 8052: d1d3 bne.n 7ffc 8054: e7d9 b.n 800a 8056: bf00 nop 00008058 : class DedicatedSpiCard : public SharedSpiCard { 8058: 4770 bx lr 805a: bf00 nop 0000805c : m_spiDriver.end(); 805c: 3004 adds r0, #4 805e: f002 b8b5 b.w a1cc 8062: bf00 nop 00008064 : class DedicatedSpiCard : public SharedSpiCard { 8064: b510 push {r4, lr} 8066: 4604 mov r4, r0 8068: 2120 movs r1, #32 806a: f003 fa33 bl b4d4 806e: 4620 mov r0, r4 8070: bd10 pop {r4, pc} 8072: bf00 nop 00008074 : uint32_t sector, const uint8_t* src, size_t ns) { 8074: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 8078: 461f mov r7, r3 if (sdState() != WRITE_STATE || m_curSector != sector) { 807a: 7cc3 ldrb r3, [r0, #19] uint32_t sector, const uint8_t* src, size_t ns) { 807c: 4605 mov r5, r0 807e: 460e mov r6, r1 if (sdState() != WRITE_STATE || m_curSector != sector) { 8080: 2b02 cmp r3, #2 uint32_t sector, const uint8_t* src, size_t ns) { 8082: 4614 mov r4, r2 if (sdState() != WRITE_STATE || m_curSector != sector) { 8084: d024 beq.n 80d0 if (!writeStart(sector)) { 8086: 682b ldr r3, [r5, #0] 8088: 4631 mov r1, r6 808a: 4628 mov r0, r5 808c: 6e1b ldr r3, [r3, #96] ; 0x60 808e: 4798 blx r3 8090: b178 cbz r0, 80b2 m_curSector = sector; 8092: 61ae str r6, [r5, #24] for (size_t i = 0; i < ns; i++, src += 512) { 8094: b187 cbz r7, 80b8 if (!writeStart(sector)) { 8096: 2600 movs r6, #0 8098: e001 b.n 809e for (size_t i = 0; i < ns; i++, src += 512) { 809a: 42b7 cmp r7, r6 809c: d00c beq.n 80b8 if (!writeData(src)) { 809e: 682a ldr r2, [r5, #0] 80a0: 4621 mov r1, r4 80a2: 4628 mov r0, r5 for (size_t i = 0; i < ns; i++, src += 512) { 80a4: 3601 adds r6, #1 if (!writeData(src)) { 80a6: 6dd2 ldr r2, [r2, #92] ; 0x5c for (size_t i = 0; i < ns; i++, src += 512) { 80a8: f504 7400 add.w r4, r4, #512 ; 0x200 if (!writeData(src)) { 80ac: 4790 blx r2 80ae: 2800 cmp r0, #0 80b0: d1f3 bne.n 809a return false; 80b2: 2000 movs r0, #0 } 80b4: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_curSector += ns; 80b8: 69ab ldr r3, [r5, #24] return m_dedicatedSpi ? true : writeStop(); 80ba: 7f28 ldrb r0, [r5, #28] m_curSector += ns; 80bc: 443b add r3, r7 80be: 61ab str r3, [r5, #24] return m_dedicatedSpi ? true : writeStop(); 80c0: 2800 cmp r0, #0 80c2: d1f7 bne.n 80b4 80c4: 682b ldr r3, [r5, #0] 80c6: 4628 mov r0, r5 80c8: 6e5b ldr r3, [r3, #100] ; 0x64 } 80ca: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} return m_dedicatedSpi ? true : writeStop(); 80ce: 4718 bx r3 if (sdState() != WRITE_STATE || m_curSector != sector) { 80d0: 6983 ldr r3, [r0, #24] 80d2: 428b cmp r3, r1 80d4: d1d7 bne.n 8086 80d6: e7dd b.n 8094 000080d8 : bool SharedSpiCard::writeStop() { 80d8: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 80dc: 4e20 ldr r6, [pc, #128] ; (8160 ) 80de: 4607 mov r7, r0 return m_spiDriver.receive(); 80e0: f100 0804 add.w r8, r0, #4 80e4: 6835 ldr r5, [r6, #0] m_endTime = ms + millis16(); 80e6: f505 7516 add.w r5, r5, #600 ; 0x258 80ea: b2ad uxth r5, r5 explicit Timeout(uint16_t ms) {set(ms);} 80ec: e003 b.n 80f6 80ee: 6833 ldr r3, [r6, #0] return (int16_t)(m_endTime - millis16()) < 0; 80f0: 1aeb subs r3, r5, r3 if (timeout.timedOut()) { 80f2: 041b lsls r3, r3, #16 80f4: d410 bmi.n 8118 80f6: 4640 mov r0, r8 80f8: f002 f86c bl a1d4 while (spiReceive() != 0XFF) { 80fc: 28ff cmp r0, #255 ; 0xff 80fe: 4604 mov r4, r0 8100: d1f5 bne.n 80ee m_spiDriver.send(data); 8102: 21fd movs r1, #253 ; 0xfd 8104: 4640 mov r0, r8 8106: f002 f87f bl a208 if (m_spiActive) { 810a: 7cbb ldrb r3, [r7, #18] 810c: b9cb cbnz r3, 8142 m_state = IDLE_STATE; 810e: 2300 movs r3, #0 8110: 2001 movs r0, #1 8112: 74fb strb r3, [r7, #19] } 8114: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_errorCode = code; 8118: 231e movs r3, #30 if (m_spiActive) { 811a: 7cb8 ldrb r0, [r7, #18] 811c: 747b strb r3, [r7, #17] 811e: 2800 cmp r0, #0 8120: d0f8 beq.n 8114 sdCsWrite(m_csPin, true); 8122: 7c38 ldrb r0, [r7, #16] 8124: 2101 movs r1, #1 8126: f002 f809 bl a13c m_spiDriver.send(data); 812a: 21ff movs r1, #255 ; 0xff 812c: 4640 mov r0, r8 812e: f002 f86b bl a208 m_spiDriver.deactivate(); 8132: 4640 mov r0, r8 8134: f002 f822 bl a17c m_spiActive = false; 8138: 2300 movs r3, #0 return false; 813a: 4618 mov r0, r3 m_spiActive = false; 813c: 74bb strb r3, [r7, #18] } 813e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} sdCsWrite(m_csPin, true); 8142: 2101 movs r1, #1 8144: 7c38 ldrb r0, [r7, #16] 8146: f001 fff9 bl a13c m_spiDriver.send(data); 814a: 4621 mov r1, r4 814c: 4640 mov r0, r8 814e: f002 f85b bl a208 m_spiDriver.deactivate(); 8152: 4640 mov r0, r8 8154: f002 f812 bl a17c m_spiActive = false; 8158: 2300 movs r3, #0 815a: 74bb strb r3, [r7, #18] } 815c: e7d7 b.n 810e 815e: bf00 nop 8160: 20002d90 .word 0x20002d90 00008164 : bool SharedSpiCard::isBusy() { 8164: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} if (m_state == READ_STATE) { 8168: 7cc3 ldrb r3, [r0, #19] 816a: 2b01 cmp r3, #1 816c: d035 beq.n 81da if (!spiActive) { 816e: 7c86 ldrb r6, [r0, #18] 8170: 4604 mov r4, r0 8172: b14e cbz r6, 8188 return m_spiDriver.receive(); 8174: 3004 adds r0, #4 8176: f002 f82d bl a1d4 bool rtn = 0XFF != spiReceive(); 817a: f1b0 05ff subs.w r5, r0, #255 ; 0xff 817e: bf18 it ne 8180: 2501 movne r5, #1 } 8182: 4628 mov r0, r5 8184: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_spiDriver.activate(); 8188: 1d07 adds r7, r0, #4 m_spiActive = true; 818a: f04f 0801 mov.w r8, #1 818e: 4638 mov r0, r7 8190: f001 ffd6 bl a140 sdCsWrite(m_csPin, false); 8194: 4631 mov r1, r6 8196: 7c20 ldrb r0, [r4, #16] 8198: f001 ffd0 bl a13c m_spiDriver.send(data); 819c: 21ff movs r1, #255 ; 0xff 819e: 4638 mov r0, r7 81a0: f002 f832 bl a208 return m_spiDriver.receive(); 81a4: 4638 mov r0, r7 81a6: f884 8012 strb.w r8, [r4, #18] 81aa: f002 f813 bl a1d4 if (m_spiActive) { 81ae: 7ca3 ldrb r3, [r4, #18] bool rtn = 0XFF != spiReceive(); 81b0: f1b0 05ff subs.w r5, r0, #255 ; 0xff 81b4: bf18 it ne 81b6: 2501 movne r5, #1 if (m_spiActive) { 81b8: 2b00 cmp r3, #0 81ba: d0e2 beq.n 8182 sdCsWrite(m_csPin, true); 81bc: 4641 mov r1, r8 81be: 7c20 ldrb r0, [r4, #16] 81c0: f001 ffbc bl a13c m_spiDriver.send(data); 81c4: 21ff movs r1, #255 ; 0xff 81c6: 4638 mov r0, r7 81c8: f002 f81e bl a208 m_spiDriver.deactivate(); 81cc: 4638 mov r0, r7 81ce: f001 ffd5 bl a17c } 81d2: 4628 mov r0, r5 m_spiActive = false; 81d4: 74a6 strb r6, [r4, #18] } 81d6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return false; 81da: 2500 movs r5, #0 } 81dc: 4628 mov r0, r5 81de: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 81e2: bf00 nop 000081e4 : bool SharedSpiCard::readData(uint8_t* dst, size_t count) { 81e4: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 81e8: 4f20 ldr r7, [pc, #128] ; (826c ) 81ea: 4604 mov r4, r0 81ec: 4688 mov r8, r1 81ee: 4691 mov r9, r2 81f0: 683d ldr r5, [r7, #0] return m_spiDriver.receive(); 81f2: 1d06 adds r6, r0, #4 m_endTime = ms + millis16(); 81f4: f505 7596 add.w r5, r5, #300 ; 0x12c 81f8: b2ad uxth r5, r5 explicit Timeout(uint16_t ms) {set(ms);} 81fa: e003 b.n 8204 81fc: 683b ldr r3, [r7, #0] return (int16_t)(m_endTime - millis16()) < 0; 81fe: 1aeb subs r3, r5, r3 if (timeout.timedOut()) { 8200: 041b lsls r3, r3, #16 8202: d40d bmi.n 8220 8204: 4630 mov r0, r6 8206: f001 ffe5 bl a1d4 while ((m_status = spiReceive()) == 0XFF) { 820a: 28ff cmp r0, #255 ; 0xff 820c: 7520 strb r0, [r4, #20] 820e: d0f5 beq.n 81fc if (m_status != DATA_START_SECTOR) { 8210: 28fe cmp r0, #254 ; 0xfe 8212: d01a beq.n 824a 8214: 2318 movs r3, #24 if (m_spiActive) { 8216: 7ca0 ldrb r0, [r4, #18] m_errorCode = code; 8218: 7463 strb r3, [r4, #17] 821a: b930 cbnz r0, 822a } 821c: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 8220: 231d movs r3, #29 if (m_spiActive) { 8222: 7ca0 ldrb r0, [r4, #18] 8224: 7463 strb r3, [r4, #17] 8226: 2800 cmp r0, #0 8228: d0f8 beq.n 821c sdCsWrite(m_csPin, true); 822a: 7c20 ldrb r0, [r4, #16] 822c: 2101 movs r1, #1 822e: f001 ff85 bl a13c m_spiDriver.send(data); 8232: 21ff movs r1, #255 ; 0xff 8234: 4630 mov r0, r6 8236: f001 ffe7 bl a208 m_spiDriver.deactivate(); 823a: 4630 mov r0, r6 823c: f001 ff9e bl a17c m_spiActive = false; 8240: 2300 movs r3, #0 return false; 8242: 4618 mov r0, r3 m_spiActive = false; 8244: 74a3 strb r3, [r4, #18] } 8246: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} return m_spiDriver.receive(buf, n); 824a: 464a mov r2, r9 824c: 4641 mov r1, r8 824e: 4630 mov r0, r6 8250: f001 ffcc bl a1ec if ((m_status = spiReceive(dst, count))) { 8254: 7520 strb r0, [r4, #20] 8256: b938 cbnz r0, 8268 return m_spiDriver.receive(); 8258: 4630 mov r0, r6 825a: f001 ffbb bl a1d4 825e: 4630 mov r0, r6 8260: f001 ffb8 bl a1d4 return true; 8264: 2001 movs r0, #1 8266: e7d9 b.n 821c 8268: 2325 movs r3, #37 ; 0x25 826a: e7d4 b.n 8216 826c: 20002d90 .word 0x20002d90 00008270 : bool SharedSpiCard::readStop() { 8270: b5f0 push {r4, r5, r6, r7, lr} m_state = IDLE_STATE; 8272: 2700 movs r7, #0 bool SharedSpiCard::readStop() { 8274: b083 sub sp, #12 if (cardCommand(CMD12, 0)) { 8276: 210c movs r1, #12 bool SharedSpiCard::readStop() { 8278: 4604 mov r4, r0 if (cardCommand(CMD12, 0)) { 827a: 463a mov r2, r7 m_state = IDLE_STATE; 827c: 74c7 strb r7, [r0, #19] if (cardCommand(CMD12, 0)) { 827e: f000 f85b bl 8338 8282: b9b0 cbnz r0, 82b2 if (m_spiActive) { 8284: 7ca6 ldrb r6, [r4, #18] 8286: b91e cbnz r6, 8290 return true; 8288: 2601 movs r6, #1 } 828a: 4630 mov r0, r6 828c: b003 add sp, #12 828e: bdf0 pop {r4, r5, r6, r7, pc} sdCsWrite(m_csPin, true); 8290: 4605 mov r5, r0 8292: 2101 movs r1, #1 8294: 7c20 ldrb r0, [r4, #16] 8296: f001 ff51 bl a13c m_spiDriver.send(data); 829a: 1d20 adds r0, r4, #4 829c: 21ff movs r1, #255 ; 0xff 829e: 9001 str r0, [sp, #4] 82a0: f001 ffb2 bl a208 m_spiDriver.deactivate(); 82a4: 9801 ldr r0, [sp, #4] 82a6: f001 ff69 bl a17c 82aa: 4630 mov r0, r6 m_spiActive = false; 82ac: 74a5 strb r5, [r4, #18] } 82ae: b003 add sp, #12 82b0: bdf0 pop {r4, r5, r6, r7, pc} m_errorCode = code; 82b2: 2309 movs r3, #9 if (m_spiActive) { 82b4: 7ca6 ldrb r6, [r4, #18] 82b6: 7463 strb r3, [r4, #17] 82b8: 2e00 cmp r6, #0 82ba: d0e6 beq.n 828a m_spiDriver.send(data); 82bc: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 82be: 7c20 ldrb r0, [r4, #16] 82c0: 2101 movs r1, #1 } 82c2: 463e mov r6, r7 82c4: f001 ff3a bl a13c m_spiDriver.send(data); 82c8: 21ff movs r1, #255 ; 0xff 82ca: 4628 mov r0, r5 82cc: f001 ff9c bl a208 m_spiDriver.deactivate(); 82d0: 4628 mov r0, r5 82d2: f001 ff53 bl a17c } 82d6: 4630 mov r0, r6 m_spiActive = false; 82d8: 74a7 strb r7, [r4, #18] } 82da: b003 add sp, #12 82dc: bdf0 pop {r4, r5, r6, r7, pc} 82de: bf00 nop 000082e0 : if (m_state == WRITE_STATE) { 82e0: 7cc2 ldrb r2, [r0, #19] 82e2: 2a02 cmp r2, #2 82e4: d003 beq.n 82ee if (m_state == READ_STATE) { 82e6: 2a01 cmp r2, #1 82e8: d004 beq.n 82f4 } 82ea: 2001 movs r0, #1 82ec: 4770 bx lr return writeStop(); 82ee: 6803 ldr r3, [r0, #0] 82f0: 6e5b ldr r3, [r3, #100] ; 0x64 82f2: 4718 bx r3 return readStop(); 82f4: f7ff bfbc b.w 8270 000082f8 : bool DedicatedSpiCard::setDedicatedSpi(bool value) { 82f8: b538 push {r3, r4, r5, lr} if (!syncDevice()) { 82fa: 6803 ldr r3, [r0, #0] bool DedicatedSpiCard::setDedicatedSpi(bool value) { 82fc: 460d mov r5, r1 82fe: 490d ldr r1, [pc, #52] ; (8334 ) 8300: 4604 mov r4, r0 if (!syncDevice()) { 8302: 6a1a ldr r2, [r3, #32] 8304: 428a cmp r2, r1 8306: d10c bne.n 8322 if (m_state == WRITE_STATE) { 8308: 7cc2 ldrb r2, [r0, #19] 830a: 2a02 cmp r2, #2 830c: d004 beq.n 8318 if (m_state == READ_STATE) { 830e: 2a01 cmp r2, #1 8310: d00b beq.n 832a return true; 8312: 2001 movs r0, #1 m_dedicatedSpi = value; 8314: 7725 strb r5, [r4, #28] } 8316: bd38 pop {r3, r4, r5, pc} return writeStop(); 8318: 6e5b ldr r3, [r3, #100] ; 0x64 831a: 4798 blx r3 if (!syncDevice()) { 831c: 2800 cmp r0, #0 831e: d1f8 bne.n 8312 } 8320: bd38 pop {r3, r4, r5, pc} if (!syncDevice()) { 8322: 4790 blx r2 8324: 2800 cmp r0, #0 8326: d0fb beq.n 8320 8328: e7f3 b.n 8312 return readStop(); 832a: f7ff ffa1 bl 8270 if (!syncDevice()) { 832e: 2800 cmp r0, #0 8330: d0f6 beq.n 8320 8332: e7ee b.n 8312 8334: 000082e1 .word 0x000082e1 00008338 : uint8_t SharedSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { 8338: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} if (!syncDevice()) { 833c: 6803 ldr r3, [r0, #0] uint8_t SharedSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { 833e: b082 sub sp, #8 8340: 460f mov r7, r1 8342: 4935 ldr r1, [pc, #212] ; (8418 ) 8344: 9201 str r2, [sp, #4] 8346: 4606 mov r6, r0 if (!syncDevice()) { 8348: 6a1a ldr r2, [r3, #32] 834a: 428a cmp r2, r1 834c: d15e bne.n 840c if (m_state == WRITE_STATE) { 834e: 7cc2 ldrb r2, [r0, #19] 8350: 2a02 cmp r2, #2 8352: d041 beq.n 83d8 if (m_state == READ_STATE) { 8354: 2a01 cmp r2, #1 8356: d05b beq.n 8410 if (!m_spiActive) { 8358: 7cb4 ldrb r4, [r6, #18] 835a: 2c00 cmp r4, #0 835c: d047 beq.n 83ee m_spiDriver.activate(); 835e: 1d35 adds r5, r6, #4 if (cmd != CMD12) { 8360: 2f0c cmp r7, #12 8362: d011 beq.n 8388 8364: f8df 80b4 ldr.w r8, [pc, #180] ; 841c 8368: f8d8 4000 ldr.w r4, [r8] m_endTime = ms + millis16(); 836c: f504 7496 add.w r4, r4, #300 ; 0x12c 8370: b2a4 uxth r4, r4 explicit Timeout(uint16_t ms) {set(ms);} 8372: e004 b.n 837e 8374: f8d8 3000 ldr.w r3, [r8] return (int16_t)(m_endTime - millis16()) < 0; 8378: 1ae3 subs r3, r4, r3 if (timeout.timedOut()) { 837a: 041a lsls r2, r3, #16 837c: d434 bmi.n 83e8 return m_spiDriver.receive(); 837e: 4628 mov r0, r5 8380: f001 ff28 bl a1d4 while (spiReceive() != 0XFF) { 8384: 28ff cmp r0, #255 ; 0xff 8386: d1f5 bne.n 8374 m_spiDriver.send(data); 8388: f10d 0804 add.w r8, sp, #4 838c: ac02 add r4, sp, #8 838e: f047 0140 orr.w r1, r7, #64 ; 0x40 8392: 4628 mov r0, r5 8394: f001 ff38 bl a208 8398: f814 1d01 ldrb.w r1, [r4, #-1]! 839c: 4628 mov r0, r5 839e: f001 ff33 bl a208 for (int8_t i = 3; i >= 0; i--) { 83a2: 45a0 cmp r8, r4 83a4: d1f8 bne.n 8398 spiSend(cmd == CMD0 ? 0X95 : 0X87); 83a6: 2f00 cmp r7, #0 83a8: 4628 mov r0, r5 return m_spiDriver.receive(); 83aa: f04f 040a mov.w r4, #10 m_spiDriver.send(data); 83ae: bf0c ite eq 83b0: 2195 moveq r1, #149 ; 0x95 83b2: 2187 movne r1, #135 ; 0x87 83b4: f001 ff28 bl a208 return m_spiDriver.receive(); 83b8: 4628 mov r0, r5 83ba: f001 ff0b bl a1d4 83be: 4628 mov r0, r5 } while (m_status & 0X80 && ++n < 10); 83c0: 3c01 subs r4, #1 83c2: f001 ff07 bl a1d4 83c6: 0603 lsls r3, r0, #24 83c8: b2a4 uxth r4, r4 m_status = spiReceive(); 83ca: 7530 strb r0, [r6, #20] } while (m_status & 0X80 && ++n < 10); 83cc: d501 bpl.n 83d2 83ce: 2c00 cmp r4, #0 83d0: d1f5 bne.n 83be } 83d2: b002 add sp, #8 83d4: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return writeStop(); 83d8: 6e5b ldr r3, [r3, #100] ; 0x64 83da: 4798 blx r3 if (!syncDevice()) { 83dc: 2800 cmp r0, #0 83de: d1bb bne.n 8358 return 0XFF; 83e0: 20ff movs r0, #255 ; 0xff } 83e2: b002 add sp, #8 83e4: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!waitReady(SD_CMD_TIMEOUT) && cmd != CMD0) { 83e8: 2f00 cmp r7, #0 83ea: d0cd beq.n 8388 83ec: e7f8 b.n 83e0 m_spiDriver.activate(); 83ee: 1d35 adds r5, r6, #4 83f0: 4628 mov r0, r5 83f2: f001 fea5 bl a140 sdCsWrite(m_csPin, false); 83f6: 4621 mov r1, r4 83f8: 7c30 ldrb r0, [r6, #16] 83fa: f001 fe9f bl a13c m_spiDriver.send(data); 83fe: 21ff movs r1, #255 ; 0xff 8400: 4628 mov r0, r5 8402: f001 ff01 bl a208 m_spiActive = true; 8406: 2301 movs r3, #1 8408: 74b3 strb r3, [r6, #18] } 840a: e7a9 b.n 8360 if (!syncDevice()) { 840c: 4790 blx r2 840e: e7e5 b.n 83dc return readStop(); 8410: f7ff ff2e bl 8270 8414: e7e2 b.n 83dc 8416: bf00 nop 8418: 000082e1 .word 0x000082e1 841c: 20002d90 .word 0x20002d90 00008420 : bool SharedSpiCard::begin(SdSpiConfig spiConfig) { 8420: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 8424: b088 sub sp, #32 8426: 4605 mov r5, r0 m_spiActive = false; 8428: f04f 0800 mov.w r8, #0 842c: 4617 mov r7, r2 bool SharedSpiCard::begin(SdSpiConfig spiConfig) { 842e: ac01 add r4, sp, #4 m_spiDriver.begin(spiConfig); 8430: 1d2e adds r6, r5, #4 m_spiActive = false; 8432: f885 8012 strb.w r8, [r5, #18] m_errorCode = SD_CARD_ERROR_NONE; 8436: f885 8011 strb.w r8, [r5, #17] m_type = 0; 843a: f885 8015 strb.w r8, [r5, #21] bool SharedSpiCard::begin(SdSpiConfig spiConfig) { 843e: e884 000e stmia.w r4, {r1, r2, r3} 8442: f89d 0004 ldrb.w r0, [sp, #4] m_csPin = spiConfig.csPin; 8446: 7428 strb r0, [r5, #16] sdCsInit(m_csPin); 8448: f001 fe74 bl a134 sdCsWrite(m_csPin, true); 844c: 2101 movs r1, #1 844e: 7c28 ldrb r0, [r5, #16] 8450: f001 fe74 bl a13c /** Save high speed SPISettings after SD initialization. * * \param[in] maxSck Maximum SCK frequency. */ void setSckSpeed(uint32_t maxSck) { m_spiSettings = SPISettings(maxSck, MSBFIRST, SPI_MODE0); 8454: 496c ldr r1, [pc, #432] ; (8608 ) 8456: 2307 movs r3, #7 8458: e9c5 1302 strd r1, r3, [r5, #8] spiBegin(spiConfig); 845c: e894 0007 ldmia.w r4, {r0, r1, r2} 8460: ab05 add r3, sp, #20 8462: e883 0007 stmia.w r3, {r0, r1, r2} m_spiDriver.begin(spiConfig); 8466: 4630 mov r0, r6 8468: cb0e ldmia r3, {r1, r2, r3} 846a: f001 fe73 bl a154 if (!m_spiActive) { 846e: 7cac ldrb r4, [r5, #18] m_state = IDLE_STATE; 8470: f885 8013 strb.w r8, [r5, #19] if (!m_spiActive) { 8474: 2c00 cmp r4, #0 8476: d067 beq.n 8548 sdCsWrite(m_csPin, true); 8478: 240a movs r4, #10 847a: 2101 movs r1, #1 847c: 7c28 ldrb r0, [r5, #16] 847e: f001 fe5d bl a13c m_spiDriver.send(data); 8482: 21ff movs r1, #255 ; 0xff 8484: 4630 mov r0, r6 8486: f001 febf bl a208 for (uint8_t i = 0; i < 10; i++) { 848a: 1e61 subs r1, r4, #1 848c: f011 04ff ands.w r4, r1, #255 ; 0xff 8490: d1f7 bne.n 8482 sdCsWrite(m_csPin, false); 8492: 4621 mov r1, r4 8494: 240a movs r4, #10 8496: 7c28 ldrb r0, [r5, #16] 8498: f001 fe50 bl a13c if (cardCommand(CMD0, 0) == R1_IDLE_STATE) { 849c: 2200 movs r2, #0 849e: 4628 mov r0, r5 84a0: 4611 mov r1, r2 84a2: f7ff ff49 bl 8338 84a6: 2801 cmp r0, #1 if (i == SD_CMD0_RETRY) { 84a8: f104 33ff add.w r3, r4, #4294967295 if (cardCommand(CMD0, 0) == R1_IDLE_STATE) { 84ac: 4604 mov r4, r0 84ae: d00a beq.n 84c6 if (i == SD_CMD0_RETRY) { 84b0: f013 04ff ands.w r4, r3, #255 ; 0xff 84b4: d1f2 bne.n 849c 84b6: 2301 movs r3, #1 if (m_spiActive) { 84b8: 7ca8 ldrb r0, [r5, #18] m_errorCode = code; 84ba: 746b strb r3, [r5, #17] 84bc: 2800 cmp r0, #0 84be: d151 bne.n 8564 } 84c0: b008 add sp, #32 84c2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} if (!(cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { 84c6: f44f 72d5 mov.w r2, #426 ; 0x1aa 84ca: 2108 movs r1, #8 84cc: 4628 mov r0, r5 84ce: f7ff ff33 bl 8338 84d2: 0742 lsls r2, r0, #29 84d4: d557 bpl.n 8586 m_type = value; 84d6: 756c strb r4, [r5, #21] arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; 84d8: 682b ldr r3, [r5, #0] 84da: f8df a130 ldr.w sl, [pc, #304] ; 860c 84de: 6d9b ldr r3, [r3, #88] ; 0x58 84e0: 4553 cmp r3, sl 84e2: d161 bne.n 85a8 return m_type; 84e4: 7d68 ldrb r0, [r5, #21] 84e6: f1a0 0402 sub.w r4, r0, #2 84ea: f8df 9124 ldr.w r9, [pc, #292] ; 8610 84ee: fab4 f484 clz r4, r4 84f2: f8d9 3000 ldr.w r3, [r9] 84f6: 0964 lsrs r4, r4, #5 m_endTime = ms + millis16(); 84f8: f503 68fa add.w r8, r3, #2000 ; 0x7d0 arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; 84fc: 07a4 lsls r4, r4, #30 m_endTime = ms + millis16(); 84fe: fa1f f888 uxth.w r8, r8 } 8502: e005 b.n 8510 8504: f8d9 3000 ldr.w r3, [r9] return (int16_t)(m_endTime - millis16()) < 0; 8508: eba8 0303 sub.w r3, r8, r3 if (timeout.timedOut()) { 850c: 041b lsls r3, r3, #16 850e: d449 bmi.n 85a4 cardCommand(CMD55, 0); 8510: 2137 movs r1, #55 ; 0x37 8512: 2200 movs r2, #0 8514: 4628 mov r0, r5 8516: f7ff ff0f bl 8338 return cardCommand(cmd, arg); 851a: 4622 mov r2, r4 851c: 2129 movs r1, #41 ; 0x29 851e: 4628 mov r0, r5 8520: f7ff ff0a bl 8338 while (cardAcmd(ACMD41, arg) != R1_READY_STATE) { 8524: 2800 cmp r0, #0 8526: d1ed bne.n 8504 if (type() == SD_CARD_TYPE_SD2) { 8528: 682b ldr r3, [r5, #0] 852a: 6d9b ldr r3, [r3, #88] ; 0x58 852c: 4553 cmp r3, sl 852e: d165 bne.n 85fc return m_type; 8530: 7d68 ldrb r0, [r5, #21] 8532: 2802 cmp r0, #2 8534: d049 beq.n 85ca if (m_spiActive) { 8536: 7cab ldrb r3, [r5, #18] 8538: bbcb cbnz r3, 85ae 853a: 2307 movs r3, #7 return true; 853c: 2001 movs r0, #1 853e: e9c5 7302 strd r7, r3, [r5, #8] } 8542: b008 add sp, #32 8544: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} m_spiDriver.activate(); 8548: 4630 mov r0, r6 854a: f001 fdf9 bl a140 sdCsWrite(m_csPin, false); 854e: 4621 mov r1, r4 8550: 7c28 ldrb r0, [r5, #16] 8552: f001 fdf3 bl a13c m_spiDriver.send(data); 8556: 21ff movs r1, #255 ; 0xff 8558: 4630 mov r0, r6 855a: f001 fe55 bl a208 m_spiActive = true; 855e: 2301 movs r3, #1 8560: 74ab strb r3, [r5, #18] } 8562: e789 b.n 8478 sdCsWrite(m_csPin, true); 8564: 7c28 ldrb r0, [r5, #16] 8566: 2101 movs r1, #1 8568: f001 fde8 bl a13c m_spiDriver.send(data); 856c: 21ff movs r1, #255 ; 0xff 856e: 4630 mov r0, r6 8570: f001 fe4a bl a208 m_spiDriver.deactivate(); 8574: 4630 mov r0, r6 8576: f001 fe01 bl a17c m_spiActive = false; 857a: 2300 movs r3, #0 return false; 857c: 4618 mov r0, r3 m_spiActive = false; 857e: 74ab strb r3, [r5, #18] } 8580: b008 add sp, #32 8582: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} m_type = value; 8586: 2302 movs r3, #2 8588: 2404 movs r4, #4 858a: 756b strb r3, [r5, #21] return m_spiDriver.receive(); 858c: 4630 mov r0, r6 858e: f001 fe21 bl a1d4 for (uint8_t i = 0; i < 4; i++) { 8592: 1e63 subs r3, r4, #1 m_status = spiReceive(); 8594: 7528 strb r0, [r5, #20] for (uint8_t i = 0; i < 4; i++) { 8596: f013 04ff ands.w r4, r3, #255 ; 0xff 859a: d1f7 bne.n 858c if (m_status != 0XAA) { 859c: 28aa cmp r0, #170 ; 0xaa 859e: d09b beq.n 84d8 85a0: 2306 movs r3, #6 85a2: e789 b.n 84b8 85a4: 2317 movs r3, #23 85a6: e787 b.n 84b8 arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; 85a8: 4628 mov r0, r5 85aa: 4798 blx r3 85ac: e79b b.n 84e6 sdCsWrite(m_csPin, true); 85ae: 2101 movs r1, #1 85b0: 7c28 ldrb r0, [r5, #16] 85b2: f001 fdc3 bl a13c m_spiDriver.send(data); 85b6: 21ff movs r1, #255 ; 0xff 85b8: 4630 mov r0, r6 85ba: f001 fe25 bl a208 m_spiDriver.deactivate(); 85be: 4630 mov r0, r6 85c0: f001 fddc bl a17c m_spiActive = false; 85c4: 2300 movs r3, #0 85c6: 74ab strb r3, [r5, #18] } 85c8: e7b7 b.n 853a if (cardCommand(CMD58, 0)) { 85ca: 2200 movs r2, #0 85cc: 213a movs r1, #58 ; 0x3a 85ce: 4628 mov r0, r5 85d0: f7ff feb2 bl 8338 85d4: b9a8 cbnz r0, 8602 return m_spiDriver.receive(); 85d6: 4630 mov r0, r6 85d8: f001 fdfc bl a1d4 if ((spiReceive() & 0XC0) == 0XC0) { 85dc: f000 00c0 and.w r0, r0, #192 ; 0xc0 85e0: 28c0 cmp r0, #192 ; 0xc0 85e2: d101 bne.n 85e8 m_type = value; 85e4: 2303 movs r3, #3 85e6: 756b strb r3, [r5, #21] return m_spiDriver.receive(); 85e8: 4630 mov r0, r6 85ea: f001 fdf3 bl a1d4 85ee: 4630 mov r0, r6 85f0: f001 fdf0 bl a1d4 85f4: 4630 mov r0, r6 85f6: f001 fded bl a1d4 for (uint8_t i = 0; i < 3; i++) { 85fa: e79c b.n 8536 if (type() == SD_CARD_TYPE_SD2) { 85fc: 4628 mov r0, r5 85fe: 4798 blx r3 8600: e797 b.n 8532 8602: 2312 movs r3, #18 8604: e758 b.n 84b8 8606: bf00 nop 8608: 00061a80 .word 0x00061a80 860c: 00007fdd .word 0x00007fdd 8610: 20002d90 .word 0x20002d90 00008614 : bool SharedSpiCard::readOCR(uint32_t* ocr) { 8614: b5f8 push {r3, r4, r5, r6, r7, lr} if (cardCommand(CMD58, 0)) { 8616: 2200 movs r2, #0 bool SharedSpiCard::readOCR(uint32_t* ocr) { 8618: 460d mov r5, r1 if (cardCommand(CMD58, 0)) { 861a: 213a movs r1, #58 ; 0x3a bool SharedSpiCard::readOCR(uint32_t* ocr) { 861c: 4606 mov r6, r0 if (cardCommand(CMD58, 0)) { 861e: f7ff fe8b bl 8338 8622: b9e0 cbnz r0, 865e m_spiDriver.send(data); 8624: 1d37 adds r7, r6, #4 8626: 1d2c adds r4, r5, #4 return m_spiDriver.receive(); 8628: 4638 mov r0, r7 862a: f001 fdd3 bl a1d4 p[3 - i] = spiReceive(); 862e: f804 0d01 strb.w r0, [r4, #-1]! for (uint8_t i = 0; i < 4; i++) { 8632: 42a5 cmp r5, r4 8634: d1f8 bne.n 8628 if (m_spiActive) { 8636: 7cb4 ldrb r4, [r6, #18] 8638: b914 cbnz r4, 8640 863a: 2401 movs r4, #1 } 863c: 4620 mov r0, r4 863e: bdf8 pop {r3, r4, r5, r6, r7, pc} sdCsWrite(m_csPin, true); 8640: 7c30 ldrb r0, [r6, #16] 8642: 2101 movs r1, #1 8644: f001 fd7a bl a13c m_spiDriver.send(data); 8648: 21ff movs r1, #255 ; 0xff 864a: 4638 mov r0, r7 864c: f001 fddc bl a208 m_spiDriver.deactivate(); 8650: 4638 mov r0, r7 8652: f001 fd93 bl a17c m_spiActive = false; 8656: 2300 movs r3, #0 } 8658: 4620 mov r0, r4 m_spiActive = false; 865a: 74b3 strb r3, [r6, #18] } 865c: bdf8 pop {r3, r4, r5, r6, r7, pc} m_errorCode = code; 865e: 2312 movs r3, #18 if (m_spiActive) { 8660: 7cb4 ldrb r4, [r6, #18] 8662: 7473 strb r3, [r6, #17] 8664: 2c00 cmp r4, #0 8666: d0e9 beq.n 863c m_spiDriver.send(data); 8668: 1d34 adds r4, r6, #4 sdCsWrite(m_csPin, true); 866a: 7c30 ldrb r0, [r6, #16] 866c: 2101 movs r1, #1 866e: f001 fd65 bl a13c m_spiDriver.send(data); 8672: 21ff movs r1, #255 ; 0xff 8674: 4620 mov r0, r4 8676: f001 fdc7 bl a208 m_spiDriver.deactivate(); 867a: 4620 mov r0, r4 867c: f001 fd7e bl a17c m_spiActive = false; 8680: 2300 movs r3, #0 return false; 8682: 461c mov r4, r3 m_spiActive = false; 8684: 74b3 strb r3, [r6, #18] } 8686: 4620 mov r0, r4 8688: bdf8 pop {r3, r4, r5, r6, r7, pc} 868a: bf00 nop 0000868c : bool SharedSpiCard::readRegister(uint8_t cmd, void* buf) { 868c: b570 push {r4, r5, r6, lr} 868e: 4616 mov r6, r2 8690: b082 sub sp, #8 if (cardCommand(cmd, 0)) { 8692: 2200 movs r2, #0 bool SharedSpiCard::readRegister(uint8_t cmd, void* buf) { 8694: 4604 mov r4, r0 if (cardCommand(cmd, 0)) { 8696: f7ff fe4f bl 8338 869a: b1b0 cbz r0, 86ca m_errorCode = code; 869c: 231b movs r3, #27 869e: 7463 strb r3, [r4, #17] if (m_spiActive) { 86a0: 7ca0 ldrb r0, [r4, #18] 86a2: b908 cbnz r0, 86a8 } 86a4: b002 add sp, #8 86a6: bd70 pop {r4, r5, r6, pc} m_spiDriver.send(data); 86a8: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 86aa: 7c20 ldrb r0, [r4, #16] 86ac: 2101 movs r1, #1 86ae: f001 fd45 bl a13c m_spiDriver.send(data); 86b2: 21ff movs r1, #255 ; 0xff 86b4: 4628 mov r0, r5 86b6: f001 fda7 bl a208 m_spiDriver.deactivate(); 86ba: 4628 mov r0, r5 86bc: f001 fd5e bl a17c m_spiActive = false; 86c0: 2300 movs r3, #0 return false; 86c2: 4618 mov r0, r3 m_spiActive = false; 86c4: 74a3 strb r3, [r4, #18] } 86c6: b002 add sp, #8 86c8: bd70 pop {r4, r5, r6, pc} if (!readData(dst, 16)) { 86ca: 4605 mov r5, r0 86cc: 2210 movs r2, #16 86ce: 4631 mov r1, r6 86d0: 4620 mov r0, r4 86d2: f7ff fd87 bl 81e4 86d6: 2800 cmp r0, #0 86d8: d0e2 beq.n 86a0 if (m_spiActive) { 86da: 7ca6 ldrb r6, [r4, #18] 86dc: 2e00 cmp r6, #0 86de: d0e1 beq.n 86a4 sdCsWrite(m_csPin, true); 86e0: 7c20 ldrb r0, [r4, #16] 86e2: 2101 movs r1, #1 86e4: f001 fd2a bl a13c m_spiDriver.send(data); 86e8: 1d20 adds r0, r4, #4 86ea: 21ff movs r1, #255 ; 0xff 86ec: 9001 str r0, [sp, #4] 86ee: f001 fd8b bl a208 m_spiDriver.deactivate(); 86f2: 9801 ldr r0, [sp, #4] 86f4: f001 fd42 bl a17c } 86f8: 4630 mov r0, r6 m_spiActive = false; 86fa: 74a5 strb r5, [r4, #18] } 86fc: b002 add sp, #8 86fe: bd70 pop {r4, r5, r6, pc} 00008700 : return readCSD(&csd) ? sdCardCapacity(&csd) : 0; 8700: 6803 ldr r3, [r0, #0] 8702: 4a25 ldr r2, [pc, #148] ; (8798 ) 8704: 6cdb ldr r3, [r3, #76] ; 0x4c 8706: 4293 cmp r3, r2 uint32_t SharedSpiCard::sectorCount() { 8708: b500 push {lr} 870a: b085 sub sp, #20 870c: d10f bne.n 872e return readRegister(CMD9, csd); 870e: 466a mov r2, sp 8710: 2109 movs r1, #9 8712: f7ff ffbb bl 868c return readCSD(&csd) ? sdCardCapacity(&csd) : 0; 8716: b138 cbz r0, 8728 csd1_t v1; csd2_t v2; }; //----------------------------------------------------------------------------- inline uint32_t sdCardCapacity(csd_t* csd) { if (csd->v1.csd_ver == 0) { 8718: f89d 3000 ldrb.w r3, [sp] 871c: f013 03c0 ands.w r3, r3, #192 ; 0xc0 8720: d008 beq.n 8734 uint16_t c_size = (csd->v1.c_size_high << 10) | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; uint8_t c_size_mult = (csd->v1.c_size_mult_high << 1) | csd->v1.c_size_mult_low; return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); } else if (csd->v2.csd_ver == 1) { 8722: 2b40 cmp r3, #64 ; 0x40 8724: d027 beq.n 8776 8726: 2000 movs r0, #0 } 8728: b005 add sp, #20 872a: f85d fb04 ldr.w pc, [sp], #4 return readCSD(&csd) ? sdCardCapacity(&csd) : 0; 872e: 4669 mov r1, sp 8730: 4798 blx r3 8732: e7f0 b.n 8716 uint8_t c_size_mult = (csd->v1.c_size_mult_high << 1) 8734: f89d 3009 ldrb.w r3, [sp, #9] | csd->v1.c_size_mult_low; 8738: f89d 200a ldrb.w r2, [sp, #10] uint8_t c_size_mult = (csd->v1.c_size_mult_high << 1) 873c: f003 0303 and.w r3, r3, #3 uint16_t c_size = (csd->v1.c_size_high << 10) 8740: f89d 1006 ldrb.w r1, [sp, #6] | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 8744: f89d 0007 ldrb.w r0, [sp, #7] | csd->v1.c_size_mult_low; 8748: 005b lsls r3, r3, #1 uint16_t c_size = (csd->v1.c_size_high << 10) 874a: f001 0103 and.w r1, r1, #3 | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 874e: 0080 lsls r0, r0, #2 8750: f89d c008 ldrb.w ip, [sp, #8] return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); 8754: ea43 13d2 orr.w r3, r3, r2, lsr #7 uint8_t read_bl_len = csd->v1.read_bl_len; 8758: f89d 2005 ldrb.w r2, [sp, #5] | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 875c: ea40 2081 orr.w r0, r0, r1, lsl #10 return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); 8760: f002 020f and.w r2, r2, #15 | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 8764: ea40 109c orr.w r0, r0, ip, lsr #6 return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); 8768: 4413 add r3, r2 876a: 3001 adds r0, #1 876c: 3b07 subs r3, #7 876e: 4098 lsls r0, r3 } 8770: b005 add sp, #20 8772: f85d fb04 ldr.w pc, [sp], #4 return (((uint32_t)csd->v2.c_size_high << 16) + ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; 8776: f89d 0009 ldrb.w r0, [sp, #9] return (((uint32_t)csd->v2.c_size_high << 16) + 877a: f89d 3007 ldrb.w r3, [sp, #7] ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; 877e: 3001 adds r0, #1 8780: f89d 2008 ldrb.w r2, [sp, #8] return (((uint32_t)csd->v2.c_size_high << 16) + 8784: f003 033f and.w r3, r3, #63 ; 0x3f ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; 8788: eb00 4003 add.w r0, r0, r3, lsl #16 878c: eb00 2002 add.w r0, r0, r2, lsl #8 8790: 0280 lsls r0, r0, #10 8792: b005 add sp, #20 8794: f85d fb04 ldr.w pc, [sp], #4 8798: 00008abd .word 0x00008abd 0000879c : if (type() != SD_CARD_TYPE_SDHC) { 879c: 6803 ldr r3, [r0, #0] bool SharedSpiCard::readStart(uint32_t sector) { 879e: 460a mov r2, r1 87a0: b530 push {r4, r5, lr} if (type() != SD_CARD_TYPE_SDHC) { 87a2: 6d9b ldr r3, [r3, #88] ; 0x58 bool SharedSpiCard::readStart(uint32_t sector) { 87a4: b083 sub sp, #12 87a6: 4d16 ldr r5, [pc, #88] ; (8800 ) 87a8: 4604 mov r4, r0 if (type() != SD_CARD_TYPE_SDHC) { 87aa: 42ab cmp r3, r5 87ac: d124 bne.n 87f8 return m_type; 87ae: 7d40 ldrb r0, [r0, #21] 87b0: 2803 cmp r0, #3 if (cardCommand(CMD18, sector)) { 87b2: f04f 0112 mov.w r1, #18 87b6: 4620 mov r0, r4 sector <<= 9; 87b8: bf18 it ne 87ba: 0252 lslne r2, r2, #9 if (cardCommand(CMD18, sector)) { 87bc: f7ff fdbc bl 8338 87c0: b920 cbnz r0, 87cc m_state = READ_STATE; 87c2: 2301 movs r3, #1 return true; 87c4: 4618 mov r0, r3 m_state = READ_STATE; 87c6: 74e3 strb r3, [r4, #19] } 87c8: b003 add sp, #12 87ca: bd30 pop {r4, r5, pc} m_errorCode = code; 87cc: 230c movs r3, #12 if (m_spiActive) { 87ce: 7ca0 ldrb r0, [r4, #18] 87d0: 7463 strb r3, [r4, #17] 87d2: 2800 cmp r0, #0 87d4: d0f8 beq.n 87c8 m_spiDriver.send(data); 87d6: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 87d8: 7c20 ldrb r0, [r4, #16] 87da: 2101 movs r1, #1 87dc: f001 fcae bl a13c m_spiDriver.send(data); 87e0: 21ff movs r1, #255 ; 0xff 87e2: 4628 mov r0, r5 87e4: f001 fd10 bl a208 m_spiDriver.deactivate(); 87e8: 4628 mov r0, r5 87ea: f001 fcc7 bl a17c m_spiActive = false; 87ee: 2300 movs r3, #0 } 87f0: 4618 mov r0, r3 m_spiActive = false; 87f2: 74a3 strb r3, [r4, #18] } 87f4: b003 add sp, #12 87f6: bd30 pop {r4, r5, pc} 87f8: 9101 str r1, [sp, #4] if (type() != SD_CARD_TYPE_SDHC) { 87fa: 4798 blx r3 87fc: 9a01 ldr r2, [sp, #4] 87fe: e7d7 b.n 87b0 8800: 00007fdd .word 0x00007fdd 00008804 : uint32_t sector, uint8_t* dst, size_t ns) { 8804: b5f8 push {r3, r4, r5, r6, r7, lr} 8806: 4614 mov r4, r2 if (sdState() != READ_STATE || sector != m_curSector) { 8808: 7cc2 ldrb r2, [r0, #19] uint32_t sector, uint8_t* dst, size_t ns) { 880a: 4606 mov r6, r0 880c: 460d mov r5, r1 if (sdState() != READ_STATE || sector != m_curSector) { 880e: 2a01 cmp r2, #1 uint32_t sector, uint8_t* dst, size_t ns) { 8810: 461f mov r7, r3 if (sdState() != READ_STATE || sector != m_curSector) { 8812: d102 bne.n 881a 8814: 6983 ldr r3, [r0, #24] 8816: 428b cmp r3, r1 8818: d005 beq.n 8826 if (!readStart(sector)) { 881a: 4629 mov r1, r5 881c: 4630 mov r0, r6 881e: f7ff ffbd bl 879c 8822: b180 cbz r0, 8846 m_curSector = sector; 8824: 61b5 str r5, [r6, #24] for (size_t i = 0; i < ns; i++, dst += 512) { 8826: b187 cbz r7, 884a if (!readStart(sector)) { 8828: 2500 movs r5, #0 882a: e001 b.n 8830 for (size_t i = 0; i < ns; i++, dst += 512) { 882c: 42af cmp r7, r5 882e: d00c beq.n 884a return readData(dst, 512); 8830: 4621 mov r1, r4 8832: f44f 7200 mov.w r2, #512 ; 0x200 8836: 4630 mov r0, r6 for (size_t i = 0; i < ns; i++, dst += 512) { 8838: 3501 adds r5, #1 883a: f504 7400 add.w r4, r4, #512 ; 0x200 return readData(dst, 512); 883e: f7ff fcd1 bl 81e4 if (!readData(dst)) { 8842: 2800 cmp r0, #0 8844: d1f2 bne.n 882c return false; 8846: 2000 movs r0, #0 } 8848: bdf8 pop {r3, r4, r5, r6, r7, pc} m_curSector += ns; 884a: 69b3 ldr r3, [r6, #24] return m_dedicatedSpi ? true : readStop(); 884c: 7f30 ldrb r0, [r6, #28] m_curSector += ns; 884e: 443b add r3, r7 8850: 61b3 str r3, [r6, #24] return m_dedicatedSpi ? true : readStop(); 8852: 2800 cmp r0, #0 8854: d1f8 bne.n 8848 8856: 4630 mov r0, r6 } 8858: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} return m_dedicatedSpi ? true : readStop(); 885c: f7ff bd08 b.w 8270 00008860 : void (*callback)(uint32_t sector, uint8_t *buf, void *context), void *context) { 8860: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} 8864: 469b mov fp, r3 if (sdState() != READ_STATE || sector != m_curSector) { 8866: 7cc3 ldrb r3, [r0, #19] void (*callback)(uint32_t sector, uint8_t *buf, void *context), void *context) { 8868: 4606 mov r6, r0 886a: 460c mov r4, r1 if (sdState() != READ_STATE || sector != m_curSector) { 886c: 2b01 cmp r3, #1 void (*callback)(uint32_t sector, uint8_t *buf, void *context), void *context) { 886e: 4615 mov r5, r2 8870: f8dd 9028 ldr.w r9, [sp, #40] ; 0x28 8874: f8dd 802c ldr.w r8, [sp, #44] ; 0x2c if (sdState() != READ_STATE || sector != m_curSector) { 8878: d102 bne.n 8880 887a: 6983 ldr r3, [r0, #24] 887c: 428b cmp r3, r1 887e: d005 beq.n 888c if (!readStart(sector)) { 8880: 4621 mov r1, r4 8882: 4630 mov r0, r6 8884: f7ff ff8a bl 879c 8888: b1b0 cbz r0, 88b8 m_curSector = sector; 888a: 61b4 str r4, [r6, #24] for (size_t i = 0; i < ns; i++) { 888c: f1bb 0f00 cmp.w fp, #0 8890: d015 beq.n 88be 8892: eb04 0a0b add.w sl, r4, fp 8896: e002 b.n 889e callback(sector + i, dst, context); 8898: 47c8 blx r9 for (size_t i = 0; i < ns; i++) { 889a: 45a2 cmp sl, r4 889c: d00f beq.n 88be return readData(dst, 512); 889e: f44f 7200 mov.w r2, #512 ; 0x200 88a2: 4629 mov r1, r5 88a4: 4630 mov r0, r6 88a6: f7ff fc9d bl 81e4 88aa: 4607 mov r7, r0 callback(sector + i, dst, context); 88ac: 4642 mov r2, r8 88ae: 4620 mov r0, r4 88b0: 4629 mov r1, r5 for (size_t i = 0; i < ns; i++) { 88b2: 3401 adds r4, #1 if (readData(dst)) { 88b4: 2f00 cmp r7, #0 88b6: d1ef bne.n 8898 return false; 88b8: 2000 movs r0, #0 } 88ba: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} m_curSector += ns; 88be: 69b3 ldr r3, [r6, #24] return m_dedicatedSpi ? true : readStop(); 88c0: 7f30 ldrb r0, [r6, #28] m_curSector += ns; 88c2: 445b add r3, fp 88c4: 61b3 str r3, [r6, #24] return m_dedicatedSpi ? true : readStop(); 88c6: 2800 cmp r0, #0 88c8: d1f7 bne.n 88ba 88ca: 4630 mov r0, r6 } 88cc: e8bd 4ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} return m_dedicatedSpi ? true : readStop(); 88d0: f7ff bcce b.w 8270 000088d4 : return readSectors(sector, dst, 1); 88d4: 6803 ldr r3, [r0, #0] bool DedicatedSpiCard::readSector(uint32_t sector, uint8_t* dst) { 88d6: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} return readSectors(sector, dst, 1); 88da: 695f ldr r7, [r3, #20] 88dc: 4b16 ldr r3, [pc, #88] ; (8938 ) 88de: 429f cmp r7, r3 88e0: d11f bne.n 8922 if (sdState() != READ_STATE || sector != m_curSector) { 88e2: 7cc3 ldrb r3, [r0, #19] 88e4: 4604 mov r4, r0 88e6: 460d mov r5, r1 88e8: 4616 mov r6, r2 88ea: 2b01 cmp r3, #1 88ec: d102 bne.n 88f4 88ee: 6983 ldr r3, [r0, #24] 88f0: 4299 cmp r1, r3 88f2: d005 beq.n 8900 if (!readStart(sector)) { 88f4: 4629 mov r1, r5 88f6: 4620 mov r0, r4 88f8: f7ff ff50 bl 879c 88fc: b170 cbz r0, 891c m_curSector = sector; 88fe: 61a5 str r5, [r4, #24] return readData(dst, 512); 8900: f44f 7200 mov.w r2, #512 ; 0x200 8904: 4631 mov r1, r6 8906: 4620 mov r0, r4 8908: f7ff fc6c bl 81e4 if (!readData(dst)) { 890c: b130 cbz r0, 891c m_curSector += ns; 890e: 69a3 ldr r3, [r4, #24] return m_dedicatedSpi ? true : readStop(); 8910: 7f20 ldrb r0, [r4, #28] m_curSector += ns; 8912: 3301 adds r3, #1 8914: 61a3 str r3, [r4, #24] return m_dedicatedSpi ? true : readStop(); 8916: b148 cbz r0, 892c } 8918: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return false; 891c: 2000 movs r0, #0 } 891e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return readSectors(sector, dst, 1); 8922: 46bc mov ip, r7 8924: 2301 movs r3, #1 } 8926: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} return readSectors(sector, dst, 1); 892a: 4760 bx ip return m_dedicatedSpi ? true : readStop(); 892c: 4620 mov r0, r4 } 892e: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} return m_dedicatedSpi ? true : readStop(); 8932: f7ff bc9d b.w 8270 8936: bf00 nop 8938: 00008805 .word 0x00008805 0000893c : if (type() != SD_CARD_TYPE_SDHC) { 893c: 6803 ldr r3, [r0, #0] bool SharedSpiCard::writeStart(uint32_t sector) { 893e: 460a mov r2, r1 8940: b530 push {r4, r5, lr} if (type() != SD_CARD_TYPE_SDHC) { 8942: 6d9b ldr r3, [r3, #88] ; 0x58 bool SharedSpiCard::writeStart(uint32_t sector) { 8944: b083 sub sp, #12 8946: 4d16 ldr r5, [pc, #88] ; (89a0 ) 8948: 4604 mov r4, r0 if (type() != SD_CARD_TYPE_SDHC) { 894a: 42ab cmp r3, r5 894c: d124 bne.n 8998 return m_type; 894e: 7d40 ldrb r0, [r0, #21] 8950: 2803 cmp r0, #3 if (cardCommand(CMD25, sector)) { 8952: f04f 0119 mov.w r1, #25 8956: 4620 mov r0, r4 sector <<= 9; 8958: bf18 it ne 895a: 0252 lslne r2, r2, #9 if (cardCommand(CMD25, sector)) { 895c: f7ff fcec bl 8338 8960: b920 cbnz r0, 896c m_state = WRITE_STATE; 8962: 2302 movs r3, #2 return true; 8964: 2001 movs r0, #1 m_state = WRITE_STATE; 8966: 74e3 strb r3, [r4, #19] } 8968: b003 add sp, #12 896a: bd30 pop {r4, r5, pc} m_errorCode = code; 896c: 230e movs r3, #14 if (m_spiActive) { 896e: 7ca0 ldrb r0, [r4, #18] 8970: 7463 strb r3, [r4, #17] 8972: 2800 cmp r0, #0 8974: d0f8 beq.n 8968 m_spiDriver.send(data); 8976: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 8978: 7c20 ldrb r0, [r4, #16] 897a: 2101 movs r1, #1 897c: f001 fbde bl a13c m_spiDriver.send(data); 8980: 21ff movs r1, #255 ; 0xff 8982: 4628 mov r0, r5 8984: f001 fc40 bl a208 m_spiDriver.deactivate(); 8988: 4628 mov r0, r5 898a: f001 fbf7 bl a17c m_spiActive = false; 898e: 2300 movs r3, #0 } 8990: 4618 mov r0, r3 m_spiActive = false; 8992: 74a3 strb r3, [r4, #18] } 8994: b003 add sp, #12 8996: bd30 pop {r4, r5, pc} 8998: 9101 str r1, [sp, #4] if (type() != SD_CARD_TYPE_SDHC) { 899a: 4798 blx r3 899c: 9a01 ldr r2, [sp, #4] 899e: e7d7 b.n 8950 89a0: 00007fdd .word 0x00007fdd 000089a4 : if (!readCSD(&csd)) { 89a4: 6803 ldr r3, [r0, #0] bool SharedSpiCard::erase(uint32_t firstSector, uint32_t lastSector) { 89a6: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} if (!readCSD(&csd)) { 89aa: 6cdb ldr r3, [r3, #76] ; 0x4c bool SharedSpiCard::erase(uint32_t firstSector, uint32_t lastSector) { 89ac: 4617 mov r7, r2 89ae: 4a41 ldr r2, [pc, #260] ; (8ab4 ) 89b0: b085 sub sp, #20 89b2: 4604 mov r4, r0 89b4: 460e mov r6, r1 89b6: 4293 cmp r3, r2 89b8: d145 bne.n 8a46 return readRegister(CMD9, csd); 89ba: 466a mov r2, sp 89bc: 2109 movs r1, #9 89be: f7ff fe65 bl 868c 89c2: 4605 mov r5, r0 if (!readCSD(&csd)) { 89c4: b1b5 cbz r5, 89f4 if (!csd.v1.erase_blk_en) { 89c6: f89d 300a ldrb.w r3, [sp, #10] 89ca: 065a lsls r2, r3, #25 89cc: d518 bpl.n 8a00 if (m_type != SD_CARD_TYPE_SDHC) { 89ce: 7d63 ldrb r3, [r4, #21] 89d0: 2b03 cmp r3, #3 89d2: d001 beq.n 89d8 firstSector <<= 9; 89d4: 0276 lsls r6, r6, #9 lastSector <<= 9; 89d6: 027f lsls r7, r7, #9 if (cardCommand(CMD32, firstSector) 89d8: 4632 mov r2, r6 89da: 2120 movs r1, #32 89dc: 4620 mov r0, r4 89de: f7ff fcab bl 8338 || cardCommand(CMD38, 0)) { 89e2: b928 cbnz r0, 89f0 || cardCommand(CMD33, lastSector) 89e4: 463a mov r2, r7 89e6: 2121 movs r1, #33 ; 0x21 89e8: 4620 mov r0, r4 89ea: f7ff fca5 bl 8338 89ee: b370 cbz r0, 8a4e m_errorCode = code; 89f0: 2326 movs r3, #38 ; 0x26 89f2: 7463 strb r3, [r4, #17] if (m_spiActive) { 89f4: 7ca5 ldrb r5, [r4, #18] 89f6: b99d cbnz r5, 8a20 } 89f8: 4628 mov r0, r5 89fa: b005 add sp, #20 89fc: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} uint8_t m = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; 8a00: f003 033f and.w r3, r3, #63 ; 0x3f 8a04: f89d 200b ldrb.w r2, [sp, #11] 8a08: 005b lsls r3, r3, #1 if ((firstSector & m) != 0 || ((lastSector + 1) & m) != 0) { 8a0a: ea43 13d2 orr.w r3, r3, r2, lsr #7 8a0e: 1c7a adds r2, r7, #1 8a10: 4332 orrs r2, r6 8a12: 4213 tst r3, r2 8a14: d0db beq.n 89ce 8a16: 2327 movs r3, #39 ; 0x27 if (m_spiActive) { 8a18: 7ca5 ldrb r5, [r4, #18] 8a1a: 7463 strb r3, [r4, #17] 8a1c: 2d00 cmp r5, #0 8a1e: d0eb beq.n 89f8 m_spiDriver.send(data); 8a20: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 8a22: 7c20 ldrb r0, [r4, #16] 8a24: 2101 movs r1, #1 8a26: f001 fb89 bl a13c m_spiDriver.send(data); 8a2a: 21ff movs r1, #255 ; 0xff 8a2c: 4628 mov r0, r5 8a2e: f001 fbeb bl a208 m_spiDriver.deactivate(); 8a32: 4628 mov r0, r5 8a34: f001 fba2 bl a17c m_spiActive = false; 8a38: 2300 movs r3, #0 return false; 8a3a: 461d mov r5, r3 m_spiActive = false; 8a3c: 74a3 strb r3, [r4, #18] } 8a3e: 4628 mov r0, r5 8a40: b005 add sp, #20 8a42: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} if (!readCSD(&csd)) { 8a46: 4669 mov r1, sp 8a48: 4798 blx r3 8a4a: 4605 mov r5, r0 8a4c: e7ba b.n 89c4 || cardCommand(CMD38, 0)) { 8a4e: 4602 mov r2, r0 8a50: 2126 movs r1, #38 ; 0x26 8a52: 4620 mov r0, r4 8a54: f7ff fc70 bl 8338 8a58: 2800 cmp r0, #0 8a5a: d1c9 bne.n 89f0 8a5c: f8df 8058 ldr.w r8, [pc, #88] ; 8ab8 m_endTime = ms + millis16(); 8a60: f242 7710 movw r7, #10000 ; 0x2710 return m_spiDriver.receive(); 8a64: f104 0904 add.w r9, r4, #4 8a68: f8d8 3000 ldr.w r3, [r8] 8a6c: 441f add r7, r3 8a6e: b2bf uxth r7, r7 explicit Timeout(uint16_t ms) {set(ms);} 8a70: e004 b.n 8a7c 8a72: f8d8 3000 ldr.w r3, [r8] return (int16_t)(m_endTime - millis16()) < 0; 8a76: 1afb subs r3, r7, r3 if (timeout.timedOut()) { 8a78: 041b lsls r3, r3, #16 8a7a: d417 bmi.n 8aac 8a7c: 4648 mov r0, r9 8a7e: f001 fba9 bl a1d4 while (spiReceive() != 0XFF) { 8a82: 28ff cmp r0, #255 ; 0xff 8a84: 4606 mov r6, r0 8a86: d1f4 bne.n 8a72 if (m_spiActive) { 8a88: 7ca3 ldrb r3, [r4, #18] 8a8a: 2b00 cmp r3, #0 8a8c: d0b4 beq.n 89f8 sdCsWrite(m_csPin, true); 8a8e: 2101 movs r1, #1 8a90: 7c20 ldrb r0, [r4, #16] return true; 8a92: 461d mov r5, r3 8a94: f001 fb52 bl a13c m_spiDriver.send(data); 8a98: 4631 mov r1, r6 8a9a: 4648 mov r0, r9 8a9c: f001 fbb4 bl a208 m_spiDriver.deactivate(); 8aa0: 4648 mov r0, r9 8aa2: f001 fb6b bl a17c m_spiActive = false; 8aa6: 2300 movs r3, #0 8aa8: 74a3 strb r3, [r4, #18] } 8aaa: e7a5 b.n 89f8 m_errorCode = code; 8aac: 2328 movs r3, #40 ; 0x28 8aae: 7463 strb r3, [r4, #17] goto fail; 8ab0: e7a0 b.n 89f4 8ab2: bf00 nop 8ab4: 00008abd .word 0x00008abd 8ab8: 20002d90 .word 0x20002d90 00008abc : bool readCSD(csd_t* csd) { 8abc: b570 push {r4, r5, r6, lr} if (cardCommand(cmd, 0)) { 8abe: 2200 movs r2, #0 8ac0: b082 sub sp, #8 8ac2: 460e mov r6, r1 8ac4: 2109 movs r1, #9 8ac6: 4604 mov r4, r0 8ac8: f7ff fc36 bl 8338 8acc: b1b0 cbz r0, 8afc m_errorCode = code; 8ace: 231b movs r3, #27 8ad0: 7463 strb r3, [r4, #17] if (m_spiActive) { 8ad2: 7ca0 ldrb r0, [r4, #18] 8ad4: b908 cbnz r0, 8ada } 8ad6: b002 add sp, #8 8ad8: bd70 pop {r4, r5, r6, pc} m_spiDriver.send(data); 8ada: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 8adc: 7c20 ldrb r0, [r4, #16] 8ade: 2101 movs r1, #1 8ae0: f001 fb2c bl a13c m_spiDriver.send(data); 8ae4: 21ff movs r1, #255 ; 0xff 8ae6: 4628 mov r0, r5 8ae8: f001 fb8e bl a208 m_spiDriver.deactivate(); 8aec: 4628 mov r0, r5 8aee: f001 fb45 bl a17c m_spiActive = false; 8af2: 2300 movs r3, #0 return false; 8af4: 4618 mov r0, r3 m_spiActive = false; 8af6: 74a3 strb r3, [r4, #18] } 8af8: b002 add sp, #8 8afa: bd70 pop {r4, r5, r6, pc} if (!readData(dst, 16)) { 8afc: 4605 mov r5, r0 8afe: 2210 movs r2, #16 8b00: 4631 mov r1, r6 8b02: 4620 mov r0, r4 8b04: f7ff fb6e bl 81e4 8b08: 2800 cmp r0, #0 8b0a: d0e2 beq.n 8ad2 if (m_spiActive) { 8b0c: 7ca6 ldrb r6, [r4, #18] 8b0e: 2e00 cmp r6, #0 8b10: d0e1 beq.n 8ad6 sdCsWrite(m_csPin, true); 8b12: 7c20 ldrb r0, [r4, #16] 8b14: 2101 movs r1, #1 8b16: f001 fb11 bl a13c m_spiDriver.send(data); 8b1a: 1d20 adds r0, r4, #4 8b1c: 21ff movs r1, #255 ; 0xff 8b1e: 9001 str r0, [sp, #4] 8b20: f001 fb72 bl a208 m_spiDriver.deactivate(); 8b24: 9801 ldr r0, [sp, #4] 8b26: f001 fb29 bl a17c } 8b2a: 4630 mov r0, r6 m_spiActive = false; 8b2c: 74a5 strb r5, [r4, #18] } 8b2e: b002 add sp, #8 8b30: bd70 pop {r4, r5, r6, pc} 8b32: bf00 nop 00008b34 : bool readCID(cid_t* cid) { 8b34: b570 push {r4, r5, r6, lr} if (cardCommand(cmd, 0)) { 8b36: 2200 movs r2, #0 8b38: b082 sub sp, #8 8b3a: 460e mov r6, r1 8b3c: 210a movs r1, #10 8b3e: 4604 mov r4, r0 8b40: f7ff fbfa bl 8338 8b44: b1b0 cbz r0, 8b74 m_errorCode = code; 8b46: 231b movs r3, #27 8b48: 7463 strb r3, [r4, #17] if (m_spiActive) { 8b4a: 7ca0 ldrb r0, [r4, #18] 8b4c: b908 cbnz r0, 8b52 } 8b4e: b002 add sp, #8 8b50: bd70 pop {r4, r5, r6, pc} m_spiDriver.send(data); 8b52: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 8b54: 7c20 ldrb r0, [r4, #16] 8b56: 2101 movs r1, #1 8b58: f001 faf0 bl a13c m_spiDriver.send(data); 8b5c: 21ff movs r1, #255 ; 0xff 8b5e: 4628 mov r0, r5 8b60: f001 fb52 bl a208 m_spiDriver.deactivate(); 8b64: 4628 mov r0, r5 8b66: f001 fb09 bl a17c m_spiActive = false; 8b6a: 2300 movs r3, #0 return false; 8b6c: 4618 mov r0, r3 m_spiActive = false; 8b6e: 74a3 strb r3, [r4, #18] } 8b70: b002 add sp, #8 8b72: bd70 pop {r4, r5, r6, pc} if (!readData(dst, 16)) { 8b74: 4605 mov r5, r0 8b76: 2210 movs r2, #16 8b78: 4631 mov r1, r6 8b7a: 4620 mov r0, r4 8b7c: f7ff fb32 bl 81e4 8b80: 2800 cmp r0, #0 8b82: d0e2 beq.n 8b4a if (m_spiActive) { 8b84: 7ca6 ldrb r6, [r4, #18] 8b86: 2e00 cmp r6, #0 8b88: d0e1 beq.n 8b4e sdCsWrite(m_csPin, true); 8b8a: 7c20 ldrb r0, [r4, #16] 8b8c: 2101 movs r1, #1 8b8e: f001 fad5 bl a13c m_spiDriver.send(data); 8b92: 1d20 adds r0, r4, #4 8b94: 21ff movs r1, #255 ; 0xff 8b96: 9001 str r0, [sp, #4] 8b98: f001 fb36 bl a208 m_spiDriver.deactivate(); 8b9c: 9801 ldr r0, [sp, #4] 8b9e: f001 faed bl a17c } 8ba2: 4630 mov r0, r6 m_spiActive = false; 8ba4: 74a5 strb r5, [r4, #18] } 8ba6: b002 add sp, #8 8ba8: bd70 pop {r4, r5, r6, pc} 8baa: bf00 nop 00008bac : bool SharedSpiCard::writeData(uint8_t token, const uint8_t* src) { 8bac: b570 push {r4, r5, r6, lr} m_spiDriver.send(data); 8bae: 1d05 adds r5, r0, #4 8bb0: 4616 mov r6, r2 8bb2: 4604 mov r4, r0 8bb4: 4628 mov r0, r5 8bb6: f001 fb27 bl a208 m_spiDriver.send(buf, n); 8bba: f44f 7200 mov.w r2, #512 ; 0x200 8bbe: 4631 mov r1, r6 8bc0: 4628 mov r0, r5 8bc2: f001 fb2b bl a21c m_spiDriver.send(data); 8bc6: 21ff movs r1, #255 ; 0xff 8bc8: 4628 mov r0, r5 8bca: f001 fb1d bl a208 8bce: 21ff movs r1, #255 ; 0xff 8bd0: 4628 mov r0, r5 8bd2: f001 fb19 bl a208 return m_spiDriver.receive(); 8bd6: 4628 mov r0, r5 8bd8: f001 fafc bl a1d4 if ((m_status & DATA_RES_MASK) != DATA_RES_ACCEPTED) { 8bdc: f000 031f and.w r3, r0, #31 m_status = spiReceive(); 8be0: 7520 strb r0, [r4, #20] if ((m_status & DATA_RES_MASK) != DATA_RES_ACCEPTED) { 8be2: 2b05 cmp r3, #5 8be4: d004 beq.n 8bf0 m_errorCode = code; 8be6: 2320 movs r3, #32 if (m_spiActive) { 8be8: 7ca0 ldrb r0, [r4, #18] 8bea: 7463 strb r3, [r4, #17] 8bec: b910 cbnz r0, 8bf4 } 8bee: bd70 pop {r4, r5, r6, pc} return true; 8bf0: 2001 movs r0, #1 } 8bf2: bd70 pop {r4, r5, r6, pc} sdCsWrite(m_csPin, true); 8bf4: 7c20 ldrb r0, [r4, #16] 8bf6: 2101 movs r1, #1 8bf8: f001 faa0 bl a13c m_spiDriver.send(data); 8bfc: 21ff movs r1, #255 ; 0xff 8bfe: 4628 mov r0, r5 8c00: f001 fb02 bl a208 m_spiDriver.deactivate(); 8c04: 4628 mov r0, r5 8c06: f001 fab9 bl a17c m_spiActive = false; 8c0a: 2300 movs r3, #0 } 8c0c: 4618 mov r0, r3 m_spiActive = false; 8c0e: 74a3 strb r3, [r4, #18] } 8c10: bd70 pop {r4, r5, r6, pc} 8c12: bf00 nop 00008c14 : bool SharedSpiCard::writeData(const uint8_t* src) { 8c14: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 8c18: 4d17 ldr r5, [pc, #92] ; (8c78 ) 8c1a: 4606 mov r6, r0 8c1c: 460f mov r7, r1 return m_spiDriver.receive(); 8c1e: f100 0804 add.w r8, r0, #4 8c22: 682c ldr r4, [r5, #0] m_endTime = ms + millis16(); 8c24: f504 7416 add.w r4, r4, #600 ; 0x258 8c28: b2a4 uxth r4, r4 explicit Timeout(uint16_t ms) {set(ms);} 8c2a: e003 b.n 8c34 8c2c: 682b ldr r3, [r5, #0] return (int16_t)(m_endTime - millis16()) < 0; 8c2e: 1ae3 subs r3, r4, r3 if (timeout.timedOut()) { 8c30: 041b lsls r3, r3, #16 8c32: d40c bmi.n 8c4e 8c34: 4640 mov r0, r8 8c36: f001 facd bl a1d4 while (spiReceive() != 0XFF) { 8c3a: 28ff cmp r0, #255 ; 0xff 8c3c: d1f6 bne.n 8c2c if (!writeData(WRITE_MULTIPLE_TOKEN, src)) { 8c3e: 463a mov r2, r7 8c40: 21fc movs r1, #252 ; 0xfc 8c42: 4630 mov r0, r6 8c44: f7ff ffb2 bl 8bac 8c48: b118 cbz r0, 8c52 } 8c4a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_errorCode = code; 8c4e: 2324 movs r3, #36 ; 0x24 8c50: 7473 strb r3, [r6, #17] if (m_spiActive) { 8c52: 7cb0 ldrb r0, [r6, #18] 8c54: 2800 cmp r0, #0 8c56: d0f8 beq.n 8c4a sdCsWrite(m_csPin, true); 8c58: 7c30 ldrb r0, [r6, #16] 8c5a: 2101 movs r1, #1 8c5c: f001 fa6e bl a13c m_spiDriver.send(data); 8c60: 21ff movs r1, #255 ; 0xff 8c62: 4640 mov r0, r8 8c64: f001 fad0 bl a208 m_spiDriver.deactivate(); 8c68: 4640 mov r0, r8 8c6a: f001 fa87 bl a17c m_spiActive = false; 8c6e: 2300 movs r3, #0 } 8c70: 4618 mov r0, r3 m_spiActive = false; 8c72: 74b3 strb r3, [r6, #18] } 8c74: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 8c78: 20002d90 .word 0x20002d90 00008c7c : if (type() != SD_CARD_TYPE_SDHC) { 8c7c: 6803 ldr r3, [r0, #0] bool SharedSpiCard::writeSector(uint32_t sector, const uint8_t* src) { 8c7e: b570 push {r4, r5, r6, lr} if (type() != SD_CARD_TYPE_SDHC) { 8c80: 6d9b ldr r3, [r3, #88] ; 0x58 bool SharedSpiCard::writeSector(uint32_t sector, const uint8_t* src) { 8c82: 4616 mov r6, r2 8c84: 4a22 ldr r2, [pc, #136] ; (8d10 ) 8c86: b082 sub sp, #8 8c88: 4604 mov r4, r0 8c8a: 460d mov r5, r1 8c8c: 4293 cmp r3, r2 8c8e: d13c bne.n 8d0a return m_type; 8c90: 7d40 ldrb r0, [r0, #21] if (type() != SD_CARD_TYPE_SDHC) { 8c92: 2803 cmp r0, #3 if (cardCommand(CMD24, sector)) { 8c94: f04f 0118 mov.w r1, #24 8c98: 4620 mov r0, r4 sector <<= 9; 8c9a: bf18 it ne 8c9c: 026d lslne r5, r5, #9 if (cardCommand(CMD24, sector)) { 8c9e: 462a mov r2, r5 8ca0: f7ff fb4a bl 8338 8ca4: 4605 mov r5, r0 8ca6: b1b0 cbz r0, 8cd6 m_errorCode = code; 8ca8: 230d movs r3, #13 8caa: 7463 strb r3, [r4, #17] if (m_spiActive) { 8cac: 7ca0 ldrb r0, [r4, #18] 8cae: b908 cbnz r0, 8cb4 } 8cb0: b002 add sp, #8 8cb2: bd70 pop {r4, r5, r6, pc} m_spiDriver.send(data); 8cb4: 1d25 adds r5, r4, #4 sdCsWrite(m_csPin, true); 8cb6: 7c20 ldrb r0, [r4, #16] 8cb8: 2101 movs r1, #1 8cba: f001 fa3f bl a13c m_spiDriver.send(data); 8cbe: 21ff movs r1, #255 ; 0xff 8cc0: 4628 mov r0, r5 8cc2: f001 faa1 bl a208 m_spiDriver.deactivate(); 8cc6: 4628 mov r0, r5 8cc8: f001 fa58 bl a17c m_spiActive = false; 8ccc: 2300 movs r3, #0 return false; 8cce: 4618 mov r0, r3 m_spiActive = false; 8cd0: 74a3 strb r3, [r4, #18] } 8cd2: b002 add sp, #8 8cd4: bd70 pop {r4, r5, r6, pc} if (!writeData(DATA_START_SECTOR, src)) { 8cd6: 4632 mov r2, r6 8cd8: 21fe movs r1, #254 ; 0xfe 8cda: 4620 mov r0, r4 8cdc: f7ff ff66 bl 8bac 8ce0: 2800 cmp r0, #0 8ce2: d0e3 beq.n 8cac if (m_spiActive) { 8ce4: 7ca6 ldrb r6, [r4, #18] 8ce6: 2e00 cmp r6, #0 8ce8: d0e2 beq.n 8cb0 sdCsWrite(m_csPin, true); 8cea: 7c20 ldrb r0, [r4, #16] 8cec: 2101 movs r1, #1 8cee: f001 fa25 bl a13c m_spiDriver.send(data); 8cf2: 1d20 adds r0, r4, #4 8cf4: 21ff movs r1, #255 ; 0xff 8cf6: 9001 str r0, [sp, #4] 8cf8: f001 fa86 bl a208 m_spiDriver.deactivate(); 8cfc: 9801 ldr r0, [sp, #4] 8cfe: f001 fa3d bl a17c return true; 8d02: 4630 mov r0, r6 m_spiActive = false; 8d04: 74a5 strb r5, [r4, #18] } 8d06: b002 add sp, #8 8d08: bd70 pop {r4, r5, r6, pc} if (type() != SD_CARD_TYPE_SDHC) { 8d0a: 4798 blx r3 8d0c: e7c1 b.n 8c92 8d0e: bf00 nop 8d10: 00007fdd .word 0x00007fdd 00008d14 : bool DedicatedSpiCard::writeSector(uint32_t sector, const uint8_t* src) { 8d14: b410 push {r4} if (m_dedicatedSpi) { 8d16: 7f04 ldrb r4, [r0, #28] 8d18: b134 cbz r4, 8d28 return writeSectors(sector, src, 1); 8d1a: 6804 ldr r4, [r0, #0] 8d1c: 2301 movs r3, #1 8d1e: 6aa4 ldr r4, [r4, #40] ; 0x28 8d20: 46a4 mov ip, r4 } 8d22: f85d 4b04 ldr.w r4, [sp], #4 return writeSectors(sector, src, 1); 8d26: 4760 bx ip } 8d28: f85d 4b04 ldr.w r4, [sp], #4 return SharedSpiCard::writeSector(sector, src); 8d2c: f7ff bfa6 b.w 8c7c 00008d30 : bool DedicatedSpiCard::begin(SdSpiConfig spiConfig) { 8d30: b510 push {r4, lr} 8d32: b084 sub sp, #16 8d34: 4604 mov r4, r0 8d36: f10d 0c04 add.w ip, sp, #4 8d3a: e88c 000e stmia.w ip, {r1, r2, r3} if (!SharedSpiCard::begin(spiConfig)) { 8d3e: e89c 000e ldmia.w ip, {r1, r2, r3} 8d42: f7ff fb6d bl 8420 8d46: b120 cbz r0, 8d52 const uint8_t DEDICATED_SPI = 1; /** * \param[in] opt option field of SdSpiConfig. * \return true for dedicated SPI. */ inline bool spiOptionDedicated(uint8_t opt) {return opt & DEDICATED_SPI;} 8d48: f89d 3005 ldrb.w r3, [sp, #5] 8d4c: f003 0301 and.w r3, r3, #1 8d50: 7723 strb r3, [r4, #28] } 8d52: b004 add sp, #16 8d54: bd10 pop {r4, pc} 8d56: bf00 nop 00008d58 : virtual bool hasDedicatedSpi() {return false;} 8d58: 2000 movs r0, #0 8d5a: 4770 bx lr 00008d5c : bool virtual isDedicatedSpi() {return false;} 8d5c: 2000 movs r0, #0 8d5e: 4770 bx lr 00008d60 : } 8d60: 2000 movs r0, #0 8d62: 4770 bx lr 00008d64 : */ bool begin(SdioConfig sdioConfig); /** Disable an SDIO card. * not implemented. */ void end() {} 8d64: 4770 bx lr 8d66: bf00 nop 00008d68 : return false; } //============================================================================== // ISR static void sdIrs() { SDHC_IRQSIGEN = 0; 8d68: 4b08 ldr r3, [pc, #32] ; (8d8c ) 8d6a: 2100 movs r1, #0 m_irqstat = SDHC_IRQSTAT; 8d6c: 4a08 ldr r2, [pc, #32] ; (8d90 ) SDHC_IRQSTAT = m_irqstat; #if defined(__IMXRT1062__) SDHC_MIX_CTRL &= ~(SDHC_MIX_CTRL_AC23EN | SDHC_MIX_CTRL_DMAEN); #endif m_dmaBusy = false; 8d6e: 4809 ldr r0, [pc, #36] ; (8d94 ) static void sdIrs() { 8d70: b410 push {r4} SDHC_IRQSIGEN = 0; 8d72: 6399 str r1, [r3, #56] ; 0x38 m_irqstat = SDHC_IRQSTAT; 8d74: 6b1c ldr r4, [r3, #48] ; 0x30 8d76: 6014 str r4, [r2, #0] SDHC_IRQSTAT = m_irqstat; 8d78: 6812 ldr r2, [r2, #0] } 8d7a: f85d 4b04 ldr.w r4, [sp], #4 SDHC_IRQSTAT = m_irqstat; 8d7e: 631a str r2, [r3, #48] ; 0x30 SDHC_MIX_CTRL &= ~(SDHC_MIX_CTRL_AC23EN | SDHC_MIX_CTRL_DMAEN); 8d80: 6c9a ldr r2, [r3, #72] ; 0x48 8d82: f022 0281 bic.w r2, r2, #129 ; 0x81 8d86: 649a str r2, [r3, #72] ; 0x48 m_dmaBusy = false; 8d88: 7001 strb r1, [r0, #0] } 8d8a: 4770 bx lr 8d8c: 402c0000 .word 0x402c0000 8d90: 20002448 .word 0x20002448 8d94: 20002df6 .word 0x20002df6 00008d98 : static bool isBusyCommandInhibit() { return SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB; } //------------------------------------------------------------------------------ static bool isBusyDat() { return SDHC_PRSSTAT & (1 << 24) ? false : true; 8d98: 4b03 ldr r3, [pc, #12] ; (8da8 ) 8d9a: 6a58 ldr r0, [r3, #36] ; 0x24 8d9c: f080 7080 eor.w r0, r0, #16777216 ; 0x1000000 } 8da0: f3c0 6000 ubfx r0, r0, #24, #1 8da4: 4770 bx lr 8da6: bf00 nop 8da8: 402c0000 .word 0x402c0000 00008dac : //------------------------------------------------------------------------------ static bool isBusyDMA() { return m_dmaBusy; 8dac: 4b01 ldr r3, [pc, #4] ; (8db4 ) 8dae: 7818 ldrb r0, [r3, #0] } 8db0: 4770 bx lr 8db2: bf00 nop 8db4: 20002df6 .word 0x20002df6 00008db8 : uint32_t divider = ((CCM_CSCDR1 >> 11) & 0x7) + 1; 8db8: 4a2b ldr r2, [pc, #172] ; (8e68 ) return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; 8dba: 4b2c ldr r3, [pc, #176] ; (8e6c ) uint32_t divider = ((CCM_CSCDR1 >> 11) & 0x7) + 1; 8dbc: 6a52 ldr r2, [r2, #36] ; 0x24 return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; 8dbe: f8d3 3100 ldr.w r3, [r3, #256] ; 0x100 8dc2: 492b ldr r1, [pc, #172] ; (8e70 ) uint32_t divider = ((CCM_CSCDR1 >> 11) & 0x7) + 1; 8dc4: f3c2 22c2 ubfx r2, r2, #11, #3 return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; 8dc8: f003 033f and.w r3, r3, #63 ; 0x3f uint32_t divider = ((CCM_CSCDR1 >> 11) & 0x7) + 1; 8dcc: 3201 adds r2, #1 } d[15] = 0; return true; } //------------------------------------------------------------------------------ static void setSdclk(uint32_t kHzMax) { 8dce: b570 push {r4, r5, r6, lr} return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; 8dd0: 4c28 ldr r4, [pc, #160] ; (8e74 ) const uint32_t DVS_LIMIT = 0X10; const uint32_t SDCLKFS_LIMIT = 0X100; uint32_t dvs = 1; uint32_t sdclkfs = 1; uint32_t maxSdclk = 1000*kHzMax; 8dd2: f44f 757a mov.w r5, #1000 ; 0x3e8 return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; 8dd6: fba4 4303 umull r4, r3, r4, r3 uint32_t maxSdclk = 1000*kHzMax; 8dda: fb05 f000 mul.w r0, r5, r0 return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; 8dde: 089b lsrs r3, r3, #2 8de0: fbb1 fef3 udiv lr, r1, r3 8de4: fbbe fef2 udiv lr, lr, r2 uint32_t base = baseClock(); while ((base/(sdclkfs*DVS_LIMIT) > maxSdclk) && (sdclkfs < SDCLKFS_LIMIT)) { 8de8: ebb0 1f1e cmp.w r0, lr, lsr #4 8dec: d235 bcs.n 8e5a uint32_t sdclkfs = 1; 8dee: 2301 movs r3, #1 sdclkfs <<= 1; 8df0: 461e mov r6, r3 8df2: 005b lsls r3, r3, #1 while ((base/(sdclkfs*DVS_LIMIT) > maxSdclk) && (sdclkfs < SDCLKFS_LIMIT)) { 8df4: 011a lsls r2, r3, #4 8df6: fbbe f2f2 udiv r2, lr, r2 8dfa: 4282 cmp r2, r0 8dfc: d901 bls.n 8e02 8dfe: 2bff cmp r3, #255 ; 0xff 8e00: d9f6 bls.n 8df0 } while ((base/(sdclkfs*dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { 8e02: fbbe f2f3 udiv r2, lr, r3 // Change dividers. uint32_t sysctl = SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK | SDHC_SYSCTL_DVS_MASK | SDHC_SYSCTL_SDCLKFS_MASK); SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) | SDHC_SYSCTL_SDCLKFS(sdclkfs); 8e06: 0236 lsls r6, r6, #8 while ((base/(sdclkfs*dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { 8e08: 4290 cmp r0, r2 8e0a: d22a bcs.n 8e62 8e0c: ea4f 0c43 mov.w ip, r3, lsl #1 8e10: 2201 movs r2, #1 8e12: e000 b.n 8e16 8e14: 46a4 mov ip, r4 dvs++; 8e16: 4615 mov r5, r2 while ((base/(sdclkfs*dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { 8e18: eb03 040c add.w r4, r3, ip dvs++; 8e1c: 3201 adds r2, #1 while ((base/(sdclkfs*dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { 8e1e: fbbe f1fc udiv r1, lr, ip 8e22: 4281 cmp r1, r0 8e24: d917 bls.n 8e56 8e26: 2a10 cmp r2, #16 8e28: d1f4 bne.n 8e14 8e2a: 25f0 movs r5, #240 ; 0xf0 m_sdClkKhz = base/(1000*sdclkfs*dvs); 8e2c: f44f 737a mov.w r3, #1000 ; 0x3e8 8e30: 4911 ldr r1, [pc, #68] ; (8e78 ) uint32_t sysctl = SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK 8e32: 4a12 ldr r2, [pc, #72] ; (8e7c ) m_sdClkKhz = base/(1000*sdclkfs*dvs); 8e34: fb03 fc0c mul.w ip, r3, ip 8e38: fbbe f3fc udiv r3, lr, ip 8e3c: 600b str r3, [r1, #0] | SDHC_SYSCTL_DVS_MASK | SDHC_SYSCTL_SDCLKFS_MASK); 8e3e: 4b10 ldr r3, [pc, #64] ; (8e80 ) uint32_t sysctl = SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK 8e40: 6ad1 ldr r1, [r2, #44] ; 0x2c | SDHC_SYSCTL_DVS_MASK | SDHC_SYSCTL_SDCLKFS_MASK); 8e42: 400b ands r3, r1 SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) 8e44: 432b orrs r3, r5 | SDHC_SYSCTL_SDCLKFS(sdclkfs); 8e46: 4333 orrs r3, r6 8e48: f443 2360 orr.w r3, r3, #917504 ; 0xe0000 SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) 8e4c: 62d3 str r3, [r2, #44] ; 0x2c // Wait until the SDHC clock is stable. while (!(SDHC_PRSSTAT & SDHC_PRSSTAT_SDSTB)) { 8e4e: 6a53 ldr r3, [r2, #36] ; 0x24 8e50: 071b lsls r3, r3, #28 8e52: d5fc bpl.n 8e4e #if defined(__MK64FX512__) || defined(__MK66FX1M0__) // Enable the SDHC clock. SDHC_SYSCTL |= SDHC_SYSCTL_SDCLKEN; #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) } 8e54: bd70 pop {r4, r5, r6, pc} SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) 8e56: 012d lsls r5, r5, #4 8e58: e7e8 b.n 8e2c while ((base/(sdclkfs*DVS_LIMIT) > maxSdclk) && (sdclkfs < SDCLKFS_LIMIT)) { 8e5a: 4672 mov r2, lr 8e5c: 2600 movs r6, #0 uint32_t sdclkfs = 1; 8e5e: 2301 movs r3, #1 8e60: e7d2 b.n 8e08 while ((base/(sdclkfs*dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { 8e62: 469c mov ip, r3 8e64: 2500 movs r5, #0 8e66: e7e1 b.n 8e2c 8e68: 400fc000 .word 0x400fc000 8e6c: 400d8000 .word 0x400d8000 8e70: 5e69ec00 .word 0x5e69ec00 8e74: aaaaaaab .word 0xaaaaaaab 8e78: 20002414 .word 0x20002414 8e7c: 402c0000 .word 0x402c0000 8e80: fff0000f .word 0xfff0000f 00008e84 : } return true; } //------------------------------------------------------------------------------ uint8_t SdioCard::errorCode() const { return m_errorCode; 8e84: 4b01 ldr r3, [pc, #4] ; (8e8c ) } 8e86: 7818 ldrb r0, [r3, #0] 8e88: 4770 bx lr 8e8a: bf00 nop 8e8c: 2000153a .word 0x2000153a 00008e90 : //------------------------------------------------------------------------------ uint32_t SdioCard::errorData() const { return m_irqstat; 8e90: 4b01 ldr r3, [pc, #4] ; (8e98 ) 8e92: 6818 ldr r0, [r3, #0] } 8e94: 4770 bx lr 8e96: bf00 nop 8e98: 20002448 .word 0x20002448 00008e9c : //------------------------------------------------------------------------------ uint32_t SdioCard::kHzSdClk() { return m_sdClkKhz; } //------------------------------------------------------------------------------ bool SdioCard::readCID(cid_t* cid) { 8e9c: b410 push {r4} memcpy(cid, &m_cid, 16); 8e9e: 4c07 ldr r4, [pc, #28] ; (8ebc ) bool SdioCard::readCID(cid_t* cid) { 8ea0: 468c mov ip, r1 memcpy(cid, &m_cid, 16); 8ea2: cc0f ldmia r4!, {r0, r1, r2, r3} 8ea4: f8cc 0000 str.w r0, [ip] return true; } 8ea8: 2001 movs r0, #1 memcpy(cid, &m_cid, 16); 8eaa: f8cc 1004 str.w r1, [ip, #4] 8eae: f8cc 2008 str.w r2, [ip, #8] 8eb2: f8cc 300c str.w r3, [ip, #12] } 8eb6: f85d 4b04 ldr.w r4, [sp], #4 8eba: 4770 bx lr 8ebc: 2000241c .word 0x2000241c 00008ec0 : //------------------------------------------------------------------------------ bool SdioCard::readCSD(csd_t* csd) { 8ec0: b410 push {r4} memcpy(csd, &m_csd, 16); 8ec2: 4c07 ldr r4, [pc, #28] ; (8ee0 ) bool SdioCard::readCSD(csd_t* csd) { 8ec4: 468c mov ip, r1 memcpy(csd, &m_csd, 16); 8ec6: cc0f ldmia r4!, {r0, r1, r2, r3} 8ec8: f8cc 0000 str.w r0, [ip] return true; } 8ecc: 2001 movs r0, #1 memcpy(csd, &m_csd, 16); 8ece: f8cc 1004 str.w r1, [ip, #4] 8ed2: f8cc 2008 str.w r2, [ip, #8] 8ed6: f8cc 300c str.w r3, [ip, #12] } 8eda: f85d 4b04 ldr.w r4, [sp], #4 8ede: 4770 bx lr 8ee0: 2000242c .word 0x2000242c 00008ee4 : SDHC_IRQSTAT = m_irqstat; return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); } //------------------------------------------------------------------------------ bool SdioCard::readOCR(uint32_t* ocr) { *ocr = m_ocr; 8ee4: 4b02 ldr r3, [pc, #8] ; (8ef0 ) return true; } 8ee6: 2001 movs r0, #1 *ocr = m_ocr; 8ee8: 681b ldr r3, [r3, #0] 8eea: 600b str r3, [r1, #0] } 8eec: 4770 bx lr 8eee: bf00 nop 8ef0: 2000243c .word 0x2000243c 00008ef4 : class SdioCard : public SdCardInterface { 8ef4: 4770 bx lr 8ef6: bf00 nop 00008ef8 : 8ef8: b510 push {r4, lr} 8efa: 4604 mov r4, r0 8efc: 210c movs r1, #12 8efe: f002 fae9 bl b4d4 8f02: 4620 mov r0, r4 8f04: bd10 pop {r4, pc} 8f06: bf00 nop 00008f08 : } return true; } //------------------------------------------------------------------------------ uint8_t SdioCard::type() const { return m_version2 ? m_highCapacity ? 8f08: 4b04 ldr r3, [pc, #16] ; (8f1c ) 8f0a: 781b ldrb r3, [r3, #0] 8f0c: b123 cbz r3, 8f18 8f0e: 4b04 ldr r3, [pc, #16] ; (8f20 ) 8f10: 7818 ldrb r0, [r3, #0] 8f12: 3002 adds r0, #2 8f14: b2c0 uxtb r0, r0 8f16: 4770 bx lr 8f18: 2001 movs r0, #1 SD_CARD_TYPE_SDHC : SD_CARD_TYPE_SD2 : SD_CARD_TYPE_SD1; } 8f1a: 4770 bx lr 8f1c: 20002df3 .word 0x20002df3 8f20: 20002df4 .word 0x20002df4 00008f24 : if (csd->v1.csd_ver == 0) { 8f24: 4b18 ldr r3, [pc, #96] ; (8f88 ) 8f26: 781a ldrb r2, [r3, #0] 8f28: f012 02c0 ands.w r2, r2, #192 ; 0xc0 8f2c: d00f beq.n 8f4e } else if (csd->v2.csd_ver == 1) { 8f2e: 2a40 cmp r2, #64 ; 0x40 8f30: d001 beq.n 8f36 } else { return 0; 8f32: 2000 movs r0, #0 } 8f34: 4770 bx lr ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; 8f36: 7a58 ldrb r0, [r3, #9] return (((uint32_t)csd->v2.c_size_high << 16) + 8f38: 79da ldrb r2, [r3, #7] ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; 8f3a: 7a19 ldrb r1, [r3, #8] 8f3c: 3001 adds r0, #1 return (((uint32_t)csd->v2.c_size_high << 16) + 8f3e: f002 033f and.w r3, r2, #63 ; 0x3f ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; 8f42: eb00 4003 add.w r0, r0, r3, lsl #16 8f46: eb00 2001 add.w r0, r0, r1, lsl #8 8f4a: 0280 lsls r0, r0, #10 8f4c: 4770 bx lr uint8_t c_size_mult = (csd->v1.c_size_mult_high << 1) 8f4e: 7a5a ldrb r2, [r3, #9] uint16_t c_size = (csd->v1.c_size_high << 10) 8f50: 7999 ldrb r1, [r3, #6] | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 8f52: 79d8 ldrb r0, [r3, #7] uint8_t c_size_mult = (csd->v1.c_size_mult_high << 1) 8f54: f002 0203 and.w r2, r2, #3 | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 8f58: f893 c008 ldrb.w ip, [r3, #8] uint16_t c_size = (csd->v1.c_size_high << 10) 8f5c: f001 0103 and.w r1, r1, #3 | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 8f60: 0080 lsls r0, r0, #2 | csd->v1.c_size_mult_low; 8f62: 0052 lsls r2, r2, #1 | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 8f64: ea40 2081 orr.w r0, r0, r1, lsl #10 uint32_t SdioCard::sectorCount() { 8f68: b500 push {lr} | csd->v1.c_size_mult_low; 8f6a: f893 e00a ldrb.w lr, [r3, #10] | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; 8f6e: ea40 109c orr.w r0, r0, ip, lsr #6 uint8_t read_bl_len = csd->v1.read_bl_len; 8f72: 795b ldrb r3, [r3, #5] return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); 8f74: ea42 12de orr.w r2, r2, lr, lsr #7 8f78: 3001 adds r0, #1 8f7a: f003 030f and.w r3, r3, #15 8f7e: 4413 add r3, r2 8f80: 3b07 subs r3, #7 8f82: 4098 lsls r0, r3 } 8f84: f85d fb04 ldr.w pc, [sp], #4 8f88: 2000242c .word 0x2000242c 00008f8c : CCM_ANALOG_PFD_528 |= (1 << 7); 8f8c: 4a40 ldr r2, [pc, #256] ; (9090 ) IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = mode; // DAT2 8f8e: 2005 movs r0, #5 8f90: 4940 ldr r1, [pc, #256] ; (9094 ) static void initSDHC() { 8f92: b538 push {r3, r4, r5, lr} CCM_ANALOG_PFD_528 |= (1 << 7); 8f94: f8d2 4100 ldr.w r4, [r2, #256] ; 0x100 CCM_CCGR6 |= CCM_CCGR6_USDHC1(CCM_CCGR_ON); 8f98: 4b3f ldr r3, [pc, #252] ; (9098 ) CCM_ANALOG_PFD_528 |= (1 << 7); 8f9a: f044 0480 orr.w r4, r4, #128 ; 0x80 SDHC_MIX_CTRL |= 0x80000000; 8f9e: 4d3f ldr r5, [pc, #252] ; (909c ) CCM_ANALOG_PFD_528 |= (1 << 7); 8fa0: f8c2 4100 str.w r4, [r2, #256] ; 0x100 CCM_ANALOG_PFD_528 &= ~(0x3F << 0); 8fa4: f8d2 4100 ldr.w r4, [r2, #256] ; 0x100 8fa8: f024 043f bic.w r4, r4, #63 ; 0x3f 8fac: f8c2 4100 str.w r4, [r2, #256] ; 0x100 CCM_ANALOG_PFD_528 |= ((24) & 0x3F << 0); // 12 - 35 8fb0: f8d2 4100 ldr.w r4, [r2, #256] ; 0x100 8fb4: f044 0418 orr.w r4, r4, #24 8fb8: f8c2 4100 str.w r4, [r2, #256] ; 0x100 CCM_ANALOG_PFD_528 &= ~(1 << 7); 8fbc: f8d2 4100 ldr.w r4, [r2, #256] ; 0x100 8fc0: f024 0480 bic.w r4, r4, #128 ; 0x80 8fc4: f8c2 4100 str.w r4, [r2, #256] ; 0x100 CCM_CCGR6 |= CCM_CCGR6_USDHC1(CCM_CCGR_ON); 8fc8: f8d3 2080 ldr.w r2, [r3, #128] ; 0x80 8fcc: f042 020c orr.w r2, r2, #12 8fd0: f8c3 2080 str.w r2, [r3, #128] ; 0x80 CCM_CSCDR1 &= ~(CCM_CSCDR1_USDHC1_CLK_PODF_MASK); 8fd4: 6a5a ldr r2, [r3, #36] ; 0x24 8fd6: f422 5260 bic.w r2, r2, #14336 ; 0x3800 8fda: 625a str r2, [r3, #36] ; 0x24 CCM_CSCMR1 |= CCM_CSCMR1_USDHC1_CLK_SEL; // PLL2PFD0 8fdc: 69da ldr r2, [r3, #28] 8fde: f442 3280 orr.w r2, r2, #65536 ; 0x10000 8fe2: 61da str r2, [r3, #28] CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((1)); 8fe4: 6a5a ldr r2, [r3, #36] ; 0x24 8fe6: f442 6200 orr.w r2, r2, #2048 ; 0x800 8fea: 625a str r2, [r3, #36] ; 0x24 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = mode; // DAT2 8fec: f8c1 01cc str.w r0, [r1, #460] ; 0x1cc IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = mode; // DAT3 8ff0: f8c1 01d0 str.w r0, [r1, #464] ; 0x1d0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00 = mode; // CMD 8ff4: f8c1 01bc str.w r0, [r1, #444] ; 0x1bc IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01 = mode; // CLK 8ff8: f8c1 01c0 str.w r0, [r1, #448] ; 0x1c0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02 = mode; // DAT0 8ffc: f8c1 01c4 str.w r0, [r1, #452] ; 0x1c4 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03 = mode; // DAT1 9000: f8c1 01c8 str.w r0, [r1, #456] ; 0x1c8 SDHC_MIX_CTRL |= 0x80000000; 9004: 6caa ldr r2, [r5, #72] ; 0x48 SDHC_SYSCTL |= SDHC_SYSCTL_RSTA | SDHC_SYSCTL_SDCLKFS(0x80); 9006: 4b26 ldr r3, [pc, #152] ; (90a0 ) SDHC_MIX_CTRL |= 0x80000000; 9008: f042 4200 orr.w r2, r2, #2147483648 ; 0x80000000 900c: 64aa str r2, [r5, #72] ; 0x48 SDHC_SYSCTL |= SDHC_SYSCTL_RSTA | SDHC_SYSCTL_SDCLKFS(0x80); 900e: 6aea ldr r2, [r5, #44] ; 0x2c 9010: 4313 orrs r3, r2 9012: 62eb str r3, [r5, #44] ; 0x2c while (SDHC_SYSCTL & SDHC_SYSCTL_RSTA) { 9014: 6aec ldr r4, [r5, #44] ; 0x2c 9016: f014 7480 ands.w r4, r4, #16777216 ; 0x1000000 901a: d1fb bne.n 9014 setSdclk(SD_MAX_INIT_RATE_KHZ); 901c: f44f 70c8 mov.w r0, #400 ; 0x190 9020: f7ff feca bl 8db8 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = mode; // DAT2 9024: 4b1b ldr r3, [pc, #108] ; (9094 ) IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = DATA_MASK; // DAT2 9026: f247 02b8 movw r2, #28856 ; 0x70b8 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_01 = CLOCK_MASK; // CLK 902a: f241 01b8 movw r1, #4280 ; 0x10b8 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = mode; // DAT2 902e: f8c3 41cc str.w r4, [r3, #460] ; 0x1cc SDHC_IRQSTATEN = SDHC_IRQSTATEN_MASK; 9032: 481c ldr r0, [pc, #112] ; (90a4 ) IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = mode; // DAT3 9034: f8c3 41d0 str.w r4, [r3, #464] ; 0x1d0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00 = mode; // CMD 9038: f8c3 41bc str.w r4, [r3, #444] ; 0x1bc IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01 = mode; // CLK 903c: f8c3 41c0 str.w r4, [r3, #448] ; 0x1c0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02 = mode; // DAT0 9040: f8c3 41c4 str.w r4, [r3, #452] ; 0x1c4 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03 = mode; // DAT1 9044: f8c3 41c8 str.w r4, [r3, #456] ; 0x1c8 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = DATA_MASK; // DAT2 9048: f8c3 23bc str.w r2, [r3, #956] ; 0x3bc IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_05 = DATA_MASK; // DAT3 904c: f8c3 23c0 str.w r2, [r3, #960] ; 0x3c0 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_00 = DATA_MASK; // CMD 9050: f8c3 23ac str.w r2, [r3, #940] ; 0x3ac IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_01 = CLOCK_MASK; // CLK 9054: f8c3 13b0 str.w r1, [r3, #944] ; 0x3b0 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_02 = DATA_MASK; // DAT0 9058: f8c3 23b4 str.w r2, [r3, #948] ; 0x3b4 static inline void attachInterruptVector(IRQ_NUMBER_t irq, void (*function)(void)) { _VectorsRam[irq + 16] = function; asm volatile("": : :"memory"); } 905c: 4912 ldr r1, [pc, #72] ; (90a8 ) IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_03 = DATA_MASK; // DAT1 905e: f8c3 23b8 str.w r2, [r3, #952] ; 0x3b8 9062: 4b12 ldr r3, [pc, #72] ; (90ac ) SDHC_IRQSTATEN = SDHC_IRQSTATEN_MASK; 9064: 6368 str r0, [r5, #52] ; 0x34 9066: f8c1 31f8 str.w r3, [r1, #504] ; 0x1f8 NVIC_ENABLE_IRQ(IRQ_SDHC); 906a: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 906e: f44f 4280 mov.w r2, #16384 ; 0x4000 NVIC_SET_PRIORITY(IRQ_SDHC, 6*16); 9072: 490f ldr r1, [pc, #60] ; (90b0 ) 9074: 2060 movs r0, #96 ; 0x60 9076: f881 006e strb.w r0, [r1, #110] ; 0x6e NVIC_ENABLE_IRQ(IRQ_SDHC); 907a: f8c3 210c str.w r2, [r3, #268] ; 0x10c SDHC_SYSCTL |= SDHC_SYSCTL_INITA; 907e: 6aeb ldr r3, [r5, #44] ; 0x2c while (SDHC_SYSCTL & SDHC_SYSCTL_INITA) { 9080: 4a06 ldr r2, [pc, #24] ; (909c ) SDHC_SYSCTL |= SDHC_SYSCTL_INITA; 9082: f043 6300 orr.w r3, r3, #134217728 ; 0x8000000 9086: 62eb str r3, [r5, #44] ; 0x2c while (SDHC_SYSCTL & SDHC_SYSCTL_INITA) { 9088: 6ad3 ldr r3, [r2, #44] ; 0x2c 908a: 011b lsls r3, r3, #4 908c: d4fc bmi.n 9088 } 908e: bd38 pop {r3, r4, r5, pc} 9090: 400d8000 .word 0x400d8000 9094: 401f8000 .word 0x401f8000 9098: 400fc000 .word 0x400fc000 909c: 402c0000 .word 0x402c0000 90a0: 01008000 .word 0x01008000 90a4: 117f000b .word 0x117f000b 90a8: 20001800 .word 0x20001800 90ac: 00008d69 .word 0x00008d69 90b0: e000e400 .word 0xe000e400 000090b4 : static bool waitTransferComplete() { 90b4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} uint32_t m = micros(); 90b8: f002 f8ca bl b250 return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_TC | SDHC_IRQSTAT_ERROR)); 90bc: 4e17 ldr r6, [pc, #92] ; (911c ) 90be: 4d18 ldr r5, [pc, #96] ; (9120 ) uint32_t m = micros(); 90c0: 4607 mov r7, r0 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 90c2: f8df 8074 ldr.w r8, [pc, #116] ; 9138 while (fcn()) { 90c6: e004 b.n 90d2 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 90c8: f002 f8c2 bl b250 90cc: 1bc0 subs r0, r0, r7 90ce: 4540 cmp r0, r8 90d0: d81b bhi.n 910a return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_TC | SDHC_IRQSTAT_ERROR)); 90d2: 6b34 ldr r4, [r6, #48] ; 0x30 while (fcn()) { 90d4: 402c ands r4, r5 90d6: d0f7 beq.n 90c8 m_transferActive = false; 90d8: 4a12 ldr r2, [pc, #72] ; (9124 ) 90da: 2100 movs r1, #0 m_irqstat = SDHC_IRQSTAT; 90dc: 4b12 ldr r3, [pc, #72] ; (9128 ) m_transferActive = false; 90de: 7011 strb r1, [r2, #0] m_irqstat = SDHC_IRQSTAT; 90e0: 6b32 ldr r2, [r6, #48] ; 0x30 90e2: 601a str r2, [r3, #0] SDHC_IRQSTAT = m_irqstat; 90e4: 6819 ldr r1, [r3, #0] if (timeOut || (m_irqstat & SDHC_IRQSTAT_ERROR)) { 90e6: 4a11 ldr r2, [pc, #68] ; (912c ) SDHC_IRQSTAT = m_irqstat; 90e8: 6331 str r1, [r6, #48] ; 0x30 if (timeOut || (m_irqstat & SDHC_IRQSTAT_ERROR)) { 90ea: 681b ldr r3, [r3, #0] 90ec: 4213 tst r3, r2 90ee: d009 beq.n 9104 m_errorCode = code; 90f0: 490f ldr r1, [pc, #60] ; (9130 ) 90f2: 241f movs r4, #31 m_errorLine = line; 90f4: 4b0f ldr r3, [pc, #60] ; (9134 ) 90f6: f240 227a movw r2, #634 ; 0x27a return sdError(SD_CARD_ERROR_TRANSFER_COMPLETE); 90fa: 2000 movs r0, #0 m_errorCode = code; 90fc: 700c strb r4, [r1, #0] m_errorLine = line; 90fe: 601a str r2, [r3, #0] } 9100: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return true; 9104: 2001 movs r0, #1 } 9106: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_transferActive = false; 910a: 4a06 ldr r2, [pc, #24] ; (9124 ) m_irqstat = SDHC_IRQSTAT; 910c: 4b06 ldr r3, [pc, #24] ; (9128 ) m_transferActive = false; 910e: 7014 strb r4, [r2, #0] m_irqstat = SDHC_IRQSTAT; 9110: 6b32 ldr r2, [r6, #48] ; 0x30 9112: 601a str r2, [r3, #0] SDHC_IRQSTAT = m_irqstat; 9114: 681b ldr r3, [r3, #0] 9116: 6333 str r3, [r6, #48] ; 0x30 if (timeOut || (m_irqstat & SDHC_IRQSTAT_ERROR)) { 9118: e7ea b.n 90f0 911a: bf00 nop 911c: 402c0000 .word 0x402c0000 9120: 117f0002 .word 0x117f0002 9124: 20002df5 .word 0x20002df5 9128: 20002448 .word 0x20002448 912c: 117f0000 .word 0x117f0000 9130: 2000153a .word 0x2000153a 9134: 20002418 .word 0x20002418 9138: 000f4240 .word 0x000f4240 0000913c : //------------------------------------------------------------------------------ bool SdioCard::writeData(const uint8_t* src) { 913c: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} if (!m_transferActive) { 9140: 4c26 ldr r4, [pc, #152] ; (91dc ) bool SdioCard::writeData(const uint8_t* src) { 9142: 460f mov r7, r1 if (!m_transferActive) { 9144: 7823 ldrb r3, [r4, #0] 9146: 2b00 cmp r3, #0 9148: d138 bne.n 91bc DBG_IRQSTAT(); if (!waitTransferComplete()) { return false; } const uint32_t* p32 = reinterpret_cast(src); if (!(SDHC_PRSSTAT & SDHC_PRSSTAT_WTA)) { 914a: 4b25 ldr r3, [pc, #148] ; (91e0 ) 914c: 6a5a ldr r2, [r3, #36] ; 0x24 914e: 05d2 lsls r2, r2, #23 9150: d52b bpl.n 91aa SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; SDHC_PROCTL |= SDHC_PROCTL_CREQ; } SDHC_PROCTL |= SDHC_PROCTL_SABGREQ; 9152: 4d23 ldr r5, [pc, #140] ; (91e0 ) if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9154: f8df 8094 ldr.w r8, [pc, #148] ; 91ec SDHC_PROCTL |= SDHC_PROCTL_SABGREQ; 9158: 6aab ldr r3, [r5, #40] ; 0x28 915a: f443 3380 orr.w r3, r3, #65536 ; 0x10000 915e: 62ab str r3, [r5, #40] ; 0x28 uint32_t m = micros(); 9160: f002 f876 bl b250 9164: 4606 mov r6, r0 while (fcn()) { 9166: e004 b.n 9172 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9168: f002 f872 bl b250 916c: 1b80 subs r0, r0, r6 916e: 4540 cmp r0, r8 9170: d82a bhi.n 91c8 return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN); 9172: 6a6b ldr r3, [r5, #36] ; 0x24 while (fcn()) { 9174: f413 6980 ands.w r9, r3, #1024 ; 0x400 9178: d0f6 beq.n 9168 917a: f107 0c3c add.w ip, r7, #60 ; 0x3c if (waitTimeout(isBusyFifoWrite)) { return sdError(SD_CARD_ERROR_WRITE_FIFO); } for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN)) { 917e: 4818 ldr r0, [pc, #96] ; (91e0 ) 9180: f507 770f add.w r7, r7, #572 ; 0x23c 9184: 6a43 ldr r3, [r0, #36] ; 0x24 9186: 055b lsls r3, r3, #21 9188: d5fc bpl.n 9184 918a: f1ac 0340 sub.w r3, ip, #64 ; 0x40 } for (uint32_t i = 0; i < FIFO_WML; i++) { SDHC_DATPORT = p32[i]; 918e: f853 2f04 ldr.w r2, [r3, #4]! for (uint32_t i = 0; i < FIFO_WML; i++) { 9192: 459c cmp ip, r3 SDHC_DATPORT = p32[i]; 9194: 6202 str r2, [r0, #32] for (uint32_t i = 0; i < FIFO_WML; i++) { 9196: d1fa bne.n 918e for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { 9198: f10c 0c40 add.w ip, ip, #64 ; 0x40 919c: 45bc cmp ip, r7 919e: d1f1 bne.n 9184 } p32 += FIFO_WML; } m_transferActive = true; 91a0: 2301 movs r3, #1 return true; 91a2: 4618 mov r0, r3 m_transferActive = true; 91a4: 7023 strb r3, [r4, #0] } 91a6: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 91aa: 6a9a ldr r2, [r3, #40] ; 0x28 91ac: f422 3280 bic.w r2, r2, #65536 ; 0x10000 91b0: 629a str r2, [r3, #40] ; 0x28 SDHC_PROCTL |= SDHC_PROCTL_CREQ; 91b2: 6a9a ldr r2, [r3, #40] ; 0x28 91b4: f442 3200 orr.w r2, r2, #131072 ; 0x20000 91b8: 629a str r2, [r3, #40] ; 0x28 91ba: e7ca b.n 9152 91bc: f7ff ff7a bl 90b4 if (!waitTransferComplete()) { 91c0: 2800 cmp r0, #0 91c2: d1c2 bne.n 914a } 91c4: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} m_errorCode = code; 91c8: 4906 ldr r1, [pc, #24] ; (91e4 ) 91ca: 2421 movs r4, #33 ; 0x21 m_errorLine = line; 91cc: 4b06 ldr r3, [pc, #24] ; (91e8 ) 91ce: f44f 727e mov.w r2, #1016 ; 0x3f8 return sdError(SD_CARD_ERROR_WRITE_FIFO); 91d2: 4648 mov r0, r9 m_errorCode = code; 91d4: 700c strb r4, [r1, #0] m_errorLine = line; 91d6: 601a str r2, [r3, #0] } 91d8: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 91dc: 20002df5 .word 0x20002df5 91e0: 402c0000 .word 0x402c0000 91e4: 2000153a .word 0x2000153a 91e8: 20002418 .word 0x20002418 91ec: 000f4240 .word 0x000f4240 000091f0 : static bool cardCommand(uint32_t xfertyp, uint32_t arg) { 91f0: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 91f4: 4607 mov r7, r0 91f6: 4688 mov r8, r1 return SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB; 91f8: 4c1f ldr r4, [pc, #124] ; (9278 ) uint32_t m = micros(); 91fa: f002 f829 bl b250 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 91fe: 4e1f ldr r6, [pc, #124] ; (927c ) uint32_t m = micros(); 9200: 4605 mov r5, r0 while (fcn()) { 9202: e004 b.n 920e if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9204: f002 f824 bl b250 9208: 1b43 subs r3, r0, r5 920a: 42b3 cmp r3, r6 920c: d824 bhi.n 9258 return SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB; 920e: 6a63 ldr r3, [r4, #36] ; 0x24 while (fcn()) { 9210: 07d9 lsls r1, r3, #31 9212: d4f7 bmi.n 9204 if (xfertyp & SDHC_XFERTYP_DPSEL) { 9214: 02bb lsls r3, r7, #10 SDHC_CMDARG = arg; 9216: f8c4 8008 str.w r8, [r4, #8] if (xfertyp & SDHC_XFERTYP_DPSEL) { 921a: d420 bmi.n 925e xfertyp &= ~SDHC_MIX_CTRL_MASK; 921c: f027 03ff bic.w r3, r7, #255 ; 0xff SDHC_XFERTYP = xfertyp; 9220: 4c15 ldr r4, [pc, #84] ; (9278 ) return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_CC | SDHC_IRQSTAT_CMD_ERROR)); 9222: 4e17 ldr r6, [pc, #92] ; (9280 ) SDHC_XFERTYP = xfertyp; 9224: 60e3 str r3, [r4, #12] uint32_t m = micros(); 9226: f002 f813 bl b250 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 922a: 4f14 ldr r7, [pc, #80] ; (927c ) uint32_t m = micros(); 922c: 4605 mov r5, r0 while (fcn()) { 922e: e004 b.n 923a if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9230: f002 f80e bl b250 9234: 1b40 subs r0, r0, r5 9236: 42b8 cmp r0, r7 9238: d80e bhi.n 9258 return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_CC | SDHC_IRQSTAT_CMD_ERROR)); 923a: 6b23 ldr r3, [r4, #48] ; 0x30 while (fcn()) { 923c: 4233 tst r3, r6 923e: d0f7 beq.n 9230 m_irqstat = SDHC_IRQSTAT; 9240: 6b22 ldr r2, [r4, #48] ; 0x30 9242: 4b10 ldr r3, [pc, #64] ; (9284 ) 9244: 601a str r2, [r3, #0] SDHC_IRQSTAT = m_irqstat; 9246: 681a ldr r2, [r3, #0] 9248: 6322 str r2, [r4, #48] ; 0x30 return (m_irqstat & SDHC_IRQSTAT_CC) && 924a: 681a ldr r2, [r3, #0] 924c: 07d2 lsls r2, r2, #31 924e: d503 bpl.n 9258 !(m_irqstat & SDHC_IRQSTAT_CMD_ERROR); 9250: 681b ldr r3, [r3, #0] return (m_irqstat & SDHC_IRQSTAT_CC) && 9252: f413 2f70 tst.w r3, #983040 ; 0xf0000 9256: d00b beq.n 9270 9258: 2000 movs r0, #0 } 925a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} SDHC_MIX_CTRL &= ~SDHC_MIX_CTRL_MASK; 925e: 6ca2 ldr r2, [r4, #72] ; 0x48 SDHC_MIX_CTRL |= xfertyp & SDHC_MIX_CTRL_MASK; 9260: b2fb uxtb r3, r7 SDHC_MIX_CTRL &= ~SDHC_MIX_CTRL_MASK; 9262: f022 02ff bic.w r2, r2, #255 ; 0xff 9266: 64a2 str r2, [r4, #72] ; 0x48 SDHC_MIX_CTRL |= xfertyp & SDHC_MIX_CTRL_MASK; 9268: 6ca2 ldr r2, [r4, #72] ; 0x48 926a: 4313 orrs r3, r2 926c: 64a3 str r3, [r4, #72] ; 0x48 926e: e7d5 b.n 921c return (m_irqstat & SDHC_IRQSTAT_CC) && 9270: 2001 movs r0, #1 } 9272: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 9276: bf00 nop 9278: 402c0000 .word 0x402c0000 927c: 000f4240 .word 0x000f4240 9280: 000f0001 .word 0x000f0001 9284: 20002448 .word 0x20002448 00009288 : if (!cardCommand(xfertyp, m_rca)) { 9288: 4b15 ldr r3, [pc, #84] ; (92e0 ) static bool readReg16(uint32_t xfertyp, void* data) { 928a: b530 push {r4, r5, lr} 928c: 460d mov r5, r1 928e: b085 sub sp, #20 if (!cardCommand(xfertyp, m_rca)) { 9290: 6819 ldr r1, [r3, #0] 9292: f7ff ffad bl 91f0 9296: b308 cbz r0, 92dc uint32_t sr[] = {SDHC_CMDRSP0, SDHC_CMDRSP1, SDHC_CMDRSP2, SDHC_CMDRSP3}; 9298: 4b12 ldr r3, [pc, #72] ; (92e4 ) 929a: f105 040f add.w r4, r5, #15 929e: 691a ldr r2, [r3, #16] 92a0: 9200 str r2, [sp, #0] 92a2: 6959 ldr r1, [r3, #20] 92a4: 9101 str r1, [sp, #4] 92a6: 6999 ldr r1, [r3, #24] 92a8: 9102 str r1, [sp, #8] 92aa: 69db ldr r3, [r3, #28] 92ac: 9303 str r3, [sp, #12] for (int i = 0; i < 15; i++) { 92ae: 2300 movs r3, #0 92b0: e001 b.n 92b6 d[14 - i] = sr[i/4] >> 8*(i%4); 92b2: f85e 2c10 ldr.w r2, [lr, #-16] 92b6: f003 0c03 and.w ip, r3, #3 for (int i = 0; i < 15; i++) { 92ba: 3301 adds r3, #1 d[14 - i] = sr[i/4] >> 8*(i%4); 92bc: ea4f 0ccc mov.w ip, ip, lsl #3 92c0: f023 0e03 bic.w lr, r3, #3 for (int i = 0; i < 15; i++) { 92c4: 2b0f cmp r3, #15 d[14 - i] = sr[i/4] >> 8*(i%4); 92c6: fa22 f20c lsr.w r2, r2, ip 92ca: f10e 0110 add.w r1, lr, #16 92ce: f804 2d01 strb.w r2, [r4, #-1]! 92d2: eb0d 0e01 add.w lr, sp, r1 for (int i = 0; i < 15; i++) { 92d6: d1ec bne.n 92b2 d[15] = 0; 92d8: 2300 movs r3, #0 92da: 73eb strb r3, [r5, #15] } 92dc: b005 add sp, #20 92de: bd30 pop {r4, r5, pc} 92e0: 20002440 .word 0x20002440 92e4: 402c0000 .word 0x402c0000 000092e8 : bool SdioCard::isBusy() { 92e8: b510 push {r4, lr} bool useDma() {return m_options & DMA_SDIO;} 92ea: 7a03 ldrb r3, [r0, #8] if (m_sdioConfig.useDma()) { 92ec: 07db lsls r3, r3, #31 92ee: d505 bpl.n 92fc return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); 92f0: 4b15 ldr r3, [pc, #84] ; (9348 ) 92f2: 681b ldr r3, [r3, #0] 92f4: b1b3 cbz r3, 9324 } 92f6: e8bd 4010 ldmia.w sp!, {r4, lr} return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); 92fa: 4718 bx r3 if (m_transferActive) { 92fc: 4b13 ldr r3, [pc, #76] ; (934c ) 92fe: 781b ldrb r3, [r3, #0] 9300: b93b cbnz r3, 9312 return SDHC_PRSSTAT & (1 << 24) ? false : true; 9302: 4b13 ldr r3, [pc, #76] ; (9350 ) 9304: 6a5c ldr r4, [r3, #36] ; 0x24 9306: f084 7480 eor.w r4, r4, #16777216 ; 0x1000000 930a: f3c4 6400 ubfx r4, r4, #24, #1 } 930e: 4620 mov r0, r4 9310: bd10 pop {r4, pc} return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_TC | SDHC_IRQSTAT_ERROR)); 9312: 4b0f ldr r3, [pc, #60] ; (9350 ) 9314: 4c0f ldr r4, [pc, #60] ; (9354 ) 9316: 6b1b ldr r3, [r3, #48] ; 0x30 9318: 401c ands r4, r3 if (isBusyTransferComplete()) { 931a: fab4 f484 clz r4, r4 931e: 0964 lsrs r4, r4, #5 } 9320: 4620 mov r0, r4 9322: bd10 pop {r4, pc} return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); 9324: 4b0c ldr r3, [pc, #48] ; (9358 ) 9326: 781c ldrb r4, [r3, #0] 9328: 2c00 cmp r4, #0 932a: d0f0 beq.n 930e return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 932c: 4b0b ldr r3, [pc, #44] ; (935c ) 932e: 480c ldr r0, [pc, #48] ; (9360 ) 9330: 6819 ldr r1, [r3, #0] 9332: f7ff ff5d bl 91f0 9336: 2800 cmp r0, #0 9338: d0e9 beq.n 930e 933a: 4b05 ldr r3, [pc, #20] ; (9350 ) 933c: 691c ldr r4, [r3, #16] return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); 933e: f484 7480 eor.w r4, r4, #256 ; 0x100 9342: f3c4 2400 ubfx r4, r4, #8, #1 9346: e7e2 b.n 930e 9348: 20002444 .word 0x20002444 934c: 20002df5 .word 0x20002df5 9350: 402c0000 .word 0x402c0000 9354: 117f0002 .word 0x117f0002 9358: 20002df2 .word 0x20002df2 935c: 20002440 .word 0x20002440 9360: 0d1a0000 .word 0x0d1a0000 00009364 : uint32_t SdioCard::status() { 9364: b508 push {r3, lr} return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 9366: 4b04 ldr r3, [pc, #16] ; (9378 ) 9368: 4804 ldr r0, [pc, #16] ; (937c ) 936a: 6819 ldr r1, [r3, #0] 936c: f7ff ff40 bl 91f0 9370: b108 cbz r0, 9376 9372: 4b03 ldr r3, [pc, #12] ; (9380 ) 9374: 6918 ldr r0, [r3, #16] } 9376: bd08 pop {r3, pc} 9378: 20002440 .word 0x20002440 937c: 0d1a0000 .word 0x0d1a0000 9380: 402c0000 .word 0x402c0000 00009384 : static bool isBusyCMD13() { 9384: b508 push {r3, lr} return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 9386: 4b07 ldr r3, [pc, #28] ; (93a4 ) 9388: 4807 ldr r0, [pc, #28] ; (93a8 ) 938a: 6819 ldr r1, [r3, #0] 938c: f7ff ff30 bl 91f0 9390: b130 cbz r0, 93a0 9392: 4b06 ldr r3, [pc, #24] ; (93ac ) 9394: 6918 ldr r0, [r3, #16] return !(statusCMD13() & CARD_STATUS_READY_FOR_DATA); 9396: f480 7080 eor.w r0, r0, #256 ; 0x100 939a: f3c0 2000 ubfx r0, r0, #8, #1 } 939e: bd08 pop {r3, pc} 93a0: 2001 movs r0, #1 93a2: bd08 pop {r3, pc} 93a4: 20002440 .word 0x20002440 93a8: 0d1a0000 .word 0x0d1a0000 93ac: 402c0000 .word 0x402c0000 000093b0 : } } return true; } //------------------------------------------------------------------------------ bool SdioCard::writeStart(uint32_t sector) { 93b0: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} m_busyFcn = fcn; 93b4: 4b29 ldr r3, [pc, #164] ; (945c ) bool SdioCard::writeStart(uint32_t sector) { 93b6: 4689 mov r9, r1 m_busyFcn = fcn; 93b8: f8df a0c0 ldr.w sl, [pc, #192] ; 947c 93bc: 4e28 ldr r6, [pc, #160] ; (9460 ) 93be: f8ca 3000 str.w r3, [sl] uint32_t m = micros(); 93c2: f001 ff45 bl b250 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 93c6: 4d27 ldr r5, [pc, #156] ; (9464 ) uint32_t m = micros(); 93c8: 4604 mov r4, r0 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 93ca: f8df 80b4 ldr.w r8, [pc, #180] ; 9480 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 93ce: 4f26 ldr r7, [pc, #152] ; (9468 ) while (fcn()) { 93d0: e006 b.n 93e0 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 93d2: f001 ff3d bl b250 93d6: 1b00 subs r0, r0, r4 93d8: 42b8 cmp r0, r7 93da: d829 bhi.n 9430 yield(); 93dc: f003 ffcc bl d378 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 93e0: 6831 ldr r1, [r6, #0] 93e2: 4628 mov r0, r5 93e4: f7ff ff04 bl 91f0 93e8: 2800 cmp r0, #0 93ea: d0f2 beq.n 93d2 93ec: f8d8 3010 ldr.w r3, [r8, #16] while (fcn()) { 93f0: 05db lsls r3, r3, #23 93f2: d5ee bpl.n 93d2 m_busyFcn = 0; 93f4: 2300 movs r3, #0 } SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; #if defined(__IMXRT1062__) // Infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); 93f6: f44f 7200 mov.w r2, #512 ; 0x200 m_busyFcn = 0; 93fa: f8ca 3000 str.w r3, [sl] SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 93fe: f8d8 3028 ldr.w r3, [r8, #40] ; 0x28 9402: f423 3380 bic.w r3, r3, #65536 ; 0x10000 9406: f8c8 3028 str.w r3, [r8, #40] ; 0x28 #else // defined(__IMXRT1062__) // Errata - can't do infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(MAX_BLKCNT) | SDHC_BLKATTR_BLKSIZE(512); #endif // defined(__IMXRT1062__) if (!cardCommand(CMD25_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { 940a: 4b18 ldr r3, [pc, #96] ; (946c ) SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); 940c: f8c8 2004 str.w r2, [r8, #4] if (!cardCommand(CMD25_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { 9410: 781b ldrb r3, [r3, #0] 9412: b1cb cbz r3, 9448 9414: 4649 mov r1, r9 9416: 4816 ldr r0, [pc, #88] ; (9470 ) 9418: f7ff feea bl 91f0 941c: b930 cbnz r0, 942c m_errorCode = code; 941e: 4915 ldr r1, [pc, #84] ; (9474 ) 9420: 240e movs r4, #14 m_errorLine = line; 9422: 4b15 ldr r3, [pc, #84] ; (9478 ) 9424: f240 4257 movw r2, #1111 ; 0x457 m_errorCode = code; 9428: 700c strb r4, [r1, #0] m_errorLine = line; 942a: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD25); } return true; } 942c: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} m_errorCode = code; 9430: 4a10 ldr r2, [pc, #64] ; (9474 ) 9432: 210a movs r1, #10 m_busyFcn = 0; 9434: 2000 movs r0, #0 m_errorLine = line; 9436: 4b10 ldr r3, [pc, #64] ; (9478 ) m_errorCode = code; 9438: 7011 strb r1, [r2, #0] m_errorLine = line; 943a: f240 424b movw r2, #1099 ; 0x44b m_busyFcn = 0; 943e: f8ca 0000 str.w r0, [sl] m_errorLine = line; 9442: 601a str r2, [r3, #0] } 9444: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} if (!cardCommand(CMD25_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { 9448: ea4f 2949 mov.w r9, r9, lsl #9 944c: 4808 ldr r0, [pc, #32] ; (9470 ) 944e: 4649 mov r1, r9 9450: f7ff fece bl 91f0 9454: 2800 cmp r0, #0 9456: d1e9 bne.n 942c 9458: e7e1 b.n 941e 945a: bf00 nop 945c: 00009385 .word 0x00009385 9460: 20002440 .word 0x20002440 9464: 0d1a0000 .word 0x0d1a0000 9468: 000f4240 .word 0x000f4240 946c: 20002df4 .word 0x20002df4 9470: 193a0020 .word 0x193a0020 9474: 2000153a .word 0x2000153a 9478: 20002418 .word 0x20002418 947c: 20002444 .word 0x20002444 9480: 402c0000 .word 0x402c0000 00009484 : bool SdioCard::readStop() { 9484: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 9488: 4c25 ldr r4, [pc, #148] ; (9520 ) if (!cardCommand(CMD12_XFERTYP, 0)) { 948a: 2100 movs r1, #0 948c: 4825 ldr r0, [pc, #148] ; (9524 ) SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 948e: 6aa3 ldr r3, [r4, #40] ; 0x28 9490: f423 3380 bic.w r3, r3, #65536 ; 0x10000 9494: 62a3 str r3, [r4, #40] ; 0x28 if (!cardCommand(CMD12_XFERTYP, 0)) { 9496: f7ff feab bl 91f0 949a: 4605 mov r5, r0 949c: b948 cbnz r0, 94b2 m_errorCode = code; 949e: 4922 ldr r1, [pc, #136] ; (9528 ) 94a0: 2009 movs r0, #9 m_errorLine = line; 94a2: 4b22 ldr r3, [pc, #136] ; (952c ) 94a4: f240 223d movw r2, #573 ; 0x23d m_errorCode = code; 94a8: 7008 strb r0, [r1, #0] m_errorLine = line; 94aa: 601a str r2, [r3, #0] } 94ac: 4628 mov r0, r5 94ae: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_busyFcn = fcn; 94b2: 4b1f ldr r3, [pc, #124] ; (9530 ) 94b4: f8df 8080 ldr.w r8, [pc, #128] ; 9538 94b8: f8c8 3000 str.w r3, [r8] uint32_t m = micros(); 94bc: f001 fec8 bl b250 return SDHC_PRSSTAT & (1 << 24) ? false : true; 94c0: 6a63 ldr r3, [r4, #36] ; 0x24 uint32_t m = micros(); 94c2: 4606 mov r6, r0 while (fcn()) { 94c4: 01d8 lsls r0, r3, #7 94c6: d418 bmi.n 94fa if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 94c8: 4f1a ldr r7, [pc, #104] ; (9534 ) 94ca: e004 b.n 94d6 yield(); 94cc: f003 ff54 bl d378 return SDHC_PRSSTAT & (1 << 24) ? false : true; 94d0: 6a63 ldr r3, [r4, #36] ; 0x24 while (fcn()) { 94d2: 01d9 lsls r1, r3, #7 94d4: d411 bmi.n 94fa if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 94d6: f001 febb bl b250 94da: 1b83 subs r3, r0, r6 94dc: 42bb cmp r3, r7 94de: d9f5 bls.n 94cc m_errorCode = code; 94e0: 4a11 ldr r2, [pc, #68] ; (9528 ) 94e2: 210a movs r1, #10 m_busyFcn = 0; 94e4: 2500 movs r5, #0 m_errorLine = line; 94e6: 4b11 ldr r3, [pc, #68] ; (952c ) m_errorCode = code; 94e8: 7011 strb r1, [r2, #0] m_errorLine = line; 94ea: f44f 7210 mov.w r2, #576 ; 0x240 } 94ee: 4628 mov r0, r5 m_busyFcn = 0; 94f0: f8c8 5000 str.w r5, [r8] m_errorLine = line; 94f4: 601a str r2, [r3, #0] } 94f6: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_busyFcn = 0; 94fa: 2200 movs r2, #0 if (SDHC_PRSSTAT & SDHC_PRSSTAT_CDIHB) { 94fc: 4b08 ldr r3, [pc, #32] ; (9520 ) m_busyFcn = 0; 94fe: f8c8 2000 str.w r2, [r8] if (SDHC_PRSSTAT & SDHC_PRSSTAT_CDIHB) { 9502: 6a5a ldr r2, [r3, #36] ; 0x24 9504: 0792 lsls r2, r2, #30 9506: d5d1 bpl.n 94ac uint32_t irqsststen = SDHC_IRQSTATEN; 9508: 6b58 ldr r0, [r3, #52] ; 0x34 uint32_t proctl = SDHC_PROCTL & ~SDHC_PROCTL_SABGREQ; 950a: 6a9a ldr r2, [r3, #40] ; 0x28 SDHC_SYSCTL |= SDHC_SYSCTL_RSTD; 950c: 6ad9 ldr r1, [r3, #44] ; 0x2c uint32_t proctl = SDHC_PROCTL & ~SDHC_PROCTL_SABGREQ; 950e: f422 3280 bic.w r2, r2, #65536 ; 0x10000 SDHC_SYSCTL |= SDHC_SYSCTL_RSTD; 9512: f041 6180 orr.w r1, r1, #67108864 ; 0x4000000 9516: 62d9 str r1, [r3, #44] ; 0x2c SDHC_IRQSTATEN = irqsststen; 9518: 6358 str r0, [r3, #52] ; 0x34 SDHC_PROCTL = proctl; 951a: 629a str r2, [r3, #40] ; 0x28 951c: e7c6 b.n 94ac 951e: bf00 nop 9520: 402c0000 .word 0x402c0000 9524: 0cdb0000 .word 0x0cdb0000 9528: 2000153a .word 0x2000153a 952c: 20002418 .word 0x20002418 9530: 00008d99 .word 0x00008d99 9534: 000f4240 .word 0x000f4240 9538: 20002444 .word 0x20002444 0000953c : static bool cardCMD6(uint32_t arg, uint8_t* status) { 953c: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 9540: 4682 mov sl, r0 9542: 4689 mov r9, r1 9544: 4e36 ldr r6, [pc, #216] ; (9620 ) uint32_t m = micros(); 9546: f001 fe83 bl b250 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 954a: 4d36 ldr r5, [pc, #216] ; (9624 ) uint32_t m = micros(); 954c: 4604 mov r4, r0 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 954e: f8df 8100 ldr.w r8, [pc, #256] ; 9650 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9552: 4f35 ldr r7, [pc, #212] ; (9628 ) while (fcn()) { 9554: e004 b.n 9560 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9556: f001 fe7b bl b250 955a: 1b03 subs r3, r0, r4 955c: 42bb cmp r3, r7 955e: d827 bhi.n 95b0 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 9560: 6831 ldr r1, [r6, #0] 9562: 4628 mov r0, r5 9564: f7ff fe44 bl 91f0 9568: 2800 cmp r0, #0 956a: d0f4 beq.n 9556 956c: f8d8 3010 ldr.w r3, [r8, #16] while (fcn()) { 9570: 05da lsls r2, r3, #23 9572: d5f0 bpl.n 9556 m_dmaBusy = true; 9574: 2301 movs r3, #1 9576: 4d2d ldr r5, [pc, #180] ; (962c ) m_irqstat = 0; 9578: 4f2d ldr r7, [pc, #180] ; (9630 ) if (!cardCommand(CMD6_XFERTYP, arg)) { 957a: 4651 mov r1, sl m_dmaBusy = true; 957c: 702b strb r3, [r5, #0] m_irqstat = 0; 957e: 2300 movs r3, #0 if (!cardCommand(CMD6_XFERTYP, arg)) { 9580: 482c ldr r0, [pc, #176] ; (9634 ) m_irqstat = 0; 9582: 603b str r3, [r7, #0] SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(64); 9584: 4b2c ldr r3, [pc, #176] ; (9638 ) SDHC_DSADDR = (uint32_t)status; 9586: f8c8 9000 str.w r9, [r8] SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(64); 958a: f8c8 3004 str.w r3, [r8, #4] SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; 958e: 4b2b ldr r3, [pc, #172] ; (963c ) 9590: f8c8 3038 str.w r3, [r8, #56] ; 0x38 if (!cardCommand(CMD6_XFERTYP, arg)) { 9594: f7ff fe2c bl 91f0 9598: 4604 mov r4, r0 959a: b9a0 cbnz r0, 95c6 m_errorCode = code; 959c: 4928 ldr r1, [pc, #160] ; (9640 ) 959e: 2004 movs r0, #4 m_errorLine = line; 95a0: 4b28 ldr r3, [pc, #160] ; (9644 ) 95a2: f240 129f movw r2, #415 ; 0x19f m_errorCode = code; 95a6: 7008 strb r0, [r1, #0] } 95a8: 4620 mov r0, r4 m_errorLine = line; 95aa: 601a str r2, [r3, #0] } 95ac: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} m_errorCode = code; 95b0: 4923 ldr r1, [pc, #140] ; (9640 ) 95b2: 200a movs r0, #10 m_errorLine = line; 95b4: 4b23 ldr r3, [pc, #140] ; (9644 ) 95b6: f44f 72cc mov.w r2, #408 ; 0x198 return sdError(SD_CARD_ERROR_CMD13); 95ba: 2400 movs r4, #0 m_errorCode = code; 95bc: 7008 strb r0, [r1, #0] m_errorLine = line; 95be: 601a str r2, [r3, #0] } 95c0: 4620 mov r0, r4 95c2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} m_busyFcn = fcn; 95c6: 4b20 ldr r3, [pc, #128] ; (9648 ) 95c8: f8df 9088 ldr.w r9, [pc, #136] ; 9654 95cc: f8c9 3000 str.w r3, [r9] uint32_t m = micros(); 95d0: f001 fe3e bl b250 return m_dmaBusy; 95d4: 782b ldrb r3, [r5, #0] uint32_t m = micros(); 95d6: 4606 mov r6, r0 while (fcn()) { 95d8: b1bb cbz r3, 960a if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 95da: f8df 804c ldr.w r8, [pc, #76] ; 9628 95de: e003 b.n 95e8 yield(); 95e0: f003 feca bl d378 return m_dmaBusy; 95e4: 782b ldrb r3, [r5, #0] while (fcn()) { 95e6: b183 cbz r3, 960a if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 95e8: f001 fe32 bl b250 95ec: 1b83 subs r3, r0, r6 95ee: 4543 cmp r3, r8 95f0: d9f6 bls.n 95e0 m_busyFcn = 0; 95f2: 2300 movs r3, #0 95f4: f8c9 3000 str.w r3, [r9] m_errorCode = code; 95f8: 4911 ldr r1, [pc, #68] ; (9640 ) 95fa: 2025 movs r0, #37 ; 0x25 m_errorLine = line; 95fc: 4b11 ldr r3, [pc, #68] ; (9644 ) 95fe: f44f 72d1 mov.w r2, #418 ; 0x1a2 return sdError(SD_CARD_ERROR_DMA); 9602: 2400 movs r4, #0 m_errorCode = code; 9604: 7008 strb r0, [r1, #0] m_errorLine = line; 9606: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_DMA); 9608: e7da b.n 95c0 return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); 960a: 683b ldr r3, [r7, #0] m_busyFcn = 0; 960c: 2200 movs r2, #0 return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); 960e: 079b lsls r3, r3, #30 m_busyFcn = 0; 9610: f8c9 2000 str.w r2, [r9] return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); 9614: d5f0 bpl.n 95f8 9616: 683a ldr r2, [r7, #0] 9618: 4b0c ldr r3, [pc, #48] ; (964c ) 961a: 421a tst r2, r3 961c: d0d0 beq.n 95c0 961e: e7eb b.n 95f8 9620: 20002440 .word 0x20002440 9624: 0d1a0000 .word 0x0d1a0000 9628: 000f4240 .word 0x000f4240 962c: 20002df6 .word 0x20002df6 9630: 20002448 .word 0x20002448 9634: 063a0011 .word 0x063a0011 9638: 00010040 .word 0x00010040 963c: 117f0002 .word 0x117f0002 9640: 2000153a .word 0x2000153a 9644: 20002418 .word 0x20002418 9648: 00008dad .word 0x00008dad 964c: 117f0000 .word 0x117f0000 9650: 402c0000 .word 0x402c0000 9654: 20002444 .word 0x20002444 00009658 : bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { 9658: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} if (!m_csd.v1.erase_blk_en) { 965c: 4d32 ldr r5, [pc, #200] ; (9728 ) bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { 965e: 4614 mov r4, r2 if (!m_csd.v1.erase_blk_en) { 9660: 7aab ldrb r3, [r5, #10] 9662: f013 0040 ands.w r0, r3, #64 ; 0x40 9666: d112 bne.n 968e uint8_t m = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; 9668: f003 033f and.w r3, r3, #63 ; 0x3f 966c: 7aea ldrb r2, [r5, #11] 966e: 005b lsls r3, r3, #1 if ((firstSector & m) != 0 || ((lastSector + 1) & m) != 0) { 9670: ea43 13d2 orr.w r3, r3, r2, lsr #7 9674: 1c62 adds r2, r4, #1 9676: 430a orrs r2, r1 9678: 4213 tst r3, r2 967a: d008 beq.n 968e m_errorCode = code; 967c: 492b ldr r1, [pc, #172] ; (972c ) 967e: 2427 movs r4, #39 ; 0x27 m_errorLine = line; 9680: 4b2b ldr r3, [pc, #172] ; (9730 ) 9682: f240 3202 movw r2, #770 ; 0x302 m_errorCode = code; 9686: 700c strb r4, [r1, #0] m_errorLine = line; 9688: 601a str r2, [r3, #0] } 968a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!m_highCapacity) { 968e: 4b29 ldr r3, [pc, #164] ; (9734 ) 9690: 781b ldrb r3, [r3, #0] 9692: b90b cbnz r3, 9698 firstSector <<= 9; 9694: 0249 lsls r1, r1, #9 lastSector <<= 9; 9696: 0264 lsls r4, r4, #9 if (!cardCommand(CMD32_XFERTYP, firstSector)) { 9698: 4827 ldr r0, [pc, #156] ; (9738 ) 969a: f7ff fda9 bl 91f0 969e: b940 cbnz r0, 96b2 m_errorCode = code; 96a0: 4922 ldr r1, [pc, #136] ; (972c ) 96a2: 240f movs r4, #15 m_errorLine = line; 96a4: 4b22 ldr r3, [pc, #136] ; (9730 ) 96a6: f240 320a movw r2, #778 ; 0x30a m_errorCode = code; 96aa: 700c strb r4, [r1, #0] m_errorLine = line; 96ac: 601a str r2, [r3, #0] } 96ae: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!cardCommand(CMD33_XFERTYP, lastSector)) { 96b2: 4621 mov r1, r4 96b4: 4821 ldr r0, [pc, #132] ; (973c ) 96b6: f7ff fd9b bl 91f0 96ba: b940 cbnz r0, 96ce m_errorCode = code; 96bc: 491b ldr r1, [pc, #108] ; (972c ) 96be: 2410 movs r4, #16 m_errorLine = line; 96c0: 4b1b ldr r3, [pc, #108] ; (9730 ) 96c2: f240 320d movw r2, #781 ; 0x30d m_errorCode = code; 96c6: 700c strb r4, [r1, #0] m_errorLine = line; 96c8: 601a str r2, [r3, #0] } 96ca: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!cardCommand(CMD38_XFERTYP, 0)) { 96ce: 2100 movs r1, #0 96d0: 481b ldr r0, [pc, #108] ; (9740 ) 96d2: f7ff fd8d bl 91f0 96d6: b938 cbnz r0, 96e8 m_errorCode = code; 96d8: 4914 ldr r1, [pc, #80] ; (972c ) 96da: 2411 movs r4, #17 m_errorLine = line; 96dc: 4b14 ldr r3, [pc, #80] ; (9730 ) 96de: f44f 7244 mov.w r2, #784 ; 0x310 m_errorCode = code; 96e2: 700c strb r4, [r1, #0] m_errorLine = line; 96e4: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD38); 96e6: e7e2 b.n 96ae uint32_t m = micros(); 96e8: f001 fdb2 bl b250 96ec: 4e15 ldr r6, [pc, #84] ; (9744 ) return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 96ee: 4d16 ldr r5, [pc, #88] ; (9748 ) uint32_t m = micros(); 96f0: 4604 mov r4, r0 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 96f2: f8df 805c ldr.w r8, [pc, #92] ; 9750 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 96f6: 4f15 ldr r7, [pc, #84] ; (974c ) return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 96f8: 6831 ldr r1, [r6, #0] 96fa: 4628 mov r0, r5 96fc: f7ff fd78 bl 91f0 9700: b118 cbz r0, 970a 9702: f8d8 3010 ldr.w r3, [r8, #16] while (fcn()) { 9706: 05db lsls r3, r3, #23 9708: d4d1 bmi.n 96ae if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 970a: f001 fda1 bl b250 970e: 1b00 subs r0, r0, r4 9710: 42b8 cmp r0, r7 9712: d9f1 bls.n 96f8 m_errorCode = code; 9714: 4905 ldr r1, [pc, #20] ; (972c ) 9716: 2428 movs r4, #40 ; 0x28 m_errorLine = line; 9718: 4b05 ldr r3, [pc, #20] ; (9730 ) 971a: f240 3213 movw r2, #787 ; 0x313 return sdError(SD_CARD_ERROR_ERASE_TIMEOUT); 971e: 2000 movs r0, #0 m_errorCode = code; 9720: 700c strb r4, [r1, #0] m_errorLine = line; 9722: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_ERASE_TIMEOUT); 9724: e7c3 b.n 96ae 9726: bf00 nop 9728: 2000242c .word 0x2000242c 972c: 2000153a .word 0x2000153a 9730: 20002418 .word 0x20002418 9734: 20002df4 .word 0x20002df4 9738: 201a0000 .word 0x201a0000 973c: 211a0000 .word 0x211a0000 9740: 261b0000 .word 0x261b0000 9744: 20002440 .word 0x20002440 9748: 0d1a0000 .word 0x0d1a0000 974c: 000f4240 .word 0x000f4240 9750: 402c0000 .word 0x402c0000 00009754 : uint32_t sector, uint8_t* buf, size_t n) { 9754: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} if ((3 & (uint32_t)buf) || n == 0) { 9758: f012 0403 ands.w r4, r2, #3 uint32_t sector, uint8_t* buf, size_t n) { 975c: b083 sub sp, #12 if ((3 & (uint32_t)buf) || n == 0) { 975e: bf18 it ne 9760: 2401 movne r4, #1 uint32_t sector, uint8_t* buf, size_t n) { 9762: 9001 str r0, [sp, #4] if ((3 & (uint32_t)buf) || n == 0) { 9764: 9300 str r3, [sp, #0] 9766: 2b00 cmp r3, #0 9768: bf08 it eq 976a: f044 0401 orreq.w r4, r4, #1 976e: b15c cbz r4, 9788 m_errorCode = code; 9770: 4940 ldr r1, [pc, #256] ; (9874 ) 9772: 2025 movs r0, #37 ; 0x25 m_errorLine = line; 9774: 4b40 ldr r3, [pc, #256] ; (9878 ) 9776: f240 12f5 movw r2, #501 ; 0x1f5 return sdError(SD_CARD_ERROR_DMA); 977a: 2400 movs r4, #0 m_errorCode = code; 977c: 7008 strb r0, [r1, #0] m_errorLine = line; 977e: 601a str r2, [r3, #0] } 9780: 4620 mov r0, r4 9782: b003 add sp, #12 9784: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} m_busyFcn = fcn; 9788: 4b3c ldr r3, [pc, #240] ; (987c ) 978a: 4615 mov r5, r2 978c: 4a3c ldr r2, [pc, #240] ; (9880 ) 978e: 460e mov r6, r1 9790: f8df 910c ldr.w r9, [pc, #268] ; 98a0 9794: 6013 str r3, [r2, #0] uint32_t m = micros(); 9796: f001 fd5b bl b250 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 979a: f8df 8108 ldr.w r8, [pc, #264] ; 98a4 uint32_t m = micros(); 979e: 4607 mov r7, r0 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 97a0: f8df b104 ldr.w fp, [pc, #260] ; 98a8 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 97a4: f8df a0f0 ldr.w sl, [pc, #240] ; 9898 while (fcn()) { 97a8: e006 b.n 97b8 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 97aa: f001 fd51 bl b250 97ae: 1bc0 subs r0, r0, r7 97b0: 4550 cmp r0, sl 97b2: d844 bhi.n 983e yield(); 97b4: f003 fde0 bl d378 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 97b8: f8d9 1000 ldr.w r1, [r9] 97bc: 4640 mov r0, r8 97be: f7ff fd17 bl 91f0 97c2: 2800 cmp r0, #0 97c4: d0f1 beq.n 97aa 97c6: f8db 3010 ldr.w r3, [fp, #16] while (fcn()) { 97ca: 05da lsls r2, r3, #23 97cc: d5ed bpl.n 97aa SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(n) | SDHC_BLKATTR_BLKSIZE(512); 97ce: 9a00 ldr r2, [sp, #0] 97d0: 4b2c ldr r3, [pc, #176] ; (9884 ) m_busyFcn = 0; 97d2: 492b ldr r1, [pc, #172] ; (9880 ) SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(n) | SDHC_BLKATTR_BLKSIZE(512); 97d4: ea03 4302 and.w r3, r3, r2, lsl #16 m_busyFcn = 0; 97d8: 2200 movs r2, #0 m_dmaBusy = true; 97da: 4f2b ldr r7, [pc, #172] ; (9888 ) m_busyFcn = 0; 97dc: 600a str r2, [r1, #0] SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(n) | SDHC_BLKATTR_BLKSIZE(512); 97de: f443 7300 orr.w r3, r3, #512 ; 0x200 m_dmaBusy = true; 97e2: 2101 movs r1, #1 m_irqstat = 0; 97e4: f8df 80c4 ldr.w r8, [pc, #196] ; 98ac m_dmaBusy = true; 97e8: 7039 strb r1, [r7, #0] m_irqstat = 0; 97ea: f8c8 2000 str.w r2, [r8] SDHC_DSADDR = (uint32_t)buf; 97ee: f8cb 5000 str.w r5, [fp] SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(n) | SDHC_BLKATTR_BLKSIZE(512); 97f2: f8cb 3004 str.w r3, [fp, #4] SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; 97f6: 4b25 ldr r3, [pc, #148] ; (988c ) 97f8: f8cb 3038 str.w r3, [fp, #56] ; 0x38 if (!cardCommand(xfertyp, m_highCapacity ? sector : 512*sector)) { 97fc: 4b24 ldr r3, [pc, #144] ; (9890 ) 97fe: 781b ldrb r3, [r3, #0] 9800: b343 cbz r3, 9854 9802: 4631 mov r1, r6 9804: 9801 ldr r0, [sp, #4] 9806: f7ff fcf3 bl 91f0 980a: 4681 mov r9, r0 980c: 2800 cmp r0, #0 980e: d0b7 beq.n 9780 m_busyFcn = fcn; 9810: 4b20 ldr r3, [pc, #128] ; (9894 ) 9812: 4a1b ldr r2, [pc, #108] ; (9880 ) 9814: 6013 str r3, [r2, #0] uint32_t m = micros(); 9816: f001 fd1b bl b250 return m_dmaBusy; 981a: 783b ldrb r3, [r7, #0] uint32_t m = micros(); 981c: 4605 mov r5, r0 while (fcn()) { 981e: b1db cbz r3, 9858 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9820: 4e1d ldr r6, [pc, #116] ; (9898 ) 9822: e003 b.n 982c yield(); 9824: f003 fda8 bl d378 return m_dmaBusy; 9828: 783b ldrb r3, [r7, #0] while (fcn()) { 982a: b1ab cbz r3, 9858 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 982c: f001 fd10 bl b250 9830: 1b40 subs r0, r0, r5 9832: 42b0 cmp r0, r6 9834: d9f6 bls.n 9824 m_busyFcn = 0; 9836: 2300 movs r3, #0 9838: 4a11 ldr r2, [pc, #68] ; (9880 ) 983a: 6013 str r3, [r2, #0] return true; 983c: e7a0 b.n 9780 m_errorCode = code; 983e: 4b0d ldr r3, [pc, #52] ; (9874 ) 9840: 220a movs r2, #10 m_busyFcn = 0; 9842: 2100 movs r1, #0 9844: 480e ldr r0, [pc, #56] ; (9880 ) m_errorCode = code; 9846: 701a strb r2, [r3, #0] m_errorLine = line; 9848: f44f 72fc mov.w r2, #504 ; 0x1f8 984c: 4b0a ldr r3, [pc, #40] ; (9878 ) m_busyFcn = 0; 984e: 6001 str r1, [r0, #0] m_errorLine = line; 9850: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD13); 9852: e795 b.n 9780 if (!cardCommand(xfertyp, m_highCapacity ? sector : 512*sector)) { 9854: 0276 lsls r6, r6, #9 9856: e7d4 b.n 9802 m_busyFcn = 0; 9858: 2300 movs r3, #0 985a: 4a09 ldr r2, [pc, #36] ; (9880 ) 985c: 6013 str r3, [r2, #0] return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); 985e: f8d8 3000 ldr.w r3, [r8] 9862: 079b lsls r3, r3, #30 9864: d58c bpl.n 9780 9866: f8d8 2000 ldr.w r2, [r8] 986a: 4b0c ldr r3, [pc, #48] ; (989c ) 986c: 421a tst r2, r3 986e: bf08 it eq 9870: 464c moveq r4, r9 9872: e785 b.n 9780 9874: 2000153a .word 0x2000153a 9878: 20002418 .word 0x20002418 987c: 00009385 .word 0x00009385 9880: 20002444 .word 0x20002444 9884: 1fff0000 .word 0x1fff0000 9888: 20002df6 .word 0x20002df6 988c: 117f0002 .word 0x117f0002 9890: 20002df4 .word 0x20002df4 9894: 00008dad .word 0x00008dad 9898: 000f4240 .word 0x000f4240 989c: 117f0000 .word 0x117f0000 98a0: 20002440 .word 0x20002440 98a4: 0d1a0000 .word 0x0d1a0000 98a8: 402c0000 .word 0x402c0000 98ac: 20002448 .word 0x20002448 000098b0 : bool SdioCard::readSectors(uint32_t sector, uint8_t* dst, size_t n) { 98b0: b5f8 push {r3, r4, r5, r6, r7, lr} 98b2: 4606 mov r6, r0 98b4: 7a00 ldrb r0, [r0, #8] 98b6: 460c mov r4, r1 98b8: 4615 mov r5, r2 if (m_sdioConfig.useDma()) { 98ba: 07c0 lsls r0, r0, #31 bool SdioCard::readSectors(uint32_t sector, uint8_t* dst, size_t n) { 98bc: 461f mov r7, r3 if (m_sdioConfig.useDma()) { 98be: d413 bmi.n 98e8 for (size_t i = 0; i < n; i++) { 98c0: b183 cbz r3, 98e4 98c2: 440f add r7, r1 98c4: e001 b.n 98ca 98c6: 42bc cmp r4, r7 98c8: d00c beq.n 98e4 if (!readSector(sector + i, dst + i*512UL)) { 98ca: 6833 ldr r3, [r6, #0] 98cc: 462a mov r2, r5 98ce: 4621 mov r1, r4 98d0: 4630 mov r0, r6 98d2: 691b ldr r3, [r3, #16] for (size_t i = 0; i < n; i++) { 98d4: 3401 adds r4, #1 98d6: f505 7500 add.w r5, r5, #512 ; 0x200 if (!readSector(sector + i, dst + i*512UL)) { 98da: 4798 blx r3 98dc: 2800 cmp r0, #0 98de: d1f2 bne.n 98c6 return false; // readSector will set errorCode. 98e0: 2000 movs r0, #0 } 98e2: bdf8 pop {r3, r4, r5, r6, r7, pc} return true; 98e4: 2001 movs r0, #1 } 98e6: bdf8 pop {r3, r4, r5, r6, r7, pc} if ((uint32_t)dst & 3) { 98e8: 0790 lsls r0, r2, #30 98ea: d012 beq.n 9912 for (size_t i = 0; i < n; i++, sector++, dst += 512) { 98ec: 2b00 cmp r3, #0 98ee: d0f9 beq.n 98e4 98f0: 440f add r7, r1 98f2: e001 b.n 98f8 98f4: 42bc cmp r4, r7 98f6: d0f5 beq.n 98e4 if (!readSector(sector, dst)) { 98f8: 6833 ldr r3, [r6, #0] 98fa: 462a mov r2, r5 98fc: 4621 mov r1, r4 98fe: 4630 mov r0, r6 9900: 691b ldr r3, [r3, #16] for (size_t i = 0; i < n; i++, sector++, dst += 512) { 9902: 3401 adds r4, #1 9904: f505 7500 add.w r5, r5, #512 ; 0x200 if (!readSector(sector, dst)) { 9908: 4798 blx r3 990a: 2800 cmp r0, #0 990c: d1f2 bne.n 98f4 return false; // readSector will set errorCode. 990e: 2000 movs r0, #0 9910: e7e7 b.n 98e2 if (!rdWrSectors(CMD18_DMA_XFERTYP, sector, dst, n)) { 9912: 4806 ldr r0, [pc, #24] ; (992c ) 9914: f7ff ff1e bl 9754 9918: 2800 cmp r0, #0 991a: d1e3 bne.n 98e4 m_errorCode = code; 991c: 4904 ldr r1, [pc, #16] ; (9930 ) 991e: 240c movs r4, #12 m_errorLine = line; 9920: 4b04 ldr r3, [pc, #16] ; (9934 ) 9922: f240 32a1 movw r2, #929 ; 0x3a1 m_errorCode = code; 9926: 700c strb r4, [r1, #0] m_errorLine = line; 9928: 601a str r2, [r3, #0] } 992a: bdf8 pop {r3, r4, r5, r6, r7, pc} 992c: 123a0037 .word 0x123a0037 9930: 2000153a .word 0x2000153a 9934: 20002418 .word 0x20002418 00009938 : bool SdioCard::writeSectors(uint32_t sector, const uint8_t* src, size_t n) { 9938: b5f8 push {r3, r4, r5, r6, r7, lr} 993a: 4606 mov r6, r0 993c: 7a00 ldrb r0, [r0, #8] 993e: 460c mov r4, r1 9940: 4615 mov r5, r2 if (m_sdioConfig.useDma()) { 9942: 07c0 lsls r0, r0, #31 bool SdioCard::writeSectors(uint32_t sector, const uint8_t* src, size_t n) { 9944: 461f mov r7, r3 if (m_sdioConfig.useDma()) { 9946: d413 bmi.n 9970 for (size_t i = 0; i < n; i++) { 9948: b183 cbz r3, 996c 994a: 440f add r7, r1 994c: e001 b.n 9952 994e: 42bc cmp r4, r7 9950: d00c beq.n 996c if (!writeSector(sector + i, src + i*512UL)) { 9952: 6833 ldr r3, [r6, #0] 9954: 462a mov r2, r5 9956: 4621 mov r1, r4 9958: 4630 mov r0, r6 995a: 6a5b ldr r3, [r3, #36] ; 0x24 for (size_t i = 0; i < n; i++) { 995c: 3401 adds r4, #1 995e: f505 7500 add.w r5, r5, #512 ; 0x200 if (!writeSector(sector + i, src + i*512UL)) { 9962: 4798 blx r3 9964: 2800 cmp r0, #0 9966: d1f2 bne.n 994e return false; // writeSector will set errorCode. 9968: 2000 movs r0, #0 } 996a: bdf8 pop {r3, r4, r5, r6, r7, pc} return true; 996c: 2001 movs r0, #1 } 996e: bdf8 pop {r3, r4, r5, r6, r7, pc} if (3 & (uint32_t)ptr) { 9970: 0790 lsls r0, r2, #30 9972: d012 beq.n 999a for (size_t i = 0; i < n; i++, sector++, ptr += 512) { 9974: 2b00 cmp r3, #0 9976: d0f9 beq.n 996c 9978: 440f add r7, r1 997a: e001 b.n 9980 997c: 42bc cmp r4, r7 997e: d0f5 beq.n 996c if (!writeSector(sector, ptr)) { 9980: 6833 ldr r3, [r6, #0] 9982: 462a mov r2, r5 9984: 4621 mov r1, r4 9986: 4630 mov r0, r6 9988: 6a5b ldr r3, [r3, #36] ; 0x24 for (size_t i = 0; i < n; i++, sector++, ptr += 512) { 998a: 3401 adds r4, #1 998c: f505 7500 add.w r5, r5, #512 ; 0x200 if (!writeSector(sector, ptr)) { 9990: 4798 blx r3 9992: 2800 cmp r0, #0 9994: d1f2 bne.n 997c return false; // writeSector will set errorCode. 9996: 2000 movs r0, #0 9998: e7e7 b.n 996a if (!rdWrSectors(CMD25_DMA_XFERTYP, sector, ptr, n)) { 999a: 4806 ldr r0, [pc, #24] ; (99b4 ) 999c: f7ff feda bl 9754 99a0: 2800 cmp r0, #0 99a2: d1e3 bne.n 996c m_errorCode = code; 99a4: 4904 ldr r1, [pc, #16] ; (99b8 ) 99a6: 240e movs r4, #14 m_errorLine = line; 99a8: 4b04 ldr r3, [pc, #16] ; (99bc ) 99aa: f240 423d movw r2, #1085 ; 0x43d m_errorCode = code; 99ae: 700c strb r4, [r1, #0] m_errorLine = line; 99b0: 601a str r2, [r3, #0] } 99b2: bdf8 pop {r3, r4, r5, r6, r7, pc} 99b4: 193a0027 .word 0x193a0027 99b8: 2000153a .word 0x2000153a 99bc: 20002418 .word 0x20002418 000099c0 : bool SdioCard::begin(SdioConfig sdioConfig) { 99c0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} m_curState = IDLE_STATE; 99c4: 2500 movs r5, #0 m_initDone = false; 99c6: f8df 92c0 ldr.w r9, [pc, #704] ; 9c88 m_errorCode = SD_CARD_ERROR_NONE; 99ca: 4c9b ldr r4, [pc, #620] ; (9c38 ) bool SdioCard::begin(SdioConfig sdioConfig) { 99cc: b091 sub sp, #68 ; 0x44 m_highCapacity = false; 99ce: f8df 82bc ldr.w r8, [pc, #700] ; 9c8c m_version2 = false; 99d2: 4e9a ldr r6, [pc, #616] ; (9c3c ) m_sdioConfig = sdioConfig; 99d4: 7201 strb r1, [r0, #8] m_curState = IDLE_STATE; 99d6: 7245 strb r5, [r0, #9] m_initDone = false; 99d8: f889 5000 strb.w r5, [r9] m_errorCode = SD_CARD_ERROR_NONE; 99dc: 7025 strb r5, [r4, #0] m_highCapacity = false; 99de: f888 5000 strb.w r5, [r8] m_version2 = false; 99e2: 7035 strb r5, [r6, #0] initSDHC(); 99e4: f7ff fad2 bl 8f8c if (!cardCommand(CMD0_XFERTYP, 0)) { 99e8: 4629 mov r1, r5 99ea: 4628 mov r0, r5 99ec: f7ff fc00 bl 91f0 99f0: b950 cbnz r0, 9a08 m_errorCode = code; 99f2: 2101 movs r1, #1 m_errorLine = line; 99f4: 4b92 ldr r3, [pc, #584] ; (9c40 ) 99f6: f240 228e movw r2, #654 ; 0x28e 99fa: 4605 mov r5, r0 m_errorCode = code; 99fc: 7021 strb r1, [r4, #0] m_errorLine = line; 99fe: 601a str r2, [r3, #0] } 9a00: 4628 mov r0, r5 9a02: b011 add sp, #68 ; 0x44 9a04: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} 9a08: 2503 movs r5, #3 if (cardCommand(CMD8_XFERTYP, 0X1AA)) { 9a0a: 4f8e ldr r7, [pc, #568] ; (9c44 ) 9a0c: f44f 71d5 mov.w r1, #426 ; 0x1aa 9a10: 4638 mov r0, r7 9a12: f7ff fbed bl 91f0 9a16: 2800 cmp r0, #0 9a18: d14e bne.n 9ab8 for (uint32_t i = 0; i < CMD8_RETRIES; i++) { 9a1a: 3d01 subs r5, #1 9a1c: d1f6 bne.n 9a0c if (!m_version2) { 9a1e: 7833 ldrb r3, [r6, #0] 9a20: 2b00 cmp r3, #0 9a22: d03d beq.n 9aa0 arg = m_version2 ? 0X40300000 : 0x00300000; 9a24: f8df b268 ldr.w fp, [pc, #616] ; 9c90 int m = micros(); 9a28: f001 fc12 bl b250 return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); 9a2c: 4e86 ldr r6, [pc, #536] ; (9c48 ) int m = micros(); 9a2e: 4605 mov r5, r0 return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); 9a30: f8df a260 ldr.w sl, [pc, #608] ; 9c94 if (!cardAcmd(0, ACMD41_XFERTYP, arg) || 9a34: 4f85 ldr r7, [pc, #532] ; (9c4c ) return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); 9a36: 2100 movs r1, #0 9a38: 4630 mov r0, r6 9a3a: f7ff fbd9 bl 91f0 9a3e: b950 cbnz r0, 9a56 return sdError(SD_CARD_ERROR_ACMD41); 9a40: 2500 movs r5, #0 m_errorCode = code; 9a42: 2117 movs r1, #23 m_errorLine = line; 9a44: 4b7e ldr r3, [pc, #504] ; (9c40 ) 9a46: f44f 722a mov.w r2, #680 ; 0x2a8 } 9a4a: 4628 mov r0, r5 m_errorCode = code; 9a4c: 7021 strb r1, [r4, #0] m_errorLine = line; 9a4e: 601a str r2, [r3, #0] } 9a50: b011 add sp, #68 ; 0x44 9a52: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); 9a56: 4659 mov r1, fp 9a58: 4650 mov r0, sl 9a5a: f7ff fbc9 bl 91f0 9a5e: 2800 cmp r0, #0 9a60: d0ee beq.n 9a40 ((micros() - m) > BUSY_TIMEOUT_MICROS)) { 9a62: f001 fbf5 bl b250 9a66: 1b40 subs r0, r0, r5 } while ((SDHC_CMDRSP0 & 0x80000000) == 0); 9a68: 4b79 ldr r3, [pc, #484] ; (9c50 ) if (!cardAcmd(0, ACMD41_XFERTYP, arg) || 9a6a: 42b8 cmp r0, r7 9a6c: d8e8 bhi.n 9a40 } while ((SDHC_CMDRSP0 & 0x80000000) == 0); 9a6e: 691a ldr r2, [r3, #16] 9a70: 2a00 cmp r2, #0 9a72: dae0 bge.n 9a36 m_ocr = SDHC_CMDRSP0; 9a74: 6919 ldr r1, [r3, #16] 9a76: 4a77 ldr r2, [pc, #476] ; (9c54 ) 9a78: 6011 str r1, [r2, #0] if (SDHC_CMDRSP0 & 0x40000000) { 9a7a: 691b ldr r3, [r3, #16] 9a7c: 005a lsls r2, r3, #1 9a7e: d502 bpl.n 9a86 m_highCapacity = true; 9a80: 2301 movs r3, #1 9a82: f888 3000 strb.w r3, [r8] if (!cardCommand(CMD2_XFERTYP, 0)) { 9a86: 2100 movs r1, #0 9a88: 4873 ldr r0, [pc, #460] ; (9c58 ) 9a8a: f7ff fbb1 bl 91f0 9a8e: 4605 mov r5, r0 9a90: bb10 cbnz r0, 9ad8 m_errorCode = code; 9a92: 2102 movs r1, #2 m_errorLine = line; 9a94: 4b6a ldr r3, [pc, #424] ; (9c40 ) 9a96: f240 22b1 movw r2, #689 ; 0x2b1 m_errorCode = code; 9a9a: 7021 strb r1, [r4, #0] m_errorLine = line; 9a9c: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD2); 9a9e: e7af b.n 9a00 initSDHC(); 9aa0: f7ff fa74 bl 8f8c cardCommand(CMD0_XFERTYP, 0); 9aa4: 4629 mov r1, r5 9aa6: 4628 mov r0, r5 9aa8: f7ff fba2 bl 91f0 arg = m_version2 ? 0X40300000 : 0x00300000; 9aac: 7833 ldrb r3, [r6, #0] 9aae: 2b00 cmp r3, #0 9ab0: d1b8 bne.n 9a24 9ab2: f44f 1b40 mov.w fp, #3145728 ; 0x300000 9ab6: e7b7 b.n 9a28 if (SDHC_CMDRSP0 != 0X1AA) { 9ab8: 4b65 ldr r3, [pc, #404] ; (9c50 ) 9aba: 691b ldr r3, [r3, #16] 9abc: f5b3 7fd5 cmp.w r3, #426 ; 0x1aa 9ac0: d007 beq.n 9ad2 m_errorCode = code; 9ac2: 2106 movs r1, #6 m_errorLine = line; 9ac4: 4b5e ldr r3, [pc, #376] ; (9c40 ) 9ac6: f44f 7225 mov.w r2, #660 ; 0x294 return sdError(SD_CARD_ERROR_CMD8); 9aca: 2500 movs r5, #0 m_errorCode = code; 9acc: 7021 strb r1, [r4, #0] m_errorLine = line; 9ace: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD8); 9ad0: e796 b.n 9a00 m_version2 = true; 9ad2: 2301 movs r3, #1 9ad4: 7033 strb r3, [r6, #0] if (!m_version2) { 9ad6: e7a5 b.n 9a24 if (!cardCommand(CMD3_XFERTYP, 0)) { 9ad8: 2100 movs r1, #0 9ada: 4860 ldr r0, [pc, #384] ; (9c5c ) 9adc: f7ff fb88 bl 91f0 9ae0: 4605 mov r5, r0 9ae2: b930 cbnz r0, 9af2 m_errorCode = code; 9ae4: 2103 movs r1, #3 m_errorLine = line; 9ae6: 4b56 ldr r3, [pc, #344] ; (9c40 ) 9ae8: f44f 722d mov.w r2, #692 ; 0x2b4 m_errorCode = code; 9aec: 7021 strb r1, [r4, #0] m_errorLine = line; 9aee: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD3); 9af0: e786 b.n 9a00 m_rca = SDHC_CMDRSP0 & 0xFFFF0000; 9af2: 4e57 ldr r6, [pc, #348] ; (9c50 ) 9af4: 4b5a ldr r3, [pc, #360] ; (9c60 ) 9af6: 6932 ldr r2, [r6, #16] 9af8: 4f5a ldr r7, [pc, #360] ; (9c64 ) 9afa: 4013 ands r3, r2 if (!readReg16(CMD9_XFERTYP, &m_csd)) { 9afc: 495a ldr r1, [pc, #360] ; (9c68 ) 9afe: 485b ldr r0, [pc, #364] ; (9c6c ) m_rca = SDHC_CMDRSP0 & 0xFFFF0000; 9b00: 603b str r3, [r7, #0] if (!readReg16(CMD9_XFERTYP, &m_csd)) { 9b02: f7ff fbc1 bl 9288 9b06: 4605 mov r5, r0 9b08: b930 cbnz r0, 9b18 m_errorCode = code; 9b0a: 2107 movs r1, #7 m_errorLine = line; 9b0c: 4b4c ldr r3, [pc, #304] ; (9c40 ) 9b0e: f240 22b9 movw r2, #697 ; 0x2b9 m_errorCode = code; 9b12: 7021 strb r1, [r4, #0] m_errorLine = line; 9b14: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD9); 9b16: e773 b.n 9a00 if (!readReg16(CMD10_XFERTYP, &m_cid)) { 9b18: 4955 ldr r1, [pc, #340] ; (9c70 ) 9b1a: 4856 ldr r0, [pc, #344] ; (9c74 ) 9b1c: f7ff fbb4 bl 9288 9b20: 4605 mov r5, r0 9b22: b930 cbnz r0, 9b32 m_errorCode = code; 9b24: 2108 movs r1, #8 m_errorLine = line; 9b26: 4b46 ldr r3, [pc, #280] ; (9c40 ) 9b28: f44f 722f mov.w r2, #700 ; 0x2bc m_errorCode = code; 9b2c: 7021 strb r1, [r4, #0] m_errorLine = line; 9b2e: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD10); 9b30: e766 b.n 9a00 if (!cardCommand(CMD7_XFERTYP, m_rca)) { 9b32: 6839 ldr r1, [r7, #0] 9b34: 4850 ldr r0, [pc, #320] ; (9c78 ) 9b36: f7ff fb5b bl 91f0 9b3a: 4605 mov r5, r0 9b3c: b930 cbnz r0, 9b4c m_errorCode = code; 9b3e: 2105 movs r1, #5 m_errorLine = line; 9b40: 4b3f ldr r3, [pc, #252] ; (9c40 ) 9b42: f240 22bf movw r2, #703 ; 0x2bf m_errorCode = code; 9b46: 7021 strb r1, [r4, #0] m_errorLine = line; 9b48: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD7); 9b4a: e759 b.n 9a00 return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); 9b4c: 6839 ldr r1, [r7, #0] 9b4e: 483e ldr r0, [pc, #248] ; (9c48 ) 9b50: f7ff fb4e bl 91f0 9b54: b938 cbnz r0, 9b66 m_errorCode = code; 9b56: 2114 movs r1, #20 m_errorLine = line; 9b58: 4b39 ldr r3, [pc, #228] ; (9c40 ) 9b5a: f240 22c3 movw r2, #707 ; 0x2c3 return sdError(SD_CARD_ERROR_ACMD6); 9b5e: 2500 movs r5, #0 m_errorCode = code; 9b60: 7021 strb r1, [r4, #0] m_errorLine = line; 9b62: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_ACMD6); 9b64: e74c b.n 9a00 return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); 9b66: 2102 movs r1, #2 9b68: 4844 ldr r0, [pc, #272] ; (9c7c ) 9b6a: f7ff fb41 bl 91f0 9b6e: 4605 mov r5, r0 9b70: 2800 cmp r0, #0 9b72: d0f0 beq.n 9b56 SDHC_PROCTL &= ~SDHC_PROCTL_DTW_MASK; 9b74: 6ab3 ldr r3, [r6, #40] ; 0x28 bool highSpeedModeAsk = cardCMD6(0X00FFFFFF, status); 9b76: 4669 mov r1, sp 9b78: f06f 407f mvn.w r0, #4278190080 ; 0xff000000 SDHC_PROCTL &= ~SDHC_PROCTL_DTW_MASK; 9b7c: f023 0306 bic.w r3, r3, #6 9b80: 62b3 str r3, [r6, #40] ; 0x28 SDHC_PROCTL |= SDHC_PROCTL_DTW(SDHC_PROCTL_DTW_4BIT); 9b82: 6ab3 ldr r3, [r6, #40] ; 0x28 9b84: f043 0302 orr.w r3, r3, #2 9b88: 62b3 str r3, [r6, #40] ; 0x28 SDHC_WML = SDHC_WML_RDWML(FIFO_WML) | SDHC_WML_WRWML(FIFO_WML); 9b8a: f04f 1310 mov.w r3, #1048592 ; 0x100010 9b8e: 6473 str r3, [r6, #68] ; 0x44 bool highSpeedModeAsk = cardCMD6(0X00FFFFFF, status); 9b90: f7ff fcd4 bl 953c bool highspeedModeSupported = (2 & status[13]); 9b94: f89d 300d ldrb.w r3, [sp, #13] if (highSpeedModeAsk && highspeedModeSupported) { 9b98: 079b lsls r3, r3, #30 9b9a: d543 bpl.n 9c24 9b9c: 2800 cmp r0, #0 9b9e: d041 beq.n 9c24 uint32_t m_errorLine_before = m_errorLine; 9ba0: 4e27 ldr r6, [pc, #156] ; (9c40 ) bool switchRequestAsk = cardCMD6(0X80FFFFF1, status); 9ba2: 4669 mov r1, sp 9ba4: 4836 ldr r0, [pc, #216] ; (9c80 ) uint8_t err_code_before = m_errorCode; 9ba6: f894 8000 ldrb.w r8, [r4] uint32_t m_errorLine_before = m_errorLine; 9baa: 6837 ldr r7, [r6, #0] bool switchRequestAsk = cardCMD6(0X80FFFFF1, status); 9bac: f7ff fcc6 bl 953c bool switchRequestDone = ((status[16] & 0XF) == 1); 9bb0: f89d 3010 ldrb.w r3, [sp, #16] 9bb4: f003 030f and.w r3, r3, #15 if (switchRequestAsk && switchRequestDone) { 9bb8: 2b01 cmp r3, #1 9bba: d136 bne.n 9c2a 9bbc: b3a8 cbz r0, 9c2a kHzSdClk = 50000; 9bbe: f24c 3050 movw r0, #50000 ; 0xc350 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = mode; // DAT2 9bc2: 4c30 ldr r4, [pc, #192] ; (9c84 ) 9bc4: 2305 movs r3, #5 9bc6: f8c4 31cc str.w r3, [r4, #460] ; 0x1cc IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = mode; // DAT3 9bca: f8c4 31d0 str.w r3, [r4, #464] ; 0x1d0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00 = mode; // CMD 9bce: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01 = mode; // CLK 9bd2: f8c4 31c0 str.w r3, [r4, #448] ; 0x1c0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02 = mode; // DAT0 9bd6: f8c4 31c4 str.w r3, [r4, #452] ; 0x1c4 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03 = mode; // DAT1 9bda: f8c4 31c8 str.w r3, [r4, #456] ; 0x1c8 setSdclk(kHzSdClk); 9bde: f7ff f8eb bl 8db8 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = mode; // DAT2 9be2: 2300 movs r3, #0 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = DATA_MASK; // DAT2 9be4: f247 02b8 movw r2, #28856 ; 0x70b8 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = mode; // DAT2 9be8: f8c4 31cc str.w r3, [r4, #460] ; 0x1cc IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = mode; // DAT3 9bec: f8c4 31d0 str.w r3, [r4, #464] ; 0x1d0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00 = mode; // CMD 9bf0: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01 = mode; // CLK 9bf4: f8c4 31c0 str.w r3, [r4, #448] ; 0x1c0 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02 = mode; // DAT0 9bf8: f8c4 31c4 str.w r3, [r4, #452] ; 0x1c4 IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03 = mode; // DAT1 9bfc: f8c4 31c8 str.w r3, [r4, #456] ; 0x1c8 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_01 = CLOCK_MASK; // CLK 9c00: f241 03b8 movw r3, #4280 ; 0x10b8 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = DATA_MASK; // DAT2 9c04: f8c4 23bc str.w r2, [r4, #956] ; 0x3bc IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_05 = DATA_MASK; // DAT3 9c08: f8c4 23c0 str.w r2, [r4, #960] ; 0x3c0 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_00 = DATA_MASK; // CMD 9c0c: f8c4 23ac str.w r2, [r4, #940] ; 0x3ac IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_01 = CLOCK_MASK; // CLK 9c10: f8c4 33b0 str.w r3, [r4, #944] ; 0x3b0 m_initDone = true; 9c14: 2301 movs r3, #1 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_02 = DATA_MASK; // DAT0 9c16: f8c4 23b4 str.w r2, [r4, #948] ; 0x3b4 IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_03 = DATA_MASK; // DAT1 9c1a: f8c4 23b8 str.w r2, [r4, #952] ; 0x3b8 m_initDone = true; 9c1e: f889 3000 strb.w r3, [r9] return true; 9c22: e6ed b.n 9a00 kHzSdClk = 25000; 9c24: f246 10a8 movw r0, #25000 ; 0x61a8 9c28: e7cb b.n 9bc2 9c2a: f246 10a8 movw r0, #25000 ; 0x61a8 m_errorCode = err_code_before; 9c2e: f884 8000 strb.w r8, [r4] m_errorLine = m_errorLine_before; 9c32: 6037 str r7, [r6, #0] 9c34: e7c5 b.n 9bc2 9c36: bf00 nop 9c38: 2000153a .word 0x2000153a 9c3c: 20002df3 .word 0x20002df3 9c40: 20002418 .word 0x20002418 9c44: 081a0000 .word 0x081a0000 9c48: 371a0000 .word 0x371a0000 9c4c: 000f4240 .word 0x000f4240 9c50: 402c0000 .word 0x402c0000 9c54: 2000243c .word 0x2000243c 9c58: 02090000 .word 0x02090000 9c5c: 031a0000 .word 0x031a0000 9c60: ffff0000 .word 0xffff0000 9c64: 20002440 .word 0x20002440 9c68: 2000242c .word 0x2000242c 9c6c: 09090000 .word 0x09090000 9c70: 2000241c .word 0x2000241c 9c74: 0a090000 .word 0x0a090000 9c78: 071b0000 .word 0x071b0000 9c7c: 061a0000 .word 0x061a0000 9c80: 80fffff1 .word 0x80fffff1 9c84: 401f8000 .word 0x401f8000 9c88: 20002df2 .word 0x20002df2 9c8c: 20002df4 .word 0x20002df4 9c90: 40300000 .word 0x40300000 9c94: 29020000 .word 0x29020000 00009c98 : if (!(SDHC_PRSSTAT & SDHC_PRSSTAT_RTA)) { 9c98: 4b37 ldr r3, [pc, #220] ; (9d78 ) 9c9a: 6a5a ldr r2, [r3, #36] ; 0x24 9c9c: 0592 lsls r2, r2, #22 bool SdioCard::readData(uint8_t* dst) { 9c9e: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 9ca2: 460f mov r7, r1 if (!(SDHC_PRSSTAT & SDHC_PRSSTAT_RTA)) { 9ca4: d40d bmi.n 9cc2 SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 9ca6: 6a9a ldr r2, [r3, #40] ; 0x28 9ca8: f422 3280 bic.w r2, r2, #65536 ; 0x10000 9cac: 629a str r2, [r3, #40] ; 0x28 noInterrupts(); 9cae: b672 cpsid i SDHC_PROCTL |= SDHC_PROCTL_CREQ; 9cb0: 6a9a ldr r2, [r3, #40] ; 0x28 9cb2: f442 3200 orr.w r2, r2, #131072 ; 0x20000 9cb6: 629a str r2, [r3, #40] ; 0x28 SDHC_PROCTL |= SDHC_PROCTL_SABGREQ; 9cb8: 6a9a ldr r2, [r3, #40] ; 0x28 9cba: f442 3280 orr.w r2, r2, #65536 ; 0x10000 9cbe: 629a str r2, [r3, #40] ; 0x28 interrupts(); 9cc0: b662 cpsie i uint32_t m = micros(); 9cc2: f001 fac5 bl b250 return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BREN); 9cc6: 4e2c ldr r6, [pc, #176] ; (9d78 ) if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9cc8: f8df 80c4 ldr.w r8, [pc, #196] ; 9d90 uint32_t m = micros(); 9ccc: 4605 mov r5, r0 while (fcn()) { 9cce: e004 b.n 9cda if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9cd0: f001 fabe bl b250 9cd4: 1b43 subs r3, r0, r5 9cd6: 4543 cmp r3, r8 9cd8: d837 bhi.n 9d4a return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BREN); 9cda: 6a74 ldr r4, [r6, #36] ; 0x24 while (fcn()) { 9cdc: f414 6400 ands.w r4, r4, #2048 ; 0x800 9ce0: d0f6 beq.n 9cd0 9ce2: f107 0c3c add.w ip, r7, #60 ; 0x3c while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BREN)) { 9ce6: 4824 ldr r0, [pc, #144] ; (9d78 ) 9ce8: f507 770f add.w r7, r7, #572 ; 0x23c 9cec: 6a43 ldr r3, [r0, #36] ; 0x24 9cee: 051b lsls r3, r3, #20 9cf0: d5fc bpl.n 9cec 9cf2: f1ac 0340 sub.w r3, ip, #64 ; 0x40 p32[i] = SDHC_DATPORT; 9cf6: 6a02 ldr r2, [r0, #32] 9cf8: f843 2f04 str.w r2, [r3, #4]! for (uint32_t i = 0; i < FIFO_WML; i++) { 9cfc: 459c cmp ip, r3 9cfe: d1fa bne.n 9cf6 for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { 9d00: f10c 0c40 add.w ip, ip, #64 ; 0x40 9d04: 4567 cmp r7, ip 9d06: d1f1 bne.n 9cec uint32_t m = micros(); 9d08: f001 faa2 bl b250 return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_TC | SDHC_IRQSTAT_ERROR)); 9d0c: 4f1a ldr r7, [pc, #104] ; (9d78 ) 9d0e: 4d1b ldr r5, [pc, #108] ; (9d7c ) uint32_t m = micros(); 9d10: 4606 mov r6, r0 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9d12: f8df 807c ldr.w r8, [pc, #124] ; 9d90 while (fcn()) { 9d16: e004 b.n 9d22 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9d18: f001 fa9a bl b250 9d1c: 1b83 subs r3, r0, r6 9d1e: 4543 cmp r3, r8 9d20: d81d bhi.n 9d5e return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_TC | SDHC_IRQSTAT_ERROR)); 9d22: 6b3c ldr r4, [r7, #48] ; 0x30 while (fcn()) { 9d24: 402c ands r4, r5 9d26: d0f7 beq.n 9d18 m_irqstat = SDHC_IRQSTAT; 9d28: 6b3b ldr r3, [r7, #48] ; 0x30 9d2a: 4a15 ldr r2, [pc, #84] ; (9d80 ) 9d2c: 6013 str r3, [r2, #0] SDHC_IRQSTAT = m_irqstat; 9d2e: 6813 ldr r3, [r2, #0] 9d30: 633b str r3, [r7, #48] ; 0x30 return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); 9d32: 6813 ldr r3, [r2, #0] 9d34: f013 0302 ands.w r3, r3, #2 9d38: d01b beq.n 9d72 9d3a: 6812 ldr r2, [r2, #0] 9d3c: 4b11 ldr r3, [pc, #68] ; (9d84 ) 9d3e: 421a tst r2, r3 9d40: bf0c ite eq 9d42: 2001 moveq r0, #1 9d44: 2000 movne r0, #0 } 9d46: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_errorCode = code; 9d4a: 490f ldr r1, [pc, #60] ; (9d88 ) 9d4c: 251a movs r5, #26 m_errorLine = line; 9d4e: 4b0f ldr r3, [pc, #60] ; (9d8c ) 9d50: f240 3256 movw r2, #854 ; 0x356 return sdError(SD_CARD_ERROR_READ_FIFO); 9d54: 4620 mov r0, r4 m_errorCode = code; 9d56: 700d strb r5, [r1, #0] m_errorLine = line; 9d58: 601a str r2, [r3, #0] } 9d5a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} m_errorCode = code; 9d5e: 490a ldr r1, [pc, #40] ; (9d88 ) 9d60: 251d movs r5, #29 m_errorLine = line; 9d62: 4b0a ldr r3, [pc, #40] ; (9d8c ) 9d64: f240 3261 movw r2, #865 ; 0x361 return sdError(SD_CARD_ERROR_READ_TIMEOUT); 9d68: 4620 mov r0, r4 m_errorCode = code; 9d6a: 700d strb r5, [r1, #0] m_errorLine = line; 9d6c: 601a str r2, [r3, #0] } 9d6e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); 9d72: 4618 mov r0, r3 } 9d74: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 9d78: 402c0000 .word 0x402c0000 9d7c: 117f0002 .word 0x117f0002 9d80: 20002448 .word 0x20002448 9d84: 117f0000 .word 0x117f0000 9d88: 2000153a .word 0x2000153a 9d8c: 20002418 .word 0x20002418 9d90: 000f4240 .word 0x000f4240 00009d94 : bool SdioCard::readStart(uint32_t sector) { 9d94: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} m_busyFcn = fcn; 9d98: 4b29 ldr r3, [pc, #164] ; (9e40 ) bool SdioCard::readStart(uint32_t sector) { 9d9a: 4689 mov r9, r1 m_busyFcn = fcn; 9d9c: f8df a0c0 ldr.w sl, [pc, #192] ; 9e60 9da0: 4e28 ldr r6, [pc, #160] ; (9e44 ) 9da2: f8ca 3000 str.w r3, [sl] uint32_t m = micros(); 9da6: f001 fa53 bl b250 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 9daa: 4d27 ldr r5, [pc, #156] ; (9e48 ) uint32_t m = micros(); 9dac: 4604 mov r4, r0 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 9dae: f8df 80b4 ldr.w r8, [pc, #180] ; 9e64 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9db2: 4f26 ldr r7, [pc, #152] ; (9e4c ) while (fcn()) { 9db4: e006 b.n 9dc4 if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9db6: f001 fa4b bl b250 9dba: 1b00 subs r0, r0, r4 9dbc: 42b8 cmp r0, r7 9dbe: d829 bhi.n 9e14 yield(); 9dc0: f003 fada bl d378 return cardCommand(CMD13_XFERTYP, m_rca) ? SDHC_CMDRSP0 : 0; 9dc4: 6831 ldr r1, [r6, #0] 9dc6: 4628 mov r0, r5 9dc8: f7ff fa12 bl 91f0 9dcc: 2800 cmp r0, #0 9dce: d0f2 beq.n 9db6 9dd0: f8d8 3010 ldr.w r3, [r8, #16] while (fcn()) { 9dd4: 05db lsls r3, r3, #23 9dd6: d5ee bpl.n 9db6 m_busyFcn = 0; 9dd8: 2300 movs r3, #0 SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); 9dda: f44f 7200 mov.w r2, #512 ; 0x200 m_busyFcn = 0; 9dde: f8ca 3000 str.w r3, [sl] SDHC_PROCTL |= SDHC_PROCTL_SABGREQ; 9de2: f8d8 3028 ldr.w r3, [r8, #40] ; 0x28 9de6: f443 3380 orr.w r3, r3, #65536 ; 0x10000 9dea: f8c8 3028 str.w r3, [r8, #40] ; 0x28 if (!cardCommand(CMD18_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { 9dee: 4b18 ldr r3, [pc, #96] ; (9e50 ) SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); 9df0: f8c8 2004 str.w r2, [r8, #4] if (!cardCommand(CMD18_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { 9df4: 781b ldrb r3, [r3, #0] 9df6: b1cb cbz r3, 9e2c 9df8: 4649 mov r1, r9 9dfa: 4816 ldr r0, [pc, #88] ; (9e54 ) 9dfc: f7ff f9f8 bl 91f0 9e00: b930 cbnz r0, 9e10 m_errorCode = code; 9e02: 4915 ldr r1, [pc, #84] ; (9e58 ) 9e04: 240c movs r4, #12 m_errorLine = line; 9e06: 4b15 ldr r3, [pc, #84] ; (9e5c ) 9e08: f240 32bd movw r2, #957 ; 0x3bd m_errorCode = code; 9e0c: 700c strb r4, [r1, #0] m_errorLine = line; 9e0e: 601a str r2, [r3, #0] } 9e10: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} m_errorCode = code; 9e14: 4a10 ldr r2, [pc, #64] ; (9e58 ) 9e16: 210a movs r1, #10 m_busyFcn = 0; 9e18: 2000 movs r0, #0 m_errorLine = line; 9e1a: 4b10 ldr r3, [pc, #64] ; (9e5c ) m_errorCode = code; 9e1c: 7011 strb r1, [r2, #0] m_errorLine = line; 9e1e: f240 32b1 movw r2, #945 ; 0x3b1 m_busyFcn = 0; 9e22: f8ca 0000 str.w r0, [sl] m_errorLine = line; 9e26: 601a str r2, [r3, #0] } 9e28: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} if (!cardCommand(CMD18_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { 9e2c: ea4f 2949 mov.w r9, r9, lsl #9 9e30: 4808 ldr r0, [pc, #32] ; (9e54 ) 9e32: 4649 mov r1, r9 9e34: f7ff f9dc bl 91f0 9e38: 2800 cmp r0, #0 9e3a: d1e9 bne.n 9e10 9e3c: e7e1 b.n 9e02 9e3e: bf00 nop 9e40: 00009385 .word 0x00009385 9e44: 20002440 .word 0x20002440 9e48: 0d1a0000 .word 0x0d1a0000 9e4c: 000f4240 .word 0x000f4240 9e50: 20002df4 .word 0x20002df4 9e54: 123a0030 .word 0x123a0030 9e58: 2000153a .word 0x2000153a 9e5c: 20002418 .word 0x20002418 9e60: 20002444 .word 0x20002444 9e64: 402c0000 .word 0x402c0000 00009e68 : bool SdioCard::stopTransmission(bool blocking) { 9e68: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} m_curState = IDLE_STATE; 9e6c: 2200 movs r2, #0 SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 9e6e: 4c1d ldr r4, [pc, #116] ; (9ee4 ) bool SdioCard::stopTransmission(bool blocking) { 9e70: 460d mov r5, r1 m_curState = IDLE_STATE; 9e72: 7242 strb r2, [r0, #9] if (!cardCommand(CMD12_XFERTYP, 0)) { 9e74: 4611 mov r1, r2 SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 9e76: 6aa3 ldr r3, [r4, #40] ; 0x28 if (!cardCommand(CMD12_XFERTYP, 0)) { 9e78: 481b ldr r0, [pc, #108] ; (9ee8 ) SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; 9e7a: f423 3380 bic.w r3, r3, #65536 ; 0x10000 9e7e: 62a3 str r3, [r4, #40] ; 0x28 if (!cardCommand(CMD12_XFERTYP, 0)) { 9e80: f7ff f9b6 bl 91f0 9e84: b940 cbnz r0, 9e98 m_errorCode = code; 9e86: 4919 ldr r1, [pc, #100] ; (9eec ) 9e88: 2409 movs r4, #9 m_errorLine = line; 9e8a: 4b19 ldr r3, [pc, #100] ; (9ef0 ) 9e8c: f240 32d3 movw r2, #979 ; 0x3d3 m_errorCode = code; 9e90: 700c strb r4, [r1, #0] m_errorLine = line; 9e92: 601a str r2, [r3, #0] } 9e94: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (blocking) { 9e98: 2d00 cmp r5, #0 9e9a: d0fb beq.n 9e94 m_busyFcn = fcn; 9e9c: 4b15 ldr r3, [pc, #84] ; (9ef4 ) 9e9e: 4e16 ldr r6, [pc, #88] ; (9ef8 ) 9ea0: 6033 str r3, [r6, #0] uint32_t m = micros(); 9ea2: f001 f9d5 bl b250 return SDHC_PRSSTAT & (1 << 24) ? false : true; 9ea6: 6a63 ldr r3, [r4, #36] ; 0x24 uint32_t m = micros(); 9ea8: 4607 mov r7, r0 while (fcn()) { 9eaa: 01da lsls r2, r3, #7 9eac: d416 bmi.n 9edc if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9eae: f8df 804c ldr.w r8, [pc, #76] ; 9efc 9eb2: e004 b.n 9ebe yield(); 9eb4: f003 fa60 bl d378 return SDHC_PRSSTAT & (1 << 24) ? false : true; 9eb8: 6a63 ldr r3, [r4, #36] ; 0x24 while (fcn()) { 9eba: 01db lsls r3, r3, #7 9ebc: d40e bmi.n 9edc if ((micros() - m) > BUSY_TIMEOUT_MICROS) { 9ebe: f001 f9c7 bl b250 9ec2: 1bc0 subs r0, r0, r7 9ec4: 4540 cmp r0, r8 9ec6: d9f5 bls.n 9eb4 m_errorCode = code; 9ec8: 4a08 ldr r2, [pc, #32] ; (9eec ) 9eca: 210a movs r1, #10 m_busyFcn = 0; 9ecc: 2000 movs r0, #0 m_errorLine = line; 9ece: 4b08 ldr r3, [pc, #32] ; (9ef0 ) m_errorCode = code; 9ed0: 7011 strb r1, [r2, #0] m_errorLine = line; 9ed2: f240 32d7 movw r2, #983 ; 0x3d7 m_busyFcn = 0; 9ed6: 6030 str r0, [r6, #0] m_errorLine = line; 9ed8: 601a str r2, [r3, #0] return sdError(SD_CARD_ERROR_CMD13); 9eda: e7db b.n 9e94 m_busyFcn = 0; 9edc: 2300 movs r3, #0 return true; 9ede: 4628 mov r0, r5 m_busyFcn = 0; 9ee0: 6033 str r3, [r6, #0] return false; // Caller will set errorCode. 9ee2: e7d7 b.n 9e94 9ee4: 402c0000 .word 0x402c0000 9ee8: 0cdb0000 .word 0x0cdb0000 9eec: 2000153a .word 0x2000153a 9ef0: 20002418 .word 0x20002418 9ef4: 00008d99 .word 0x00008d99 9ef8: 20002444 .word 0x20002444 9efc: 000f4240 .word 0x000f4240 00009f00 : if (!m_transferActive) { 9f00: 4b0a ldr r3, [pc, #40] ; (9f2c ) 9f02: 781b ldrb r3, [r3, #0] bool SdioCard::syncDevice() { 9f04: b510 push {r4, lr} 9f06: 4604 mov r4, r0 if (!m_transferActive) { 9f08: b91b cbnz r3, 9f12 if (m_curState != IDLE_STATE) { 9f0a: 7a63 ldrb r3, [r4, #9] 9f0c: b943 cbnz r3, 9f20 return true; 9f0e: 2001 movs r0, #1 } 9f10: bd10 pop {r4, pc} 9f12: f7ff f8cf bl 90b4 if (!waitTransferComplete()) { 9f16: 2800 cmp r0, #0 9f18: d0fa beq.n 9f10 if (m_curState != IDLE_STATE) { 9f1a: 7a63 ldrb r3, [r4, #9] 9f1c: 2b00 cmp r3, #0 9f1e: d0f6 beq.n 9f0e return stopTransmission(true); 9f20: 4620 mov r0, r4 9f22: 2101 movs r1, #1 } 9f24: e8bd 4010 ldmia.w sp!, {r4, lr} return stopTransmission(true); 9f28: f7ff bf9e b.w 9e68 9f2c: 20002df5 .word 0x20002df5 00009f30 : bool SdioCard::readSector(uint32_t sector, uint8_t* dst) { 9f30: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 9f34: 4604 mov r4, r0 9f36: 7a00 ldrb r0, [r0, #8] 9f38: f5ad 7d00 sub.w sp, sp, #512 ; 0x200 9f3c: 4616 mov r6, r2 if (m_sdioConfig.useDma()) { 9f3e: f010 0501 ands.w r5, r0, #1 9f42: d013 beq.n 9f6c uint8_t* ptr = (uint32_t)dst & 3 ? aligned : dst; 9f44: 0793 lsls r3, r2, #30 9f46: d03c beq.n 9fc2 if (!rdWrSectors(CMD17_DMA_XFERTYP, sector, ptr, 1)) { 9f48: 2301 movs r3, #1 9f4a: 4838 ldr r0, [pc, #224] ; (a02c ) 9f4c: 466a mov r2, sp 9f4e: f7ff fc01 bl 9754 9f52: 2800 cmp r0, #0 9f54: d03a beq.n 9fcc memcpy(dst, aligned, 512); 9f56: f44f 7200 mov.w r2, #512 ; 0x200 9f5a: 4669 mov r1, sp 9f5c: 4630 mov r0, r6 9f5e: f001 fa1d bl b39c } 9f62: 4628 mov r0, r5 9f64: f50d 7d00 add.w sp, sp, #512 ; 0x200 9f68: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!m_transferActive) { 9f6c: f8df 80cc ldr.w r8, [pc, #204] ; a03c 9f70: 460f mov r7, r1 9f72: f898 3000 ldrb.w r3, [r8] 9f76: 2b00 cmp r3, #0 9f78: d135 bne.n 9fe6 if (m_curState != READ_STATE || sector != m_curSector) { 9f7a: 7a63 ldrb r3, [r4, #9] 9f7c: 2b01 cmp r3, #1 9f7e: d039 beq.n 9ff4 if (!syncDevice()) { 9f80: 6822 ldr r2, [r4, #0] 9f82: 492b ldr r1, [pc, #172] ; (a030 ) 9f84: 6a12 ldr r2, [r2, #32] 9f86: 428a cmp r2, r1 9f88: d14a bne.n a020 if (!m_transferActive) { 9f8a: f898 2000 ldrb.w r2, [r8] 9f8e: 2a00 cmp r2, #0 9f90: d134 bne.n 9ffc if (m_curState != IDLE_STATE) { 9f92: 2b00 cmp r3, #0 9f94: d139 bne.n a00a if (!readStart(sector)) { 9f96: 4639 mov r1, r7 9f98: 4620 mov r0, r4 9f9a: f7ff fefb bl 9d94 9f9e: b1e8 cbz r0, 9fdc m_curState = READ_STATE; 9fa0: 2301 movs r3, #1 m_curSector = sector; 9fa2: 6067 str r7, [r4, #4] m_curState = READ_STATE; 9fa4: 7263 strb r3, [r4, #9] if (!readData(dst)) { 9fa6: 4631 mov r1, r6 9fa8: 4620 mov r0, r4 9faa: f7ff fe75 bl 9c98 9fae: b1a8 cbz r0, 9fdc m_curSector++; 9fb0: 6863 ldr r3, [r4, #4] return true; 9fb2: 4605 mov r5, r0 m_curSector++; 9fb4: 3301 adds r3, #1 } 9fb6: 4628 mov r0, r5 m_curSector++; 9fb8: 6063 str r3, [r4, #4] } 9fba: f50d 7d00 add.w sp, sp, #512 ; 0x200 9fbe: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!rdWrSectors(CMD17_DMA_XFERTYP, sector, ptr, 1)) { 9fc2: 2301 movs r3, #1 9fc4: 4819 ldr r0, [pc, #100] ; (a02c ) 9fc6: f7ff fbc5 bl 9754 9fca: b938 cbnz r0, 9fdc m_errorCode = code; 9fcc: 4919 ldr r1, [pc, #100] ; (a034 ) 9fce: 200b movs r0, #11 m_errorLine = line; 9fd0: 4b19 ldr r3, [pc, #100] ; (a038 ) 9fd2: f44f 725d mov.w r2, #884 ; 0x374 return sdError(SD_CARD_ERROR_CMD17); 9fd6: 2500 movs r5, #0 m_errorCode = code; 9fd8: 7008 strb r0, [r1, #0] m_errorLine = line; 9fda: 601a str r2, [r3, #0] } 9fdc: 4628 mov r0, r5 9fde: f50d 7d00 add.w sp, sp, #512 ; 0x200 9fe2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} 9fe6: f7ff f865 bl 90b4 if (!waitTransferComplete()) { 9fea: 2800 cmp r0, #0 9fec: d0f6 beq.n 9fdc if (m_curState != READ_STATE || sector != m_curSector) { 9fee: 7a63 ldrb r3, [r4, #9] 9ff0: 2b01 cmp r3, #1 9ff2: d1c5 bne.n 9f80 9ff4: 6862 ldr r2, [r4, #4] 9ff6: 42ba cmp r2, r7 9ff8: d1c2 bne.n 9f80 9ffa: e7d4 b.n 9fa6 9ffc: f7ff f85a bl 90b4 if (!waitTransferComplete()) { a000: 2800 cmp r0, #0 a002: d0eb beq.n 9fdc if (m_curState != IDLE_STATE) { a004: 7a63 ldrb r3, [r4, #9] a006: 2b00 cmp r3, #0 a008: d0c5 beq.n 9f96 return stopTransmission(true); a00a: 2101 movs r1, #1 a00c: 4620 mov r0, r4 a00e: f7ff ff2b bl 9e68 if (!syncDevice()) { a012: 2800 cmp r0, #0 a014: d1bf bne.n 9f96 } a016: 4628 mov r0, r5 a018: f50d 7d00 add.w sp, sp, #512 ; 0x200 a01c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!syncDevice()) { a020: 4620 mov r0, r4 a022: 4790 blx r2 a024: 2800 cmp r0, #0 a026: d0f6 beq.n a016 a028: e7b5 b.n 9f96 a02a: bf00 nop a02c: 113a0011 .word 0x113a0011 a030: 00009f01 .word 0x00009f01 a034: 2000153a .word 0x2000153a a038: 20002418 .word 0x20002418 a03c: 20002df5 .word 0x20002df5 0000a040 : bool SdioCard::writeSector(uint32_t sector, const uint8_t* src) { a040: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} a044: 7a04 ldrb r4, [r0, #8] a046: f5ad 7d00 sub.w sp, sp, #512 ; 0x200 a04a: 460f mov r7, r1 a04c: 4690 mov r8, r2 if (m_sdioConfig.useDma()) { a04e: f014 0401 ands.w r4, r4, #1 a052: d01d beq.n a090 if (3 & (uint32_t)src) { a054: f012 0f03 tst.w r2, #3 a058: d006 beq.n a068 memcpy(aligned, src, 512); a05a: 4668 mov r0, sp a05c: 4611 mov r1, r2 a05e: f44f 7200 mov.w r2, #512 ; 0x200 ptr = aligned; a062: 4680 mov r8, r0 memcpy(aligned, src, 512); a064: f001 f99a bl b39c if (!rdWrSectors(CMD24_DMA_XFERTYP, sector, ptr, 1)) { a068: 2301 movs r3, #1 a06a: 4642 mov r2, r8 a06c: 4639 mov r1, r7 a06e: 482c ldr r0, [pc, #176] ; (a120 ) a070: f7ff fb70 bl 9754 a074: 4604 mov r4, r0 a076: b930 cbnz r0, a086 m_errorCode = code; a078: 492a ldr r1, [pc, #168] ; (a124 ) a07a: 200d movs r0, #13 m_errorLine = line; a07c: 4b2a ldr r3, [pc, #168] ; (a128 ) a07e: f240 4211 movw r2, #1041 ; 0x411 m_errorCode = code; a082: 7008 strb r0, [r1, #0] m_errorLine = line; a084: 601a str r2, [r3, #0] } a086: 4620 mov r0, r4 a088: f50d 7d00 add.w sp, sp, #512 ; 0x200 a08c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (!m_transferActive) { a090: 4d26 ldr r5, [pc, #152] ; (a12c ) a092: 4606 mov r6, r0 a094: 782b ldrb r3, [r5, #0] a096: bb2b cbnz r3, a0e4 if (m_curState != WRITE_STATE || m_curSector != sector) { a098: 7a73 ldrb r3, [r6, #9] a09a: 2b02 cmp r3, #2 a09c: d029 beq.n a0f2 if (!syncDevice()) { a09e: 6832 ldr r2, [r6, #0] a0a0: 4923 ldr r1, [pc, #140] ; (a130 ) a0a2: 6a12 ldr r2, [r2, #32] a0a4: 428a cmp r2, r1 a0a6: d136 bne.n a116 if (!m_transferActive) { a0a8: 782a ldrb r2, [r5, #0] a0aa: bb32 cbnz r2, a0fa if (m_curState != IDLE_STATE) { a0ac: 2b00 cmp r3, #0 a0ae: d12b bne.n a108 if (!writeStart(sector )) { a0b0: 6833 ldr r3, [r6, #0] a0b2: 4639 mov r1, r7 a0b4: 4630 mov r0, r6 a0b6: 6e1b ldr r3, [r3, #96] ; 0x60 a0b8: 4798 blx r3 a0ba: 2800 cmp r0, #0 a0bc: d0e3 beq.n a086 m_curState = WRITE_STATE; a0be: 2302 movs r3, #2 m_curSector = sector; a0c0: 6077 str r7, [r6, #4] m_curState = WRITE_STATE; a0c2: 7273 strb r3, [r6, #9] if (!writeData(src)) { a0c4: 6833 ldr r3, [r6, #0] a0c6: 4641 mov r1, r8 a0c8: 4630 mov r0, r6 a0ca: 6ddb ldr r3, [r3, #92] ; 0x5c a0cc: 4798 blx r3 a0ce: 2800 cmp r0, #0 a0d0: d0d9 beq.n a086 m_curSector++; a0d2: 6873 ldr r3, [r6, #4] return true; a0d4: 4604 mov r4, r0 m_curSector++; a0d6: 3301 adds r3, #1 } a0d8: 4620 mov r0, r4 m_curSector++; a0da: 6073 str r3, [r6, #4] } a0dc: f50d 7d00 add.w sp, sp, #512 ; 0x200 a0e0: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} a0e4: f7fe ffe6 bl 90b4 if (!waitTransferComplete()) { a0e8: 2800 cmp r0, #0 a0ea: d0cc beq.n a086 if (m_curState != WRITE_STATE || m_curSector != sector) { a0ec: 7a73 ldrb r3, [r6, #9] a0ee: 2b02 cmp r3, #2 a0f0: d1d5 bne.n a09e a0f2: 6872 ldr r2, [r6, #4] a0f4: 42ba cmp r2, r7 a0f6: d1d2 bne.n a09e a0f8: e7e4 b.n a0c4 a0fa: f7fe ffdb bl 90b4 if (!waitTransferComplete()) { a0fe: 2800 cmp r0, #0 a100: d0c1 beq.n a086 if (m_curState != IDLE_STATE) { a102: 7a73 ldrb r3, [r6, #9] a104: 2b00 cmp r3, #0 a106: d0d3 beq.n a0b0 return stopTransmission(true); a108: 2101 movs r1, #1 a10a: 4630 mov r0, r6 a10c: f7ff feac bl 9e68 if (!syncDevice()) { a110: 2800 cmp r0, #0 a112: d0b8 beq.n a086 a114: e7cc b.n a0b0 a116: 4630 mov r0, r6 a118: 4790 blx r2 a11a: 2800 cmp r0, #0 a11c: d0b3 beq.n a086 a11e: e7c7 b.n a0b0 a120: 183a0001 .word 0x183a0001 a124: 2000153a .word 0x2000153a a128: 20002418 .word 0x20002418 a12c: 20002df5 .word 0x20002df5 a130: 00009f01 .word 0x00009f01 0000a134 : #include "SdSpiDriver.h" #if ENABLE_ARDUINO_FEATURES #if SD_CHIP_SELECT_MODE == 0 //------------------------------------------------------------------------------ void sdCsInit(SdCsPin_t pin) { pinMode(pin, OUTPUT); a134: 2101 movs r1, #1 a136: f001 b8f1 b.w b31c a13a: bf00 nop 0000a13c : } //------------------------------------------------------------------------------ void sdCsWrite(SdCsPin_t pin, bool level) { digitalWrite(pin, level); a13c: f001 b8b2 b.w b2a4 0000a140 : */ #include "SdSpiDriver.h" #if defined(SD_USE_CUSTOM_SPI) && defined(__arm__) && defined(CORE_TEENSY) #define USE_TRANSFER_TX_RX 1 //------------------------------------------------------------------------------ void SdSpiArduinoDriver::activate() { a140: b508 push {r3, lr} m_spi->beginTransaction(m_spiSettings); a142: 4603 mov r3, r0 a144: f853 0b04 ldr.w r0, [r3], #4 a148: e893 0006 ldmia.w r3, {r1, r2} a14c: f7f7 fbfe bl 194c } a150: bd08 pop {r3, pc} a152: bf00 nop 0000a154 : //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { a154: b084 sub sp, #16 a156: f10d 0c10 add.w ip, sp, #16 a15a: e90c 000e stmdb ip, {r1, r2, r3} a15e: 4602 mov r2, r0 if (spiConfig.spiPort) { a160: b123 cbz r3, a16c m_spi->setSCK(SDFAT_SDCARD_SCK_PIN); #endif // defined(SDFAT_SDCARD_SPI) && defined(SDFAT_SDCARD_SS_PIN) } else { m_spi = &SPI; } m_spi->begin(); a162: 4618 mov r0, r3 a164: 6013 str r3, [r2, #0] } a166: b004 add sp, #16 m_spi->begin(); a168: f7f8 bc6c b.w 2a44 m_spi = &SPI; a16c: 4b02 ldr r3, [pc, #8] ; (a178 ) m_spi->begin(); a16e: 4618 mov r0, r3 a170: 6013 str r3, [r2, #0] } a172: b004 add sp, #16 m_spi->begin(); a174: f7f8 bc66 b.w 2a44 a178: 20001048 .word 0x20001048 0000a17c : //------------------------------------------------------------------------------ void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); a17c: 6802 ldr r2, [r0, #0] if (interruptMasksUsed) { a17e: 7cd3 ldrb r3, [r2, #19] a180: b313 cbz r3, a1c8 if (interruptMasksUsed & 0x01) NVIC_ISER0 = interruptSave[0]; a182: 07d8 lsls r0, r3, #31 a184: d504 bpl.n a190 a186: 6a90 ldr r0, [r2, #40] ; 0x28 a188: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 a18c: f8c1 0100 str.w r0, [r1, #256] ; 0x100 if (interruptMasksUsed & 0x02) NVIC_ISER1 = interruptSave[1]; a190: 0799 lsls r1, r3, #30 a192: d504 bpl.n a19e a194: 6ad0 ldr r0, [r2, #44] ; 0x2c a196: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 a19a: f8c1 0104 str.w r0, [r1, #260] ; 0x104 if (interruptMasksUsed & 0x04) NVIC_ISER2 = interruptSave[2]; a19e: 0758 lsls r0, r3, #29 a1a0: d504 bpl.n a1ac a1a2: 6b10 ldr r0, [r2, #48] ; 0x30 a1a4: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 a1a8: f8c1 0108 str.w r0, [r1, #264] ; 0x108 if (interruptMasksUsed & 0x08) NVIC_ISER3 = interruptSave[3]; a1ac: 0719 lsls r1, r3, #28 a1ae: d504 bpl.n a1ba a1b0: 6b50 ldr r0, [r2, #52] ; 0x34 a1b2: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000 a1b6: f8c1 010c str.w r0, [r1, #268] ; 0x10c if (interruptMasksUsed & 0x10) NVIC_ISER4 = interruptSave[4]; a1ba: 06db lsls r3, r3, #27 a1bc: d504 bpl.n a1c8 a1be: 6b92 ldr r2, [r2, #56] ; 0x38 a1c0: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 a1c4: f8c3 2110 str.w r2, [r3, #272] ; 0x110 } a1c8: 4770 bx lr a1ca: bf00 nop 0000a1cc : //------------------------------------------------------------------------------ void SdSpiArduinoDriver::end() { m_spi->end(); a1cc: 6800 ldr r0, [r0, #0] a1ce: f7f8 bd87 b.w 2ce0 a1d2: bf00 nop 0000a1d4 : IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } a1d4: 6802 ldr r2, [r0, #0] port().TDR = data; a1d6: 23ff movs r3, #255 ; 0xff IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } a1d8: 6812 ldr r2, [r2, #0] port().TDR = data; a1da: 6653 str r3, [r2, #100] ; 0x64 uint32_t fifo = (port().FSR >> 16) & 0x1F; a1dc: 6dd3 ldr r3, [r2, #92] ; 0x5c if (fifo > 0) return port().RDR; a1de: f413 1ff8 tst.w r3, #2031616 ; 0x1f0000 a1e2: d0fb beq.n a1dc a1e4: 6f50 ldr r0, [r2, #116] ; 0x74 } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } a1e6: b2c0 uxtb r0, r0 a1e8: 4770 bx lr a1ea: bf00 nop 0000a1ec : void setTransferWriteFill(uint8_t ch ) {_transferWriteFill = ch;} a1ec: f04f 0cff mov.w ip, #255 ; 0xff //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { #ifdef USE_TRANSFER_TX_RX m_spi->setTransferWriteFill(0xff); a1f0: 6800 ldr r0, [r0, #0] uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { a1f2: b508 push {r3, lr} a1f4: 4613 mov r3, r2 a1f6: f880 c03c strb.w ip, [r0, #60] ; 0x3c m_spi->transfer(nullptr, buf, count); a1fa: 460a mov r2, r1 a1fc: 2100 movs r1, #0 a1fe: f7f8 fd6b bl 2cd8 #else memset(buf, 0XFF, count); m_spi->transfer(buf, count); #endif return 0; } a202: 2000 movs r0, #0 a204: bd08 pop {r3, pc} a206: bf00 nop 0000a208 : IMXRT_LPSPI_t & port() { return *(IMXRT_LPSPI_t *)port_addr; } a208: 6803 ldr r3, [r0, #0] a20a: 681a ldr r2, [r3, #0] port().TDR = data; a20c: 6651 str r1, [r2, #100] ; 0x64 uint32_t fifo = (port().FSR >> 16) & 0x1F; a20e: 6dd3 ldr r3, [r2, #92] ; 0x5c if (fifo > 0) return port().RDR; a210: f413 1ff8 tst.w r3, #2031616 ; 0x1f0000 a214: d0fb beq.n a20e a216: 6f53 ldr r3, [r2, #116] ; 0x74 //------------------------------------------------------------------------------ void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } a218: 4770 bx lr a21a: bf00 nop 0000a21c : //------------------------------------------------------------------------------ void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { a21c: 4613 mov r3, r2 #ifdef USE_TRANSFER_TX_RX m_spi->transfer(buf, nullptr, count); a21e: 6800 ldr r0, [r0, #0] a220: 2200 movs r2, #0 a222: f7f8 bd59 b.w 2cd8 a226: bf00 nop 0000a228 : fail: return nullptr; } //------------------------------------------------------------------------------ bool FsCache::sync() { a228: b530 push {r4, r5, lr} if (m_status & CACHE_STATUS_DIRTY) { a22a: 7803 ldrb r3, [r0, #0] bool FsCache::sync() { a22c: b083 sub sp, #12 if (m_status & CACHE_STATUS_DIRTY) { a22e: 07dc lsls r4, r3, #31 a230: d51d bpl.n a26e if (!m_blockDev->writeSector(m_sector, m_buffer)) { a232: 4604 mov r4, r0 a234: 6840 ldr r0, [r0, #4] a236: f104 0210 add.w r2, r4, #16 a23a: 6803 ldr r3, [r0, #0] a23c: 68e1 ldr r1, [r4, #12] a23e: 9201 str r2, [sp, #4] a240: 6a5b ldr r3, [r3, #36] ; 0x24 a242: 4798 blx r3 a244: 9a01 ldr r2, [sp, #4] a246: 4605 mov r5, r0 a248: b1a8 cbz r0, a276 DBG_FAIL_MACRO; goto fail; } // mirror second FAT if (m_status & CACHE_STATUS_MIRROR_FAT) { a24a: 7823 ldrb r3, [r4, #0] a24c: 0799 lsls r1, r3, #30 a24e: d508 bpl.n a262 uint32_t sector = m_sector + m_mirrorOffset; if (!m_blockDev->writeSector(sector, m_buffer)) { a250: 6860 ldr r0, [r4, #4] uint32_t sector = m_sector + m_mirrorOffset; a252: e9d4 3102 ldrd r3, r1, [r4, #8] if (!m_blockDev->writeSector(sector, m_buffer)) { a256: 4419 add r1, r3 a258: 6803 ldr r3, [r0, #0] a25a: 6a5b ldr r3, [r3, #36] ; 0x24 a25c: 4798 blx r3 a25e: b150 cbz r0, a276 DBG_FAIL_MACRO; goto fail; } } m_status &= ~CACHE_STATUS_DIRTY; a260: 7823 ldrb r3, [r4, #0] a262: f023 0301 bic.w r3, r3, #1 } return true; fail: return false; } a266: 4628 mov r0, r5 m_status &= ~CACHE_STATUS_DIRTY; a268: 7023 strb r3, [r4, #0] } a26a: b003 add sp, #12 a26c: bd30 pop {r4, r5, pc} return true; a26e: 2501 movs r5, #1 } a270: 4628 mov r0, r5 a272: b003 add sp, #12 a274: bd30 pop {r4, r5, pc} return false; a276: 2500 movs r5, #0 } a278: 4628 mov r0, r5 a27a: b003 add sp, #12 a27c: bd30 pop {r4, r5, pc} a27e: bf00 nop 0000a280 : uint8_t* FsCache::prepare(uint32_t sector, uint8_t option) { a280: b5f8 push {r3, r4, r5, r6, r7, lr} if (!m_blockDev) { a282: 6843 ldr r3, [r0, #4] a284: b30b cbz r3, a2ca if (m_sector != sector) { a286: 68c3 ldr r3, [r0, #12] a288: 4604 mov r4, r0 a28a: 460f mov r7, r1 a28c: 4615 mov r5, r2 a28e: 428b cmp r3, r1 a290: d106 bne.n a2a0 m_status |= option & CACHE_STATUS_MASK; a292: f810 3b10 ldrb.w r3, [r0], #16 a296: f005 0503 and.w r5, r5, #3 a29a: 432b orrs r3, r5 a29c: 7023 strb r3, [r4, #0] } a29e: bdf8 pop {r3, r4, r5, r6, r7, pc} if (!sync()) { a2a0: f7ff ffc2 bl a228 a2a4: b188 cbz r0, a2ca if (!(option & CACHE_OPTION_NO_READ)) { a2a6: 076b lsls r3, r5, #29 a2a8: d505 bpl.n a2b6 a2aa: f104 0610 add.w r6, r4, #16 if (!m_blockDev->readSector(sector, m_buffer)) { a2ae: 4630 mov r0, r6 m_sector = sector; a2b0: 2300 movs r3, #0 a2b2: 60e7 str r7, [r4, #12] a2b4: e7ef b.n a296 if (!m_blockDev->readSector(sector, m_buffer)) { a2b6: 6860 ldr r0, [r4, #4] a2b8: f104 0610 add.w r6, r4, #16 a2bc: 4639 mov r1, r7 a2be: 6803 ldr r3, [r0, #0] a2c0: 4632 mov r2, r6 a2c2: 691b ldr r3, [r3, #16] a2c4: 4798 blx r3 a2c6: 2800 cmp r0, #0 a2c8: d1f1 bne.n a2ae return nullptr; a2ca: 2000 movs r0, #0 } a2cc: bdf8 pop {r3, r4, r5, r6, r7, pc} a2ce: bf00 nop 0000a2d0 : *ms10 = 0; a2d0: f04f 0c00 mov.w ip, #0 FsDateTime::callback2(date, time); a2d4: 4b02 ldr r3, [pc, #8] ; (a2e0 ) *ms10 = 0; a2d6: f882 c000 strb.w ip, [r2] FsDateTime::callback2(date, time); a2da: 681b ldr r3, [r3, #0] a2dc: 4718 bx r3 a2de: bf00 nop a2e0: 20002450 .word 0x20002450 0000a2e4 : callback = dateTimeMs10; a2e4: 4a02 ldr r2, [pc, #8] ; (a2f0 ) a2e6: 4903 ldr r1, [pc, #12] ; (a2f4 ) callback2 = dateTime; a2e8: 4b03 ldr r3, [pc, #12] ; (a2f8 ) callback = dateTimeMs10; a2ea: 6011 str r1, [r2, #0] callback2 = dateTime; a2ec: 6018 str r0, [r3, #0] } a2ee: 4770 bx lr a2f0: 2000244c .word 0x2000244c a2f4: 0000a2d1 .word 0x0000a2d1 a2f8: 20002450 .word 0x20002450 0000a2fc : * DEALINGS IN THE SOFTWARE. */ #include "FsName.h" #include "FsUtf.h" #if USE_UTF8_LONG_NAMES uint16_t FsName::get16() { a2fc: b510 push {r4, lr} a2fe: 4604 mov r4, r0 uint16_t rtn; if (ls) { a300: 8980 ldrh r0, [r0, #12] uint16_t FsName::get16() { a302: b082 sub sp, #8 if (ls) { a304: b118 cbz r0, a30e rtn = ls; ls = 0; a306: 2300 movs r3, #0 a308: 81a3 strh r3, [r4, #12] } return rtn; fail: return 0XFFFF; } a30a: b002 add sp, #8 a30c: bd10 pop {r4, pc} } else if (next >= end) { a30e: e9d4 3101 ldrd r3, r1, [r4, #4] a312: 428b cmp r3, r1 a314: d2f9 bcs.n a30a const char* ptr = FsUtf::mbToCp(next, end, &cp); a316: aa01 add r2, sp, #4 a318: 4618 mov r0, r3 a31a: f000 f8b7 bl a48c if (!ptr) { a31e: b180 cbz r0, a342 if (cp <= 0XFFFF) { a320: 9b01 ldr r3, [sp, #4] next = ptr; a322: 6060 str r0, [r4, #4] if (cp <= 0XFFFF) { a324: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 a328: d201 bcs.n a32e rtn = cp; a32a: b298 uxth r0, r3 a32c: e7ed b.n a30a return (cp >> 10) + (0XD800 - (0X10000 >> 10)); a32e: 0a98 lsrs r0, r3, #10 return (cp & 0X3FF) + 0XDC00; a330: f3c3 0309 ubfx r3, r3, #0, #10 return (cp >> 10) + (0XD800 - (0X10000 >> 10)); a334: f5a0 5021 sub.w r0, r0, #10304 ; 0x2840 return (cp & 0X3FF) + 0XDC00; a338: f5a3 5310 sub.w r3, r3, #9216 ; 0x2400 return (cp >> 10) + (0XD800 - (0X10000 >> 10)); a33c: b280 uxth r0, r0 ls = FsUtf::lowSurrogate(cp); a33e: 81a3 strh r3, [r4, #12] a340: e7e3 b.n a30a return 0XFFFF; a342: f64f 70ff movw r0, #65535 ; 0xffff a346: e7e0 b.n a30a 0000a348 : uint32_t c; uint8_t h; uint8_t s; uint8_t numberOfHeads; uint8_t sectorsPerTrack = capacityMB <= 256 ? 32 : 63; a348: f5b1 7f80 cmp.w r1, #256 ; 0x100 a34c: d821 bhi.n a392 if (capacityMB <= 16) { a34e: 2910 cmp r1, #16 a350: d82e bhi.n a3b0 a352: 2340 movs r3, #64 ; 0x40 uint8_t sectorsPerTrack = capacityMB <= 256 ? 32 : 63; a354: f04f 0c20 mov.w ip, #32 } else if (capacityMB <= 4032) { numberOfHeads = 128; } else { numberOfHeads = 255; } c = lba / (numberOfHeads * sectorsPerTrack); a358: fbb2 f1f3 udiv r1, r2, r3 if (c <= 1023) { a35c: f5b1 6f80 cmp.w r1, #1024 ; 0x400 a360: d220 bcs.n a3a4 h = (lba % (numberOfHeads * sectorsPerTrack)) / sectorsPerTrack; a362: fb03 2311 mls r3, r3, r1, r2 void lbaToMbrChs(uint8_t* chs, uint32_t capacityMB, uint32_t lba) { a366: b500 push {lr} s = (lba % sectorsPerTrack) + 1; a368: fbb2 fefc udiv lr, r2, ip h = (lba % (numberOfHeads * sectorsPerTrack)) / sectorsPerTrack; a36c: fbb3 f3fc udiv r3, r3, ip s = (lba % sectorsPerTrack) + 1; a370: fb0c 221e mls r2, ip, lr, r2 c = 1023; h = 254; s = 63; } chs[0] = h; chs[1] = ((c >> 2) & 0XC0) | s; a374: ea4f 0c91 mov.w ip, r1, lsr #2 h = (lba % (numberOfHeads * sectorsPerTrack)) / sectorsPerTrack; a378: b2db uxtb r3, r3 s = (lba % sectorsPerTrack) + 1; a37a: 3201 adds r2, #1 chs[1] = ((c >> 2) & 0XC0) | s; a37c: f02c 0c3f bic.w ip, ip, #63 ; 0x3f chs[2] = c; a380: b2c9 uxtb r1, r1 chs[0] = h; a382: 7003 strb r3, [r0, #0] chs[1] = ((c >> 2) & 0XC0) | s; a384: ea42 020c orr.w r2, r2, ip chs[2] = c; a388: 7081 strb r1, [r0, #2] chs[1] = ((c >> 2) & 0XC0) | s; a38a: b2d2 uxtb r2, r2 a38c: 7042 strb r2, [r0, #1] } a38e: f85d fb04 ldr.w pc, [sp], #4 a392: 233f movs r3, #63 ; 0x3f uint8_t sectorsPerTrack = capacityMB <= 256 ? 32 : 63; a394: 469c mov ip, r3 } else if (capacityMB <= 128) { a396: 2980 cmp r1, #128 ; 0x80 a398: d910 bls.n a3bc } else if (capacityMB <= 504) { a39a: f5b1 7ffc cmp.w r1, #504 ; 0x1f8 a39e: d80f bhi.n a3c0 c = lba / (numberOfHeads * sectorsPerTrack); a3a0: 011b lsls r3, r3, #4 a3a2: e7d9 b.n a358 a3a4: 21ff movs r1, #255 ; 0xff h = 254; a3a6: 23fe movs r3, #254 ; 0xfe chs[1] = ((c >> 2) & 0XC0) | s; a3a8: 7041 strb r1, [r0, #1] chs[0] = h; a3aa: 7003 strb r3, [r0, #0] chs[2] = c; a3ac: 7081 strb r1, [r0, #2] a3ae: 4770 bx lr } else if (capacityMB <= 32) { a3b0: 2920 cmp r1, #32 a3b2: d816 bhi.n a3e2 a3b4: 2380 movs r3, #128 ; 0x80 uint8_t sectorsPerTrack = capacityMB <= 256 ? 32 : 63; a3b6: f04f 0c20 mov.w ip, #32 a3ba: e7cd b.n a358 c = lba / (numberOfHeads * sectorsPerTrack); a3bc: 00db lsls r3, r3, #3 a3be: e7cb b.n a358 } else if (capacityMB <= 1008) { a3c0: f5b1 7f7c cmp.w r1, #1008 ; 0x3f0 a3c4: d904 bls.n a3d0 } else if (capacityMB <= 2016) { a3c6: f5b1 6ffc cmp.w r1, #2016 ; 0x7e0 a3ca: d803 bhi.n a3d4 c = lba / (numberOfHeads * sectorsPerTrack); a3cc: 019b lsls r3, r3, #6 a3ce: e7c3 b.n a358 a3d0: 015b lsls r3, r3, #5 a3d2: e7c1 b.n a358 } else if (capacityMB <= 4032) { a3d4: f5b1 6f7c cmp.w r1, #4032 ; 0xfc0 c = lba / (numberOfHeads * sectorsPerTrack); a3d8: bf94 ite ls a3da: 01db lslls r3, r3, #7 a3dc: ebc3 2303 rsbhi r3, r3, r3, lsl #8 a3e0: e7ba b.n a358 a3e2: 2320 movs r3, #32 uint8_t sectorsPerTrack = capacityMB <= 256 ? 32 : 63; a3e4: 469c mov ip, r3 a3e6: e7d6 b.n a396 0000a3e8 : if (cp < 0X80) { a3e8: 287f cmp r0, #127 ; 0x7f size_t n = end - str; a3ea: eba2 0201 sub.w r2, r2, r1 if (cp < 0X80) { a3ee: d805 bhi.n a3fc if (n < 1) goto fail; a3f0: b112 cbz r2, a3f8 *(str++) = static_cast(cp); a3f2: 460a mov r2, r1 a3f4: f802 0b01 strb.w r0, [r2], #1 } a3f8: 4610 mov r0, r2 a3fa: 4770 bx lr } else if (cp < 0X800) { a3fc: f5b0 6f00 cmp.w r0, #2048 ; 0x800 a400: d20f bcs.n a422 if (n < 2) goto fail; a402: 2a01 cmp r2, #1 a404: d940 bls.n a488 *(str++) = static_cast((cp >> 6) | 0XC0); a406: ea4f 1c90 mov.w ip, r0, lsr #6 *(str++) = static_cast((cp & 0X3F) | 0X80); a40a: f000 033f and.w r3, r0, #63 ; 0x3f *(str++) = static_cast((cp >> 6) | 0XC0); a40e: 460a mov r2, r1 a410: f06c 003f orn r0, ip, #63 ; 0x3f *(str++) = static_cast((cp & 0X3F) | 0X80); a414: f063 037f orn r3, r3, #127 ; 0x7f *(str++) = static_cast((cp >> 6) | 0XC0); a418: f802 0b02 strb.w r0, [r2], #2 } a41c: 4610 mov r0, r2 *(str++) = static_cast((cp & 0X3F) | 0X80); a41e: 704b strb r3, [r1, #1] } a420: 4770 bx lr } else if (cp < 0X10000) { a422: f5b0 3f80 cmp.w r0, #65536 ; 0x10000 a426: d216 bcs.n a456 if (n < 3) goto fail; a428: 2a02 cmp r2, #2 a42a: d92d bls.n a488 *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); a42c: f3c0 1c85 ubfx ip, r0, #6, #6 *(str++) = static_cast((cp & 0X3F) | 0X80); a430: f000 033f and.w r3, r0, #63 ; 0x3f a434: 1cca adds r2, r1, #3 a436: f063 037f orn r3, r3, #127 ; 0x7f char* cpToMb(uint32_t cp, char* str, char* end) { a43a: b500 push {lr} *(str++) = static_cast((cp >> 12) | 0XE0); a43c: ea4f 3e10 mov.w lr, r0, lsr #12 *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); a440: f06c 007f orn r0, ip, #127 ; 0x7f *(str++) = static_cast((cp & 0X3F) | 0X80); a444: 708b strb r3, [r1, #2] *(str++) = static_cast((cp >> 12) | 0XE0); a446: f06e 0e1f orn lr, lr, #31 *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); a44a: 7048 strb r0, [r1, #1] } a44c: 4610 mov r0, r2 *(str++) = static_cast((cp >> 12) | 0XE0); a44e: f881 e000 strb.w lr, [r1] } a452: f85d fb04 ldr.w pc, [sp], #4 if (n < 4) goto fail; a456: 2a03 cmp r2, #3 a458: d916 bls.n a488 *(str++) = static_cast((cp >> 18) | 0XF0); a45a: ea4f 4c90 mov.w ip, r0, lsr #18 *(str++) = static_cast(((cp >> 12) & 0X3F)| 0X80); a45e: f3c0 3205 ubfx r2, r0, #12, #6 *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); a462: f3c0 1385 ubfx r3, r0, #6, #6 *(str++) = static_cast((cp & 0X3F) | 0X80); a466: f000 003f and.w r0, r0, #63 ; 0x3f *(str++) = static_cast(((cp >> 12) & 0X3F)| 0X80); a46a: f062 027f orn r2, r2, #127 ; 0x7f *(str++) = static_cast((cp >> 18) | 0XF0); a46e: f06c 0c0f orn ip, ip, #15 *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); a472: f063 037f orn r3, r3, #127 ; 0x7f *(str++) = static_cast((cp & 0X3F) | 0X80); a476: f060 007f orn r0, r0, #127 ; 0x7f *(str++) = static_cast(((cp >> 12) & 0X3F)| 0X80); a47a: 704a strb r2, [r1, #1] *(str++) = static_cast((cp & 0X3F) | 0X80); a47c: 1d0a adds r2, r1, #4 a47e: 70c8 strb r0, [r1, #3] *(str++) = static_cast((cp >> 18) | 0XF0); a480: f881 c000 strb.w ip, [r1] *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); a484: 708b strb r3, [r1, #2] *(str++) = static_cast((cp & 0X3F) | 0X80); a486: e7b7 b.n a3f8 return nullptr; a488: 2200 movs r2, #0 a48a: e7b5 b.n a3f8 0000a48c : if (str >= end) { a48c: 4288 cmp r0, r1 a48e: d23d bcs.n a50c a490: 4603 mov r3, r0 const char* mbToCp(const char* str, const char* end, uint32_t* rtn) { a492: b410 push {r4} if ((ch & 0X80) == 0) { a494: f990 0000 ldrsb.w r0, [r0] uint8_t ch = str[0]; a498: 781c ldrb r4, [r3, #0] if ((ch & 0X80) == 0) { a49a: 2800 cmp r0, #0 a49c: da2d bge.n a4fa if ((ch & 0XE0) == 0XC0) { a49e: f004 00e0 and.w r0, r4, #224 ; 0xe0 a4a2: 28c0 cmp r0, #192 ; 0xc0 a4a4: d034 beq.n a510 } else if ((ch & 0XF0) == 0XE0) { a4a6: f004 00f0 and.w r0, r4, #240 ; 0xf0 a4aa: 28e0 cmp r0, #224 ; 0xe0 a4ac: d034 beq.n a518 } else if ((ch & 0XF8) == 0XF0) { a4ae: f004 00f8 and.w r0, r4, #248 ; 0xf8 a4b2: 28f0 cmp r0, #240 ; 0xf0 a4b4: d126 bne.n a504 cp = ch & 0X07; a4b6: f004 0407 and.w r4, r4, #7 n = 4; a4ba: 2004 movs r0, #4 if ((str + n) > end) { a4bc: 4418 add r0, r3 a4be: 4288 cmp r0, r1 a4c0: d820 bhi.n a504 a4c2: 3301 adds r3, #1 ch = str[i]; a4c4: f813 1b01 ldrb.w r1, [r3], #1 if ((ch & 0XC0) != 0X80) { a4c8: f001 0cc0 and.w ip, r1, #192 ; 0xc0 cp |= ch & 0X3F; a4cc: f001 013f and.w r1, r1, #63 ; 0x3f if ((ch & 0XC0) != 0X80) { a4d0: f1bc 0f80 cmp.w ip, #128 ; 0x80 cp |= ch & 0X3F; a4d4: ea41 1484 orr.w r4, r1, r4, lsl #6 if ((ch & 0XC0) != 0X80) { a4d8: d114 bne.n a504 for (size_t i = 1; i < n; i++) { a4da: 4283 cmp r3, r0 a4dc: d1f2 bne.n a4c4 if (cp < 0X80 || !isValidCp(cp)) { a4de: f1a4 0180 sub.w r1, r4, #128 ; 0x80 a4e2: 4b0f ldr r3, [pc, #60] ; (a520 ) a4e4: 4299 cmp r1, r3 a4e6: d80d bhi.n a504 return cp <= 0x10FFFF && (cp < 0XD800 || cp > 0XDFFF); a4e8: f5a4 4358 sub.w r3, r4, #55296 ; 0xd800 a4ec: f5b3 6f00 cmp.w r3, #2048 ; 0x800 a4f0: d308 bcc.n a504 *rtn = cp; a4f2: 6014 str r4, [r2, #0] } a4f4: f85d 4b04 ldr.w r4, [sp], #4 a4f8: 4770 bx lr return str + 1; a4fa: 1c58 adds r0, r3, #1 *rtn = ch; a4fc: 6014 str r4, [r2, #0] } a4fe: f85d 4b04 ldr.w r4, [sp], #4 a502: 4770 bx lr return nullptr; a504: 2000 movs r0, #0 } a506: f85d 4b04 ldr.w r4, [sp], #4 a50a: 4770 bx lr return nullptr; a50c: 2000 movs r0, #0 } a50e: 4770 bx lr cp = ch & 0X1F; a510: f004 041f and.w r4, r4, #31 n = 2; a514: 2002 movs r0, #2 a516: e7d1 b.n a4bc cp = ch & 0X0F; a518: f004 040f and.w r4, r4, #15 n = 3; a51c: 2003 movs r0, #3 a51e: e7cd b.n a4bc a520: 0010ff7f .word 0x0010ff7f 0000a524 : } //------------------------------------------------------------------------------ uint16_t toUpcase(uint16_t chr) { uint16_t i, first; // Optimize for simple ASCII. if (chr < 127) { a524: 287e cmp r0, #126 ; 0x7e a526: d93e bls.n a5a6 size_t right = size; a528: f04f 0c35 mov.w ip, #53 ; 0x35 size_t left = 0; a52c: 2300 movs r3, #0 uint16_t toUpcase(uint16_t chr) { a52e: b430 push {r4, r5} a530: 4c28 ldr r4, [pc, #160] ; (a5d4 ) a532: e004 b.n a53e if (readTable16(table[mid].key) <= key) { a534: f834 2021 ldrh.w r2, [r4, r1, lsl #2] a538: 4282 cmp r2, r0 a53a: d820 bhi.n a57e mid = left + (right - left)/2; a53c: 460b mov r3, r1 while (right - left > 1) { a53e: ebac 0203 sub.w r2, ip, r3 a542: 2a01 cmp r2, #1 mid = left + (right - left)/2; a544: eb03 0152 add.w r1, r3, r2, lsr #1 while (right - left > 1) { a548: d8f4 bhi.n a534 return chr - ('a' <= chr && chr <= 'z' ? 'a' - 'A' : 0); } i = searchPair16(reinterpret_cast(mapTable), MAP_DIM, chr); first = readTable16(mapTable[i].base); a54a: b29b uxth r3, r3 a54c: f834 2023 ldrh.w r2, [r4, r3, lsl #2] if (first <= chr && (chr - first) < readTable8(mapTable[i].count)) { a550: 4290 cmp r0, r2 a552: d216 bcs.n a582 a554: 244b movs r4, #75 ; 0x4b a556: 2300 movs r3, #0 a558: 4d1f ldr r5, [pc, #124] ; (a5d8 ) a55a: e004 b.n a566 if (readTable16(table[mid].key) <= key) { a55c: f835 2021 ldrh.w r2, [r5, r1, lsl #2] a560: 4282 cmp r2, r0 a562: d81e bhi.n a5a2 mid = left + (right - left)/2; a564: 460b mov r3, r1 while (right - left > 1) { a566: 1ae2 subs r2, r4, r3 a568: 2a01 cmp r2, #1 mid = left + (right - left)/2; a56a: eb03 0152 add.w r1, r3, r2, lsr #1 while (right - left > 1) { a56e: d8f5 bhi.n a55c return chr - ((chr - first) & 1); } return chr + (off ? off : -0x1C60); } i = searchPair16(lookupTable, LOOKUP_DIM, chr); if (readTable16(lookupTable[i].key) == chr) { a570: b29b uxth r3, r3 a572: f835 2023 ldrh.w r2, [r5, r3, lsl #2] a576: 4282 cmp r2, r0 a578: d01f beq.n a5ba return readTable16(lookupTable[i].val); } return chr; } a57a: bc30 pop {r4, r5} a57c: 4770 bx lr mid = left + (right - left)/2; a57e: 468c mov ip, r1 a580: e7dd b.n a53e if (first <= chr && (chr - first) < readTable8(mapTable[i].count)) { a582: eb04 0483 add.w r4, r4, r3, lsl #2 a586: 1a82 subs r2, r0, r2 a588: 78e3 ldrb r3, [r4, #3] a58a: 429a cmp r2, r3 a58c: dae2 bge.n a554 int8_t off = readTable8(mapTable[i].off); a58e: f994 3002 ldrsb.w r3, [r4, #2] if (off == 1) { a592: 2b01 cmp r3, #1 a594: d016 beq.n a5c4 return chr + (off ? off : -0x1C60); a596: b1d3 cbz r3, a5ce a598: b29b uxth r3, r3 a59a: 4403 add r3, r0 } a59c: bc30 pop {r4, r5} return chr + (off ? off : -0x1C60); a59e: b298 uxth r0, r3 } a5a0: 4770 bx lr mid = left + (right - left)/2; a5a2: 460c mov r4, r1 a5a4: e7df b.n a566 return chr - ('a' <= chr && chr <= 'z' ? 'a' - 'A' : 0); a5a6: f1a0 0361 sub.w r3, r0, #97 ; 0x61 a5aa: 2b19 cmp r3, #25 a5ac: bf8c ite hi a5ae: 2300 movhi r3, #0 a5b0: 2301 movls r3, #1 a5b2: eba0 1343 sub.w r3, r0, r3, lsl #5 a5b6: b298 uxth r0, r3 } a5b8: 4770 bx lr return readTable16(lookupTable[i].val); a5ba: eb05 0583 add.w r5, r5, r3, lsl #2 a5be: 8868 ldrh r0, [r5, #2] } a5c0: bc30 pop {r4, r5} a5c2: 4770 bx lr return chr - ((chr - first) & 1); a5c4: f002 0201 and.w r2, r2, #1 a5c8: 1a83 subs r3, r0, r2 a5ca: b298 uxth r0, r3 a5cc: e7d5 b.n a57a return chr + (off ? off : -0x1C60); a5ce: f24e 33a0 movw r3, #58272 ; 0xe3a0 a5d2: e7e2 b.n a59a a5d4: 200006b0 .word 0x200006b0 a5d8: 20000584 .word 0x20000584 0000a5dc : void transmit(audio_block_t *block, unsigned char index = 0); audio_block_t * receiveReadOnly(unsigned int index = 0); audio_block_t * receiveWritable(unsigned int index = 0); static bool update_setup(void); static void update_stop(void); static void update_all(void) { NVIC_SET_PENDING(IRQ_SOFTWARE); } a5dc: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 a5e0: 2240 movs r2, #64 ; 0x40 a5e2: f8c3 2208 str.w r2, [r3, #520] ; 0x208 a5e6: 4770 bx lr 0000a5e8 : } AudioStream * AudioStream::first_update = NULL; void software_isr(void) // AudioStream::update_all() { a5e8: b5f8 push {r3, r4, r5, r6, r7, lr} AudioStream *p; uint32_t totalcycles = ARM_DWT_CYCCNT; //digitalWriteFast(2, HIGH); for (p = AudioStream::first_update; p; p = p->next_update) { a5ea: 4b14 ldr r3, [pc, #80] ; (a63c ) uint32_t totalcycles = ARM_DWT_CYCCNT; a5ec: 4d14 ldr r5, [pc, #80] ; (a640 ) for (p = AudioStream::first_update; p; p = p->next_update) { a5ee: 681c ldr r4, [r3, #0] uint32_t totalcycles = ARM_DWT_CYCCNT; a5f0: 686e ldr r6, [r5, #4] for (p = AudioStream::first_update; p; p = p->next_update) { a5f2: b19c cbz r4, a61c if (p->active) { a5f4: 7a23 ldrb r3, [r4, #8] uint32_t cycles = ARM_DWT_CYCCNT; p->update(); a5f6: 4620 mov r0, r4 if (p->active) { a5f8: b16b cbz r3, a616 p->update(); a5fa: 6823 ldr r3, [r4, #0] uint32_t cycles = ARM_DWT_CYCCNT; a5fc: 686f ldr r7, [r5, #4] p->update(); a5fe: 681b ldr r3, [r3, #0] a600: 4798 blx r3 // TODO: traverse inputQueueArray and release // any input blocks that weren't consumed? cycles = (ARM_DWT_CYCCNT - cycles) >> 6; a602: 686b ldr r3, [r5, #4] p->cpu_cycles = cycles; if (cycles > p->cpu_cycles_max) p->cpu_cycles_max = cycles; a604: 88e1 ldrh r1, [r4, #6] cycles = (ARM_DWT_CYCCNT - cycles) >> 6; a606: 1bdb subs r3, r3, r7 p->cpu_cycles = cycles; a608: f3c3 128f ubfx r2, r3, #6, #16 if (cycles > p->cpu_cycles_max) p->cpu_cycles_max = cycles; a60c: ebb1 1f93 cmp.w r1, r3, lsr #6 p->cpu_cycles = cycles; a610: 80a2 strh r2, [r4, #4] if (cycles > p->cpu_cycles_max) p->cpu_cycles_max = cycles; a612: bf38 it cc a614: 80e2 strhcc r2, [r4, #6] for (p = AudioStream::first_update; p; p = p->next_update) { a616: 6964 ldr r4, [r4, #20] a618: 2c00 cmp r4, #0 a61a: d1eb bne.n a5f4 } } //digitalWriteFast(2, LOW); totalcycles = (ARM_DWT_CYCCNT - totalcycles) >> 6; a61c: 4b08 ldr r3, [pc, #32] ; (a640 ) AudioStream::cpu_cycles_total = totalcycles; if (totalcycles > AudioStream::cpu_cycles_total_max) a61e: 4a09 ldr r2, [pc, #36] ; (a644 ) totalcycles = (ARM_DWT_CYCCNT - totalcycles) >> 6; a620: 685b ldr r3, [r3, #4] if (totalcycles > AudioStream::cpu_cycles_total_max) a622: 8810 ldrh r0, [r2, #0] totalcycles = (ARM_DWT_CYCCNT - totalcycles) >> 6; a624: 1b9b subs r3, r3, r6 AudioStream::cpu_cycles_total = totalcycles; a626: 4c08 ldr r4, [pc, #32] ; (a648 ) a628: f3c3 118f ubfx r1, r3, #6, #16 if (totalcycles > AudioStream::cpu_cycles_total_max) a62c: ebb0 1f93 cmp.w r0, r3, lsr #6 AudioStream::cpu_cycles_total = totalcycles; a630: 8021 strh r1, [r4, #0] AudioStream::cpu_cycles_total_max = totalcycles; a632: bf38 it cc a634: 8011 strhcc r1, [r2, #0] asm("DSB"); a636: f3bf 8f4f dsb sy } a63a: bdf8 pop {r3, r4, r5, r6, r7, pc} a63c: 20002458 .word 0x20002458 a640: e0001000 .word 0xe0001000 a644: 20002ddc .word 0x20002ddc a648: 20002dda .word 0x20002dda 0000a64c ::vtable(teensy::inplace_function_detail::wrapper)::{lambda(void*)#1}::_FUN(void*)>: { return (*static_cast(storage_ptr))( a64c: 6803 ldr r3, [r0, #0] a64e: 4718 bx r3 0000a650 ::vtable(teensy::inplace_function_detail::wrapper)::{lambda(void*, void*)#2}::_FUN(void*, void*)>: { ::new (dst_ptr) C{ (*static_cast(src_ptr)) }; } a650: 680b ldr r3, [r1, #0] a652: 6003 str r3, [r0, #0] copy_ptr{ [](storage_ptr_t dst_ptr, storage_ptr_t src_ptr) -> void a654: 4770 bx lr a656: bf00 nop 0000a658 ::vtable(teensy::inplace_function_detail::wrapper)::{lambda(void*, void*)#3}::_FUN(void*, void*)>: ::new (dst_ptr) C{ std::move(*static_cast(src_ptr)) }; a658: 680b ldr r3, [r1, #0] a65a: 6003 str r3, [r0, #0] relocate_ptr{ [](storage_ptr_t dst_ptr, storage_ptr_t src_ptr) -> void a65c: 4770 bx lr a65e: bf00 nop 0000a660 ::vtable(teensy::inplace_function_detail::wrapper)::{lambda(void*)#4}::_FUN(void*)>: destructor_ptr{ [](storage_ptr_t src_ptr) -> void a660: 4770 bx lr a662: bf00 nop 0000a664 : { a664: b430 push {r4, r5} __disable_irq(); a666: b672 cpsid i index = memory_pool_first_mask; a668: 4d24 ldr r5, [pc, #144] ; (a6fc ) p += index; a66a: 4c25 ldr r4, [pc, #148] ; (a700 ) index = memory_pool_first_mask; a66c: 882a ldrh r2, [r5, #0] if (p >= end) { a66e: f104 0170 add.w r1, r4, #112 ; 0x70 p += index; a672: eb04 0382 add.w r3, r4, r2, lsl #2 if (p >= end) { a676: 428b cmp r3, r1 a678: d23c bcs.n a6f4 a67a: f104 016f add.w r1, r4, #111 ; 0x6f a67e: 1c50 adds r0, r2, #1 a680: 1ac9 subs r1, r1, r3 a682: eb00 0091 add.w r0, r0, r1, lsr #2 a686: e002 b.n a68e index++; a688: 3201 adds r2, #1 if (p >= end) { a68a: 4282 cmp r2, r0 a68c: d032 beq.n a6f4 index++; a68e: 469c mov ip, r3 avail = *p; a690: f853 1b04 ldr.w r1, [r3], #4 if (avail) break; a694: 2900 cmp r1, #0 a696: d0f7 beq.n a688 n = __builtin_clz(avail); a698: fab1 f081 clz r0, r1 avail &= ~(0x80000000 >> n); a69c: f04f 4300 mov.w r3, #2147483648 ; 0x80000000 a6a0: 40c3 lsrs r3, r0 a6a2: ea21 0103 bic.w r1, r1, r3 *p = avail; a6a6: f8cc 1000 str.w r1, [ip] if (!avail) index++; a6aa: b901 cbnz r1, a6ae a6ac: 3201 adds r2, #1 used = memory_used + 1; a6ae: 4b15 ldr r3, [pc, #84] ; (a704 ) memory_pool_first_mask = index; a6b0: 802a strh r2, [r5, #0] used = memory_used + 1; a6b2: 881a ldrh r2, [r3, #0] memory_used = used; a6b4: 3201 adds r2, #1 a6b6: b291 uxth r1, r2 a6b8: 8019 strh r1, [r3, #0] __enable_irq(); a6ba: b662 cpsie i index = p - memory_pool_available_mask; a6bc: ebac 0c04 sub.w ip, ip, r4 block = memory_pool + ((index << 5) + (31 - n)); a6c0: f641 737c movw r3, #8060 ; 0x1f7c a6c4: ebc0 6400 rsb r4, r0, r0, lsl #24 index = p - memory_pool_available_mask; a6c8: ea4f 0cac mov.w ip, ip, asr #2 block = memory_pool + ((index << 5) + (31 - n)); a6cc: ebc0 1084 rsb r0, r0, r4, lsl #6 block->ref_count = 1; a6d0: 2401 movs r4, #1 block = memory_pool + ((index << 5) + (31 - n)); a6d2: eb0c 1c8c add.w ip, ip, ip, lsl #6 a6d6: eb03 13cc add.w r3, r3, ip, lsl #7 a6da: eb03 0380 add.w r3, r3, r0, lsl #2 a6de: 480a ldr r0, [pc, #40] ; (a708 ) a6e0: 6800 ldr r0, [r0, #0] block->ref_count = 1; a6e2: 54c4 strb r4, [r0, r3] block = memory_pool + ((index << 5) + (31 - n)); a6e4: 4418 add r0, r3 if (used > memory_used_max) memory_used_max = used; a6e6: 4b09 ldr r3, [pc, #36] ; (a70c ) a6e8: 881c ldrh r4, [r3, #0] a6ea: 4294 cmp r4, r2 } a6ec: bc30 pop {r4, r5} if (used > memory_used_max) memory_used_max = used; a6ee: bf38 it cc a6f0: 8019 strhcc r1, [r3, #0] } a6f2: 4770 bx lr __enable_irq(); a6f4: b662 cpsie i return NULL; a6f6: 2000 movs r0, #0 } a6f8: bc30 pop {r4, r5} a6fa: 4770 bx lr a6fc: 20002dde .word 0x20002dde a700: 2000245c .word 0x2000245c a704: 20002dd6 .word 0x20002dd6 a708: 20002454 .word 0x20002454 a70c: 20002dd8 .word 0x20002dd8 0000a710 : uint32_t mask = (0x80000000 >> (31 - (block->memory_pool_index & 0x1F))); a710: 8842 ldrh r2, [r0, #2] __disable_irq(); a712: b672 cpsid i if (block->ref_count > 1) { a714: 7803 ldrb r3, [r0, #0] a716: 2b01 cmp r3, #1 a718: d903 bls.n a722 block->ref_count--; a71a: 3b01 subs r3, #1 a71c: 7003 strb r3, [r0, #0] __enable_irq(); a71e: b662 cpsie i } a720: 4770 bx lr uint32_t mask = (0x80000000 >> (31 - (block->memory_pool_index & 0x1F))); a722: 43d1 mvns r1, r2 uint32_t index = block->memory_pool_index >> 5; a724: 0953 lsrs r3, r2, #5 memory_pool_available_mask[index] |= mask; a726: 480b ldr r0, [pc, #44] ; (a754 ) uint32_t mask = (0x80000000 >> (31 - (block->memory_pool_index & 0x1F))); a728: f04f 4200 mov.w r2, #2147483648 ; 0x80000000 a72c: f001 011f and.w r1, r1, #31 a730: 40ca lsrs r2, r1 memory_pool_available_mask[index] |= mask; a732: f850 1023 ldr.w r1, [r0, r3, lsl #2] a736: 430a orrs r2, r1 if (index < memory_pool_first_mask) memory_pool_first_mask = index; a738: 4907 ldr r1, [pc, #28] ; (a758 ) a73a: f8b1 c000 ldrh.w ip, [r1] memory_pool_available_mask[index] |= mask; a73e: f840 2023 str.w r2, [r0, r3, lsl #2] if (index < memory_pool_first_mask) memory_pool_first_mask = index; a742: 459c cmp ip, r3 memory_used--; a744: 4a05 ldr r2, [pc, #20] ; (a75c ) if (index < memory_pool_first_mask) memory_pool_first_mask = index; a746: bf88 it hi a748: 800b strhhi r3, [r1, #0] memory_used--; a74a: 8813 ldrh r3, [r2, #0] a74c: 3b01 subs r3, #1 a74e: 8013 strh r3, [r2, #0] __enable_irq(); a750: b662 cpsie i } a752: 4770 bx lr a754: 2000245c .word 0x2000245c a758: 20002dde .word 0x20002dde a75c: 20002dd6 .word 0x20002dd6 0000a760 : for (AudioConnection *c = destination_list; c != NULL; c = c->next_dest) { a760: 68c3 ldr r3, [r0, #12] a762: b913 cbnz r3, a76a a764: e01d b.n a7a2 a766: 68db ldr r3, [r3, #12] a768: b1e3 cbz r3, a7a4 if (c->src_index == index) { a76a: 7a18 ldrb r0, [r3, #8] a76c: 4290 cmp r0, r2 a76e: d1fa bne.n a766 { a770: b410 push {r4} if (c->dst->inputQueue[c->dest_index] == NULL) { a772: 6858 ldr r0, [r3, #4] a774: f893 c009 ldrb.w ip, [r3, #9] a778: 6900 ldr r0, [r0, #16] a77a: f850 402c ldr.w r4, [r0, ip, lsl #2] a77e: b154 cbz r4, a796 for (AudioConnection *c = destination_list; c != NULL; c = c->next_dest) { a780: 68db ldr r3, [r3, #12] a782: b12b cbz r3, a790 if (c->src_index == index) { a784: 7a18 ldrb r0, [r3, #8] a786: 4290 cmp r0, r2 a788: d0f3 beq.n a772 for (AudioConnection *c = destination_list; c != NULL; c = c->next_dest) { a78a: 68db ldr r3, [r3, #12] a78c: 2b00 cmp r3, #0 a78e: d1f9 bne.n a784 } a790: f85d 4b04 ldr.w r4, [sp], #4 a794: 4770 bx lr c->dst->inputQueue[c->dest_index] = block; a796: f840 102c str.w r1, [r0, ip, lsl #2] block->ref_count++; a79a: 7808 ldrb r0, [r1, #0] a79c: 3001 adds r0, #1 a79e: 7008 strb r0, [r1, #0] a7a0: e7ee b.n a780 a7a2: 4770 bx lr a7a4: 4770 bx lr a7a6: bf00 nop 0000a7a8 : if (index >= num_inputs) return NULL; a7a8: 7a43 ldrb r3, [r0, #9] a7aa: 428b cmp r3, r1 a7ac: d906 bls.n a7bc in = inputQueue[index]; a7ae: 6903 ldr r3, [r0, #16] inputQueue[index] = NULL; a7b0: 2200 movs r2, #0 in = inputQueue[index]; a7b2: f853 0021 ldr.w r0, [r3, r1, lsl #2] inputQueue[index] = NULL; a7b6: f843 2021 str.w r2, [r3, r1, lsl #2] return in; a7ba: 4770 bx lr if (index >= num_inputs) return NULL; a7bc: 2000 movs r0, #0 } a7be: 4770 bx lr 0000a7c0 : { a7c0: b538 push {r3, r4, r5, lr} if (index >= num_inputs) return NULL; a7c2: 7a43 ldrb r3, [r0, #9] a7c4: 428b cmp r3, r1 a7c6: d91b bls.n a800 in = inputQueue[index]; a7c8: 6903 ldr r3, [r0, #16] inputQueue[index] = NULL; a7ca: 2200 movs r2, #0 in = inputQueue[index]; a7cc: f853 4021 ldr.w r4, [r3, r1, lsl #2] inputQueue[index] = NULL; a7d0: f843 2021 str.w r2, [r3, r1, lsl #2] if (in && in->ref_count > 1) { a7d4: b1a4 cbz r4, a800 a7d6: 7823 ldrb r3, [r4, #0] a7d8: 2b01 cmp r3, #1 a7da: d801 bhi.n a7e0 } a7dc: 4620 mov r0, r4 a7de: bd38 pop {r3, r4, r5, pc} p = allocate(); a7e0: f7ff ff40 bl a664 if (p) memcpy(p->data, in->data, sizeof(p->data)); a7e4: 4605 mov r5, r0 a7e6: b128 cbz r0, a7f4 a7e8: f44f 7280 mov.w r2, #256 ; 0x100 a7ec: 1d21 adds r1, r4, #4 a7ee: 3004 adds r0, #4 a7f0: f000 fdd4 bl b39c in->ref_count--; a7f4: 7823 ldrb r3, [r4, #0] a7f6: 3b01 subs r3, #1 a7f8: 7023 strb r3, [r4, #0] p = allocate(); a7fa: 462c mov r4, r5 } a7fc: 4620 mov r0, r4 a7fe: bd38 pop {r3, r4, r5, pc} if (index >= num_inputs) return NULL; a800: 2400 movs r4, #0 } a802: 4620 mov r0, r4 a804: bd38 pop {r3, r4, r5, pc} a806: bf00 nop 0000a808 : : src(NULL), dst(NULL), a808: 2200 movs r2, #0 next_dest = AudioStream::unused; a80a: 4904 ldr r1, [pc, #16] ; (a81c ) : src(NULL), dst(NULL), a80c: e9c0 2200 strd r2, r2, [r0] src_index(0), dest_index(0), a810: 8102 strh r2, [r0, #8] isConnected(false) a812: 7402 strb r2, [r0, #16] next_dest = AudioStream::unused; a814: 680a ldr r2, [r1, #0] AudioStream::unused = this; a816: 6008 str r0, [r1, #0] next_dest = AudioStream::unused; a818: 60c2 str r2, [r0, #12] } a81a: 4770 bx lr a81c: 200024cc .word 0x200024cc 0000a820 : if (isConnected) // already connected a820: 7c03 ldrb r3, [r0, #16] a822: b9fb cbnz r3, a864 if (!src || !dst) // NULL src or dst - [old] Stream object destroyed a824: 6803 ldr r3, [r0, #0] a826: 4601 mov r1, r0 a828: b1fb cbz r3, a86a a82a: 6843 ldr r3, [r0, #4] a82c: b1eb cbz r3, a86a if (dest_index >= dst->num_inputs) // input number too high a82e: 7a42 ldrb r2, [r0, #9] a830: 7a5b ldrb r3, [r3, #9] a832: 429a cmp r2, r3 a834: d21c bcs.n a870 { a836: b430 push {r4, r5} __disable_irq(); a838: b672 cpsid i s = AudioStream::first_update; // first AudioStream in the stream list a83a: 4b2b ldr r3, [pc, #172] ; (a8e8 ) a83c: 681c ldr r4, [r3, #0] while (s) // go through all AudioStream objects a83e: b1ec cbz r4, a87c p = s->destination_list; // first patchCord in this stream's list a840: 68e3 ldr r3, [r4, #12] while (p) a842: b1c3 cbz r3, a876 if (p->dst == dst && p->dest_index == dest_index) // same destination - it's in use! a844: 6848 ldr r0, [r1, #4] a846: e001 b.n a84c p = p->next_dest; a848: 68db ldr r3, [r3, #12] while (p) a84a: b1a3 cbz r3, a876 if (p->dst == dst && p->dest_index == dest_index) // same destination - it's in use! a84c: 685a ldr r2, [r3, #4] a84e: 4282 cmp r2, r0 a850: d1fa bne.n a848 a852: f893 c009 ldrb.w ip, [r3, #9] a856: 7a4a ldrb r2, [r1, #9] a858: 4594 cmp ip, r2 a85a: d1f5 bne.n a848 __enable_irq(); a85c: b662 cpsie i return 4; a85e: 2004 movs r0, #4 } a860: bc30 pop {r4, r5} a862: 4770 bx lr int result = 1; a864: 2001 movs r0, #1 __enable_irq(); a866: b662 cpsie i } a868: 4770 bx lr result = 3; a86a: 2003 movs r0, #3 __enable_irq(); a86c: b662 cpsie i } a86e: 4770 bx lr result = 2; a870: 2002 movs r0, #2 __enable_irq(); a872: b662 cpsie i } a874: 4770 bx lr s = s->next_update; a876: 6964 ldr r4, [r4, #20] while (s) // go through all AudioStream objects a878: 2c00 cmp r4, #0 a87a: d1e1 bne.n a840 pp = &AudioStream::unused; a87c: 4c1b ldr r4, [pc, #108] ; (a8ec ) a87e: 6823 ldr r3, [r4, #0] while (*pp && *pp != this) a880: b143 cbz r3, a894 a882: 4299 cmp r1, r3 a884: d102 bne.n a88c a886: e00b b.n a8a0 a888: 4299 cmp r1, r3 a88a: d007 beq.n a89c pp = &((*pp)->next_dest); a88c: 461a mov r2, r3 a88e: 68db ldr r3, [r3, #12] while (*pp && *pp != this) a890: 2b00 cmp r3, #0 a892: d1f9 bne.n a888 result = 5; a894: 2005 movs r0, #5 __enable_irq(); a896: b662 cpsie i } a898: bc30 pop {r4, r5} a89a: 4770 bx lr pp = &((*pp)->next_dest); a89c: f102 040c add.w r4, r2, #12 p = src->destination_list; // first AudioConnection a8a0: 680d ldr r5, [r1, #0] a8a2: 68e8 ldr r0, [r5, #12] if (p == NULL) a8a4: b1e8 cbz r0, a8e2 while (p->next_dest) // scan source Stream's connection list for duplicates a8a6: 68c3 ldr r3, [r0, #12] a8a8: b91b cbnz r3, a8b2 a8aa: e008 b.n a8be a8ac: 68da ldr r2, [r3, #12] a8ae: b13a cbz r2, a8c0 a8b0: 4613 mov r3, r2 if (&p->src == &this->src && &p->dst == &this->dst a8b2: 4281 cmp r1, r0 a8b4: 4618 mov r0, r3 a8b6: d1f9 bne.n a8ac __enable_irq(); a8b8: b662 cpsie i return 6; a8ba: 2006 movs r0, #6 a8bc: e7d0 b.n a860 while (p->next_dest) // scan source Stream's connection list for duplicates a8be: 4603 mov r3, r0 p->next_dest = this; // end of list, can link ourselves in a8c0: 60d9 str r1, [r3, #12] *pp = next_dest; // remove ourselves from the unused list a8c2: 68cb ldr r3, [r1, #12] next_dest = NULL; // we're last in the source's destination list a8c4: 2000 movs r0, #0 *pp = next_dest; // remove ourselves from the unused list a8c6: 6023 str r3, [r4, #0] src->active = true; a8c8: 2301 movs r3, #1 next_dest = NULL; // we're last in the source's destination list a8ca: 60c8 str r0, [r1, #12] src->numConnections++; a8cc: 7aaa ldrb r2, [r5, #10] src->active = true; a8ce: 722b strb r3, [r5, #8] src->numConnections++; a8d0: 441a add r2, r3 a8d2: 72aa strb r2, [r5, #10] dst->numConnections++; a8d4: 684a ldr r2, [r1, #4] a8d6: 7a94 ldrb r4, [r2, #10] dst->active = true; a8d8: 7213 strb r3, [r2, #8] dst->numConnections++; a8da: 441c add r4, r3 a8dc: 7294 strb r4, [r2, #10] isConnected = true; a8de: 740b strb r3, [r1, #16] result = 0; a8e0: e7d9 b.n a896 src->destination_list = this; a8e2: 60e9 str r1, [r5, #12] a8e4: e7ed b.n a8c2 a8e6: bf00 nop a8e8: 20002458 .word 0x20002458 a8ec: 200024cc .word 0x200024cc 0000a8f0 : { a8f0: b510 push {r4, lr} if (!isConnected) a8f2: 7c04 ldrb r4, [r0, #16] { a8f4: f89d e008 ldrb.w lr, [sp, #8] if (!isConnected) a8f8: b10c cbz r4, a8fe } a8fa: 2001 movs r0, #1 a8fc: bd10 pop {r4, pc} src_index = sourceOutput; a8fe: 7202 strb r2, [r0, #8] dest_index = destinationInput; a900: f880 e009 strb.w lr, [r0, #9] dst = &destination; a904: e9c0 1300 strd r1, r3, [r0] } a908: e8bd 4010 ldmia.w sp!, {r4, lr} result = connect(); a90c: f7ff bf88 b.w a820 0000a910 : { a910: b538 push {r3, r4, r5, lr} if (!isConnected) return 1; a912: 7c03 ldrb r3, [r0, #16] a914: 2b00 cmp r3, #0 a916: d036 beq.n a986 if (dest_index >= dst->num_inputs) return 2; // should never happen! a918: 6843 ldr r3, [r0, #4] a91a: 4604 mov r4, r0 a91c: 7a42 ldrb r2, [r0, #9] a91e: 7a5b ldrb r3, [r3, #9] a920: 429a cmp r2, r3 a922: d238 bcs.n a996 __disable_irq(); a924: b672 cpsid i p = src->destination_list; a926: 6801 ldr r1, [r0, #0] a928: 68cb ldr r3, [r1, #12] if (p == NULL) { a92a: 2b00 cmp r3, #0 a92c: d02d beq.n a98a } else if (p == this) { a92e: 4298 cmp r0, r3 a930: d033 beq.n a99a if (p->next_dest == this) // found the parent of the disconnecting object a932: 461a mov r2, r3 a934: 68db ldr r3, [r3, #12] a936: 429c cmp r4, r3 a938: d02a beq.n a990 while (p) a93a: 2b00 cmp r3, #0 a93c: d1f9 bne.n a932 if(dst->inputQueue[dest_index] != NULL) { a93e: 6862 ldr r2, [r4, #4] a940: 7a60 ldrb r0, [r4, #9] a942: 6913 ldr r3, [r2, #16] a944: f853 0020 ldr.w r0, [r3, r0, lsl #2] a948: b148 cbz r0, a95e AudioStream::release(dst->inputQueue[dest_index]); a94a: f7ff fee1 bl a710 __disable_irq(); a94e: b672 cpsid i dst->inputQueue[dest_index] = NULL; a950: 6862 ldr r2, [r4, #4] a952: 2500 movs r5, #0 a954: 7a60 ldrb r0, [r4, #9] a956: 6913 ldr r3, [r2, #16] src->numConnections--; a958: 6821 ldr r1, [r4, #0] dst->inputQueue[dest_index] = NULL; a95a: f843 5020 str.w r5, [r3, r0, lsl #2] src->numConnections--; a95e: 7a8b ldrb r3, [r1, #10] a960: 3b01 subs r3, #1 a962: b2db uxtb r3, r3 a964: 728b strb r3, [r1, #10] if (src->numConnections == 0) { a966: b903 cbnz r3, a96a src->active = false; a968: 720b strb r3, [r1, #8] dst->numConnections--; a96a: 7a93 ldrb r3, [r2, #10] a96c: 3b01 subs r3, #1 a96e: b2db uxtb r3, r3 a970: 7293 strb r3, [r2, #10] if (dst->numConnections == 0) { a972: b903 cbnz r3, a976 dst->active = false; a974: 7213 strb r3, [r2, #8] next_dest = dst->unused; a976: 4b0a ldr r3, [pc, #40] ; (a9a0 ) isConnected = false; a978: 2000 movs r0, #0 next_dest = dst->unused; a97a: 681a ldr r2, [r3, #0] isConnected = false; a97c: 7420 strb r0, [r4, #16] dst->unused = this; a97e: 601c str r4, [r3, #0] next_dest = dst->unused; a980: 60e2 str r2, [r4, #12] __enable_irq(); a982: b662 cpsie i } a984: bd38 pop {r3, r4, r5, pc} if (!isConnected) return 1; a986: 2001 movs r0, #1 } a988: bd38 pop {r3, r4, r5, pc} __enable_irq(); a98a: b662 cpsie i return 3; a98c: 2003 movs r0, #3 } a98e: bd38 pop {r3, r4, r5, pc} p-> next_dest = this->next_dest; // skip parent's link past us a990: 68e3 ldr r3, [r4, #12] a992: 60d3 str r3, [r2, #12] break; a994: e7d3 b.n a93e if (dest_index >= dst->num_inputs) return 2; // should never happen! a996: 2002 movs r0, #2 } a998: bd38 pop {r3, r4, r5, pc} if (p->next_dest) { a99a: 68c3 ldr r3, [r0, #12] src->destination_list = NULL; a99c: 60cb str r3, [r1, #12] a99e: e7ce b.n a93e a9a0: 200024cc .word 0x200024cc 0000a9a4 : AudioConnection::~AudioConnection() a9a4: b510 push {r4, lr} a9a6: 4604 mov r4, r0 disconnect(); // disconnect ourselves: puts us on the unused list a9a8: f7ff ffb2 bl a910 pp = &AudioStream::unused; a9ac: 4a09 ldr r2, [pc, #36] ; (a9d4 ) a9ae: 6813 ldr r3, [r2, #0] while (*pp && *pp != this) a9b0: b143 cbz r3, a9c4 a9b2: 429c cmp r4, r3 a9b4: d102 bne.n a9bc a9b6: e008 b.n a9ca a9b8: 429c cmp r4, r3 a9ba: d005 beq.n a9c8 pp = &((*pp)->next_dest); a9bc: 461a mov r2, r3 a9be: 68db ldr r3, [r3, #12] while (*pp && *pp != this) a9c0: 2b00 cmp r3, #0 a9c2: d1f9 bne.n a9b8 } a9c4: 4620 mov r0, r4 a9c6: bd10 pop {r4, pc} pp = &((*pp)->next_dest); a9c8: 320c adds r2, #12 *pp = next_dest; // remove ourselves from the unused list a9ca: 68e3 ldr r3, [r4, #12] } a9cc: 4620 mov r0, r4 *pp = next_dest; // remove ourselves from the unused list a9ce: 6013 str r3, [r2, #0] } a9d0: bd10 pop {r4, pc} a9d2: bf00 nop a9d4: 200024cc .word 0x200024cc 0000a9d8 : dchpri[(ch & 0x1C) | (3 - (ch & 0x03))] |= DMA_DCHPRI_ECP | DMA_DCHPRI_DPA; } void DMAChannel::release(void) { if (channel >= DMA_MAX_CHANNELS) return; a9d8: 7903 ldrb r3, [r0, #4] a9da: 2b0f cmp r3, #15 a9dc: d811 bhi.n aa02 DMA_CERQ = channel; a9de: 4a09 ldr r2, [pc, #36] ; (aa04 ) a9e0: 7693 strb r3, [r2, #26] __disable_irq(); a9e2: b672 cpsid i dma_channel_allocated_mask &= ~(1 << channel); a9e4: 4908 ldr r1, [pc, #32] ; (aa08 ) a9e6: 2201 movs r2, #1 a9e8: f890 c004 ldrb.w ip, [r0, #4] a9ec: 880b ldrh r3, [r1, #0] a9ee: fa02 f20c lsl.w r2, r2, ip a9f2: ea23 0302 bic.w r3, r3, r2 a9f6: 800b strh r3, [r1, #0] __enable_irq(); a9f8: b662 cpsie i channel = DMA_MAX_CHANNELS; a9fa: 2210 movs r2, #16 TCD = (TCD_t *)0; a9fc: 2300 movs r3, #0 channel = DMA_MAX_CHANNELS; a9fe: 7102 strb r2, [r0, #4] TCD = (TCD_t *)0; aa00: 6003 str r3, [r0, #0] } aa02: 4770 bx lr aa04: 400e8000 .word 0x400e8000 aa08: 20002de4 .word 0x20002de4 0000aa0c : static EventResponder *lastInterrupt; static bool runningFromYield; private: static bool disableInterrupts() { uint32_t primask; __asm__ volatile("mrs %0, primask\n" : "=r" (primask)::); aa0c: f3ef 8210 mrs r2, PRIMASK __disable_irq(); aa10: b672 cpsid i if (_triggered == false) { aa12: 7f43 ldrb r3, [r0, #29] aa14: b95b cbnz r3, aa2e if (_type == EventTypeYield) { aa16: 7f01 ldrb r1, [r0, #28] aa18: 2901 cmp r1, #1 { aa1a: b430 push {r4, r5} if (_type == EventTypeYield) { aa1c: d00b beq.n aa36 } else if (_type == EventTypeInterrupt) { aa1e: 2903 cmp r1, #3 aa20: d013 beq.n aa4a _triggered = true; aa22: 2301 movs r3, #1 aa24: 7743 strb r3, [r0, #29] return (primask == 0) ? true : false; } static void enableInterrupts(bool doit) { if (doit) __enable_irq(); aa26: b902 cbnz r2, aa2a aa28: b662 cpsie i } aa2a: bc30 pop {r4, r5} aa2c: 4770 bx lr aa2e: b90a cbnz r2, aa34 aa30: b662 cpsie i aa32: 4770 bx lr aa34: 4770 bx lr if (firstYield == nullptr) { aa36: 4c12 ldr r4, [pc, #72] ; (aa80 ) aa38: 6821 ldr r1, [r4, #0] aa3a: b1b1 cbz r1, aa6a _prev = lastYield; aa3c: 4911 ldr r1, [pc, #68] ; (aa84 ) _next = nullptr; aa3e: 6143 str r3, [r0, #20] _prev = lastYield; aa40: 680b ldr r3, [r1, #0] lastYield = this; aa42: 6008 str r0, [r1, #0] _prev = lastYield; aa44: 6183 str r3, [r0, #24] _prev->_next = this; aa46: 6158 str r0, [r3, #20] lastYield = this; aa48: e7eb b.n aa22 if (firstInterrupt == nullptr) { aa4a: 4d0f ldr r5, [pc, #60] ; (aa88 ) aa4c: 490f ldr r1, [pc, #60] ; (aa8c ) aa4e: 682c ldr r4, [r5, #0] aa50: b18c cbz r4, aa76 _next = nullptr; aa52: 6143 str r3, [r0, #20] _prev = lastInterrupt; aa54: 680b ldr r3, [r1, #0] aa56: 6183 str r3, [r0, #24] _prev->_next = this; aa58: 6158 str r0, [r3, #20] SCB_ICSR = SCB_ICSR_PENDSVSET; // set PendSV interrupt aa5a: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 aa5e: f04f 5480 mov.w r4, #268435456 ; 0x10000000 lastInterrupt = this; aa62: 6008 str r0, [r1, #0] SCB_ICSR = SCB_ICSR_PENDSVSET; // set PendSV interrupt aa64: f8c3 4d04 str.w r4, [r3, #3332] ; 0xd04 aa68: e7db b.n aa22 lastYield = this; aa6a: 4b06 ldr r3, [pc, #24] ; (aa84 ) firstYield = this; aa6c: 6020 str r0, [r4, #0] lastYield = this; aa6e: 6018 str r0, [r3, #0] _prev = nullptr; aa70: e9c0 1105 strd r1, r1, [r0, #20] lastYield = this; aa74: e7d5 b.n aa22 _prev = nullptr; aa76: e9c0 4405 strd r4, r4, [r0, #20] firstInterrupt = this; aa7a: 6028 str r0, [r5, #0] lastInterrupt = this; aa7c: e7ed b.n aa5a aa7e: bf00 nop aa80: 2000254c .word 0x2000254c aa84: 20002558 .word 0x20002558 aa88: 20002554 .word 0x20002554 aa8c: 20002550 .word 0x20002550 0000aa90 : { aa90: b570 push {r4, r5, r6, lr} __asm__ volatile("mrs %0, primask\n" : "=r" (primask)::); aa92: f3ef 8210 mrs r2, PRIMASK __disable_irq(); aa96: b672 cpsid i EventResponder *first = firstInterrupt; aa98: 4c0c ldr r4, [pc, #48] ; (aacc ) aa9a: 6820 ldr r0, [r4, #0] if (first) { aa9c: b180 cbz r0, aac0 lastInterrupt = nullptr; aa9e: 4e0c ldr r6, [pc, #48] ; (aad0 ) firstInterrupt->_prev = nullptr; aaa0: 2500 movs r5, #0 firstInterrupt = first->_next; aaa2: 6943 ldr r3, [r0, #20] aaa4: 6023 str r3, [r4, #0] if (firstInterrupt) { aaa6: b173 cbz r3, aac6 firstInterrupt->_prev = nullptr; aaa8: 619d str r5, [r3, #24] if (doit) __enable_irq(); aaaa: b902 cbnz r2, aaae aaac: b662 cpsie i (*(first->_function))(*first); aaae: 6883 ldr r3, [r0, #8] first->_triggered = false; aab0: 7745 strb r5, [r0, #29] (*(first->_function))(*first); aab2: 4798 blx r3 __asm__ volatile("mrs %0, primask\n" : "=r" (primask)::); aab4: f3ef 8210 mrs r2, PRIMASK __disable_irq(); aab8: b672 cpsid i EventResponder *first = firstInterrupt; aaba: 6820 ldr r0, [r4, #0] if (first) { aabc: 2800 cmp r0, #0 aabe: d1f0 bne.n aaa2 if (doit) __enable_irq(); aac0: b902 cbnz r2, aac4 aac2: b662 cpsie i } aac4: bd70 pop {r4, r5, r6, pc} lastInterrupt = nullptr; aac6: 6033 str r3, [r6, #0] aac8: e7ef b.n aaaa aaca: bf00 nop aacc: 20002554 .word 0x20002554 aad0: 20002550 .word 0x20002550 0000aad4 : EventResponder::runFromInterrupt(); aad4: f7ff bfdc b.w aa90 0000aad8 : extern "C" volatile uint32_t systick_millis_count; extern "C" volatile uint32_t systick_cycle_count; extern "C" uint32_t systick_safe_read; // micros() synchronization extern "C" void systick_isr(void) { systick_cycle_count = ARM_DWT_CYCCNT; aad8: 4904 ldr r1, [pc, #16] ; (aaec ) systick_millis_count++; aada: 4a05 ldr r2, [pc, #20] ; (aaf0 ) systick_cycle_count = ARM_DWT_CYCCNT; aadc: 6849 ldr r1, [r1, #4] aade: 4b05 ldr r3, [pc, #20] ; (aaf4 ) aae0: 6019 str r1, [r3, #0] systick_millis_count++; aae2: 6813 ldr r3, [r2, #0] aae4: 3301 adds r3, #1 aae6: 6013 str r3, [r2, #0] } aae8: 4770 bx lr aaea: bf00 nop aaec: e0001000 .word 0xe0001000 aaf0: 20002d90 .word 0x20002d90 aaf4: 20002d8c .word 0x20002d8c 0000aaf8 ::vtable()::{lambda(void*)#1}::_FUN(void*)>: invoke_ptr{ [](storage_ptr_t, Args&&...) -> R aaf8: 4770 bx lr aafa: bf00 nop 0000aafc ::vtable()::{lambda(void*, void*)#2}::_FUN(void*, void*)>: copy_ptr{ [](storage_ptr_t, storage_ptr_t) -> void {} }, aafc: 4770 bx lr aafe: bf00 nop 0000ab00 ::vtable()::{lambda(void*, void*)#3}::_FUN(void*, void*)>: relocate_ptr{ [](storage_ptr_t, storage_ptr_t) -> void {} }, ab00: 4770 bx lr ab02: bf00 nop 0000ab04 ::vtable()::{lambda(void*)#4}::_FUN(void*)>: destructor_ptr{ [](storage_ptr_t) -> void {} } ab04: 4770 bx lr ab06: bf00 nop 0000ab08 : //FASTRUN static void pit_isr() { ab08: b570 push {r4, r5, r6, lr} return operator bool(); } explicit constexpr operator bool() const noexcept { return vtable_ptr_ != std::addressof(inplace_function_detail::empty_vtable); ab0a: 4c1a ldr r4, [pc, #104] ; (ab74 ) } } #else IMXRT_PIT_CHANNEL_t *channel= IMXRT_PIT_CHANNELS; if (funct_table[0] != nullptr && channel->TFLG) {channel->TFLG = 1;funct_table[0]();} ab0c: 4d1a ldr r5, [pc, #104] ; (ab78 ) ab0e: 6823 ldr r3, [r4, #0] ab10: 42ab cmp r3, r5 ab12: d002 beq.n ab1a ab14: 4a19 ldr r2, [pc, #100] ; (ab7c ) ab16: 68d1 ldr r1, [r2, #12] ab18: bb29 cbnz r1, ab66 ab1a: 69a3 ldr r3, [r4, #24] channel++; if (funct_table[1] != nullptr && channel->TFLG) {channel->TFLG = 1;funct_table[1]();} ab1c: 42ab cmp r3, r5 ab1e: d002 beq.n ab26 ab20: 4a16 ldr r2, [pc, #88] ; (ab7c ) ab22: 69d1 ldr r1, [r2, #28] ab24: b9c9 cbnz r1, ab5a ab26: 6b23 ldr r3, [r4, #48] ; 0x30 channel++; if (funct_table[2] != nullptr && channel->TFLG) {channel->TFLG = 1;funct_table[2]();} ab28: 42ab cmp r3, r5 ab2a: d002 beq.n ab32 ab2c: 4a13 ldr r2, [pc, #76] ; (ab7c ) ab2e: 6ad1 ldr r1, [r2, #44] ; 0x2c ab30: b969 cbnz r1, ab4e ab32: 6ca3 ldr r3, [r4, #72] ; 0x48 channel++; if (funct_table[3] != nullptr && channel->TFLG) {channel->TFLG = 1;funct_table[3]();} ab34: 42ab cmp r3, r5 ab36: d009 beq.n ab4c ab38: 4a10 ldr r2, [pc, #64] ; (ab7c ) ab3a: 6bd1 ldr r1, [r2, #60] ; 0x3c ab3c: b131 cbz r1, ab4c ab3e: 2101 movs r1, #1 return vtable_ptr_->invoke_ptr( ab40: 681b ldr r3, [r3, #0] ab42: 480f ldr r0, [pc, #60] ; (ab80 ) ab44: 63d1 str r1, [r2, #60] ; 0x3c #endif } ab46: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr} ab4a: 4718 bx r3 ab4c: bd70 pop {r4, r5, r6, pc} if (funct_table[2] != nullptr && channel->TFLG) {channel->TFLG = 1;funct_table[2]();} ab4e: 2101 movs r1, #1 ab50: 681b ldr r3, [r3, #0] ab52: 480c ldr r0, [pc, #48] ; (ab84 ) ab54: 62d1 str r1, [r2, #44] ; 0x2c ab56: 4798 blx r3 ); ab58: e7eb b.n ab32 if (funct_table[1] != nullptr && channel->TFLG) {channel->TFLG = 1;funct_table[1]();} ab5a: 2101 movs r1, #1 return vtable_ptr_->invoke_ptr( ab5c: 681b ldr r3, [r3, #0] ab5e: 480a ldr r0, [pc, #40] ; (ab88 ) ab60: 61d1 str r1, [r2, #28] ab62: 4798 blx r3 ); ab64: e7df b.n ab26 if (funct_table[0] != nullptr && channel->TFLG) {channel->TFLG = 1;funct_table[0]();} ab66: 2101 movs r1, #1 return vtable_ptr_->invoke_ptr( ab68: 681b ldr r3, [r3, #0] ab6a: f104 0008 add.w r0, r4, #8 ab6e: 60d1 str r1, [r2, #12] ab70: 4798 blx r3 ); ab72: e7d2 b.n ab1a ab74: 20001ac0 .word 0x20001ac0 ab78: 20000858 .word 0x20000858 ab7c: 40084100 .word 0x40084100 ab80: 20001b10 .word 0x20001b10 ab84: 20001af8 .word 0x20001af8 ab88: 20001ae0 .word 0x20001ae0 0000ab8c <__tcf_0>: static IntervalTimer::callback_t funct_table[4] __attribute((aligned(32))) = {nullptr, nullptr, nullptr, nullptr}; ab8c: b538 push {r3, r4, r5, lr} ab8e: 4c06 ldr r4, [pc, #24] ; (aba8 <__tcf_0+0x1c>) ab90: f1a4 0560 sub.w r5, r4, #96 ; 0x60 vtable_ptr_->destructor_ptr(std::addressof(storage_)); ab94: f854 3c08 ldr.w r3, [r4, #-8] ab98: 4620 mov r0, r4 ab9a: 3c18 subs r4, #24 ab9c: 68db ldr r3, [r3, #12] ab9e: 4798 blx r3 aba0: 42ac cmp r4, r5 aba2: d1f7 bne.n ab94 <__tcf_0+0x8> aba4: bd38 pop {r3, r4, r5, pc} aba6: bf00 nop aba8: 20001b10 .word 0x20001b10 0000abac , unsigned long)>: if (channel) { abac: 6803 ldr r3, [r0, #0] { abae: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} abb2: 4604 mov r4, r0 abb4: b088 sub sp, #32 abb6: 4617 mov r7, r2 if (channel) { abb8: 2b00 cmp r3, #0 abba: d04b beq.n ac54 , unsigned long)+0xa8> channel->TCTRL = 0; abbc: 2200 movs r2, #0 abbe: 609a str r2, [r3, #8] channel->TFLG = 1; abc0: 2201 movs r2, #1 abc2: 60da str r2, [r3, #12] int index = channel - IMXRT_PIT_CHANNELS; abc4: 4d30 ldr r5, [pc, #192] ; (ac88 , unsigned long)+0xdc>) vtable_ptr_->copy_ptr( abc6: a804 add r0, sp, #16 vtable_ptr_->destructor_ptr(std::addressof(storage_)); abc8: f8df 80e0 ldr.w r8, [pc, #224] ; acac , unsigned long)+0x100> abcc: 441d add r5, r3 vtable_ptr_{other.vtable_ptr_} abce: f851 3b08 ldr.w r3, [r1], #8 abd2: 112d asrs r5, r5, #4 abd4: 9302 str r3, [sp, #8] vtable_ptr_->copy_ptr( abd6: 685b ldr r3, [r3, #4] vtable_ptr_->destructor_ptr(std::addressof(storage_)); abd8: eb05 0645 add.w r6, r5, r5, lsl #1 vtable_ptr_->copy_ptr( abdc: 4798 blx r3 vtable_ptr_->destructor_ptr(std::addressof(storage_)); abde: 00f6 lsls r6, r6, #3 abe0: f106 0008 add.w r0, r6, #8 abe4: f858 3006 ldr.w r3, [r8, r6] abe8: 4440 add r0, r8 abea: 68db ldr r3, [r3, #12] abec: 9001 str r0, [sp, #4] abee: 4798 blx r3 _GLIBCXX20_CONSTEXPR inline _Tp __exchange(_Tp& __obj, _Up&& __new_val) { _Tp __old_val = std::move(__obj); __obj = std::forward<_Up>(__new_val); abf0: 4a26 ldr r2, [pc, #152] ; (ac8c , unsigned long)+0xe0>) vtable_ptr_->relocate_ptr( abf2: a904 add r1, sp, #16 _Tp __old_val = std::move(__obj); abf4: e9dd 0301 ldrd r0, r3, [sp, #4] __obj = std::forward<_Up>(__new_val); abf8: 9202 str r2, [sp, #8] vtable_ptr_ = std::exchange(other.vtable_ptr_, std::addressof(inplace_function_detail::empty_vtable)); abfa: f848 3006 str.w r3, [r8, r6] vtable_ptr_->relocate_ptr( abfe: 689b ldr r3, [r3, #8] ac00: 4798 blx r3 vtable_ptr_->destructor_ptr(std::addressof(storage_)); ac02: 9b02 ldr r3, [sp, #8] ac04: a804 add r0, sp, #16 ac06: 68db ldr r3, [r3, #12] ac08: 4798 blx r3 channel->LDVAL = cycles; ac0a: 6823 ldr r3, [r4, #0] channel->TCTRL = 3; ac0c: 2203 movs r2, #3 ac0e: 4820 ldr r0, [pc, #128] ; (ac90 , unsigned long)+0xe4>) channel->LDVAL = cycles; ac10: 601f str r7, [r3, #0] channel->TCTRL = 3; ac12: 609a str r2, [r3, #8] nvic_priorites[index] = nvic_priority; ac14: 4a1f ldr r2, [pc, #124] ; (ac94 , unsigned long)+0xe8>) ac16: 7923 ldrb r3, [r4, #4] ac18: 4c1f ldr r4, [pc, #124] ; (ac98 , unsigned long)+0xec>) ac1a: 5553 strb r3, [r2, r5] if (top_priority > nvic_priorites[i]) top_priority = nvic_priorites[i]; ac1c: 7813 ldrb r3, [r2, #0] ac1e: 7851 ldrb r1, [r2, #1] ac20: f8c0 4228 str.w r4, [r0, #552] ; 0x228 ac24: 428b cmp r3, r1 ac26: bf28 it cs ac28: 460b movcs r3, r1 ac2a: 7891 ldrb r1, [r2, #2] ac2c: 78d2 ldrb r2, [r2, #3] ac2e: 428b cmp r3, r1 ac30: bf28 it cs ac32: 460b movcs r3, r1 ac34: 4293 cmp r3, r2 ac36: bf28 it cs ac38: 4613 movcs r3, r2 NVIC_SET_PRIORITY(IRQ_PIT, top_priority); ac3a: 4c18 ldr r4, [pc, #96] ; (ac9c , unsigned long)+0xf0>) NVIC_ENABLE_IRQ(IRQ_PIT); ac3c: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 ac40: f04f 6180 mov.w r1, #67108864 ; 0x4000000 return true; ac44: 2001 movs r0, #1 NVIC_SET_PRIORITY(IRQ_PIT, top_priority); ac46: f884 307a strb.w r3, [r4, #122] ; 0x7a NVIC_ENABLE_IRQ(IRQ_PIT); ac4a: f8c2 110c str.w r1, [r2, #268] ; 0x10c } ac4e: b008 add sp, #32 ac50: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} CCM_CCGR1 |= CCM_CCGR1_PIT(CCM_CCGR_ON); ac54: 4a12 ldr r2, [pc, #72] ; (aca0 , unsigned long)+0xf4>) ac56: 6ed3 ldr r3, [r2, #108] ; 0x6c ac58: f443 5340 orr.w r3, r3, #12288 ; 0x3000 ac5c: 66d3 str r3, [r2, #108] ; 0x6c PIT_MCR = 1; ac5e: 2201 movs r2, #1 ac60: 4b10 ldr r3, [pc, #64] ; (aca4 , unsigned long)+0xf8>) ac62: 601a str r2, [r3, #0] channel = IMXRT_PIT_CHANNELS; ac64: 4a10 ldr r2, [pc, #64] ; (aca8 , unsigned long)+0xfc>) ac66: 4613 mov r3, r2 ac68: 6002 str r2, [r0, #0] if (++channel >= IMXRT_PIT_CHANNELS + NUM_CHANNELS) { ac6a: 3240 adds r2, #64 ; 0x40 if (channel->TCTRL == 0) break; ac6c: 6898 ldr r0, [r3, #8] ac6e: 2800 cmp r0, #0 ac70: d0a8 beq.n abc4 , unsigned long)+0x18> if (++channel >= IMXRT_PIT_CHANNELS + NUM_CHANNELS) { ac72: 3310 adds r3, #16 ac74: 4293 cmp r3, r2 ac76: 6023 str r3, [r4, #0] ac78: d1f8 bne.n ac6c , unsigned long)+0xc0> channel = NULL; ac7a: 2300 movs r3, #0 return false; ac7c: 4618 mov r0, r3 channel = NULL; ac7e: 6023 str r3, [r4, #0] } ac80: b008 add sp, #32 ac82: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} ac86: bf00 nop ac88: bff7bf00 .word 0xbff7bf00 ac8c: 20000858 .word 0x20000858 ac90: 20001800 .word 0x20001800 ac94: 200010a4 .word 0x200010a4 ac98: 0000ab09 .word 0x0000ab09 ac9c: e000e400 .word 0xe000e400 aca0: 400fc000 .word 0x400fc000 aca4: 40084000 .word 0x40084000 aca8: 40084100 .word 0x40084100 acac: 20001ac0 .word 0x20001ac0 0000acb0 <_GLOBAL__sub_I__ZN13IntervalTimer14nvic_prioritesE>: } acb0: b410 push {r4} vtable_ptr_{std::addressof(inplace_function_detail::empty_vtable)} acb2: 4b06 ldr r3, [pc, #24] ; (accc <_GLOBAL__sub_I__ZN13IntervalTimer14nvic_prioritesE+0x1c>) static IntervalTimer::callback_t funct_table[4] __attribute((aligned(32))) = {nullptr, nullptr, nullptr, nullptr}; acb4: 2000 movs r0, #0 acb6: 4c06 ldr r4, [pc, #24] ; (acd0 <_GLOBAL__sub_I__ZN13IntervalTimer14nvic_prioritesE+0x20>) acb8: 4a06 ldr r2, [pc, #24] ; (acd4 <_GLOBAL__sub_I__ZN13IntervalTimer14nvic_prioritesE+0x24>) acba: 601c str r4, [r3, #0] acbc: 619c str r4, [r3, #24] acbe: 631c str r4, [r3, #48] ; 0x30 acc0: 649c str r4, [r3, #72] ; 0x48 acc2: 4905 ldr r1, [pc, #20] ; (acd8 <_GLOBAL__sub_I__ZN13IntervalTimer14nvic_prioritesE+0x28>) } acc4: f85d 4b04 ldr.w r4, [sp], #4 static IntervalTimer::callback_t funct_table[4] __attribute((aligned(32))) = {nullptr, nullptr, nullptr, nullptr}; acc8: f002 bc2a b.w d520 <__aeabi_atexit> accc: 20001ac0 .word 0x20001ac0 acd0: 20000858 .word 0x20000858 acd4: 200010b4 .word 0x200010b4 acd8: 0000ab8d .word 0x0000ab8d 0000acdc : virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } acdc: 4608 mov r0, r1 acde: f002 bb35 b.w d34c ace2: bf00 nop 0000ace4 : #include "debug/printf.h" #undef printf size_t Print::write(const uint8_t *buffer, size_t size) { ace4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} if (buffer == nullptr) return 0; ace8: 460c mov r4, r1 acea: b1d1 cbz r1, ad22 size_t count = 0; while (size--) count += write(*buffer++); acec: b1ea cbz r2, ad2a acee: 4680 mov r8, r0 acf0: 188e adds r6, r1, r2 size_t count = 0; acf2: 2500 movs r5, #0 acf4: 4f0e ldr r7, [pc, #56] ; (ad30 ) acf6: e004 b.n ad02 acf8: f002 fb28 bl d34c while (size--) count += write(*buffer++); acfc: 42b4 cmp r4, r6 acfe: 4405 add r5, r0 ad00: d00c beq.n ad1c ad02: f8d8 3000 ldr.w r3, [r8] ad06: f814 0b01 ldrb.w r0, [r4], #1 ad0a: 681b ldr r3, [r3, #0] ad0c: 42bb cmp r3, r7 ad0e: d0f3 beq.n acf8 ad10: 4601 mov r1, r0 ad12: 4640 mov r0, r8 ad14: 4798 blx r3 ad16: 42b4 cmp r4, r6 ad18: 4405 add r5, r0 ad1a: d1f2 bne.n ad02 return count; } ad1c: 4628 mov r0, r5 ad1e: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (buffer == nullptr) return 0; ad22: 460d mov r5, r1 } ad24: 4628 mov r0, r5 ad26: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} if (buffer == nullptr) return 0; ad2a: 4615 mov r5, r2 ad2c: e7f6 b.n ad1c ad2e: bf00 nop ad30: 0000acdd .word 0x0000acdd 0000ad34 : uint8_t year; uint8_t month, monthLength; unsigned long days; tm.sec = time % 60; ad34: 4a4d ldr r2, [pc, #308] ; (ae6c ) { ad36: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} tm.sec = time % 60; ad3a: fba2 4300 umull r4, r3, r2, r0 time /= 24; // now it is days tm.wday = ((time + 4) % 7); // Sunday is day 0 year = 0; days = 0; while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { ad3e: f240 1a6d movw sl, #365 ; 0x16d ad42: 4f4b ldr r7, [pc, #300] ; (ae70 ) tm.sec = time % 60; ad44: 095b lsrs r3, r3, #5 while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { ad46: f8df 8138 ldr.w r8, [pc, #312] ; ae80 ad4a: f8df 9138 ldr.w r9, [pc, #312] ; ae84 tm.min = time % 60; ad4e: fba2 4203 umull r4, r2, r2, r3 tm.sec = time % 60; ad52: ebc3 1403 rsb r4, r3, r3, lsl #4 tm.min = time % 60; ad56: 0952 lsrs r2, r2, #5 tm.sec = time % 60; ad58: eba0 0084 sub.w r0, r0, r4, lsl #2 tm.hour = time % 24; ad5c: 4c45 ldr r4, [pc, #276] ; (ae74 ) tm.min = time % 60; ad5e: ebc2 1502 rsb r5, r2, r2, lsl #4 tm.sec = time % 60; ad62: 7008 strb r0, [r1, #0] tm.min = time % 60; ad64: eba3 0385 sub.w r3, r3, r5, lsl #2 tm.hour = time % 24; ad68: fba4 5402 umull r5, r4, r4, r2 ad6c: 0924 lsrs r4, r4, #4 tm.min = time % 60; ad6e: 704b strb r3, [r1, #1] tm.wday = ((time + 4) % 7); // Sunday is day 0 ad70: 4b41 ldr r3, [pc, #260] ; (ae78 ) ad72: 1d25 adds r5, r4, #4 tm.hour = time % 24; ad74: eb04 0044 add.w r0, r4, r4, lsl #1 ad78: eba2 02c0 sub.w r2, r2, r0, lsl #3 tm.wday = ((time + 4) % 7); // Sunday is day 0 ad7c: fba3 0305 umull r0, r3, r3, r5 while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { ad80: 2000 movs r0, #0 tm.hour = time % 24; ad82: 708a strb r2, [r1, #2] tm.wday = ((time + 4) % 7); // Sunday is day 0 ad84: 1aea subs r2, r5, r3 ad86: eb03 0352 add.w r3, r3, r2, lsr #1 days = 0; ad8a: 4602 mov r2, r0 tm.wday = ((time + 4) % 7); // Sunday is day 0 ad8c: 089b lsrs r3, r3, #2 ad8e: ebc3 03c3 rsb r3, r3, r3, lsl #3 ad92: 1aed subs r5, r5, r3 ad94: 70cd strb r5, [r1, #3] while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { ad96: fa5f fe80 uxtb.w lr, r0 ad9a: f240 1c6d movw ip, #365 ; 0x16d ad9e: f20e 73b2 addw r3, lr, #1970 ; 0x7b2 ada2: f013 0503 ands.w r5, r3, #3 ada6: fb07 f603 mul.w r6, r7, r3 adaa: d108 bne.n adbe adac: ebb8 0fb6 cmp.w r8, r6, ror #2 adb0: f44f 7cb7 mov.w ip, #366 ; 0x16e adb4: d303 bcc.n adbe adb6: ebb9 1f36 cmp.w r9, r6, ror #4 adba: bf38 it cc adbc: 46d4 movcc ip, sl adbe: 4462 add r2, ip adc0: 3001 adds r0, #1 adc2: 4294 cmp r4, r2 adc4: d2e7 bcs.n ad96 year++; } tm.year = year + 70; // year is offset from 1970 adc6: f10e 0e46 add.w lr, lr, #70 ; 0x46 days -= LEAP_YEAR(year) ? 366 : 365; adca: 4e2c ldr r6, [pc, #176] ; (ae7c ) tm.year = year + 70; // year is offset from 1970 adcc: f881 e006 strb.w lr, [r1, #6] days -= LEAP_YEAR(year) ? 366 : 365; add0: fba6 0603 umull r0, r6, r6, r3 add4: b385 cbz r5, ae38 while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { add6: 0977 lsrs r7, r6, #5 add8: f04f 0c64 mov.w ip, #100 ; 0x64 addc: f44f 70c8 mov.w r0, #400 ; 0x190 ade0: 09f6 lsrs r6, r6, #7 ade2: fb0c 3717 mls r7, ip, r7, r3 ade6: fb00 3616 mls r6, r0, r6, r3 days -= LEAP_YEAR(year) ? 366 : 365; adea: f240 106d movw r0, #365 ; 0x16d time -= days; // now it is days in this year, starting at 0 adee: 1aa4 subs r4, r4, r2 adf0: 2300 movs r3, #0 adf2: 2201 movs r2, #1 monthLength=29; } else { monthLength=28; } } else { monthLength = monthDays[month]; adf4: f8df e090 ldr.w lr, [pc, #144] ; ae88 time -= days; // now it is days in this year, starting at 0 adf8: 4420 add r0, r4 for (month=0; month<12; month++) { adfa: e00a b.n ae12 } if (time >= monthLength) { adfc: f813 400e ldrb.w r4, [r3, lr] ae00: 4284 cmp r4, r0 ae02: d80e bhi.n ae22 for (month=0; month<12; month++) { ae04: 2a0c cmp r2, #12 time -= monthLength; ae06: eba0 0004 sub.w r0, r0, r4 for (month=0; month<12; month++) { ae0a: d00b beq.n ae24 ae0c: 3201 adds r2, #1 ae0e: 3301 adds r3, #1 ae10: b2d2 uxtb r2, r2 if (month==1) { // february ae12: 2b01 cmp r3, #1 ae14: fa5f fc83 uxtb.w ip, r3 ae18: d1f0 bne.n adfc if (LEAP_YEAR(year)) { ae1a: b945 cbnz r5, ae2e ae1c: b1cf cbz r7, ae52 ae1e: 241d movs r4, #29 ae20: e006 b.n ae30 ae22: 4662 mov r2, ip } else { break; } } tm.mon = month; // jan is month 0 tm.mday = time + 1; // day of month ae24: 3001 adds r0, #1 tm.mon = month; // jan is month 0 ae26: 714a strb r2, [r1, #5] tm.mday = time + 1; // day of month ae28: 7108 strb r0, [r1, #4] } ae2a: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} ae2e: 241c movs r4, #28 if (time >= monthLength) { ae30: 42a0 cmp r0, r4 ae32: d318 bcc.n ae66 time -= monthLength; ae34: 1b00 subs r0, r0, r4 for (month=0; month<12; month++) { ae36: e7e9 b.n ae0c days -= LEAP_YEAR(year) ? 366 : 365; ae38: 2064 movs r0, #100 ; 0x64 ae3a: 0977 lsrs r7, r6, #5 while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { ae3c: 09f6 lsrs r6, r6, #7 days -= LEAP_YEAR(year) ? 366 : 365; ae3e: fb00 3717 mls r7, r0, r7, r3 while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) { ae42: f44f 70c8 mov.w r0, #400 ; 0x190 ae46: fb00 3616 mls r6, r0, r6, r3 days -= LEAP_YEAR(year) ? 366 : 365; ae4a: b13f cbz r7, ae5c ae4c: f44f 70b7 mov.w r0, #366 ; 0x16e ae50: e7cd b.n adee if (LEAP_YEAR(year)) { ae52: 2e00 cmp r6, #0 ae54: bf14 ite ne ae56: 241c movne r4, #28 ae58: 241d moveq r4, #29 ae5a: e7e9 b.n ae30 days -= LEAP_YEAR(year) ? 366 : 365; ae5c: 2e00 cmp r6, #0 ae5e: d1c4 bne.n adea ae60: f44f 70b7 mov.w r0, #366 ; 0x16e ae64: e7c3 b.n adee if (time >= monthLength) { ae66: 2201 movs r2, #1 ae68: e7dc b.n ae24 ae6a: bf00 nop ae6c: 88888889 .word 0x88888889 ae70: c28f5c29 .word 0xc28f5c29 ae74: aaaaaaab .word 0xaaaaaaab ae78: 24924925 .word 0x24924925 ae7c: 51eb851f .word 0x51eb851f ae80: 028f5c28 .word 0x028f5c28 ae84: 00a3d70a .word 0x00a3d70a ae88: 20000784 .word 0x20000784 0000ae8c : uint32_t dcdc = DCDC_REG3; // compute required voltage, apparently not as simple as NXP datasheet says // https://forum.pjrc.com/index.php?threads/77839 uint32_t voltage; // millivolts if (frequency <= 240000000) { ae8c: 49ac ldr r1, [pc, #688] ; (b140 ) uint32_t cbcdr = CCM_CBCDR; // pg 1021 ae8e: 4bad ldr r3, [pc, #692] ; (b144 ) if (frequency <= 240000000) { ae90: 4288 cmp r0, r1 { ae92: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} uint32_t dcdc = DCDC_REG3; ae96: 4cac ldr r4, [pc, #688] ; (b148 ) uint32_t cbcdr = CCM_CBCDR; // pg 1021 ae98: 695f ldr r7, [r3, #20] uint32_t cbcmr = CCM_CBCMR; // pg 1023 ae9a: 699a ldr r2, [r3, #24] uint32_t dcdc = DCDC_REG3; ae9c: f8d4 800c ldr.w r8, [r4, #12] if (frequency <= 240000000) { aea0: f200 80ff bhi.w b0a2 voltage = 950 + (frequency / 32000000) * 25; aea4: f103 7343 add.w r3, r3, #51118080 ; 0x30c0000 aea8: f503 53f4 add.w r3, r3, #7808 ; 0x1e80 aeac: 3303 adds r3, #3 aeae: fba3 1300 umull r1, r3, r3, r0 aeb2: 0ddb lsrs r3, r3, #23 aeb4: eb03 0383 add.w r3, r3, r3, lsl #2 aeb8: eb03 0483 add.w r4, r3, r3, lsl #2 aebc: f204 34b6 addw r4, r4, #950 ; 0x3b6 #endif if (voltage > OVERCLOCK_MAX_VOLT) voltage = OVERCLOCK_MAX_VOLT; // if voltage needs to increase, do it before switch clock speed CCM_CCGR6 |= CCM_CCGR6_DCDC(CCM_CCGR_ON); if ((dcdc & DCDC_REG3_TRG_MASK) < DCDC_REG3_TRG((voltage - 800) / 25)) { aec0: f240 6327 movw r3, #1575 ; 0x627 aec4: 429c cmp r4, r3 aec6: bf28 it cs aec8: 461c movcs r4, r3 aeca: 4ba0 ldr r3, [pc, #640] ; (b14c ) aecc: f5a4 7448 sub.w r4, r4, #800 ; 0x320 aed0: fba3 3404 umull r3, r4, r3, r4 aed4: 08e4 lsrs r4, r4, #3 CCM_CCGR6 |= CCM_CCGR6_DCDC(CCM_CCGR_ON); aed6: 499b ldr r1, [pc, #620] ; (b144 ) if ((dcdc & DCDC_REG3_TRG_MASK) < DCDC_REG3_TRG((voltage - 800) / 25)) { aed8: f008 091f and.w r9, r8, #31 CCM_CCGR6 |= CCM_CCGR6_DCDC(CCM_CCGR_ON); aedc: f8d1 3080 ldr.w r3, [r1, #128] ; 0x80 if ((dcdc & DCDC_REG3_TRG_MASK) < DCDC_REG3_TRG((voltage - 800) / 25)) { aee0: 45a1 cmp r9, r4 CCM_CCGR6 |= CCM_CCGR6_DCDC(CCM_CCGR_ON); aee2: f043 03c0 orr.w r3, r3, #192 ; 0xc0 aee6: f8c1 3080 str.w r3, [r1, #128] ; 0x80 if ((dcdc & DCDC_REG3_TRG_MASK) < DCDC_REG3_TRG((voltage - 800) / 25)) { aeea: d20c bcs.n af06 printf("Increasing voltage to %u mV\n", voltage); dcdc &= ~DCDC_REG3_TRG_MASK; aeec: f028 081f bic.w r8, r8, #31 dcdc |= DCDC_REG3_TRG((voltage - 800) / 25); DCDC_REG3 = dcdc; aef0: f5a1 21f8 sub.w r1, r1, #507904 ; 0x7c000 dcdc |= DCDC_REG3_TRG((voltage - 800) / 25); aef4: ea48 0804 orr.w r8, r8, r4 DCDC_REG3 = dcdc; aef8: f8c1 800c str.w r8, [r1, #12] while (!(DCDC_REG0 & DCDC_REG0_STS_DC_OK)) ; // wait voltage settling aefc: 680b ldr r3, [r1, #0] aefe: 2b00 cmp r3, #0 af00: dafc bge.n aefc scale_cpu_cycles_to_microseconds = 0xFFFFFFFFu / (uint32_t)(frequency / 1000000u); printf("New Frequency: ARM=%u, IPG=%u\n", frequency, frequency / div_ipg); // if voltage needs to decrease, do it after switch clock speed if ((dcdc & DCDC_REG3_TRG_MASK) > DCDC_REG3_TRG((voltage - 800) / 25)) { af02: f008 091f and.w r9, r8, #31 if (!(cbcdr & CCM_CBCDR_PERIPH_CLK_SEL)) { af06: f017 7300 ands.w r3, r7, #33554432 ; 0x2000000 af0a: d124 bne.n af56 if ((CCM_ANALOG_PLL_USB1 & need1s) == need1s) { af0c: 4990 ldr r1, [pc, #576] ; (b150 ) af0e: 690d ldr r5, [r1, #16] af10: 4990 ldr r1, [pc, #576] ; (b154 ) af12: 43a9 bics r1, r5 af14: f000 8101 beq.w b11a if ((cbcmr & CCM_CBCMR_PERIPH_CLK2_SEL_MASK) != CCM_CBCMR_PERIPH_CLK2_SEL(sel)) { af18: f482 5180 eor.w r1, r2, #4096 ; 0x1000 af1c: 463d mov r5, r7 af1e: f44f 5680 mov.w r6, #4096 ; 0x1000 if ((cbcdr & CCM_CBCDR_PERIPH_CLK2_PODF_MASK) != CCM_CBCDR_PERIPH_CLK2_PODF(div)) { af22: f015 5f60 tst.w r5, #939524096 ; 0x38000000 af26: d004 beq.n af32 cbcdr &= ~CCM_CBCDR_PERIPH_CLK2_PODF_MASK; af28: f027 5760 bic.w r7, r7, #939524096 ; 0x38000000 cbcdr |= CCM_CBCDR_PERIPH_CLK2_PODF(div); af2c: 431f orrs r7, r3 CCM_CBCDR = cbcdr; af2e: 4b85 ldr r3, [pc, #532] ; (b144 ) af30: 615f str r7, [r3, #20] if ((cbcmr & CCM_CBCMR_PERIPH_CLK2_SEL_MASK) != CCM_CBCMR_PERIPH_CLK2_SEL(sel)) { af32: f411 5f40 tst.w r1, #12288 ; 0x3000 af36: d007 beq.n af48 cbcmr &= ~CCM_CBCMR_PERIPH_CLK2_SEL_MASK; af38: f422 5240 bic.w r2, r2, #12288 ; 0x3000 CCM_CBCMR = cbcmr; af3c: 4981 ldr r1, [pc, #516] ; (b144 ) cbcmr |= CCM_CBCMR_PERIPH_CLK2_SEL(sel); af3e: 4332 orrs r2, r6 CCM_CBCMR = cbcmr; af40: 618a str r2, [r1, #24] while (CCM_CDHIPR & CCM_CDHIPR_PERIPH2_CLK_SEL_BUSY) ; // wait af42: 6c8b ldr r3, [r1, #72] ; 0x48 af44: 071a lsls r2, r3, #28 af46: d4fc bmi.n af42 cbcdr |= CCM_CBCDR_PERIPH_CLK_SEL; af48: f047 7700 orr.w r7, r7, #33554432 ; 0x2000000 CCM_CBCDR = cbcdr; af4c: 4a7d ldr r2, [pc, #500] ; (b144 ) af4e: 6157 str r7, [r2, #20] while (CCM_CDHIPR & CCM_CDHIPR_PERIPH_CLK_SEL_BUSY) ; // wait af50: 6c93 ldr r3, [r2, #72] ; 0x48 af52: 069b lsls r3, r3, #26 af54: d4fc bmi.n af50 while (frequency * div_arm * div_ahb < 648000000) { af56: 4d80 ldr r5, [pc, #512] ; (b158 ) af58: 42a8 cmp r0, r5 af5a: f200 80e9 bhi.w b130 uint32_t div_ahb = 1; af5e: f04f 0c01 mov.w ip, #1 af62: 4601 mov r1, r0 uint32_t div_arm = 1; af64: 4663 mov r3, ip while (frequency * div_arm * div_ahb < 648000000) { af66: fb03 1201 mla r2, r3, r1, r1 div_arm = div_arm + 1; af6a: f103 0e01 add.w lr, r3, #1 div_ahb = div_ahb + 1; af6e: f10c 0601 add.w r6, ip, #1 while (frequency * div_arm * div_ahb < 648000000) { af72: 42aa cmp r2, r5 af74: d818 bhi.n afa8 if (div_arm < 8) { af76: f1be 0f08 cmp.w lr, #8 div_arm = 1; af7a: f04f 0301 mov.w r3, #1 if (div_arm < 8) { af7e: f040 808e bne.w b09e if (div_ahb < 5) { af82: f1bc 0f04 cmp.w ip, #4 af86: f200 80a8 bhi.w b0da while (frequency * div_arm * div_ahb < 648000000) { af8a: 180a adds r2, r1, r0 af8c: 42aa cmp r2, r5 af8e: f200 80bb bhi.w b108 af92: fb06 f100 mul.w r1, r6, r0 div_ahb = div_ahb + 1; af96: 46b4 mov ip, r6 div_arm = div_arm + 1; af98: f103 0e01 add.w lr, r3, #1 while (frequency * div_arm * div_ahb < 648000000) { af9c: fb03 1201 mla r2, r3, r1, r1 div_ahb = div_ahb + 1; afa0: f10c 0601 add.w r6, ip, #1 while (frequency * div_arm * div_ahb < 648000000) { afa4: 42aa cmp r2, r5 afa6: d9e6 bls.n af76 if ((cbcdr & CCM_CBCDR_AHB_PODF_MASK) != CCM_CBCDR_AHB_PODF(div_ahb - 1)) { afa8: f10c 31ff add.w r1, ip, #4294967295 afac: 028d lsls r5, r1, #10 afae: ea87 2181 eor.w r1, r7, r1, lsl #10 uint32_t mult = (frequency * div_arm * div_ahb + 6000000) / 12000000; afb2: 486a ldr r0, [pc, #424] ; (b15c ) afb4: 4410 add r0, r2 if (mult > 108) mult = 108; afb6: 4a6a ldr r2, [pc, #424] ; (b160 ) afb8: 4290 cmp r0, r2 afba: f240 8096 bls.w b0ea afbe: f8df a1dc ldr.w sl, [pc, #476] ; b19c afc2: 226c movs r2, #108 ; 0x6c afc4: 4867 ldr r0, [pc, #412] ; (b164 ) if ((CCM_ANALOG_PLL_ARM & arm_pll_mask) != (CCM_ANALOG_PLL_ARM_LOCK afc6: 4e62 ldr r6, [pc, #392] ; (b150 ) frequency = mult * 12000000 / div_arm / div_ahb; afc8: fbb0 f0fe udiv r0, r0, lr if ((CCM_ANALOG_PLL_ARM & arm_pll_mask) != (CCM_ANALOG_PLL_ARM_LOCK afcc: f8d6 e000 ldr.w lr, [r6] frequency = mult * 12000000 / div_arm / div_ahb; afd0: fbb0 f0fc udiv r0, r0, ip if ((CCM_ANALOG_PLL_ARM & arm_pll_mask) != (CCM_ANALOG_PLL_ARM_LOCK afd4: f8df c1c8 ldr.w ip, [pc, #456] ; b1a0 afd8: ea0e 0c0c and.w ip, lr, ip afdc: 45d4 cmp ip, sl afde: d009 beq.n aff4 | CCM_ANALOG_PLL_ARM_DIV_SELECT(mult); afe0: f442 5200 orr.w r2, r2, #8192 ; 0x2000 CCM_ANALOG_PLL_ARM = CCM_ANALOG_PLL_ARM_POWERDOWN; afe4: f44f 5c80 mov.w ip, #4096 ; 0x1000 afe8: f8c6 c000 str.w ip, [r6] CCM_ANALOG_PLL_ARM = CCM_ANALOG_PLL_ARM_ENABLE afec: 6032 str r2, [r6, #0] while (!(CCM_ANALOG_PLL_ARM & CCM_ANALOG_PLL_ARM_LOCK)) ; // wait for lock afee: 6832 ldr r2, [r6, #0] aff0: 2a00 cmp r2, #0 aff2: dafc bge.n afee if ((CCM_CACRR & CCM_CACRR_ARM_PODF_MASK) != (div_arm - 1)) { aff4: 4a53 ldr r2, [pc, #332] ; (b144 ) aff6: 6916 ldr r6, [r2, #16] aff8: f006 0607 and.w r6, r6, #7 affc: 429e cmp r6, r3 affe: d003 beq.n b008 CCM_CACRR = CCM_CACRR_ARM_PODF(div_arm - 1); b000: 6113 str r3, [r2, #16] while (CCM_CDHIPR & CCM_CDHIPR_ARM_PODF_BUSY) ; // wait b002: 6c93 ldr r3, [r2, #72] ; 0x48 b004: 03de lsls r6, r3, #15 b006: d4fc bmi.n b002 if ((cbcdr & CCM_CBCDR_AHB_PODF_MASK) != CCM_CBCDR_AHB_PODF(div_ahb - 1)) { b008: f411 5fe0 tst.w r1, #7168 ; 0x1c00 b00c: d009 beq.n b022 cbcdr &= ~CCM_CBCDR_AHB_PODF_MASK; b00e: f427 57e0 bic.w r7, r7, #7168 ; 0x1c00 cbcdr |= CCM_CBCDR_AHB_PODF(div_ahb - 1); b012: f405 55e0 and.w r5, r5, #7168 ; 0x1c00 CCM_CBCDR = cbcdr; b016: 4a4b ldr r2, [pc, #300] ; (b144 ) cbcdr |= CCM_CBCDR_AHB_PODF(div_ahb - 1); b018: 432f orrs r7, r5 CCM_CBCDR = cbcdr; b01a: 6157 str r7, [r2, #20] while (CCM_CDHIPR & CCM_CDHIPR_AHB_PODF_BUSY); // wait b01c: 6c93 ldr r3, [r2, #72] ; 0x48 b01e: 0799 lsls r1, r3, #30 b020: d4fc bmi.n b01c uint32_t div_ipg = (frequency + 149999999) / 150000000; b022: 4951 ldr r1, [pc, #324] ; (b168 ) if (div_ipg > 4) div_ipg = 4; b024: 4a51 ldr r2, [pc, #324] ; (b16c ) uint32_t div_ipg = (frequency + 149999999) / 150000000; b026: 4401 add r1, r0 if (div_ipg > 4) div_ipg = 4; b028: 4291 cmp r1, r2 b02a: d852 bhi.n b0d2 uint32_t div_ipg = (frequency + 149999999) / 150000000; b02c: 4b50 ldr r3, [pc, #320] ; (b170 ) b02e: 09c9 lsrs r1, r1, #7 b030: fba3 3101 umull r3, r1, r3, r1 b034: 0b09 lsrs r1, r1, #12 if ((cbcdr & CCM_CBCDR_IPG_PODF_MASK) != (CCM_CBCDR_IPG_PODF(div_ipg - 1))) { b036: 1e4b subs r3, r1, #1 b038: 021b lsls r3, r3, #8 b03a: ea87 0203 eor.w r2, r7, r3 b03e: f412 7f40 tst.w r2, #768 ; 0x300 b042: d006 beq.n b052 cbcdr &= ~CCM_CBCDR_IPG_PODF_MASK; b044: f427 7740 bic.w r7, r7, #768 ; 0x300 cbcdr |= CCM_CBCDR_IPG_PODF(div_ipg - 1); b048: f403 7340 and.w r3, r3, #768 ; 0x300 CCM_CBCDR = cbcdr; b04c: 4a3d ldr r2, [pc, #244] ; (b144 ) cbcdr |= CCM_CBCDR_IPG_PODF(div_ipg - 1); b04e: 433b orrs r3, r7 CCM_CBCDR = cbcdr; b050: 6153 str r3, [r2, #20] CCM_CBCDR &= ~CCM_CBCDR_PERIPH_CLK_SEL; b052: 4a3c ldr r2, [pc, #240] ; (b144 ) b054: 6953 ldr r3, [r2, #20] b056: f023 7300 bic.w r3, r3, #33554432 ; 0x2000000 b05a: 6153 str r3, [r2, #20] while (CCM_CDHIPR & CCM_CDHIPR_PERIPH_CLK_SEL_BUSY) ; // wait b05c: 6c93 ldr r3, [r2, #72] ; 0x48 b05e: 069b lsls r3, r3, #26 b060: d4fc bmi.n b05c scale_cpu_cycles_to_microseconds = 0xFFFFFFFFu / (uint32_t)(frequency / 1000000u); b062: 4b44 ldr r3, [pc, #272] ; (b174 ) if ((dcdc & DCDC_REG3_TRG_MASK) > DCDC_REG3_TRG((voltage - 800) / 25)) { b064: 454c cmp r4, r9 scale_cpu_cycles_to_microseconds = 0xFFFFFFFFu / (uint32_t)(frequency / 1000000u); b066: fba3 2300 umull r2, r3, r3, r0 b06a: f04f 32ff mov.w r2, #4294967295 b06e: ea4f 4393 mov.w r3, r3, lsr #18 F_BUS_ACTUAL = frequency / div_ipg; b072: fbb0 f1f1 udiv r1, r0, r1 scale_cpu_cycles_to_microseconds = 0xFFFFFFFFu / (uint32_t)(frequency / 1000000u); b076: fbb2 f3f3 udiv r3, r2, r3 F_CPU_ACTUAL = frequency; b07a: 4a3f ldr r2, [pc, #252] ; (b178 ) b07c: 6010 str r0, [r2, #0] F_BUS_ACTUAL = frequency / div_ipg; b07e: 4a3f ldr r2, [pc, #252] ; (b17c ) b080: 6011 str r1, [r2, #0] scale_cpu_cycles_to_microseconds = 0xFFFFFFFFu / (uint32_t)(frequency / 1000000u); b082: 4a3f ldr r2, [pc, #252] ; (b180 ) b084: 6013 str r3, [r2, #0] if ((dcdc & DCDC_REG3_TRG_MASK) > DCDC_REG3_TRG((voltage - 800) / 25)) { b086: d208 bcs.n b09a printf("Decreasing voltage to %u mV\n", voltage); dcdc &= ~DCDC_REG3_TRG_MASK; b088: f028 081f bic.w r8, r8, #31 dcdc |= DCDC_REG3_TRG((voltage - 800) / 25); DCDC_REG3 = dcdc; b08c: 4a2e ldr r2, [pc, #184] ; (b148 ) dcdc |= DCDC_REG3_TRG((voltage - 800) / 25); b08e: ea48 0404 orr.w r4, r8, r4 DCDC_REG3 = dcdc; b092: 60d4 str r4, [r2, #12] while (!(DCDC_REG0 & DCDC_REG0_STS_DC_OK)) ; // wait voltage settling b094: 6813 ldr r3, [r2, #0] b096: 2b00 cmp r3, #0 b098: dafc bge.n b094 } return frequency; } b09a: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} b09e: 4673 mov r3, lr b0a0: e761 b.n af66 } else if (frequency < 460000000) { b0a2: 4b38 ldr r3, [pc, #224] ; (b184 ) b0a4: 4298 cmp r0, r3 b0a6: d801 bhi.n b0ac b0a8: 240e movs r4, #14 b0aa: e714 b.n aed6 } else if (frequency <= 528000000) { b0ac: 4b36 ldr r3, [pc, #216] ; (b188 ) b0ae: 4298 cmp r0, r3 b0b0: d93a bls.n b128 } else if (frequency <= 600000000) { b0b2: 4c36 ldr r4, [pc, #216] ; (b18c ) b0b4: 42a0 cmp r0, r4 b0b6: d939 bls.n b12c voltage = 1250 + ((frequency - 600000000) / OVERCLOCK_STEPSIZE) * 25; b0b8: 1b04 subs r4, r0, r4 b0ba: 4b35 ldr r3, [pc, #212] ; (b190 ) b0bc: 0a24 lsrs r4, r4, #8 b0be: fba3 3404 umull r3, r4, r3, r4 b0c2: 09e4 lsrs r4, r4, #7 b0c4: eb04 0484 add.w r4, r4, r4, lsl #2 b0c8: eb04 0484 add.w r4, r4, r4, lsl #2 b0cc: f204 44e2 addw r4, r4, #1250 ; 0x4e2 b0d0: e6f6 b.n aec0 b0d2: f44f 7340 mov.w r3, #768 ; 0x300 if (div_ipg > 4) div_ipg = 4; b0d6: 2104 movs r1, #4 b0d8: e7af b.n b03a if ((cbcdr & CCM_CBCDR_AHB_PODF_MASK) != CCM_CBCDR_AHB_PODF(div_ahb - 1)) { b0da: f10c 31ff add.w r1, ip, #4294967295 uint32_t mult = (frequency * div_arm * div_ahb + 6000000) / 12000000; b0de: 481f ldr r0, [pc, #124] ; (b15c ) b0e0: 2307 movs r3, #7 if ((cbcdr & CCM_CBCDR_AHB_PODF_MASK) != CCM_CBCDR_AHB_PODF(div_ahb - 1)) { b0e2: 028d lsls r5, r1, #10 uint32_t mult = (frequency * div_arm * div_ahb + 6000000) / 12000000; b0e4: 4410 add r0, r2 if ((cbcdr & CCM_CBCDR_AHB_PODF_MASK) != CCM_CBCDR_AHB_PODF(div_ahb - 1)) { b0e6: ea87 2181 eor.w r1, r7, r1, lsl #10 uint32_t mult = (frequency * div_arm * div_ahb + 6000000) / 12000000; b0ea: 4a2a ldr r2, [pc, #168] ; (b194 ) | CCM_ANALOG_PLL_ARM_ENABLE | CCM_ANALOG_PLL_ARM_DIV_SELECT(mult))) { b0ec: f8df a0b4 ldr.w sl, [pc, #180] ; b1a4 uint32_t mult = (frequency * div_arm * div_ahb + 6000000) / 12000000; b0f0: fba2 2000 umull r2, r0, r2, r0 b0f4: 0d02 lsrs r2, r0, #20 frequency = mult * 12000000 / div_arm / div_ahb; b0f6: 4828 ldr r0, [pc, #160] ; (b198 ) b0f8: 2a36 cmp r2, #54 ; 0x36 b0fa: bf38 it cc b0fc: 2236 movcc r2, #54 ; 0x36 b0fe: fb02 f000 mul.w r0, r2, r0 | CCM_ANALOG_PLL_ARM_ENABLE | CCM_ANALOG_PLL_ARM_DIV_SELECT(mult))) { b102: ea42 0a0a orr.w sl, r2, sl b106: e75e b.n afc6 if ((cbcdr & CCM_CBCDR_AHB_PODF_MASK) != CCM_CBCDR_AHB_PODF(div_ahb - 1)) { b108: ea4f 258c mov.w r5, ip, lsl #10 b10c: 2300 movs r3, #0 b10e: ea87 218c eor.w r1, r7, ip, lsl #10 div_arm = 1; b112: f04f 0e01 mov.w lr, #1 div_ahb = div_ahb + 1; b116: 46b4 mov ip, r6 b118: e74b b.n afb2 if ((cbcdr & CCM_CBCDR_PERIPH_CLK2_PODF_MASK) != CCM_CBCDR_PERIPH_CLK2_PODF(div)) { b11a: 461e mov r6, r3 b11c: f087 55c0 eor.w r5, r7, #402653184 ; 0x18000000 b120: 4611 mov r1, r2 b122: f04f 53c0 mov.w r3, #402653184 ; 0x18000000 b126: e6fc b.n af22 b128: 240f movs r4, #15 b12a: e6d4 b.n aed6 b12c: 2412 movs r4, #18 b12e: e6d2 b.n aed6 while (frequency * div_arm * div_ahb < 648000000) { b130: 2500 movs r5, #0 uint32_t div_ahb = 1; b132: f04f 0c01 mov.w ip, #1 while (frequency * div_arm * div_ahb < 648000000) { b136: 4602 mov r2, r0 b138: 4639 mov r1, r7 b13a: 462b mov r3, r5 uint32_t div_arm = 1; b13c: 46e6 mov lr, ip b13e: e738 b.n afb2 b140: 0e4e1c00 .word 0x0e4e1c00 b144: 400fc000 .word 0x400fc000 b148: 40080000 .word 0x40080000 b14c: 51eb851f .word 0x51eb851f b150: 400d8000 .word 0x400d8000 b154: 80003040 .word 0x80003040 b158: 269fb1ff .word 0x269fb1ff b15c: 005b8d80 .word 0x005b8d80 b160: 4df67eff .word 0x4df67eff b164: 4d3f6400 .word 0x4d3f6400 b168: 08f0d17f .word 0x08f0d17f b16c: 2cb4177f .word 0x2cb4177f b170: 00e5109f .word 0x00e5109f b174: 431bde83 .word 0x431bde83 b178: 20001044 .word 0x20001044 b17c: 20001040 .word 0x20001040 b180: 20002d84 .word 0x20002d84 b184: 1b6b0aff .word 0x1b6b0aff b188: 1f78a400 .word 0x1f78a400 b18c: 23c34600 .word 0x23c34600 b190: 004cb223 .word 0x004cb223 b194: 165e9f81 .word 0x165e9f81 b198: 00b71b00 .word 0x00b71b00 b19c: 8000206c .word 0x8000206c b1a0: 8001307f .word 0x8001307f b1a4: 80002000 .word 0x80002000 0000b1a8 : // or delayNanoseconds(). void delay(uint32_t msec) { uint32_t start; if (msec == 0) return; b1a8: b900 cbnz r0, b1ac b1aa: 4770 bx lr { b1ac: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} */ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) { uint32_t result; __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); b1b0: 2101 movs r1, #1 b1b2: 4681 mov r9, r0 b1b4: 4c21 ldr r4, [pc, #132] ; (b23c ) b1b6: 4d22 ldr r5, [pc, #136] ; (b240 ) b1b8: 4e22 ldr r6, [pc, #136] ; (b244 ) __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); b1ba: e854 3f00 ldrex r3, [r4] uint32_t micros(void) { uint32_t smc, scc; do { __LDREXW(&systick_safe_read); smc = systick_millis_count; b1be: 682a ldr r2, [r5, #0] scc = systick_cycle_count; b1c0: 6830 ldr r0, [r6, #0] __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); b1c2: e844 1300 strex r3, r1, [r4] } while ( __STREXW(1, &systick_safe_read)); b1c6: 2b00 cmp r3, #0 b1c8: d1f7 bne.n b1ba uint32_t cyccnt = ARM_DWT_CYCCNT; b1ca: 491f ldr r1, [pc, #124] ; (b248 ) b1cc: 684b ldr r3, [r1, #4] asm volatile("" : : : "memory"); uint32_t ccdelta = cyccnt - scc; uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; if (frac > 1000) frac = 1000; uint32_t usec = 1000*smc + frac; b1ce: f44f 7b7a mov.w fp, #1000 ; 0x3e8 uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; b1d2: f8df a078 ldr.w sl, [pc, #120] ; b24c uint32_t ccdelta = cyccnt - scc; b1d6: 1a1b subs r3, r3, r0 b1d8: 2701 movs r7, #1 uint32_t usec = 1000*smc + frac; b1da: fb0b f802 mul.w r8, fp, r2 uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; b1de: f8da 2000 ldr.w r2, [sl] b1e2: fba3 3202 umull r3, r2, r3, r2 uint32_t usec = 1000*smc + frac; b1e6: 455a cmp r2, fp b1e8: bf94 ite ls b1ea: 4490 addls r8, r2 b1ec: 44d8 addhi r8, fp __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); b1ee: e854 3f00 ldrex r3, [r4] smc = systick_millis_count; b1f2: 682a ldr r2, [r5, #0] scc = systick_cycle_count; b1f4: 6830 ldr r0, [r6, #0] __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); b1f6: e844 7300 strex r3, r7, [r4] } while ( __STREXW(1, &systick_safe_read)); b1fa: 2b00 cmp r3, #0 b1fc: d1f7 bne.n b1ee uint32_t cyccnt = ARM_DWT_CYCCNT; b1fe: 684b ldr r3, [r1, #4] uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; b200: f8da c000 ldr.w ip, [sl] uint32_t ccdelta = cyccnt - scc; b204: 1a1b subs r3, r3, r0 uint32_t usec = 1000*smc + frac; b206: fb0b f202 mul.w r2, fp, r2 uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; b20a: fba3 3c0c umull r3, ip, r3, ip uint32_t usec = 1000*smc + frac; b20e: f5bc 7f7a cmp.w ip, #1000 ; 0x3e8 b212: bf94 ite ls b214: 4462 addls r2, ip b216: f502 727a addhi.w r2, r2, #1000 ; 0x3e8 while ((micros() - start) >= 1000) { b21a: eba2 0208 sub.w r2, r2, r8 b21e: f5b2 7f7a cmp.w r2, #1000 ; 0x3e8 b222: d306 bcc.n b232 if (--msec == 0) return; b224: f1b9 0901 subs.w r9, r9, #1 start += 1000; b228: f508 787a add.w r8, r8, #1000 ; 0x3e8 if (--msec == 0) return; b22c: d1df bne.n b1ee } b22e: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} yield(); b232: f002 f8a1 bl d378 while ((micros() - start) >= 1000) { b236: 4904 ldr r1, [pc, #16] ; (b248 ) b238: e7d9 b.n b1ee b23a: bf00 nop b23c: 20002d94 .word 0x20002d94 b240: 20002d90 .word 0x20002d90 b244: 20002d8c .word 0x20002d8c b248: e0001000 .word 0xe0001000 b24c: 20002d84 .word 0x20002d84 0000b250 : { b250: b430 push {r4, r5} b252: 4b0f ldr r3, [pc, #60] ; (b290 ) b254: f04f 0c01 mov.w ip, #1 b258: 4d0e ldr r5, [pc, #56] ; (b294 ) b25a: 4c0f ldr r4, [pc, #60] ; (b298 ) __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); b25c: e853 2f00 ldrex r2, [r3] smc = systick_millis_count; b260: 6828 ldr r0, [r5, #0] scc = systick_cycle_count; b262: 6821 ldr r1, [r4, #0] __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); b264: e843 c200 strex r2, ip, [r3] } while ( __STREXW(1, &systick_safe_read)); b268: 2a00 cmp r2, #0 b26a: d1f7 bne.n b25c uint32_t cyccnt = ARM_DWT_CYCCNT; b26c: 4b0b ldr r3, [pc, #44] ; (b29c ) b26e: 685b ldr r3, [r3, #4] uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; b270: 4a0b ldr r2, [pc, #44] ; (b2a0 ) uint32_t ccdelta = cyccnt - scc; b272: 1a5b subs r3, r3, r1 uint32_t usec = 1000*smc + frac; b274: f44f 717a mov.w r1, #1000 ; 0x3e8 uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; b278: 6812 ldr r2, [r2, #0] uint32_t usec = 1000*smc + frac; b27a: fb01 f000 mul.w r0, r1, r0 uint32_t frac = ((uint64_t)ccdelta * scale_cpu_cycles_to_microseconds) >> 32; b27e: fba3 3202 umull r3, r2, r3, r2 return usec; } b282: bc30 pop {r4, r5} b284: 428a cmp r2, r1 b286: bf94 ite ls b288: 1880 addls r0, r0, r2 b28a: 1840 addhi r0, r0, r1 b28c: 4770 bx lr b28e: bf00 nop b290: 20002d94 .word 0x20002d94 b294: 20002d90 .word 0x20002d90 b298: 20002d8c .word 0x20002d8c b29c: e0001000 .word 0xe0001000 b2a0: 20002d84 .word 0x20002d84 0000b2a4 : void digitalWrite(uint8_t pin, uint8_t val) { const struct digital_pin_bitband_and_config_table_struct *p; uint32_t pinmode, mask; if (pin >= CORE_NUM_DIGITAL) return; b2a4: 2836 cmp r0, #54 ; 0x36 b2a6: d816 bhi.n b2d6 p = digital_pin_to_info_PGM + pin; b2a8: 0102 lsls r2, r0, #4 b2aa: 4b10 ldr r3, [pc, #64] ; (b2ec ) b2ac: eb03 1000 add.w r0, r3, r0, lsl #4 pinmode = *(p->reg + 1); b2b0: 589b ldr r3, [r3, r2] { b2b2: b410 push {r4} mask = p->mask; b2b4: 68c2 ldr r2, [r0, #12] pinmode = *(p->reg + 1); b2b6: 685c ldr r4, [r3, #4] if (pinmode & mask) { b2b8: 4214 tst r4, r2 b2ba: d005 beq.n b2c8 // pin is configured for output mode if (val) { b2bc: b961 cbnz r1, b2d8 *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(3) | IOMUXC_PAD_HYS; } else { *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(0) | IOMUXC_PAD_HYS; } } } b2be: f85d 4b04 ldr.w r4, [sp], #4 *(p->reg + 0x22) = mask; // clear register b2c2: f8c3 2088 str.w r2, [r3, #136] ; 0x88 } b2c6: 4770 bx lr *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(3) | IOMUXC_PAD_HYS; b2c8: 6883 ldr r3, [r0, #8] if (val) { b2ca: b151 cbz r1, b2e2 *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(3) | IOMUXC_PAD_HYS; b2cc: 4a08 ldr r2, [pc, #32] ; (b2f0 ) } b2ce: f85d 4b04 ldr.w r4, [sp], #4 *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(3) | IOMUXC_PAD_HYS; b2d2: 601a str r2, [r3, #0] } b2d4: 4770 bx lr b2d6: 4770 bx lr b2d8: f85d 4b04 ldr.w r4, [sp], #4 *(p->reg + 0x21) = mask; // set register b2dc: f8c3 2084 str.w r2, [r3, #132] ; 0x84 } b2e0: 4770 bx lr *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(0) | IOMUXC_PAD_HYS; b2e2: 4a04 ldr r2, [pc, #16] ; (b2f4 ) } b2e4: f85d 4b04 ldr.w r4, [sp], #4 *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(0) | IOMUXC_PAD_HYS; b2e8: 601a str r2, [r3, #0] } b2ea: 4770 bx lr b2ec: 20000b44 .word 0x20000b44 b2f0: 0001f038 .word 0x0001f038 b2f4: 00013038 .word 0x00013038 0000b2f8 : uint8_t digitalRead(uint8_t pin) { const struct digital_pin_bitband_and_config_table_struct *p; if (pin >= CORE_NUM_DIGITAL) return 0; b2f8: 2836 cmp r0, #54 ; 0x36 b2fa: d80b bhi.n b314 p = digital_pin_to_info_PGM + pin; b2fc: 4b06 ldr r3, [pc, #24] ; (b318 ) b2fe: 0102 lsls r2, r0, #4 b300: eb03 1000 add.w r0, r3, r0, lsl #4 return (*(p->reg + 2) & p->mask) ? 1 : 0; b304: 589a ldr r2, [r3, r2] b306: 68c3 ldr r3, [r0, #12] b308: 6892 ldr r2, [r2, #8] b30a: 421a tst r2, r3 b30c: bf14 ite ne b30e: 2001 movne r0, #1 b310: 2000 moveq r0, #0 b312: 4770 bx lr if (pin >= CORE_NUM_DIGITAL) return 0; b314: 2000 movs r0, #0 } b316: 4770 bx lr b318: 20000b44 .word 0x20000b44 0000b31c : void pinMode(uint8_t pin, uint8_t mode) { const struct digital_pin_bitband_and_config_table_struct *p; if (pin >= CORE_NUM_DIGITAL) return; b31c: 2836 cmp r0, #54 ; 0x36 b31e: d829 bhi.n b374 p = digital_pin_to_info_PGM + pin; b320: 4b16 ldr r3, [pc, #88] ; (b37c ) b322: 0102 lsls r2, r0, #4 if (mode == OUTPUT || mode == OUTPUT_OPENDRAIN) { b324: 2901 cmp r1, #1 p = digital_pin_to_info_PGM + pin; b326: eb03 1000 add.w r0, r3, r0, lsl #4 *(p->pad) = IOMUXC_PAD_DSE(7); } else { // OUTPUT_OPENDRAIN *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_ODE; } } else { *(p->reg + 1) &= ~(p->mask); // TODO: atomic b32a: 589a ldr r2, [r3, r2] { b32c: b410 push {r4} *(p->reg + 1) &= ~(p->mask); // TODO: atomic b32e: 6853 ldr r3, [r2, #4] b330: 68c4 ldr r4, [r0, #12] if (mode == OUTPUT || mode == OUTPUT_OPENDRAIN) { b332: d00e beq.n b352 b334: 2904 cmp r1, #4 b336: d00c beq.n b352 *(p->reg + 1) &= ~(p->mask); // TODO: atomic b338: ea23 0304 bic.w r3, r3, r4 b33c: 6053 str r3, [r2, #4] if (mode == INPUT) { *(p->pad) = IOMUXC_PAD_DSE(7); b33e: 6883 ldr r3, [r0, #8] if (mode == INPUT) { b340: b1a9 cbz r1, b36e } else if (mode == INPUT_PULLUP) { b342: 2902 cmp r1, #2 b344: d017 beq.n b376 *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(3) | IOMUXC_PAD_HYS; } else if (mode == INPUT_PULLDOWN) { b346: 2903 cmp r1, #3 *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(0) | IOMUXC_PAD_HYS; b348: bf0c ite eq b34a: 4a0d ldreq r2, [pc, #52] ; (b380 ) } else { // INPUT_DISABLE *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_HYS; b34c: 4a0d ldrne r2, [pc, #52] ; (b384 ) b34e: 601a str r2, [r3, #0] b350: e007 b.n b362 *(p->reg + 1) |= p->mask; // TODO: atomic b352: 4323 orrs r3, r4 if (mode == OUTPUT) { b354: 2901 cmp r1, #1 *(p->reg + 1) |= p->mask; // TODO: atomic b356: 6053 str r3, [r2, #4] *(p->pad) = IOMUXC_PAD_DSE(7); b358: 6883 ldr r3, [r0, #8] if (mode == OUTPUT) { b35a: d008 beq.n b36e *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_ODE; b35c: f640 0238 movw r2, #2104 ; 0x838 b360: 601a str r2, [r3, #0] } } *(p->mux) = 5 | 0x10; b362: 6843 ldr r3, [r0, #4] b364: 2215 movs r2, #21 } b366: f85d 4b04 ldr.w r4, [sp], #4 *(p->mux) = 5 | 0x10; b36a: 601a str r2, [r3, #0] } b36c: 4770 bx lr *(p->pad) = IOMUXC_PAD_DSE(7); b36e: 2238 movs r2, #56 ; 0x38 b370: 601a str r2, [r3, #0] b372: e7f6 b.n b362 b374: 4770 bx lr *(p->pad) = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_PKE | IOMUXC_PAD_PUE | IOMUXC_PAD_PUS(3) | IOMUXC_PAD_HYS; b376: 4a04 ldr r2, [pc, #16] ; (b388 ) b378: 601a str r2, [r3, #0] b37a: e7f2 b.n b362 b37c: 20000b44 .word 0x20000b44 b380: 00013038 .word 0x00013038 b384: 00010038 .word 0x00010038 b388: 0001f038 .word 0x0001f038 0000b38c
: */ #include extern "C" int main(void) { b38c: b508 push {r3, lr} } #else // Arduino's main() function just calls setup() and loop().... setup(); b38e: f7f6 f8a7 bl 14e0 while (1) { loop(); b392: f7f6 f927 bl 15e4 yield(); b396: f001 ffef bl d378 while (1) { b39a: e7fa b.n b392 0000b39c : @ r1: src @ r2: len #ifdef __ARM_FEATURE_UNALIGNED /* In case of UNALIGNED access supported, ip is not used in function body. */ mov ip, r0 b39c: 4684 mov ip, r0 #else push {r0} #endif orr r3, r1, r0 b39e: ea41 0300 orr.w r3, r1, r0 ands r3, r3, #3 b3a2: f013 0303 ands.w r3, r3, #3 bne .Lmisaligned_copy b3a6: d16d bne.n b484 .Lbig_block: subs r2, __OPT_BIG_BLOCK_SIZE b3a8: 3a40 subs r2, #64 ; 0x40 blo .Lmid_block b3aa: d341 bcc.n b430 .Lbig_block_loop: BEGIN_UNROLL_BIG_BLOCK #ifdef __ARM_ARCH_7EM__ ldr r3, [r1], #4 str r3, [r0], #4 END_UNROLL b3ac: f851 3b04 ldr.w r3, [r1], #4 b3b0: f840 3b04 str.w r3, [r0], #4 b3b4: f851 3b04 ldr.w r3, [r1], #4 b3b8: f840 3b04 str.w r3, [r0], #4 b3bc: f851 3b04 ldr.w r3, [r1], #4 b3c0: f840 3b04 str.w r3, [r0], #4 b3c4: f851 3b04 ldr.w r3, [r1], #4 b3c8: f840 3b04 str.w r3, [r0], #4 b3cc: f851 3b04 ldr.w r3, [r1], #4 b3d0: f840 3b04 str.w r3, [r0], #4 b3d4: f851 3b04 ldr.w r3, [r1], #4 b3d8: f840 3b04 str.w r3, [r0], #4 b3dc: f851 3b04 ldr.w r3, [r1], #4 b3e0: f840 3b04 str.w r3, [r0], #4 b3e4: f851 3b04 ldr.w r3, [r1], #4 b3e8: f840 3b04 str.w r3, [r0], #4 b3ec: f851 3b04 ldr.w r3, [r1], #4 b3f0: f840 3b04 str.w r3, [r0], #4 b3f4: f851 3b04 ldr.w r3, [r1], #4 b3f8: f840 3b04 str.w r3, [r0], #4 b3fc: f851 3b04 ldr.w r3, [r1], #4 b400: f840 3b04 str.w r3, [r0], #4 b404: f851 3b04 ldr.w r3, [r1], #4 b408: f840 3b04 str.w r3, [r0], #4 b40c: f851 3b04 ldr.w r3, [r1], #4 b410: f840 3b04 str.w r3, [r0], #4 b414: f851 3b04 ldr.w r3, [r1], #4 b418: f840 3b04 str.w r3, [r0], #4 b41c: f851 3b04 ldr.w r3, [r1], #4 b420: f840 3b04 str.w r3, [r0], #4 b424: f851 3b04 ldr.w r3, [r1], #4 b428: f840 3b04 str.w r3, [r0], #4 str r3, [r0, \offset] END_UNROLL adds r0, __OPT_BIG_BLOCK_SIZE adds r1, __OPT_BIG_BLOCK_SIZE #endif subs r2, __OPT_BIG_BLOCK_SIZE b42c: 3a40 subs r2, #64 ; 0x40 bhs .Lbig_block_loop b42e: d2bd bcs.n b3ac .Lmid_block: adds r2, __OPT_BIG_BLOCK_SIZE - __OPT_MID_BLOCK_SIZE b430: 3230 adds r2, #48 ; 0x30 blo .Lcopy_word_by_word b432: d311 bcc.n b458 .Lmid_block_loop: BEGIN_UNROLL_MID_BLOCK #ifdef __ARM_ARCH_7EM__ ldr r3, [r1], #4 str r3, [r0], #4 END_UNROLL b434: f851 3b04 ldr.w r3, [r1], #4 b438: f840 3b04 str.w r3, [r0], #4 b43c: f851 3b04 ldr.w r3, [r1], #4 b440: f840 3b04 str.w r3, [r0], #4 b444: f851 3b04 ldr.w r3, [r1], #4 b448: f840 3b04 str.w r3, [r0], #4 b44c: f851 3b04 ldr.w r3, [r1], #4 b450: f840 3b04 str.w r3, [r0], #4 str r3, [r0, \offset] END_UNROLL adds r0, __OPT_MID_BLOCK_SIZE adds r1, __OPT_MID_BLOCK_SIZE #endif subs r2, __OPT_MID_BLOCK_SIZE b454: 3a10 subs r2, #16 bhs .Lmid_block_loop b456: d2ed bcs.n b434 .Lcopy_word_by_word: adds r2, __OPT_MID_BLOCK_SIZE - 4 b458: 320c adds r2, #12 blo .Lcopy_less_than_4 b45a: d305 bcc.n b468 /* Kernel loop for small block copy */ .align 2 .Lcopy_word_by_word_loop: ldr r3, [r1], #4 b45c: f851 3b04 ldr.w r3, [r1], #4 str r3, [r0], #4 b460: f840 3b04 str.w r3, [r0], #4 subs r2, #4 b464: 3a04 subs r2, #4 bhs .Lcopy_word_by_word_loop b466: d2f9 bcs.n b45c .Lcopy_less_than_4: adds r2, #4 b468: 3204 adds r2, #4 beq .Ldone b46a: d008 beq.n b47e lsls r2, r2, #31 b46c: 07d2 lsls r2, r2, #31 itt ne b46e: bf1c itt ne ldrbne r3, [r1], #1 b470: f811 3b01 ldrbne.w r3, [r1], #1 strbne r3, [r0], #1 b474: f800 3b01 strbne.w r3, [r0], #1 bcc .Ldone b478: d301 bcc.n b47e #ifdef __ARM_FEATURE_UNALIGNED ldrh r3, [r1] b47a: 880b ldrh r3, [r1, #0] strh r3, [r0] b47c: 8003 strh r3, [r0, #0] strb r3, [r0, #1] #endif /* __ARM_FEATURE_UNALIGNED */ .Ldone: #ifdef __ARM_FEATURE_UNALIGNED mov r0, ip b47e: 4660 mov r0, ip #else pop {r0} #endif bx lr b480: 4770 bx lr b482: bf00 nop #define Ldst_aligned Lbig_block /* Copy word by word using LDR when alignment can be done in hardware, i.e., SCTLR.A is set, supporting unaligned access in LDR and STR. */ cmp r2, #8 b484: 2a08 cmp r2, #8 blo .Lbyte_copy b486: d313 bcc.n b4b0 /* if src is aligned, just go to the big block loop. */ lsls r3, r1, #30 b488: 078b lsls r3, r1, #30 beq .Ldst_aligned b48a: d08d beq.n b3a8 handling of aligned src and misaligned dst need more overhead than otherwise. By doing this the worst case is when initial src is aligned, additional up to 4 byte additional copy will executed, which is acceptable. */ ands r3, r0, #3 b48c: f010 0303 ands.w r3, r0, #3 beq .Ldst_aligned b490: d08a beq.n b3a8 rsb r3, #4 b492: f1c3 0304 rsb r3, r3, #4 subs r2, r3 b496: 1ad2 subs r2, r2, r3 lsls r3, r3, #31 b498: 07db lsls r3, r3, #31 itt ne b49a: bf1c itt ne ldrbne r3, [r1], #1 b49c: f811 3b01 ldrbne.w r3, [r1], #1 strbne r3, [r0], #1 b4a0: f800 3b01 strbne.w r3, [r0], #1 bcc .Ldst_aligned b4a4: d380 bcc.n b3a8 #ifdef __ARM_FEATURE_UNALIGNED ldrh r3, [r1], #2 b4a6: f831 3b02 ldrh.w r3, [r1], #2 strh r3, [r0], #2 b4aa: f820 3b02 strh.w r3, [r0], #2 b .Ldst_aligned b4ae: e77b b.n b3a8 pop {r4, r5} #endif /* __ARM_FEATURE_UNALIGNED */ .Lbyte_copy: subs r2, #4 b4b0: 3a04 subs r2, #4 blo .Lcopy_less_than_4 b4b2: d3d9 bcc.n b468 .Lbyte_copy_loop: subs r2, #1 b4b4: 3a01 subs r2, #1 ldrb r3, [r1], #1 b4b6: f811 3b01 ldrb.w r3, [r1], #1 strb r3, [r0], #1 b4ba: f800 3b01 strb.w r3, [r0], #1 bhs .Lbyte_copy_loop b4be: d2f9 bcs.n b4b4 ldrb r3, [r1] b4c0: 780b ldrb r3, [r1, #0] strb r3, [r0] b4c2: 7003 strb r3, [r0, #0] ldrb r3, [r1, #1] b4c4: 784b ldrb r3, [r1, #1] strb r3, [r0, #1] b4c6: 7043 strb r3, [r0, #1] ldrb r3, [r1, #2] b4c8: 788b ldrb r3, [r1, #2] strb r3, [r0, #2] b4ca: 7083 strb r3, [r0, #2] #ifdef __ARM_FEATURE_UNALIGNED mov r0, ip b4cc: 4660 mov r0, ip #else pop {r0} #endif bx lr b4ce: 4770 bx lr 0000b4d0 : #include #include void * operator new(size_t size) { return malloc(size); b4d0: f002 b82c b.w d52c 0000b4d4 : free(ptr); } void operator delete(void * ptr, size_t size __attribute__((unused))) { free(ptr); b4d4: f002 b832 b.w d53c 0000b4d8 : char * ultoa(unsigned long val, char *buf, int radix) { unsigned digit; int i=0, j; b4d8: f101 3cff add.w ip, r1, #4294967295 { b4dc: b570 push {r4, r5, r6, lr} char t; while (1) { digit = val % radix; b4de: 4666 mov r6, ip int i=0, j; b4e0: 2400 movs r4, #0 b4e2: e000 b.n b4e6 buf[i] = ((digit < 10) ? '0' + digit : 'A' + digit - 10); val /= radix; if (val == 0) break; i++; b4e4: 3401 adds r4, #1 digit = val % radix; b4e6: fbb0 f5f2 udiv r5, r0, r2 b4ea: fb02 0315 mls r3, r2, r5, r0 buf[i] = ((digit < 10) ? '0' + digit : 'A' + digit - 10); b4ee: 2b09 cmp r3, #9 b4f0: f103 0e37 add.w lr, r3, #55 ; 0x37 b4f4: f103 0330 add.w r3, r3, #48 ; 0x30 b4f8: fa5f fe8e uxtb.w lr, lr b4fc: bf98 it ls b4fe: fa5f fe83 uxtbls.w lr, r3 if (val == 0) break; b502: 4290 cmp r0, r2 val /= radix; b504: 4628 mov r0, r5 buf[i] = ((digit < 10) ? '0' + digit : 'A' + digit - 10); b506: f806 ef01 strb.w lr, [r6, #1]! if (val == 0) break; b50a: d2eb bcs.n b4e4 } buf[i + 1] = 0; b50c: 1c63 adds r3, r4, #1 b50e: 2200 movs r2, #0 b510: 18c8 adds r0, r1, r3 b512: 54ca strb r2, [r1, r3] for (j=0; j < i; j++, i--) { b514: b17c cbz r4, b536 t = buf[j]; b516: 4662 mov r2, ip b518: f81c 5f01 ldrb.w r5, [ip, #1]! buf[j] = buf[i]; b51c: f810 6d01 ldrb.w r6, [r0, #-1]! for (j=0; j < i; j++, i--) { b520: eba1 030c sub.w r3, r1, ip b524: 3202 adds r2, #2 buf[j] = buf[i]; b526: f88c 6000 strb.w r6, [ip] for (j=0; j < i; j++, i--) { b52a: 3b01 subs r3, #1 b52c: 1a52 subs r2, r2, r1 buf[i] = t; b52e: 7005 strb r5, [r0, #0] for (j=0; j < i; j++, i--) { b530: 4423 add r3, r4 b532: 429a cmp r2, r3 b534: dbef blt.n b516 } return buf; } b536: 4608 mov r0, r1 b538: bd70 pop {r4, r5, r6, pc} b53a: bf00 nop 0000b53c : { int i; p->FCTRL0 = FLEXPWM_FCTRL0_FLVL(15); // logic high = fault p->FSTS0 = 0x000F; // clear fault status p->FFILT0 = 0; b53c: 2300 movs r3, #0 p->FSTS0 = 0x000F; // clear fault status b53e: 220f movs r2, #15 p->SM[i].CTRL = FLEXPWM_SMCTRL_FULL; p->SM[i].OCTRL = 0; p->SM[i].DTCNT0 = 0; p->SM[i].INIT = 0; p->SM[i].VAL0 = 0; p->SM[i].VAL1 = 33464; b540: f248 2cb8 movw ip, #33464 ; 0x82b8 for (i=0; i < 4; i++) { b544: 4619 mov r1, r3 { b546: b510 push {r4, lr} p->FCTRL0 = FLEXPWM_FCTRL0_FLVL(15); // logic high = fault b548: f44f 4470 mov.w r4, #61440 ; 0xf000 p->SM[i].CTRL = FLEXPWM_SMCTRL_FULL; b54c: f44f 6e80 mov.w lr, #1024 ; 0x400 p->FCTRL0 = FLEXPWM_FCTRL0_FLVL(15); // logic high = fault b550: f8a0 418c strh.w r4, [r0, #396] ; 0x18c p->SM[i].CTRL2 = FLEXPWM_SMCTRL2_INDEP | FLEXPWM_SMCTRL2_WAITEN b554: f44f 4460 mov.w r4, #57344 ; 0xe000 p->FSTS0 = 0x000F; // clear fault status b558: f8a0 218e strh.w r2, [r0, #398] ; 0x18e p->SM[i].OCTRL = 0; b55c: 460a mov r2, r1 p->FFILT0 = 0; b55e: f8a0 3190 strh.w r3, [r0, #400] ; 0x190 p->MCTRL |= FLEXPWM_MCTRL_CLDOK(15); b562: f8b0 3188 ldrh.w r3, [r0, #392] ; 0x188 b566: b29b uxth r3, r3 b568: f043 03f0 orr.w r3, r3, #240 ; 0xf0 b56c: f8a0 3188 strh.w r3, [r0, #392] ; 0x188 p->SM[i].CTRL2 = FLEXPWM_SMCTRL2_INDEP | FLEXPWM_SMCTRL2_WAITEN b570: eb01 0341 add.w r3, r1, r1, lsl #1 for (i=0; i < 4; i++) { b574: 3101 adds r1, #1 b576: eb00 1343 add.w r3, r0, r3, lsl #5 b57a: 2904 cmp r1, #4 p->SM[i].CTRL2 = FLEXPWM_SMCTRL2_INDEP | FLEXPWM_SMCTRL2_WAITEN b57c: 809c strh r4, [r3, #4] p->SM[i].CTRL = FLEXPWM_SMCTRL_FULL; b57e: f8a3 e006 strh.w lr, [r3, #6] p->SM[i].OCTRL = 0; b582: 845a strh r2, [r3, #34] ; 0x22 p->SM[i].DTCNT0 = 0; b584: 861a strh r2, [r3, #48] ; 0x30 p->SM[i].INIT = 0; b586: 805a strh r2, [r3, #2] p->SM[i].VAL0 = 0; b588: 815a strh r2, [r3, #10] p->SM[i].VAL1 = 33464; b58a: f8a3 c00e strh.w ip, [r3, #14] p->SM[i].VAL2 = 0; b58e: 825a strh r2, [r3, #18] p->SM[i].VAL3 = 0; b590: 82da strh r2, [r3, #22] p->SM[i].VAL4 = 0; b592: 835a strh r2, [r3, #26] p->SM[i].VAL5 = 0; b594: 83da strh r2, [r3, #30] for (i=0; i < 4; i++) { b596: d1eb bne.n b570 } p->MCTRL |= FLEXPWM_MCTRL_LDOK(15); b598: f8b0 3188 ldrh.w r3, [r0, #392] ; 0x188 b59c: b29b uxth r3, r3 b59e: f043 030f orr.w r3, r3, #15 b5a2: f8a0 3188 strh.w r3, [r0, #392] ; 0x188 p->MCTRL |= FLEXPWM_MCTRL_RUN(15); b5a6: f8b0 3188 ldrh.w r3, [r0, #392] ; 0x188 b5aa: b29b uxth r3, r3 b5ac: f443 6370 orr.w r3, r3, #3840 ; 0xf00 b5b0: f8a0 3188 strh.w r3, [r0, #392] ; 0x188 } b5b4: bd10 pop {r4, pc} b5b6: bf00 nop 0000b5b8 : } void pwm_init(void) { //printf("pwm init\n"); CCM_CCGR4 |= CCM_CCGR4_PWM1(CCM_CCGR_ON) | CCM_CCGR4_PWM2(CCM_CCGR_ON) | b5b8: 4b37 ldr r3, [pc, #220] ; (b698 ) CCM_CCGR4_PWM3(CCM_CCGR_ON) | CCM_CCGR4_PWM4(CCM_CCGR_ON); CCM_CCGR6 |= CCM_CCGR6_QTIMER1(CCM_CCGR_ON) | CCM_CCGR6_QTIMER2(CCM_CCGR_ON) | b5ba: 4a38 ldr r2, [pc, #224] ; (b69c ) CCM_CCGR4 |= CCM_CCGR4_PWM1(CCM_CCGR_ON) | CCM_CCGR4_PWM2(CCM_CCGR_ON) | b5bc: 6f99 ldr r1, [r3, #120] ; 0x78 CCM_CCGR6_QTIMER3(CCM_CCGR_ON) | CCM_CCGR6_QTIMER4(CCM_CCGR_ON); flexpwm_init(&IMXRT_FLEXPWM1); b5be: 4838 ldr r0, [pc, #224] ; (b6a0 ) CCM_CCGR4 |= CCM_CCGR4_PWM1(CCM_CCGR_ON) | CCM_CCGR4_PWM2(CCM_CCGR_ON) | b5c0: f441 017f orr.w r1, r1, #16711680 ; 0xff0000 { b5c4: b570 push {r4, r5, r6, lr} CCM_CCGR4 |= CCM_CCGR4_PWM1(CCM_CCGR_ON) | CCM_CCGR4_PWM2(CCM_CCGR_ON) | b5c6: 6799 str r1, [r3, #120] ; 0x78 p->CH[i].CSCTRL = TMR_CSCTRL_CL1(1) | TMR_CSCTRL_ALT_LOAD; b5c8: f241 0601 movw r6, #4097 ; 0x1001 CCM_CCGR6 |= CCM_CCGR6_QTIMER1(CCM_CCGR_ON) | CCM_CCGR6_QTIMER2(CCM_CCGR_ON) | b5cc: f8d3 1080 ldr.w r1, [r3, #128] ; 0x80 p->CH[i].LOAD = 24000; // low time (65537 - x) - b5d0: f645 55c0 movw r5, #24000 ; 0x5dc0 p->CH[i].CTRL = TMR_CTRL_CM(1) | TMR_CTRL_PCS(8) | b5d4: f243 0426 movw r4, #12326 ; 0x3026 CCM_CCGR6 |= CCM_CCGR6_QTIMER1(CCM_CCGR_ON) | CCM_CCGR6_QTIMER2(CCM_CCGR_ON) | b5d8: 430a orrs r2, r1 b5da: f8c3 2080 str.w r2, [r3, #128] ; 0x80 flexpwm_init(&IMXRT_FLEXPWM1); b5de: f7ff ffad bl b53c flexpwm_init(&IMXRT_FLEXPWM2); b5e2: f500 4080 add.w r0, r0, #16384 ; 0x4000 b5e6: f7ff ffa9 bl b53c flexpwm_init(&IMXRT_FLEXPWM3); b5ea: f500 4080 add.w r0, r0, #16384 ; 0x4000 b5ee: f7ff ffa5 bl b53c flexpwm_init(&IMXRT_FLEXPWM4); b5f2: f500 4080 add.w r0, r0, #16384 ; 0x4000 b5f6: f7ff ffa1 bl b53c for (i=0; i < 4; i++) { b5fa: 2200 movs r2, #0 p->CH[i].CTRL = 0; // stop timer b5fc: f5a0 1003 sub.w r0, r0, #2146304 ; 0x20c000 p->CH[i].SCTRL = TMR_SCTRL_OEN | TMR_SCTRL_OPS | TMR_SCTRL_VAL | TMR_SCTRL_FORCE; b600: f04f 0e0f mov.w lr, #15 p->CH[i].CTRL = 0; // stop timer b604: 4611 mov r1, r2 b606: eb00 1342 add.w r3, r0, r2, lsl #5 b60a: ea4f 1c42 mov.w ip, r2, lsl #5 for (i=0; i < 4; i++) { b60e: 3201 adds r2, #1 p->CH[i].CTRL = 0; // stop timer b610: 8199 strh r1, [r3, #12] for (i=0; i < 4; i++) { b612: 2a04 cmp r2, #4 p->CH[i].CNTR = 0; b614: 8159 strh r1, [r3, #10] p->CH[i].SCTRL = TMR_SCTRL_OEN | TMR_SCTRL_OPS | TMR_SCTRL_VAL | TMR_SCTRL_FORCE; b616: f8a3 e00e strh.w lr, [r3, #14] p->CH[i].CSCTRL = TMR_CSCTRL_CL1(1) | TMR_CSCTRL_ALT_LOAD; b61a: 829e strh r6, [r3, #20] p->CH[i].LOAD = 24000; // low time (65537 - x) - b61c: 80dd strh r5, [r3, #6] p->CH[i].COMP1 = 0; // high time (0 = always low, max = LOAD-1) b61e: f820 100c strh.w r1, [r0, ip] p->CH[i].CMPLD1 = 0; b622: 8219 strh r1, [r3, #16] p->CH[i].CTRL = TMR_CTRL_CM(1) | TMR_CTRL_PCS(8) | b624: 819c strh r4, [r3, #12] for (i=0; i < 4; i++) { b626: d1ee bne.n b606 b628: 2200 movs r2, #0 p->CH[i].CTRL = 0; // stop timer b62a: 481e ldr r0, [pc, #120] ; (b6a4 ) p->CH[i].SCTRL = TMR_SCTRL_OEN | TMR_SCTRL_OPS | TMR_SCTRL_VAL | TMR_SCTRL_FORCE; b62c: f04f 0e0f mov.w lr, #15 p->CH[i].CSCTRL = TMR_CSCTRL_CL1(1) | TMR_CSCTRL_ALT_LOAD; b630: f241 0601 movw r6, #4097 ; 0x1001 p->CH[i].CTRL = 0; // stop timer b634: 4611 mov r1, r2 p->CH[i].LOAD = 24000; // low time (65537 - x) - b636: f645 55c0 movw r5, #24000 ; 0x5dc0 p->CH[i].CTRL = TMR_CTRL_CM(1) | TMR_CTRL_PCS(8) | b63a: f243 0426 movw r4, #12326 ; 0x3026 p->CH[i].CTRL = 0; // stop timer b63e: eb00 1342 add.w r3, r0, r2, lsl #5 b642: ea4f 1c42 mov.w ip, r2, lsl #5 for (i=0; i < 4; i++) { b646: 3201 adds r2, #1 p->CH[i].CTRL = 0; // stop timer b648: 8199 strh r1, [r3, #12] for (i=0; i < 4; i++) { b64a: 2a04 cmp r2, #4 p->CH[i].CNTR = 0; b64c: 8159 strh r1, [r3, #10] p->CH[i].SCTRL = TMR_SCTRL_OEN | TMR_SCTRL_OPS | TMR_SCTRL_VAL | TMR_SCTRL_FORCE; b64e: f8a3 e00e strh.w lr, [r3, #14] p->CH[i].CSCTRL = TMR_CSCTRL_CL1(1) | TMR_CSCTRL_ALT_LOAD; b652: 829e strh r6, [r3, #20] p->CH[i].LOAD = 24000; // low time (65537 - x) - b654: 80dd strh r5, [r3, #6] p->CH[i].COMP1 = 0; // high time (0 = always low, max = LOAD-1) b656: f820 100c strh.w r1, [r0, ip] p->CH[i].CMPLD1 = 0; b65a: 8219 strh r1, [r3, #16] p->CH[i].CTRL = TMR_CTRL_CM(1) | TMR_CTRL_PCS(8) | b65c: 819c strh r4, [r3, #12] for (i=0; i < 4; i++) { b65e: d1ee bne.n b63e b660: 2200 movs r2, #0 p->CH[i].CTRL = 0; // stop timer b662: 4811 ldr r0, [pc, #68] ; (b6a8 ) p->CH[i].SCTRL = TMR_SCTRL_OEN | TMR_SCTRL_OPS | TMR_SCTRL_VAL | TMR_SCTRL_FORCE; b664: 260f movs r6, #15 p->CH[i].CSCTRL = TMR_CSCTRL_CL1(1) | TMR_CSCTRL_ALT_LOAD; b666: f241 0501 movw r5, #4097 ; 0x1001 p->CH[i].CTRL = 0; // stop timer b66a: 4611 mov r1, r2 p->CH[i].LOAD = 24000; // low time (65537 - x) - b66c: f645 54c0 movw r4, #24000 ; 0x5dc0 p->CH[i].CTRL = TMR_CTRL_CM(1) | TMR_CTRL_PCS(8) | b670: f243 0e26 movw lr, #12326 ; 0x3026 p->CH[i].CTRL = 0; // stop timer b674: eb00 1342 add.w r3, r0, r2, lsl #5 b678: ea4f 1c42 mov.w ip, r2, lsl #5 for (i=0; i < 4; i++) { b67c: 3201 adds r2, #1 p->CH[i].CTRL = 0; // stop timer b67e: 8199 strh r1, [r3, #12] for (i=0; i < 4; i++) { b680: 2a04 cmp r2, #4 p->CH[i].CNTR = 0; b682: 8159 strh r1, [r3, #10] p->CH[i].SCTRL = TMR_SCTRL_OEN | TMR_SCTRL_OPS | TMR_SCTRL_VAL | TMR_SCTRL_FORCE; b684: 81de strh r6, [r3, #14] p->CH[i].CSCTRL = TMR_CSCTRL_CL1(1) | TMR_CSCTRL_ALT_LOAD; b686: 829d strh r5, [r3, #20] p->CH[i].LOAD = 24000; // low time (65537 - x) - b688: 80dc strh r4, [r3, #6] p->CH[i].COMP1 = 0; // high time (0 = always low, max = LOAD-1) b68a: f820 100c strh.w r1, [r0, ip] p->CH[i].CMPLD1 = 0; b68e: 8219 strh r1, [r3, #16] p->CH[i].CTRL = TMR_CTRL_CM(1) | TMR_CTRL_PCS(8) | b690: f8a3 e00c strh.w lr, [r3, #12] for (i=0; i < 4; i++) { b694: d1ee bne.n b674 quadtimer_init(&IMXRT_TMR1); quadtimer_init(&IMXRT_TMR2); quadtimer_init(&IMXRT_TMR3); } b696: bd70 pop {r4, r5, r6, pc} b698: 400fc000 .word 0x400fc000 b69c: fc030000 .word 0xfc030000 b6a0: 403dc000 .word 0x403dc000 b6a4: 401e0000 .word 0x401e0000 b6a8: 401e4000 .word 0x401e4000 0000b6ac : uint32_t hi1 = SNVS_HPRTCMR; b6ac: 4a07 ldr r2, [pc, #28] ; (b6cc ) b6ae: 6a50 ldr r0, [r2, #36] ; 0x24 uint32_t lo1 = SNVS_HPRTCLR; b6b0: 6a93 ldr r3, [r2, #40] ; 0x28 uint32_t hi2 = SNVS_HPRTCMR; b6b2: 4619 mov r1, r3 b6b4: 4684 mov ip, r0 b6b6: 6a50 ldr r0, [r2, #36] ; 0x24 uint32_t lo2 = SNVS_HPRTCLR; b6b8: 6a93 ldr r3, [r2, #40] ; 0x28 if (lo1 == lo2 && hi1 == hi2) { b6ba: 4299 cmp r1, r3 b6bc: d1f9 bne.n b6b2 b6be: 4584 cmp ip, r0 b6c0: d1f7 bne.n b6b2 return (hi2 << 17) | (lo2 >> 15); b6c2: 0bdb lsrs r3, r3, #15 } b6c4: ea43 4040 orr.w r0, r3, r0, lsl #17 b6c8: 4770 bx lr b6ca: bf00 nop b6cc: 400d4000 .word 0x400d4000 0000b6d0 : __disable_irq(); b6d0: b672 cpsid i asm volatile("mrs %0, ipsr\n" : "=r" (ipsr) :: "memory"); b6d2: f3ef 8305 mrs r3, IPSR info->ipsr = ipsr; b6d6: 4c52 ldr r4, [pc, #328] ; (b820 ) b6d8: f8c4 3084 str.w r3, [r4, #132] ; 0x84 asm volatile("tst lr, #4\nite eq\nmrseq %0, msp\nmrsne %0, psp\n" : "=r" (stack) :: "memory"); b6dc: f01e 0f04 tst.w lr, #4 b6e0: bf0c ite eq b6e2: f3ef 8208 mrseq r2, MSP b6e6: f3ef 8209 mrsne r2, PSP info->cfsr = SCB_CFSR; b6ea: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 p = (uint32_t *)info; b6ee: 4e4d ldr r6, [pc, #308] ; (b824 ) while (p < end) { b6f0: 4d4d ldr r5, [pc, #308] ; (b828 ) info->cfsr = SCB_CFSR; b6f2: f8d3 0d28 ldr.w r0, [r3, #3368] ; 0xd28 info->hfsr = SCB_HFSR; b6f6: f8d3 1d2c ldr.w r1, [r3, #3372] ; 0xd2c b6fa: e9c4 0122 strd r0, r1, [r4, #136] ; 0x88 info->mmfar = SCB_MMFAR; b6fe: f8d3 1d34 ldr.w r1, [r3, #3380] ; 0xd34 info->bfar = SCB_BFAR; b702: f8d3 3d38 ldr.w r3, [r3, #3384] ; 0xd38 b706: e9c4 1324 strd r1, r3, [r4, #144] ; 0x90 info->ret = stack[6]; b70a: 6993 ldr r3, [r2, #24] b70c: f8c4 3098 str.w r3, [r4, #152] ; 0x98 info->xpsr = stack[7]; b710: 69d3 ldr r3, [r2, #28] b712: f8c4 309c str.w r3, [r4, #156] ; 0x9c info->temp = tempmonGetTemp(); b716: f000 f8bf bl b898 b71a: ed84 0a28 vstr s0, [r4, #160] ; 0xa0 info->time = rtc_get(); b71e: f7ff ffc5 bl b6ac info->len = sizeof(*info) / 4; b722: 210b movs r1, #11 crc = 0xFFFFFFFF; b724: f04f 32ff mov.w r2, #4294967295 info->time = rtc_get(); b728: f8c4 00a4 str.w r0, [r4, #164] ; 0xa4 info->len = sizeof(*info) / 4; b72c: 460b mov r3, r1 b72e: f8c4 1080 str.w r1, [r4, #128] ; 0x80 for (i=0; i < 32; i++) crc = (crc >> 1) ^ (crc & 1)*0xEDB88320; b732: 493e ldr r1, [pc, #248] ; (b82c ) crc ^= *p++; b734: 1d30 adds r0, r6, #4 b736: 405a eors r2, r3 b738: 2420 movs r4, #32 for (i=0; i < 32; i++) crc = (crc >> 1) ^ (crc & 1)*0xEDB88320; b73a: f002 0301 and.w r3, r2, #1 b73e: 3c01 subs r4, #1 b740: fb01 f303 mul.w r3, r1, r3 b744: ea83 0252 eor.w r2, r3, r2, lsr #1 b748: d1f7 bne.n b73a while (p < end) { b74a: 42a8 cmp r0, r5 b74c: d002 beq.n b754 crc ^= *p++; b74e: 6873 ldr r3, [r6, #4] b750: 4606 mov r6, r0 b752: e7ef b.n b734 info->crc = crc; b754: 4b32 ldr r3, [pc, #200] ; (b820 ) b756: f8c3 20a8 str.w r2, [r3, #168] ; 0xa8 static inline void arm_dcache_flush_delete(void *addr, uint32_t size) { uint32_t location = (uint32_t)addr & 0xFFFFFFE0; uint32_t end_addr = (uint32_t)addr + size; asm volatile("": : :"memory"); asm("dsb"); b75a: f3bf 8f4f dsb sy do { SCB_CACHE_DCCIMVAC = location; b75e: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 b762: 4930 ldr r1, [pc, #192] ; (b824 ) b764: 4a32 ldr r2, [pc, #200] ; (b830 ) b766: f8c3 1f70 str.w r1, [r3, #3952] ; 0xf70 b76a: f8c3 2f70 str.w r2, [r3, #3952] ; 0xf70 location += 32; } while (location < end_addr); asm("dsb"); b76e: f3bf 8f4f dsb sy asm("isb"); b772: f3bf 8f6f isb sy CCM_CCGR1 |= CCM_CCGR1_PIT(CCM_CCGR_ON); b776: 4a2f ldr r2, [pc, #188] ; (b834 ) PIT_MCR = PIT_MCR_MDIS; b778: 2502 movs r5, #2 b77a: 482f ldr r0, [pc, #188] ; (b838 ) CCM_CCGR1 |= CCM_CCGR1_PIT(CCM_CCGR_ON); b77c: 6ed3 ldr r3, [r2, #108] ; 0x6c if (F_CPU_ACTUAL > 198000000) set_arm_clock(198000000); b77e: 492f ldr r1, [pc, #188] ; (b83c ) CCM_CCGR1 |= CCM_CCGR1_PIT(CCM_CCGR_ON); b780: f443 5340 orr.w r3, r3, #12288 ; 0x3000 b784: 66d3 str r3, [r2, #108] ; 0x6c PIT_MCR = PIT_MCR_MDIS; b786: 6005 str r5, [r0, #0] CCM_CSCMR1 = (CCM_CSCMR1 & ~CCM_CSCMR1_PERCLK_PODF(0x3F)) | CCM_CSCMR1_PERCLK_CLK_SEL; b788: 69d3 ldr r3, [r2, #28] if (F_CPU_ACTUAL > 198000000) set_arm_clock(198000000); b78a: 482d ldr r0, [pc, #180] ; (b840 ) CCM_CSCMR1 = (CCM_CSCMR1 & ~CCM_CSCMR1_PERCLK_PODF(0x3F)) | CCM_CSCMR1_PERCLK_CLK_SEL; b78c: f023 037f bic.w r3, r3, #127 ; 0x7f b790: f043 0340 orr.w r3, r3, #64 ; 0x40 b794: 61d3 str r3, [r2, #28] if (F_CPU_ACTUAL > 198000000) set_arm_clock(198000000); b796: 680b ldr r3, [r1, #0] b798: 4283 cmp r3, r0 b79a: d83d bhi.n b818 PIT_MCR = 0; b79c: 4d26 ldr r5, [pc, #152] ; (b838 ) b79e: 2100 movs r1, #0 NVIC_ICER0 = 0xFFFFFFFF; b7a0: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 b7a4: f04f 32ff mov.w r2, #4294967295 PIT_MCR = 0; b7a8: 6029 str r1, [r5, #0] PIT_TCTRL0 = PIT_TCTRL_TEN; b7aa: 2601 movs r6, #1 PIT_TCTRL0 = 0; b7ac: f8c5 1108 str.w r1, [r5, #264] ; 0x108 PIT_LDVAL0 = 2400000; // 2400000 = 100ms b7b0: 4924 ldr r1, [pc, #144] ; (b844 ) b7b2: f8c5 1100 str.w r1, [r5, #256] ; 0x100 PIT_TCTRL0 = PIT_TCTRL_TEN; b7b6: f8c5 6108 str.w r6, [r5, #264] ; 0x108 NVIC_ICER0 = 0xFFFFFFFF; b7ba: f8c3 2180 str.w r2, [r3, #384] ; 0x180 NVIC_ICER1 = 0xFFFFFFFF; b7be: f8c3 2184 str.w r2, [r3, #388] ; 0x184 NVIC_ICER2 = 0xFFFFFFFF; b7c2: f8c3 2188 str.w r2, [r3, #392] ; 0x188 NVIC_ICER3 = 0xFFFFFFFF; b7c6: f8c3 218c str.w r2, [r3, #396] ; 0x18c NVIC_ICER4 = 0xFFFFFFFF; b7ca: f8c3 2190 str.w r2, [r3, #400] ; 0x190 count = 0; b7ce: e001 b.n b7d4 usb_isr(); b7d0: f000 f9b8 bl bb44 if (PIT_TFLG0) { b7d4: f8d5 310c ldr.w r3, [r5, #268] ; 0x10c b7d8: 2b00 cmp r3, #0 b7da: d0f9 beq.n b7d0 if (++count >= 80) break; // reboot after 8 seconds b7dc: 3401 adds r4, #1 PIT_TFLG0 = 1; b7de: f8c5 610c str.w r6, [r5, #268] ; 0x10c if (++count >= 80) break; // reboot after 8 seconds b7e2: 2c4f cmp r4, #79 ; 0x4f b7e4: d9f4 bls.n b7d0 USBPHY1_CTRL_SET = USBPHY_CTRL_SFTRST; b7e6: 4b18 ldr r3, [pc, #96] ; (b848 ) USB1_USBCMD = USB_USBCMD_RST; b7e8: 2002 movs r0, #2 b7ea: 4918 ldr r1, [pc, #96] ; (b84c ) USBPHY1_CTRL_SET = USBPHY_CTRL_SFTRST; b7ec: f04f 4200 mov.w r2, #2147483648 ; 0x80000000 USB1_USBCMD = USB_USBCMD_RST; b7f0: f8c1 0140 str.w r0, [r1, #320] ; 0x140 USBPHY1_CTRL_SET = USBPHY_CTRL_SFTRST; b7f4: 635a str r2, [r3, #52] ; 0x34 while (PIT_TFLG0 == 0) /* wait 0.1 second for PC to know USB unplugged */ b7f6: f8d5 310c ldr.w r3, [r5, #268] ; 0x10c b7fa: b93b cbnz r3, b80c SRC_GPR5 = 0x0BAD00F1; b7fc: 4814 ldr r0, [pc, #80] ; (b850 ) b7fe: 4915 ldr r1, [pc, #84] ; (b854 ) while (PIT_TFLG0 == 0) /* wait 0.1 second for PC to know USB unplugged */ b800: 4a0d ldr r2, [pc, #52] ; (b838 ) SRC_GPR5 = 0x0BAD00F1; b802: 6301 str r1, [r0, #48] ; 0x30 while (PIT_TFLG0 == 0) /* wait 0.1 second for PC to know USB unplugged */ b804: f8d2 310c ldr.w r3, [r2, #268] ; 0x10c b808: 2b00 cmp r3, #0 b80a: d0fa beq.n b802 SCB_AIRCR = 0x05FA0004; b80c: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 b810: 4a11 ldr r2, [pc, #68] ; (b858 ) b812: f8c3 2d0c str.w r2, [r3, #3340] ; 0xd0c while (1) ; b816: e7fe b.n b816 if (F_CPU_ACTUAL > 198000000) set_arm_clock(198000000); b818: f7ff fb38 bl ae8c b81c: e7be b.n b79c b81e: bf00 nop b820: 2027ff00 .word 0x2027ff00 b824: 2027ff80 .word 0x2027ff80 b828: 2027ffa8 .word 0x2027ffa8 b82c: edb88320 .word 0xedb88320 b830: 2027ffa0 .word 0x2027ffa0 b834: 400fc000 .word 0x400fc000 b838: 40084000 .word 0x40084000 b83c: 20001044 .word 0x20001044 b840: 0bcd3d80 .word 0x0bcd3d80 b844: 00249f00 .word 0x00249f00 b848: 400d9000 .word 0x400d9000 b84c: 402e0000 .word 0x402e0000 b850: 400f8000 .word 0x400f8000 b854: 0bad00f1 .word 0x0bad00f1 b858: 05fa0004 .word 0x05fa0004 0000b85c <_sbrk>: char *__brkval = (char *)&_heap_start; __attribute__((weak)) void * _sbrk(int incr) { char *prev = __brkval; b85c: 490a ldr r1, [pc, #40] ; (b888 <_sbrk+0x2c>) b85e: 680a ldr r2, [r1, #0] if (incr != 0) { b860: b138 cbz r0, b872 <_sbrk+0x16> { b862: b508 push {r3, lr} if (prev + incr > (char *)&_heap_end) { b864: 1813 adds r3, r2, r0 b866: 4809 ldr r0, [pc, #36] ; (b88c <_sbrk+0x30>) b868: 4283 cmp r3, r0 b86a: d804 bhi.n b876 <_sbrk+0x1a> return (void *)-1; } __brkval = prev + incr; } return prev; } b86c: 4610 mov r0, r2 __brkval = prev + incr; b86e: 600b str r3, [r1, #0] } b870: bd08 pop {r3, pc} b872: 4610 mov r0, r2 b874: 4770 bx lr errno = ENOMEM; b876: f002 fa05 bl dc84 <__errno> b87a: 230c movs r3, #12 return (void *)-1; b87c: f04f 32ff mov.w r2, #4294967295 errno = ENOMEM; b880: 6003 str r3, [r0, #0] } b882: 4610 mov r0, r2 b884: bd08 pop {r3, pc} b886: bf00 nop b888: 200010b0 .word 0x200010b0 b88c: 20280000 .word 0x20280000 0000b890 <__cxa_pure_virtual>: } __attribute__((weak)) void __cxa_pure_virtual() { while (1) asm ("WFI"); b890: bf30 wfi b892: e7fd b.n b890 <__cxa_pure_virtual> 0000b894 : unused_interrupt_vector(); b894: f7ff bf1c b.w b6d0 0000b898 : float tempmonGetTemp(void) { uint32_t nmeas; float tmeas; while (!(TEMPMON_TEMPSENSE0 & 0x4U)) b898: 4a12 ldr r2, [pc, #72] ; (b8e4 ) b89a: f8d2 3080 ldr.w r3, [r2, #128] ; 0x80 b89e: 075b lsls r3, r3, #29 b8a0: d5fb bpl.n b89a { } /* ready to read temperature code value */ nmeas = (TEMPMON_TEMPSENSE0 & 0xFFF00U) >> 8U; b8a2: f8d2 3080 ldr.w r3, [r2, #128] ; 0x80 /* Calculate temperature */ tmeas = s_hotTemp - (((float)nmeas - (float)s_hotCount) * s_hot_ROOM / s_roomC_hotC); b8a6: 4810 ldr r0, [pc, #64] ; (b8e8 ) nmeas = (TEMPMON_TEMPSENSE0 & 0xFFF00U) >> 8U; b8a8: f3c3 230b ubfx r3, r3, #8, #12 tmeas = s_hotTemp - (((float)nmeas - (float)s_hotCount) * s_hot_ROOM / s_roomC_hotC); b8ac: 490f ldr r1, [pc, #60] ; (b8ec ) b8ae: ed90 7a00 vldr s14, [r0] nmeas = (TEMPMON_TEMPSENSE0 & 0xFFF00U) >> 8U; b8b2: ee07 3a90 vmov s15, r3 tmeas = s_hotTemp - (((float)nmeas - (float)s_hotCount) * s_hot_ROOM / s_roomC_hotC); b8b6: ed91 6a00 vldr s12, [r1] b8ba: eeb8 7a47 vcvt.f32.u32 s14, s14 b8be: 4a0c ldr r2, [pc, #48] ; (b8f0 ) b8c0: eef8 7ae7 vcvt.f32.s32 s15, s15 b8c4: 4b0b ldr r3, [pc, #44] ; (b8f4 ) b8c6: edd2 6a00 vldr s13, [r2] b8ca: ee77 7ac7 vsub.f32 s15, s15, s14 b8ce: ed93 7a00 vldr s14, [r3] b8d2: eeb8 7a47 vcvt.f32.u32 s14, s14 b8d6: ee67 7a86 vmul.f32 s15, s15, s12 b8da: ee87 0aa6 vdiv.f32 s0, s15, s13 return tmeas; } b8de: ee37 0a40 vsub.f32 s0, s14, s0 b8e2: 4770 bx lr b8e4: 400d8100 .word 0x400d8100 b8e8: 20002d74 .word 0x20002d74 b8ec: 20002d7c .word 0x20002d7c b8f0: 20002d80 .word 0x20002d80 b8f4: 20002d78 .word 0x20002d78 0000b8f8 : endpoint0_notify_mask = (notify ? (1 << 0) : 0); while (USB1_ENDPTPRIME) ; } static void endpoint0_receive(void *data, uint32_t len, int notify) { b8f8: b430 push {r4, r5} //printf("rx %lu\n", len); if (len > 0) { b8fa: 2900 cmp r1, #0 b8fc: d131 bne.n b962 b8fe: 4c2b ldr r4, [pc, #172] ; (b9ac ) endpoint_queue_head[0].next = (uint32_t)&endpoint0_transfer_data; endpoint_queue_head[0].status = 0; USB1_ENDPTPRIME |= (1<<0); while (USB1_ENDPTPRIME) ; } endpoint0_transfer_ack.next = 1; b900: 4b2b ldr r3, [pc, #172] ; (b9b0 ) b902: 2101 movs r1, #1 b904: 6019 str r1, [r3, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); b906: b1da cbz r2, b940 endpoint0_transfer_ack.pointer0 = 0; endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; endpoint_queue_head[1].status = 0; USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); b908: 492a ldr r1, [pc, #168] ; (b9b4 ) endpoint0_transfer_ack.pointer0 = 0; b90a: 2200 movs r2, #0 endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); b90c: f248 0580 movw r5, #32896 ; 0x8080 USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); b910: f04f 1001 mov.w r0, #65537 ; 0x10001 endpoint0_transfer_ack.pointer0 = 0; b914: 609a str r2, [r3, #8] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); b916: 605d str r5, [r3, #4] endpoint_queue_head[1].status = 0; b918: e9c4 3212 strd r3, r2, [r4, #72] ; 0x48 USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); b91c: f8c1 01bc str.w r0, [r1, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); endpoint0_notify_mask = (notify ? (1 << 16) : 0); b920: f44f 3280 mov.w r2, #65536 ; 0x10000 USB1_ENDPTPRIME |= (1<<16); b924: f8d1 31b0 ldr.w r3, [r1, #432] ; 0x1b0 b928: 4313 orrs r3, r2 b92a: f8c1 31b0 str.w r3, [r1, #432] ; 0x1b0 endpoint0_notify_mask = (notify ? (1 << 16) : 0); b92e: 4b22 ldr r3, [pc, #136] ; (b9b8 ) while (USB1_ENDPTPRIME) ; b930: 4920 ldr r1, [pc, #128] ; (b9b4 ) endpoint0_notify_mask = (notify ? (1 << 16) : 0); b932: 601a str r2, [r3, #0] while (USB1_ENDPTPRIME) ; b934: f8d1 31b0 ldr.w r3, [r1, #432] ; 0x1b0 b938: 2b00 cmp r3, #0 b93a: d1fb bne.n b934 } b93c: bc30 pop {r4, r5} b93e: 4770 bx lr USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); b940: 491c ldr r1, [pc, #112] ; (b9b4 ) endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); b942: 2580 movs r5, #128 ; 0x80 USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); b944: f04f 1001 mov.w r0, #65537 ; 0x10001 endpoint0_transfer_ack.pointer0 = 0; b948: 609a str r2, [r3, #8] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); b94a: 605d str r5, [r3, #4] endpoint_queue_head[1].status = 0; b94c: e9c4 3212 strd r3, r2, [r4, #72] ; 0x48 USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); b950: f8c1 01bc str.w r0, [r1, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); b954: f8d1 31b0 ldr.w r3, [r1, #432] ; 0x1b0 b958: f443 3380 orr.w r3, r3, #65536 ; 0x10000 b95c: f8c1 31b0 str.w r3, [r1, #432] ; 0x1b0 endpoint0_notify_mask = (notify ? (1 << 16) : 0); b960: e7e5 b.n b92e endpoint0_transfer_data.status = (len << 16) | (1<<7); b962: 0409 lsls r1, r1, #16 endpoint0_transfer_data.next = 1; b964: 4b15 ldr r3, [pc, #84] ; (b9bc ) b966: 2401 movs r4, #1 endpoint_queue_head[0].status = 0; b968: 2500 movs r5, #0 endpoint0_transfer_data.status = (len << 16) | (1<<7); b96a: f041 0180 orr.w r1, r1, #128 ; 0x80 endpoint0_transfer_data.pointer0 = addr; // format: table 55-60, pg 3159 b96e: 6098 str r0, [r3, #8] endpoint0_transfer_data.next = 1; b970: 601c str r4, [r3, #0] endpoint0_transfer_data.status = (len << 16) | (1<<7); b972: 6059 str r1, [r3, #4] endpoint0_transfer_data.pointer1 = addr + 4096; b974: f500 5180 add.w r1, r0, #4096 ; 0x1000 endpoint_queue_head[0].next = (uint32_t)&endpoint0_transfer_data; b978: 4c0c ldr r4, [pc, #48] ; (b9ac ) endpoint0_transfer_data.pointer1 = addr + 4096; b97a: 60d9 str r1, [r3, #12] endpoint0_transfer_data.pointer2 = addr + 8192; b97c: f500 5100 add.w r1, r0, #8192 ; 0x2000 endpoint_queue_head[0].status = 0; b980: 60e5 str r5, [r4, #12] endpoint0_transfer_data.pointer2 = addr + 8192; b982: 6119 str r1, [r3, #16] endpoint0_transfer_data.pointer3 = addr + 12288; b984: f500 5140 add.w r1, r0, #12288 ; 0x3000 endpoint0_transfer_data.pointer4 = addr + 16384; b988: f500 4080 add.w r0, r0, #16384 ; 0x4000 endpoint_queue_head[0].next = (uint32_t)&endpoint0_transfer_data; b98c: 60a3 str r3, [r4, #8] endpoint0_transfer_data.pointer3 = addr + 12288; b98e: 6159 str r1, [r3, #20] USB1_ENDPTPRIME |= (1<<0); b990: 4908 ldr r1, [pc, #32] ; (b9b4 ) endpoint0_transfer_data.pointer4 = addr + 16384; b992: 6198 str r0, [r3, #24] USB1_ENDPTPRIME |= (1<<0); b994: f8d1 31b0 ldr.w r3, [r1, #432] ; 0x1b0 b998: f043 0301 orr.w r3, r3, #1 b99c: f8c1 31b0 str.w r3, [r1, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; b9a0: f8d1 31b0 ldr.w r3, [r1, #432] ; 0x1b0 b9a4: 2b00 cmp r3, #0 b9a6: d1fb bne.n b9a0 b9a8: e7aa b.n b900 b9aa: bf00 nop b9ac: 20000000 .word 0x20000000 b9b0: 20001b20 .word 0x20001b20 b9b4: 402e0000 .word 0x402e0000 b9b8: 2000295c .word 0x2000295c b9bc: 20001b40 .word 0x20001b40 0000b9c0 : { // when we stop at 6, why is the last transfer missing from the USB output? //if (transfer_log_count >= 6) return; //uint32_t ret = (*(const uint8_t *)transfer->pointer0) << 8; if (endpoint->callback_function) { b9c0: 6b83 ldr r3, [r0, #56] ; 0x38 { b9c2: b4f0 push {r4, r5, r6, r7} if (endpoint->callback_function) { b9c4: b11b cbz r3, b9ce transfer->status |= (1<<15); b9c6: 6853 ldr r3, [r2, #4] b9c8: f443 4300 orr.w r3, r3, #32768 ; 0x8000 b9cc: 6053 str r3, [r2, #4] } __disable_irq(); b9ce: b672 cpsid i //digitalWriteFast(1, HIGH); // Executing A Transfer Descriptor, page 2468 (RT1060 manual, Rev 1, 12/2018) transfer_t *last = endpoint->last_transfer; b9d0: 6b44 ldr r4, [r0, #52] ; 0x34 if (last) { b9d2: b33c cbz r4, ba24 last->next = (uint32_t)transfer; if (USB1_ENDPTPRIME & epmask) goto end; b9d4: 4b1a ldr r3, [pc, #104] ; (ba40 ) last->next = (uint32_t)transfer; b9d6: 6022 str r2, [r4, #0] if (USB1_ENDPTPRIME & epmask) goto end; b9d8: f8d3 41b0 ldr.w r4, [r3, #432] ; 0x1b0 b9dc: 420c tst r4, r1 b9de: d11d bne.n ba1c //digitalWriteFast(2, HIGH); //ret |= 0x01; uint32_t status, cyccnt=ARM_DWT_CYCCNT; b9e0: 4e18 ldr r6, [pc, #96] ; (ba44 ) b9e2: 6877 ldr r7, [r6, #4] b9e4: e004 b.n b9f0 do { USB1_USBCMD |= USB_USBCMD_ATDTW; status = USB1_ENDPTSTATUS; } while (!(USB1_USBCMD & USB_USBCMD_ATDTW) && (ARM_DWT_CYCCNT - cyccnt < 2400)); b9e6: 6874 ldr r4, [r6, #4] b9e8: 1be4 subs r4, r4, r7 b9ea: f5b4 6f16 cmp.w r4, #2400 ; 0x960 b9ee: d20b bcs.n ba08 USB1_USBCMD |= USB_USBCMD_ATDTW; b9f0: f8d3 4140 ldr.w r4, [r3, #320] ; 0x140 b9f4: f444 4480 orr.w r4, r4, #16384 ; 0x4000 b9f8: f8c3 4140 str.w r4, [r3, #320] ; 0x140 status = USB1_ENDPTSTATUS; b9fc: f8d3 51b8 ldr.w r5, [r3, #440] ; 0x1b8 } while (!(USB1_USBCMD & USB_USBCMD_ATDTW) && (ARM_DWT_CYCCNT - cyccnt < 2400)); ba00: f8d3 4140 ldr.w r4, [r3, #320] ; 0x140 ba04: 0464 lsls r4, r4, #17 ba06: d5ee bpl.n b9e6 //USB1_USBCMD &= ~USB_USBCMD_ATDTW; if (status & epmask) goto end; ba08: 400d ands r5, r1 ba0a: d107 bne.n ba1c //ret |= 0x02; endpoint->next = (uint32_t)transfer; endpoint->status = 0; USB1_ENDPTPRIME |= epmask; ba0c: 4c0c ldr r4, [pc, #48] ; (ba40 ) endpoint->status = 0; ba0e: e9c0 2502 strd r2, r5, [r0, #8] USB1_ENDPTPRIME |= epmask; ba12: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 ba16: 430b orrs r3, r1 ba18: f8c4 31b0 str.w r3, [r4, #432] ; 0x1b0 endpoint->next = (uint32_t)transfer; endpoint->status = 0; USB1_ENDPTPRIME |= epmask; endpoint->first_transfer = transfer; end: endpoint->last_transfer = transfer; ba1c: 6342 str r2, [r0, #52] ; 0x34 __enable_irq(); ba1e: b662 cpsie i //digitalWriteFast(2, LOW); //digitalWriteFast(1, LOW); //if (transfer_log_head > LOG_SIZE) transfer_log_head = 0; //transfer_log[transfer_log_head++] = ret; //transfer_log_count++; } ba20: bcf0 pop {r4, r5, r6, r7} ba22: 4770 bx lr USB1_ENDPTPRIME |= epmask; ba24: 4d06 ldr r5, [pc, #24] ; (ba40 ) endpoint->status = 0; ba26: e9c0 2402 strd r2, r4, [r0, #8] USB1_ENDPTPRIME |= epmask; ba2a: f8d5 31b0 ldr.w r3, [r5, #432] ; 0x1b0 ba2e: 430b orrs r3, r1 ba30: f8c5 31b0 str.w r3, [r5, #432] ; 0x1b0 endpoint->first_transfer = transfer; ba34: 6302 str r2, [r0, #48] ; 0x30 endpoint->last_transfer = transfer; ba36: 6342 str r2, [r0, #52] ; 0x34 __enable_irq(); ba38: b662 cpsie i } ba3a: bcf0 pop {r4, r5, r6, r7} ba3c: 4770 bx lr ba3e: bf00 nop ba40: 402e0000 .word 0x402e0000 ba44: e0001000 .word 0xe0001000 0000ba48 : void (*callback_function)(transfer_t *completed_transfer); uint32_t unused1; };*/ static void run_callbacks(endpoint_t *ep) { ba48: b570 push {r4, r5, r6, lr} //printf("run_callbacks\n"); transfer_t *first = ep->first_transfer; ba4a: 6b05 ldr r5, [r0, #48] ; 0x30 if (first == NULL) return; ba4c: b19d cbz r5, ba76 ba4e: 4606 mov r6, r0 ba50: 462a mov r2, r5 // count how many transfers are completed, then remove them from the endpoint's list uint32_t count = 0; ba52: 2400 movs r4, #0 ba54: e003 b.n ba5e //printf(" still active\n"); ep->first_transfer = t; break; } count++; t = (transfer_t *)t->next; ba56: 6812 ldr r2, [r2, #0] count++; ba58: 3401 adds r4, #1 if ((uint32_t)t == 1) { ba5a: 2a01 cmp r2, #1 ba5c: d00c beq.n ba78 if (t->status & (1<<7)) { ba5e: 6853 ldr r3, [r2, #4] ba60: f013 0380 ands.w r3, r3, #128 ; 0x80 ba64: d0f7 beq.n ba56 ep->first_transfer = t; ba66: 6332 str r2, [r6, #48] ; 0x30 ep->last_transfer = NULL; break; } } // do all the callbacks while (count) { ba68: b12c cbz r4, ba76 transfer_t *next = (transfer_t *)first->next; ba6a: 4628 mov r0, r5 ep->callback_function(first); ba6c: 6bb3 ldr r3, [r6, #56] ; 0x38 transfer_t *next = (transfer_t *)first->next; ba6e: 682d ldr r5, [r5, #0] ep->callback_function(first); ba70: 4798 blx r3 while (count) { ba72: 3c01 subs r4, #1 ba74: d1f9 bne.n ba6a first = next; count--; } } ba76: bd70 pop {r4, r5, r6, pc} ep->last_transfer = NULL; ba78: e9c6 330c strd r3, r3, [r6, #48] ; 0x30 break; ba7c: e7f4 b.n ba68 ba7e: bf00 nop 0000ba80 : static void endpoint0_transmit(const void *data, uint32_t len, int notify) ba80: b430 push {r4, r5} if (len > 0) { ba82: b9d9 cbnz r1, babc ba84: 4c1f ldr r4, [pc, #124] ; (bb04 ) endpoint0_transfer_ack.next = 1; ba86: 4b20 ldr r3, [pc, #128] ; (bb08 ) endpoint0_transfer_ack.pointer0 = 0; ba88: 2100 movs r1, #0 USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); ba8a: 4a20 ldr r2, [pc, #128] ; (bb0c ) endpoint0_transfer_ack.next = 1; ba8c: 2501 movs r5, #1 USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); ba8e: f04f 1001 mov.w r0, #65537 ; 0x10001 endpoint0_transfer_ack.pointer0 = 0; ba92: 6099 str r1, [r3, #8] endpoint0_transfer_ack.next = 1; ba94: 601d str r5, [r3, #0] endpoint_queue_head[0].status = 0; ba96: e9c4 3102 strd r3, r1, [r4, #8] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); ba9a: 2480 movs r4, #128 ; 0x80 ba9c: 605c str r4, [r3, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); ba9e: f8c2 01bc str.w r0, [r2, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<0); baa2: f8d2 31b0 ldr.w r3, [r2, #432] ; 0x1b0 endpoint0_notify_mask = (notify ? (1 << 0) : 0); baa6: 481a ldr r0, [pc, #104] ; (bb10 ) USB1_ENDPTPRIME |= (1<<0); baa8: 432b orrs r3, r5 baaa: f8c2 31b0 str.w r3, [r2, #432] ; 0x1b0 endpoint0_notify_mask = (notify ? (1 << 0) : 0); baae: 6001 str r1, [r0, #0] while (USB1_ENDPTPRIME) ; bab0: f8d2 31b0 ldr.w r3, [r2, #432] ; 0x1b0 bab4: 2b00 cmp r3, #0 bab6: d1fb bne.n bab0 } bab8: bc30 pop {r4, r5} baba: 4770 bx lr endpoint0_transfer_data.status = (len << 16) | (1<<7); babc: 0409 lsls r1, r1, #16 endpoint0_transfer_data.next = 1; babe: 4b15 ldr r3, [pc, #84] ; (bb14 ) endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_data; bac0: 4c10 ldr r4, [pc, #64] ; (bb04 ) endpoint0_transfer_data.next = 1; bac2: 2501 movs r5, #1 endpoint0_transfer_data.status = (len << 16) | (1<<7); bac4: f041 0180 orr.w r1, r1, #128 ; 0x80 endpoint0_transfer_data.pointer0 = addr; // format: table 55-60, pg 3159 bac8: 6098 str r0, [r3, #8] USB1_ENDPTPRIME |= (1<<16); baca: 4a10 ldr r2, [pc, #64] ; (bb0c ) endpoint0_transfer_data.status = (len << 16) | (1<<7); bacc: 6059 str r1, [r3, #4] endpoint0_transfer_data.pointer1 = addr + 4096; bace: f500 5180 add.w r1, r0, #4096 ; 0x1000 endpoint0_transfer_data.next = 1; bad2: 601d str r5, [r3, #0] endpoint0_transfer_data.pointer1 = addr + 4096; bad4: 60d9 str r1, [r3, #12] endpoint0_transfer_data.pointer2 = addr + 8192; bad6: f500 5100 add.w r1, r0, #8192 ; 0x2000 endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_data; bada: 64a3 str r3, [r4, #72] ; 0x48 endpoint0_transfer_data.pointer2 = addr + 8192; badc: 6119 str r1, [r3, #16] endpoint0_transfer_data.pointer3 = addr + 12288; bade: f500 5140 add.w r1, r0, #12288 ; 0x3000 endpoint0_transfer_data.pointer4 = addr + 16384; bae2: f500 4080 add.w r0, r0, #16384 ; 0x4000 endpoint0_transfer_data.pointer3 = addr + 12288; bae6: 6159 str r1, [r3, #20] endpoint_queue_head[1].status = 0; bae8: 2100 movs r1, #0 endpoint0_transfer_data.pointer4 = addr + 16384; baea: 6198 str r0, [r3, #24] endpoint_queue_head[1].status = 0; baec: 64e1 str r1, [r4, #76] ; 0x4c USB1_ENDPTPRIME |= (1<<16); baee: f8d2 31b0 ldr.w r3, [r2, #432] ; 0x1b0 baf2: f443 3380 orr.w r3, r3, #65536 ; 0x10000 baf6: f8c2 31b0 str.w r3, [r2, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; bafa: f8d2 31b0 ldr.w r3, [r2, #432] ; 0x1b0 bafe: 2b00 cmp r3, #0 bb00: d1fb bne.n bafa bb02: e7c0 b.n ba86 bb04: 20000000 .word 0x20000000 bb08: 20001b20 .word 0x20001b20 bb0c: 402e0000 .word 0x402e0000 bb10: 2000295c .word 0x2000295c bb14: 20001b40 .word 0x20001b40 0000bb18 : sof_usage &= ~(1 << interface); bb18: 4908 ldr r1, [pc, #32] ; (bb3c ) bb1a: 2201 movs r2, #1 bb1c: 780b ldrb r3, [r1, #0] bb1e: fa02 f000 lsl.w r0, r2, r0 bb22: ea23 0000 bic.w r0, r3, r0 bb26: 7008 strb r0, [r1, #0] if (sof_usage == 0) { bb28: b930 cbnz r0, bb38 USB1_USBINTR &= ~USB_USBINTR_SRE; bb2a: 4a05 ldr r2, [pc, #20] ; (bb40 ) bb2c: f8d2 3148 ldr.w r3, [r2, #328] ; 0x148 bb30: f023 0380 bic.w r3, r3, #128 ; 0x80 bb34: f8c2 3148 str.w r3, [r2, #328] ; 0x148 } bb38: 4770 bx lr bb3a: bf00 nop bb3c: 20002e05 .word 0x20002e05 bb40: 402e0000 .word 0x402e0000 0000bb44 : { bb44: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} uint32_t status = USB1_USBSTS; bb48: 4ca8 ldr r4, [pc, #672] ; (bdec ) { bb4a: b087 sub sp, #28 uint32_t status = USB1_USBSTS; bb4c: f8d4 6144 ldr.w r6, [r4, #324] ; 0x144 if (status & USB_USBSTS_UI) { bb50: 07f1 lsls r1, r6, #31 USB1_USBSTS = status; bb52: f8c4 6144 str.w r6, [r4, #324] ; 0x144 if (status & USB_USBSTS_UI) { bb56: f140 809c bpl.w bc92 uint32_t setupstatus = USB1_ENDPTSETUPSTAT; bb5a: f8d4 31ac ldr.w r3, [r4, #428] ; 0x1ac while (setupstatus) { bb5e: 2b00 cmp r3, #0 bb60: d063 beq.n bc2a bb62: 4da3 ldr r5, [pc, #652] ; (bdf0 ) bb64: f8df 9290 ldr.w r9, [pc, #656] ; bdf8 usb_configuration = setup.wValue; bb68: f8df b2ac ldr.w fp, [pc, #684] ; be18 *((volatile uint32_t *)&USB1_ENDPTCTRL0 + endpoint) |= USB_ENDPTCTRL_RXS; bb6c: f8df 82ac ldr.w r8, [pc, #684] ; be1c USB1_ENDPTSETUPSTAT = setupstatus; bb70: f8c4 31ac str.w r3, [r4, #428] ; 0x1ac s.word2 = endpoint_queue_head[0].setup1; bb74: e9d5 700a ldrd r7, r0, [r5, #40] ; 0x28 USB1_USBCMD |= USB_USBCMD_SUTW; bb78: f8d4 3140 ldr.w r3, [r4, #320] ; 0x140 bb7c: f443 5300 orr.w r3, r3, #8192 ; 0x2000 bb80: f8c4 3140 str.w r3, [r4, #320] ; 0x140 } while (!(USB1_USBCMD & USB_USBCMD_SUTW)); bb84: f8d4 3140 ldr.w r3, [r4, #320] ; 0x140 bb88: 049b lsls r3, r3, #18 bb8a: d5f5 bpl.n bb78 USB1_USBCMD &= ~USB_USBCMD_SUTW; bb8c: f8d4 3140 ldr.w r3, [r4, #320] ; 0x140 USB1_ENDPTFLUSH = (1<<16) | (1<<0); // page 3174 bb90: f04f 1201 mov.w r2, #65537 ; 0x10001 USB1_USBCMD &= ~USB_USBCMD_SUTW; bb94: f423 5300 bic.w r3, r3, #8192 ; 0x2000 bb98: f8c4 3140 str.w r3, [r4, #320] ; 0x140 USB1_ENDPTFLUSH = (1<<16) | (1<<0); // page 3174 bb9c: f8c4 21b4 str.w r2, [r4, #436] ; 0x1b4 while (USB1_ENDPTFLUSH & ((1<<16) | (1<<0))) ; bba0: f8d4 31b4 ldr.w r3, [r4, #436] ; 0x1b4 bba4: f013 1301 ands.w r3, r3, #65537 ; 0x10001 bba8: d1fa bne.n bba0 endpoint0_notify_mask = 0; bbaa: b2ba uxth r2, r7 bbac: f8c9 3000 str.w r3, [r9] switch (setup.wRequestAndType) { bbb0: f5b2 6f10 cmp.w r2, #2304 ; 0x900 setup.bothwords = setupdata; bbb4: e9cd 7004 strd r7, r0, [sp, #16] switch (setup.wRequestAndType) { bbb8: f000 81b2 beq.w bf20 bbbc: f200 80c3 bhi.w bd46 bbc0: f240 3102 movw r1, #770 ; 0x302 bbc4: 428a cmp r2, r1 bbc6: f000 8226 beq.w c016 bbca: f240 80dd bls.w bd88 bbce: f240 6181 movw r1, #1665 ; 0x681 bbd2: 428a cmp r2, r1 bbd4: f200 80ac bhi.w bd30 bbd8: f5b2 6fd0 cmp.w r2, #1664 ; 0x680 bbdc: f080 81d5 bcs.w bf8a bbe0: f5b2 6fa0 cmp.w r2, #1280 ; 0x500 bbe4: f040 809e bne.w bd24 endpoint0_transfer_ack.next = 1; bbe8: 4a82 ldr r2, [pc, #520] ; (bdf4 ) endpoint_queue_head[1].status = 0; bbea: 64eb str r3, [r5, #76] ; 0x4c endpoint0_transfer_ack.pointer0 = 0; bbec: 6093 str r3, [r2, #8] endpoint0_transfer_ack.next = 1; bbee: 2301 movs r3, #1 endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; bbf0: 64aa str r2, [r5, #72] ; 0x48 endpoint0_transfer_ack.next = 1; bbf2: 6013 str r3, [r2, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); bbf4: 2380 movs r3, #128 ; 0x80 bbf6: 6053 str r3, [r2, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); bbf8: f04f 1301 mov.w r3, #65537 ; 0x10001 bbfc: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); bc00: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 bc04: f443 3380 orr.w r3, r3, #65536 ; 0x10000 bc08: f8c4 31b0 str.w r3, [r4, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; bc0c: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 bc10: 2b00 cmp r3, #0 bc12: d1fb bne.n bc0c USB1_DEVICEADDR = USB_DEVICEADDR_USBADR(setup.wValue) | USB_DEVICEADDR_USBADRA; bc14: f8bd 3012 ldrh.w r3, [sp, #18] bc18: 065b lsls r3, r3, #25 bc1a: f043 7380 orr.w r3, r3, #16777216 ; 0x1000000 bc1e: f8c4 3154 str.w r3, [r4, #340] ; 0x154 setupstatus = USB1_ENDPTSETUPSTAT; // page 3175 bc22: f8d4 31ac ldr.w r3, [r4, #428] ; 0x1ac while (setupstatus) { bc26: 2b00 cmp r3, #0 bc28: d1a2 bne.n bb70 uint32_t completestatus = USB1_ENDPTCOMPLETE; bc2a: 4b70 ldr r3, [pc, #448] ; (bdec ) bc2c: f8d3 41bc ldr.w r4, [r3, #444] ; 0x1bc if (completestatus) { bc30: b37c cbz r4, bc92 if (completestatus & endpoint0_notify_mask) { bc32: 4a71 ldr r2, [pc, #452] ; (bdf8 ) USB1_ENDPTCOMPLETE = completestatus; bc34: f8c3 41bc str.w r4, [r3, #444] ; 0x1bc if (completestatus & endpoint0_notify_mask) { bc38: 6811 ldr r1, [r2, #0] bc3a: 420c tst r4, r1 bc3c: f040 8288 bne.w c150 completestatus &= endpointN_notify_mask; bc40: 4b6e ldr r3, [pc, #440] ; (bdfc ) bc42: 681b ldr r3, [r3, #0] if (completestatus) { bc44: 401c ands r4, r3 bc46: d024 beq.n bc92 while (tx) { bc48: ea5f 4814 movs.w r8, r4, lsr #16 bc4c: d010 beq.n bc70 bc4e: 4d68 ldr r5, [pc, #416] ; (bdf0 ) tx &= ~(1< while (tx) { bc6a: ea38 0807 bics.w r8, r8, r7 bc6e: d1f1 bne.n bc54 uint32_t rx = completestatus & 0xffff; bc70: b2a4 uxth r4, r4 while(rx) { bc72: b174 cbz r4, bc92 bc74: 4d5e ldr r5, [pc, #376] ; (bdf0 ) rx &= ~(1< while(rx) { bc8e: 43bc bics r4, r7 bc90: d1f3 bne.n bc7a if (status & USB_USBSTS_URI) { // page 3164 bc92: 0672 lsls r2, r6, #25 bc94: d516 bpl.n bcc4 USB1_ENDPTSETUPSTAT = USB1_ENDPTSETUPSTAT; // Clear all setup token semaphores bc96: 4b55 ldr r3, [pc, #340] ; (bdec ) bc98: f8d3 21ac ldr.w r2, [r3, #428] ; 0x1ac bc9c: f8c3 21ac str.w r2, [r3, #428] ; 0x1ac USB1_ENDPTCOMPLETE = USB1_ENDPTCOMPLETE; // Clear all the endpoint complete status bca0: f8d3 21bc ldr.w r2, [r3, #444] ; 0x1bc bca4: f8c3 21bc str.w r2, [r3, #444] ; 0x1bc while (USB1_ENDPTPRIME != 0) ; // Wait for any endpoint priming bca8: f8d3 41b0 ldr.w r4, [r3, #432] ; 0x1b0 bcac: 2c00 cmp r4, #0 bcae: d1fb bne.n bca8 USB1_ENDPTFLUSH = 0xFFFFFFFF; // Cancel all endpoint primed status bcb0: f04f 32ff mov.w r2, #4294967295 bcb4: f8c3 21b4 str.w r2, [r3, #436] ; 0x1b4 if ((USB1_PORTSC1 & USB_PORTSC1_PR)) { bcb8: f8d3 3184 ldr.w r3, [r3, #388] ; 0x184 usb_serial_reset(); bcbc: f001 fa38 bl d130 endpointN_notify_mask = 0; bcc0: 4b4e ldr r3, [pc, #312] ; (bdfc ) bcc2: 601c str r4, [r3, #0] if (status & USB_USBSTS_TI0) { bcc4: 01f4 lsls r4, r6, #7 bcc6: d503 bpl.n bcd0 if (usb_timer0_callback != NULL) usb_timer0_callback(); bcc8: 4b4d ldr r3, [pc, #308] ; (be00 ) bcca: 681b ldr r3, [r3, #0] bccc: b103 cbz r3, bcd0 bcce: 4798 blx r3 if (status & USB_USBSTS_TI1) { bcd0: 01b0 lsls r0, r6, #6 bcd2: d503 bpl.n bcdc if (usb_timer1_callback != NULL) usb_timer1_callback(); bcd4: 4b4b ldr r3, [pc, #300] ; (be04 ) bcd6: 681b ldr r3, [r3, #0] bcd8: b103 cbz r3, bcdc bcda: 4798 blx r3 if (status & USB_USBSTS_PCI) { bcdc: 0771 lsls r1, r6, #29 bcde: d509 bpl.n bcf4 if (USB1_PORTSC1 & USB_PORTSC1_HSP) { bce0: 4b42 ldr r3, [pc, #264] ; (bdec ) bce2: f8d3 3184 ldr.w r3, [r3, #388] ; 0x184 bce6: f413 7300 ands.w r3, r3, #512 ; 0x200 bcea: f000 8110 beq.w bf0e usb_high_speed = 1; bcee: 4b46 ldr r3, [pc, #280] ; (be08 ) bcf0: 2201 movs r2, #1 bcf2: 701a strb r2, [r3, #0] if ((USB1_USBINTR & USB_USBINTR_SRE) && (status & USB_USBSTS_SRI)) { bcf4: 4b3d ldr r3, [pc, #244] ; (bdec ) bcf6: f8d3 3148 ldr.w r3, [r3, #328] ; 0x148 bcfa: 061a lsls r2, r3, #24 bcfc: d50f bpl.n bd1e bcfe: 0633 lsls r3, r6, #24 bd00: d50d bpl.n bd1e if (usb_reboot_timer) { bd02: 4a42 ldr r2, [pc, #264] ; (be0c ) bd04: 7813 ldrb r3, [r2, #0] bd06: b12b cbz r3, bd14 if (--usb_reboot_timer == 0) { bd08: 3b01 subs r3, #1 bd0a: b2db uxtb r3, r3 bd0c: 7013 strb r3, [r2, #0] bd0e: 2b00 cmp r3, #0 bd10: f000 8299 beq.w c246 } bd14: b007 add sp, #28 bd16: e8bd 4ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} usb_midi_flush_output(); bd1a: f001 b809 b.w cd30 } bd1e: b007 add sp, #28 bd20: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} switch (setup.wRequestAndType) { bd24: d97c bls.n be20 USB1_ENDPTCTRL0 = 0x000010001; // stall bd26: f04f 1301 mov.w r3, #65537 ; 0x10001 bd2a: f8c4 31c0 str.w r3, [r4, #448] ; 0x1c0 bd2e: e778 b.n bc22 switch (setup.wRequestAndType) { bd30: f5b2 6f08 cmp.w r2, #2176 ; 0x880 bd34: d1f7 bne.n bd26 reply_buffer[0] = usb_configuration; bd36: 4836 ldr r0, [pc, #216] ; (be10 ) endpoint0_transmit(reply_buffer, 1, 0); bd38: 2101 movs r1, #1 reply_buffer[0] = usb_configuration; bd3a: f89b 3000 ldrb.w r3, [fp] bd3e: 7003 strb r3, [r0, #0] endpoint0_transmit(reply_buffer, 1, 0); bd40: f7ff fe9e bl ba80 return; bd44: e76d b.n bc22 switch (setup.wRequestAndType) { bd46: f242 2121 movw r1, #8737 ; 0x2221 bd4a: 428a cmp r2, r1 bd4c: f000 81d3 beq.w c0f6 bd50: f240 8099 bls.w be86 bd54: f248 11a2 movw r1, #33186 ; 0x81a2 bd58: 428a cmp r2, r1 bd5a: f000 81bf beq.w c0dc bd5e: d976 bls.n be4e bd60: f248 43a1 movw r3, #33953 ; 0x84a1 bd64: 429a cmp r2, r3 bd66: f040 80b6 bne.w bed6 if (setup.wLength <= sizeof(endpoint0_buffer)) { bd6a: f5b0 2f10 cmp.w r0, #589824 ; 0x90000 bd6e: d2da bcs.n bd26 if (usb_audio_get_feature(&setup, endpoint0_buffer, &len)) { bd70: aa03 add r2, sp, #12 bd72: 4928 ldr r1, [pc, #160] ; (be14 ) bd74: a804 add r0, sp, #16 bd76: f000 fe9b bl cab0 bd7a: 2800 cmp r0, #0 bd7c: d0d3 beq.n bd26 endpoint0_transmit(endpoint0_buffer, len, 0); bd7e: 9903 ldr r1, [sp, #12] bd80: 4824 ldr r0, [pc, #144] ; (be14 ) bd82: f7ff fe7d bl ba80 return; bd86: e74c b.n bc22 switch (setup.wRequestAndType) { bd88: 2a82 cmp r2, #130 ; 0x82 bd8a: f000 8191 beq.w c0b0 bd8e: f240 80b5 bls.w befc bd92: f5b2 7f81 cmp.w r2, #258 ; 0x102 bd96: f040 80a6 bne.w bee6 if (endpoint > 7) break; bd9a: f010 0f78 tst.w r0, #120 ; 0x78 bd9e: b283 uxth r3, r0 bda0: d1c1 bne.n bd26 endpoint = setup.wIndex & 0x7F; bda2: f003 027f and.w r2, r3, #127 ; 0x7f if (dir) { bda6: f013 0f80 tst.w r3, #128 ; 0x80 *((volatile uint32_t *)&USB1_ENDPTCTRL0 + endpoint) &= ~USB_ENDPTCTRL_TXS; bdaa: f858 3022 ldr.w r3, [r8, r2, lsl #2] bdae: bf14 ite ne bdb0: f423 3380 bicne.w r3, r3, #65536 ; 0x10000 *((volatile uint32_t *)&USB1_ENDPTCTRL0 + endpoint) &= ~USB_ENDPTCTRL_RXS; bdb4: f023 0301 biceq.w r3, r3, #1 bdb8: f848 3022 str.w r3, [r8, r2, lsl #2] endpoint0_transfer_ack.pointer0 = 0; bdbc: 2200 movs r2, #0 endpoint0_transfer_ack.next = 1; bdbe: 4b0d ldr r3, [pc, #52] ; (bdf4 ) endpoint_queue_head[1].status = 0; bdc0: 64ea str r2, [r5, #76] ; 0x4c endpoint0_transfer_ack.pointer0 = 0; bdc2: 609a str r2, [r3, #8] endpoint0_transfer_ack.next = 1; bdc4: 2201 movs r2, #1 endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; bdc6: 64ab str r3, [r5, #72] ; 0x48 endpoint0_transfer_ack.next = 1; bdc8: 601a str r2, [r3, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); bdca: 2280 movs r2, #128 ; 0x80 bdcc: 605a str r2, [r3, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); bdce: f04f 1301 mov.w r3, #65537 ; 0x10001 bdd2: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); bdd6: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 bdda: f443 3380 orr.w r3, r3, #65536 ; 0x10000 bdde: f8c4 31b0 str.w r3, [r4, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; bde2: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 bde6: 2b00 cmp r3, #0 bde8: d1fb bne.n bde2 bdea: e71a b.n bc22 bdec: 402e0000 .word 0x402e0000 bdf0: 20000000 .word 0x20000000 bdf4: 20001b20 .word 0x20001b20 bdf8: 2000295c .word 0x2000295c bdfc: 20002960 .word 0x20002960 be00: 20002dcc .word 0x20002dcc be04: 20002dd0 .word 0x20002dd0 be08: 20002e13 .word 0x20002e13 be0c: 20002e14 .word 0x20002e14 be10: 20002d18 .word 0x20002d18 be14: 20002954 .word 0x20002954 be18: 20002e12 .word 0x20002e12 be1c: 402e01c0 .word 0x402e01c0 switch (setup.wRequestAndType) { be20: f240 3321 movw r3, #801 ; 0x321 be24: 429a cmp r2, r3 be26: d004 beq.n be32 be28: f240 4321 movw r3, #1057 ; 0x421 be2c: 429a cmp r2, r3 be2e: f47f af7a bne.w bd26 if (setup.wLength <= sizeof(endpoint0_buffer)) { be32: f5b0 2f10 cmp.w r0, #589824 ; 0x90000 be36: ea4f 4110 mov.w r1, r0, lsr #16 be3a: f4bf af74 bcs.w bd26 endpoint0_setupdata.bothwords = setupdata; be3e: 4bb5 ldr r3, [pc, #724] ; (c114 ) endpoint0_receive(endpoint0_buffer, setup.wLength, 1); be40: 2201 movs r2, #1 endpoint0_setupdata.bothwords = setupdata; be42: e9c3 7000 strd r7, r0, [r3] endpoint0_receive(endpoint0_buffer, setup.wLength, 1); be46: 48b4 ldr r0, [pc, #720] ; (c118 ) be48: f7ff fd56 bl b8f8 return; // handle these after ACK be4c: e6e9 b.n bc22 switch (setup.wRequestAndType) { be4e: f242 3321 movw r3, #8993 ; 0x2321 be52: 429a cmp r2, r3 be54: d125 bne.n bea2 endpoint0_transfer_ack.next = 1; be56: 4bb1 ldr r3, [pc, #708] ; (c11c ) endpoint0_transfer_ack.pointer0 = 0; be58: 2200 movs r2, #0 be5a: 609a str r2, [r3, #8] endpoint_queue_head[1].status = 0; be5c: 64ea str r2, [r5, #76] ; 0x4c endpoint0_transfer_ack.next = 1; be5e: 2201 movs r2, #1 endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; be60: 64ab str r3, [r5, #72] ; 0x48 endpoint0_transfer_ack.next = 1; be62: 601a str r2, [r3, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); be64: 2280 movs r2, #128 ; 0x80 be66: 605a str r2, [r3, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); be68: f04f 1301 mov.w r3, #65537 ; 0x10001 be6c: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); be70: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 be74: f443 3380 orr.w r3, r3, #65536 ; 0x10000 be78: f8c4 31b0 str.w r3, [r4, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; be7c: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 be80: 2b00 cmp r3, #0 be82: d1fb bne.n be7c be84: e6cd b.n bc22 switch (setup.wRequestAndType) { be86: f640 3101 movw r1, #2817 ; 0xb01 be8a: 428a cmp r2, r1 be8c: f000 80ed beq.w c06a be90: f242 0321 movw r3, #8225 ; 0x2021 be94: 429a cmp r2, r3 be96: d10a bne.n beae if (setup.wLength != 7) break; be98: 0c01 lsrs r1, r0, #16 be9a: 2907 cmp r1, #7 be9c: f47f af43 bne.w bd26 bea0: e7cd b.n be3e switch (setup.wRequestAndType) { bea2: f248 13a1 movw r3, #33185 ; 0x81a1 bea6: 429a cmp r2, r3 bea8: f43f af5f beq.w bd6a beac: e73b b.n bd26 beae: f640 2381 movw r3, #2689 ; 0xa81 beb2: 429a cmp r2, r3 beb4: f47f af37 bne.w bd26 if (setup.wIndex == AUDIO_INTERFACE+1) { beb8: b280 uxth r0, r0 beba: 2804 cmp r0, #4 bebc: f000 81ba beq.w c234 } else if (setup.wIndex == AUDIO_INTERFACE+2) { bec0: 2805 cmp r0, #5 bec2: f47f af30 bne.w bd26 endpoint0_buffer[0] = usb_audio_receive_setting; bec6: 4b96 ldr r3, [pc, #600] ; (c120 ) bec8: 781b ldrb r3, [r3, #0] endpoint0_transmit(endpoint0_buffer, 1, 0); beca: 2101 movs r1, #1 endpoint0_buffer[0] = usb_audio_receive_setting; becc: 4892 ldr r0, [pc, #584] ; (c118 ) bece: 7003 strb r3, [r0, #0] endpoint0_transmit(endpoint0_buffer, 1, 0); bed0: f7ff fdd6 bl ba80 return; bed4: e6a5 b.n bc22 switch (setup.wRequestAndType) { bed6: f422 7280 bic.w r2, r2, #256 ; 0x100 beda: f248 23a1 movw r3, #33441 ; 0x82a1 bede: 429a cmp r2, r3 bee0: f43f af43 beq.w bd6a bee4: e71f b.n bd26 bee6: f4ff af1e bcc.w bd26 beea: f240 1321 movw r3, #289 ; 0x121 beee: 429a cmp r2, r3 bef0: d09f beq.n be32 bef2: f240 2321 movw r3, #545 ; 0x221 bef6: 429a cmp r2, r3 bef8: d09b beq.n be32 befa: e714 b.n bd26 befc: 2a80 cmp r2, #128 ; 0x80 befe: f47f af12 bne.w bd26 reply_buffer[0] = 0; bf02: 4888 ldr r0, [pc, #544] ; (c124 ) endpoint0_transmit(reply_buffer, 2, 0); bf04: 2102 movs r1, #2 reply_buffer[0] = 0; bf06: 8003 strh r3, [r0, #0] endpoint0_transmit(reply_buffer, 2, 0); bf08: f7ff fdba bl ba80 return; bf0c: e689 b.n bc22 usb_high_speed = 0; bf0e: 4a86 ldr r2, [pc, #536] ; (c128 ) bf10: 7013 strb r3, [r2, #0] if ((USB1_USBINTR & USB_USBINTR_SRE) && (status & USB_USBSTS_SRI)) { bf12: 4b86 ldr r3, [pc, #536] ; (c12c ) bf14: f8d3 3148 ldr.w r3, [r3, #328] ; 0x148 bf18: 061a lsls r2, r3, #24 bf1a: f57f af00 bpl.w bd1e bf1e: e6ee b.n bcfe USB1_ENDPTCTRL2 = ENDPOINT2_CONFIG; bf20: 4983 ldr r1, [pc, #524] ; (c130 ) usb_configuration = setup.wValue; bf22: f3c7 4c07 ubfx ip, r7, #16, #8 USB1_ENDPTCTRL3 = ENDPOINT3_CONFIG; bf26: f04f 12c8 mov.w r2, #13107400 ; 0xc800c8 bf2a: 9301 str r3, [sp, #4] usb_configuration = setup.wValue; bf2c: f88b c000 strb.w ip, [fp] USB1_ENDPTCTRL2 = ENDPOINT2_CONFIG; bf30: f8c4 11c8 str.w r1, [r4, #456] ; 0x1c8 USB1_ENDPTCTRL3 = ENDPOINT3_CONFIG; bf34: f8c4 21cc str.w r2, [r4, #460] ; 0x1cc USB1_ENDPTCTRL4 = ENDPOINT4_CONFIG; bf38: f8c4 21d0 str.w r2, [r4, #464] ; 0x1d0 USB1_ENDPTCTRL5 = ENDPOINT5_CONFIG; bf3c: f04f 12c4 mov.w r2, #12845252 ; 0xc400c4 bf40: f8c4 21d4 str.w r2, [r4, #468] ; 0x1d4 USB1_ENDPTCTRL6 = ENDPOINT6_CONFIG; bf44: 3ac2 subs r2, #194 ; 0xc2 bf46: f8c4 21d8 str.w r2, [r4, #472] ; 0x1d8 usb_serial_configure(); bf4a: f001 f8f3 bl d134 usb_midi_configure(); bf4e: f000 fe8d bl cc6c usb_audio_configure(); bf52: f000 fd39 bl c9c8 endpoint0_transfer_ack.next = 1; bf56: 4a71 ldr r2, [pc, #452] ; (c11c ) bf58: 2101 movs r1, #1 endpoint_queue_head[1].status = 0; bf5a: 9b01 ldr r3, [sp, #4] endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; bf5c: 64aa str r2, [r5, #72] ; 0x48 endpoint0_transfer_ack.next = 1; bf5e: 6011 str r1, [r2, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); bf60: 2180 movs r1, #128 ; 0x80 endpoint0_transfer_ack.pointer0 = 0; bf62: 6093 str r3, [r2, #8] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); bf64: 6051 str r1, [r2, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); bf66: f04f 1201 mov.w r2, #65537 ; 0x10001 endpoint_queue_head[1].status = 0; bf6a: 64eb str r3, [r5, #76] ; 0x4c USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); bf6c: f8c4 21bc str.w r2, [r4, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); bf70: f8d4 21b0 ldr.w r2, [r4, #432] ; 0x1b0 bf74: f442 3280 orr.w r2, r2, #65536 ; 0x10000 bf78: f8c4 21b0 str.w r2, [r4, #432] ; 0x1b0 endpoint0_notify_mask = (notify ? (1 << 16) : 0); bf7c: f8c9 3000 str.w r3, [r9] while (USB1_ENDPTPRIME) ; bf80: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 bf84: 2b00 cmp r3, #0 bf86: d1fb bne.n bf80 bf88: e64b b.n bc22 for (list = usb_descriptor_list; list->addr != NULL; list++) { bf8a: 4b6a ldr r3, [pc, #424] ; (c134 ) bf8c: 6859 ldr r1, [r3, #4] bf8e: 2900 cmp r1, #0 bf90: f43f aec9 beq.w bd26 bf94: ea4f 4c17 mov.w ip, r7, lsr #16 if (setup.wValue == list->wValue && setup.wIndex == list->wIndex) { bf98: fa1f fe80 uxth.w lr, r0 bf9c: e004 b.n bfa8 for (list = usb_descriptor_list; list->addr != NULL; list++) { bf9e: 6919 ldr r1, [r3, #16] bfa0: 330c adds r3, #12 bfa2: 2900 cmp r1, #0 bfa4: f43f aebf beq.w bd26 if (setup.wValue == list->wValue && setup.wIndex == list->wIndex) { bfa8: 881a ldrh r2, [r3, #0] bfaa: 4562 cmp r2, ip bfac: d1f7 bne.n bf9e bfae: 885a ldrh r2, [r3, #2] bfb0: 4572 cmp r2, lr bfb2: d1f4 bne.n bf9e if ((setup.wValue >> 8) == 3) { bfb4: ea4f 221c mov.w r2, ip, lsr #8 bfb8: 2a03 cmp r2, #3 bfba: f000 80e2 beq.w c182 datalen = list->length; bfbe: 891a ldrh r2, [r3, #8] if (datalen > setup.wLength) datalen = setup.wLength; bfc0: 0c00 lsrs r0, r0, #16 bfc2: 4282 cmp r2, r0 bfc4: bf28 it cs bfc6: 4602 movcs r2, r0 if (setup.wValue == 0x200) { bfc8: f5bc 7f00 cmp.w ip, #512 ; 0x200 bfcc: 4617 mov r7, r2 bfce: f040 80de bne.w c18e if (usb_high_speed) src = usb_config_descriptor_480; bfd2: 4b55 ldr r3, [pc, #340] ; (c128 ) bfd4: 4958 ldr r1, [pc, #352] ; (c138 ) bfd6: 7818 ldrb r0, [r3, #0] bfd8: 4b58 ldr r3, [pc, #352] ; (c13c ) memcpy(usb_descriptor_buffer, src, datalen); bfda: f8df a164 ldr.w sl, [pc, #356] ; c140 bfde: 2800 cmp r0, #0 bfe0: bf18 it ne bfe2: 4619 movne r1, r3 bfe4: 4856 ldr r0, [pc, #344] ; (c140 ) bfe6: f7ff f9d9 bl b39c uint32_t location = (uint32_t)addr & 0xFFFFFFE0; bfea: f02a 031f bic.w r3, sl, #31 uint32_t end_addr = (uint32_t)addr + size; bfee: eb0a 0107 add.w r1, sl, r7 asm("dsb"); bff2: f3bf 8f4f dsb sy SCB_CACHE_DCCIMVAC = location; bff6: f04f 20e0 mov.w r0, #3758153728 ; 0xe000e000 bffa: f8c0 3f70 str.w r3, [r0, #3952] ; 0xf70 location += 32; bffe: 3320 adds r3, #32 } while (location < end_addr); c000: 4299 cmp r1, r3 c002: d8fa bhi.n bffa asm("dsb"); c004: f3bf 8f4f dsb sy asm("isb"); c008: f3bf 8f6f isb sy endpoint0_transmit(usb_descriptor_buffer, datalen, 0); c00c: 484c ldr r0, [pc, #304] ; (c140 ) c00e: 4639 mov r1, r7 c010: f7ff fd36 bl ba80 return; c014: e605 b.n bc22 if (endpoint > 7) break; c016: f010 0f78 tst.w r0, #120 ; 0x78 c01a: b283 uxth r3, r0 c01c: f47f ae83 bne.w bd26 endpoint = setup.wIndex & 0x7F; c020: f003 027f and.w r2, r3, #127 ; 0x7f if (dir) { c024: f013 0f80 tst.w r3, #128 ; 0x80 *((volatile uint32_t *)&USB1_ENDPTCTRL0 + endpoint) |= USB_ENDPTCTRL_TXS; c028: f858 3022 ldr.w r3, [r8, r2, lsl #2] c02c: bf14 ite ne c02e: f443 3380 orrne.w r3, r3, #65536 ; 0x10000 *((volatile uint32_t *)&USB1_ENDPTCTRL0 + endpoint) |= USB_ENDPTCTRL_RXS; c032: f043 0301 orreq.w r3, r3, #1 c036: f848 3022 str.w r3, [r8, r2, lsl #2] endpoint0_transfer_ack.pointer0 = 0; c03a: 2200 movs r2, #0 endpoint0_transfer_ack.next = 1; c03c: 4b37 ldr r3, [pc, #220] ; (c11c ) endpoint_queue_head[1].status = 0; c03e: 64ea str r2, [r5, #76] ; 0x4c endpoint0_transfer_ack.pointer0 = 0; c040: 609a str r2, [r3, #8] endpoint0_transfer_ack.next = 1; c042: 2201 movs r2, #1 endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; c044: 64ab str r3, [r5, #72] ; 0x48 endpoint0_transfer_ack.next = 1; c046: 601a str r2, [r3, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); c048: 2280 movs r2, #128 ; 0x80 c04a: 605a str r2, [r3, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); c04c: f04f 1301 mov.w r3, #65537 ; 0x10001 c050: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); c054: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 c058: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c05c: f8c4 31b0 str.w r3, [r4, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; c060: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 c064: 2b00 cmp r3, #0 c066: d1fb bne.n c060 c068: e5db b.n bc22 if (setup.wIndex == AUDIO_INTERFACE+1) { c06a: b280 uxth r0, r0 c06c: 2804 cmp r0, #4 c06e: f000 80c5 beq.w c1fc } else if (setup.wIndex == AUDIO_INTERFACE+2) { c072: 2805 cmp r0, #5 c074: f47f ae57 bne.w bd26 endpoint0_transfer_ack.next = 1; c078: 4a28 ldr r2, [pc, #160] ; (c11c ) usb_audio_receive_setting = setup.wValue; c07a: f3c7 4c0f ubfx ip, r7, #16, #16 endpoint_queue_head[1].status = 0; c07e: 64eb str r3, [r5, #76] ; 0x4c endpoint0_transfer_ack.pointer0 = 0; c080: 6093 str r3, [r2, #8] usb_audio_receive_setting = setup.wValue; c082: 4b27 ldr r3, [pc, #156] ; (c120 ) endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; c084: 64aa str r2, [r5, #72] ; 0x48 usb_audio_receive_setting = setup.wValue; c086: f883 c000 strb.w ip, [r3] endpoint0_transfer_ack.next = 1; c08a: 2301 movs r3, #1 c08c: 6013 str r3, [r2, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); c08e: 2380 movs r3, #128 ; 0x80 c090: 6053 str r3, [r2, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); c092: f04f 1301 mov.w r3, #65537 ; 0x10001 c096: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); c09a: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 c09e: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c0a2: f8c4 31b0 str.w r3, [r4, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; c0a6: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 c0aa: 2b00 cmp r3, #0 c0ac: d1fb bne.n c0a6 c0ae: e5b8 b.n bc22 endpoint = setup.wIndex & 0x7F; c0b0: b283 uxth r3, r0 if (endpoint > 7) break; c0b2: f010 0078 ands.w r0, r0, #120 ; 0x78 c0b6: f47f ae36 bne.w bd26 endpoint = setup.wIndex & 0x7F; c0ba: f003 027f and.w r2, r3, #127 ; 0x7f ctrl = *((uint32_t *)&USB1_ENDPTCTRL0 + endpoint); c0be: f858 1022 ldr.w r1, [r8, r2, lsl #2] reply_buffer[0] = 0; c0c2: 4a18 ldr r2, [pc, #96] ; (c124 ) c0c4: 8010 strh r0, [r2, #0] if ((dir && (ctrl & USB_ENDPTCTRL_TXS)) || (!dir && (ctrl & USB_ENDPTCTRL_RXS))) { c0c6: 0618 lsls r0, r3, #24 c0c8: d458 bmi.n c17c c0ca: 07cf lsls r7, r1, #31 c0cc: d501 bpl.n c0d2 reply_buffer[0] = 1; c0ce: 2301 movs r3, #1 c0d0: 7013 strb r3, [r2, #0] endpoint0_transmit(reply_buffer, 2, 0); c0d2: 2102 movs r1, #2 c0d4: 4813 ldr r0, [pc, #76] ; (c124 ) c0d6: f7ff fcd3 bl ba80 return; c0da: e5a2 b.n bc22 if (setup.wLength >= 3) { c0dc: f5b0 3f40 cmp.w r0, #196608 ; 0x30000 c0e0: f4ff ae21 bcc.w bd26 endpoint0_buffer[0] = 44100 & 255; c0e4: 480c ldr r0, [pc, #48] ; (c118 ) endpoint0_transmit(endpoint0_buffer, 3, 0); c0e6: 2103 movs r1, #3 endpoint0_buffer[2] = 0; c0e8: 7083 strb r3, [r0, #2] endpoint0_buffer[0] = 44100 & 255; c0ea: f64a 4344 movw r3, #44100 ; 0xac44 c0ee: 8003 strh r3, [r0, #0] endpoint0_transmit(endpoint0_buffer, 3, 0); c0f0: f7ff fcc6 bl ba80 return; c0f4: e595 b.n bc22 if (setup.wIndex == CDC_STATUS_INTERFACE) { c0f6: b280 uxth r0, r0 c0f8: 2800 cmp r0, #0 c0fa: f47f aeac bne.w be56 usb_cdc_line_rtsdtr_millis = systick_millis_count; c0fe: 4b11 ldr r3, [pc, #68] ; (c144 ) usb_cdc_line_rtsdtr = setup.wValue; c100: f3c7 4c07 ubfx ip, r7, #16, #8 usb_cdc_line_rtsdtr_millis = systick_millis_count; c104: 681a ldr r2, [r3, #0] c106: 4b10 ldr r3, [pc, #64] ; (c148 ) c108: 601a str r2, [r3, #0] usb_cdc_line_rtsdtr = setup.wValue; c10a: 4b10 ldr r3, [pc, #64] ; (c14c ) c10c: f883 c000 strb.w ip, [r3] c110: e6a1 b.n be56 c112: bf00 nop c114: 20001f38 .word 0x20001f38 c118: 20002954 .word 0x20002954 c11c: 20001b20 .word 0x20001b20 c120: 20002e0d .word 0x20002e0d c124: 20002d18 .word 0x20002d18 c128: 20002e13 .word 0x20002e13 c12c: 402e0000 .word 0x402e0000 c130: 00cc0002 .word 0x00cc0002 c134: 20000eb4 .word 0x20000eb4 c138: 60001f98 .word 0x60001f98 c13c: 600020f0 .word 0x600020f0 c140: 20201a00 .word 0x20201a00 c144: 20002d90 .word 0x20002d90 c148: 20002dc8 .word 0x20002dc8 c14c: 20002e11 .word 0x20002e11 endpoint0_notify_mask = 0; c150: 2100 movs r1, #0 if (setup.wRequestAndType == 0x2021 && setup.wIndex == CDC_STATUS_INTERFACE) { c152: f242 0021 movw r0, #8225 ; 0x2021 endpoint0_notify_mask = 0; c156: 6011 str r1, [r2, #0] setup.bothwords = endpoint0_setupdata.bothwords; c158: 493d ldr r1, [pc, #244] ; (c250 ) c15a: e9d1 2100 ldrd r2, r1, [r1] if (setup.wRequestAndType == 0x2021 && setup.wIndex == CDC_STATUS_INTERFACE) { c15e: b295 uxth r5, r2 c160: 4285 cmp r5, r0 c162: d028 beq.n c1b6 if (setup.word1 == 0x02010121 || setup.word1 == 0x01000121 /* TODO: check setup.word2 */) { c164: 4b3b ldr r3, [pc, #236] ; (c254 ) c166: 429a cmp r2, r3 c168: d003 beq.n c172 c16a: 4b3b ldr r3, [pc, #236] ; (c258 ) c16c: 429a cmp r2, r3 c16e: f47f ad67 bne.w bc40 usb_audio_set_feature(&endpoint0_setupdata, endpoint0_buffer); c172: 493a ldr r1, [pc, #232] ; (c25c ) c174: 4836 ldr r0, [pc, #216] ; (c250 ) c176: f000 fccd bl cb14 c17a: e561 b.n bc40 if ((dir && (ctrl & USB_ENDPTCTRL_TXS)) || (!dir && (ctrl & USB_ENDPTCTRL_RXS))) { c17c: 03cb lsls r3, r1, #15 c17e: d4a6 bmi.n c0ce c180: e7a7 b.n c0d2 datalen = *(list->addr); c182: 780a ldrb r2, [r1, #0] if (datalen > setup.wLength) datalen = setup.wLength; c184: 0c00 lsrs r0, r0, #16 c186: 4282 cmp r2, r0 c188: bf28 it cs c18a: 4602 movcs r2, r0 c18c: 4617 mov r7, r2 } else if (setup.wValue == 0x700) { c18e: f5bc 6fe0 cmp.w ip, #1792 ; 0x700 c192: d151 bne.n c238 if (usb_high_speed) src = usb_config_descriptor_12; c194: 4b32 ldr r3, [pc, #200] ; (c260 ) memcpy(usb_descriptor_buffer, src, datalen); c196: 463a mov r2, r7 c198: f8df a0e4 ldr.w sl, [pc, #228] ; c280 if (usb_high_speed) src = usb_config_descriptor_12; c19c: 7818 ldrb r0, [r3, #0] c19e: 4931 ldr r1, [pc, #196] ; (c264 ) c1a0: 4b31 ldr r3, [pc, #196] ; (c268 ) memcpy(usb_descriptor_buffer, src, datalen); c1a2: 2800 cmp r0, #0 c1a4: bf18 it ne c1a6: 4619 movne r1, r3 c1a8: 4650 mov r0, sl c1aa: f7ff f8f7 bl b39c usb_descriptor_buffer[1] = 7; c1ae: 2307 movs r3, #7 c1b0: f88a 3001 strb.w r3, [sl, #1] c1b4: e719 b.n bfea if (setup.wRequestAndType == 0x2021 && setup.wIndex == CDC_STATUS_INTERFACE) { c1b6: b289 uxth r1, r1 c1b8: 2900 cmp r1, #0 c1ba: d1d3 bne.n c164 memcpy(usb_cdc_line_coding, endpoint0_buffer, 7); c1bc: 4927 ldr r1, [pc, #156] ; (c25c ) c1be: 4d2b ldr r5, [pc, #172] ; (c26c ) c1c0: c903 ldmia r1, {r0, r1} c1c2: 80a9 strh r1, [r5, #4] if (usb_cdc_line_coding[0] == 134) { c1c4: 2886 cmp r0, #134 ; 0x86 memcpy(usb_cdc_line_coding, endpoint0_buffer, 7); c1c6: ea4f 4111 mov.w r1, r1, lsr #16 c1ca: 6028 str r0, [r5, #0] c1cc: 71a9 strb r1, [r5, #6] if (usb_cdc_line_coding[0] == 134) { c1ce: d1c9 bne.n c164 __disable_irq(); c1d0: b672 cpsid i sof_usage |= (1 << interface); c1d2: 4827 ldr r0, [pc, #156] ; (c270 ) c1d4: 7801 ldrb r1, [r0, #0] c1d6: f041 0140 orr.w r1, r1, #64 ; 0x40 c1da: 7001 strb r1, [r0, #0] uint32_t intr = USB1_USBINTR; c1dc: f8d3 1148 ldr.w r1, [r3, #328] ; 0x148 if (!(intr & USB_USBINTR_SRE)) { c1e0: 060d lsls r5, r1, #24 c1e2: d406 bmi.n c1f2 USB1_USBINTR = intr | USB_USBINTR_SRE; c1e4: f041 0180 orr.w r1, r1, #128 ; 0x80 USB1_USBSTS = USB_USBSTS_SRI; // clear prior SOF before SOF IRQ enable c1e8: 2080 movs r0, #128 ; 0x80 c1ea: f8c3 0144 str.w r0, [r3, #324] ; 0x144 USB1_USBINTR = intr | USB_USBINTR_SRE; c1ee: f8c3 1148 str.w r1, [r3, #328] ; 0x148 __enable_irq(); c1f2: b662 cpsie i usb_reboot_timer = 80; // TODO: 10 if only 12 Mbit/sec c1f4: 4b1f ldr r3, [pc, #124] ; (c274 ) c1f6: 2150 movs r1, #80 ; 0x50 c1f8: 7019 strb r1, [r3, #0] c1fa: e7b3 b.n c164 endpoint0_transfer_ack.next = 1; c1fc: 4a1e ldr r2, [pc, #120] ; (c278 ) usb_audio_transmit_setting = setup.wValue; c1fe: f3c7 4c0f ubfx ip, r7, #16, #16 endpoint_queue_head[1].status = 0; c202: 64eb str r3, [r5, #76] ; 0x4c endpoint0_transfer_ack.pointer0 = 0; c204: 6093 str r3, [r2, #8] usb_audio_transmit_setting = setup.wValue; c206: 4b1d ldr r3, [pc, #116] ; (c27c ) endpoint_queue_head[1].next = (uint32_t)&endpoint0_transfer_ack; c208: 64aa str r2, [r5, #72] ; 0x48 usb_audio_transmit_setting = setup.wValue; c20a: f883 c000 strb.w ip, [r3] endpoint0_transfer_ack.next = 1; c20e: 2301 movs r3, #1 c210: 6013 str r3, [r2, #0] endpoint0_transfer_ack.status = (1<<7) | (notify ? (1 << 15) : 0); c212: 2380 movs r3, #128 ; 0x80 c214: 6053 str r3, [r2, #4] USB1_ENDPTCOMPLETE = (1<<0) | (1<<16); c216: f04f 1301 mov.w r3, #65537 ; 0x10001 c21a: f8c4 31bc str.w r3, [r4, #444] ; 0x1bc USB1_ENDPTPRIME |= (1<<16); c21e: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 c222: f443 3380 orr.w r3, r3, #65536 ; 0x10000 c226: f8c4 31b0 str.w r3, [r4, #432] ; 0x1b0 while (USB1_ENDPTPRIME) ; c22a: f8d4 31b0 ldr.w r3, [r4, #432] ; 0x1b0 c22e: 2b00 cmp r3, #0 c230: d1fb bne.n c22a c232: e4f6 b.n bc22 endpoint0_buffer[0] = usb_audio_transmit_setting; c234: 4b11 ldr r3, [pc, #68] ; (c27c ) c236: e647 b.n bec8 memcpy(usb_descriptor_buffer, list->addr, datalen); c238: f8df a044 ldr.w sl, [pc, #68] ; c280 c23c: 463a mov r2, r7 c23e: 4650 mov r0, sl c240: f7ff f8ac bl b39c c244: e6d1 b.n bfea usb_stop_sof_interrupts(NUM_INTERFACE); c246: 2006 movs r0, #6 c248: f7ff fc66 bl bb18 _reboot_Teensyduino_(); c24c: f001 ff68 bl e120 <___reboot_Teensyduino__veneer> c250: 20001f38 .word 0x20001f38 c254: 02010121 .word 0x02010121 c258: 01000121 .word 0x01000121 c25c: 20002954 .word 0x20002954 c260: 20002e13 .word 0x20002e13 c264: 600020f0 .word 0x600020f0 c268: 60001f98 .word 0x60001f98 c26c: 20002dc0 .word 0x20002dc0 c270: 20002e05 .word 0x20002e05 c274: 20002e14 .word 0x20002e14 c278: 20001b20 .word 0x20001b20 c27c: 20002e10 .word 0x20002e10 c280: 20201a00 .word 0x20201a00 0000c284 : { c284: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} c288: 461f mov r7, r3 if (ep < 2 || ep > NUM_ENDPOINTS) return; c28a: 1e83 subs r3, r0, #2 c28c: 2b04 cmp r3, #4 c28e: d901 bls.n c294 } c290: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} usb_endpoint_config(endpoint_queue_head + ep * 2, config, cb); c294: f8df 904c ldr.w r9, [pc, #76] ; c2e4 c298: 4615 mov r5, r2 c29a: 460c mov r4, r1 memset(qh, 0, sizeof(endpoint_t)); c29c: 223c movs r2, #60 ; 0x3c usb_endpoint_config(endpoint_queue_head + ep * 2, config, cb); c29e: eb09 18c0 add.w r8, r9, r0, lsl #7 memset(qh, 0, sizeof(endpoint_t)); c2a2: 4606 mov r6, r0 usb_endpoint_config(endpoint_queue_head + ep * 2, config, cb); c2a4: ea4f 1ac0 mov.w sl, r0, lsl #7 memset(qh, 0, sizeof(endpoint_t)); c2a8: 2100 movs r1, #0 c2aa: f108 0004 add.w r0, r8, #4 uint32_t config = (packet_size << 16) | (do_zlp ? 0 : (1 << 29)); c2ae: 0424 lsls r4, r4, #16 memset(qh, 0, sizeof(endpoint_t)); c2b0: f001 fc3e bl db30 uint32_t config = (packet_size << 16) | (do_zlp ? 0 : (1 << 29)); c2b4: fab5 f285 clz r2, r5 qh->next = 1; // Terminate bit = 1 c2b8: 2301 movs r3, #1 uint32_t config = (packet_size << 16) | (do_zlp ? 0 : (1 << 29)); c2ba: 0952 lsrs r2, r2, #5 c2bc: ea44 7442 orr.w r4, r4, r2, lsl #29 qh->config = config; c2c0: f849 400a str.w r4, [r9, sl] qh->callback_function = callback; c2c4: f8c8 7038 str.w r7, [r8, #56] ; 0x38 qh->next = 1; // Terminate bit = 1 c2c8: f8c8 3008 str.w r3, [r8, #8] if (cb) endpointN_notify_mask |= (1 << ep); c2cc: 2f00 cmp r7, #0 c2ce: d0df beq.n c290 c2d0: 4a03 ldr r2, [pc, #12] ; (c2e0 ) c2d2: 40b3 lsls r3, r6 c2d4: 6811 ldr r1, [r2, #0] c2d6: 430b orrs r3, r1 c2d8: 6013 str r3, [r2, #0] } c2da: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} c2de: bf00 nop c2e0: 20002960 .word 0x20002960 c2e4: 20000000 .word 0x20000000 0000c2e8 : { c2e8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} c2ec: 460d mov r5, r1 if (ep < 2 || ep > NUM_ENDPOINTS) return; c2ee: 1e81 subs r1, r0, #2 c2f0: 2904 cmp r1, #4 c2f2: d901 bls.n c2f8 } c2f4: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} usb_endpoint_config(endpoint_queue_head + ep * 2 + 1, config, cb); c2f8: 01c7 lsls r7, r0, #7 c2fa: f8df 904c ldr.w r9, [pc, #76] ; c348 c2fe: 4692 mov sl, r2 c300: 4604 mov r4, r0 c302: 3740 adds r7, #64 ; 0x40 memset(qh, 0, sizeof(endpoint_t)); c304: 223c movs r2, #60 ; 0x3c c306: 2100 movs r1, #0 c308: 461e mov r6, r3 usb_endpoint_config(endpoint_queue_head + ep * 2 + 1, config, cb); c30a: eb09 0807 add.w r8, r9, r7 uint32_t config = (packet_size << 16) | (do_zlp ? 0 : (1 << 29)); c30e: 042d lsls r5, r5, #16 memset(qh, 0, sizeof(endpoint_t)); c310: f108 0004 add.w r0, r8, #4 c314: f001 fc0c bl db30 uint32_t config = (packet_size << 16) | (do_zlp ? 0 : (1 << 29)); c318: faba f28a clz r2, sl c31c: 0952 lsrs r2, r2, #5 c31e: ea45 7242 orr.w r2, r5, r2, lsl #29 qh->config = config; c322: f849 2007 str.w r2, [r9, r7] qh->next = 1; // Terminate bit = 1 c326: 2201 movs r2, #1 qh->callback_function = callback; c328: f8c8 6038 str.w r6, [r8, #56] ; 0x38 qh->next = 1; // Terminate bit = 1 c32c: f8c8 2008 str.w r2, [r8, #8] if (cb) endpointN_notify_mask |= (1 << (ep + 16)); c330: 2e00 cmp r6, #0 c332: d0df beq.n c2f4 c334: 4b03 ldr r3, [pc, #12] ; (c344 ) c336: 3410 adds r4, #16 c338: 6819 ldr r1, [r3, #0] c33a: 40a2 lsls r2, r4 c33c: 430a orrs r2, r1 c33e: 601a str r2, [r3, #0] } c340: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} c344: 20002960 .word 0x20002960 c348: 20000000 .word 0x20000000 0000c34c : { c34c: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} c350: 4614 mov r4, r2 if (mult < 1 || mult > 3) return; c352: 3a01 subs r2, #1 c354: 2a02 cmp r2, #2 c356: d804 bhi.n c362 c358: 461d mov r5, r3 if (ep < 2 || ep > NUM_ENDPOINTS) return; c35a: 1e83 subs r3, r0, #2 c35c: 4607 mov r7, r0 c35e: 2b04 cmp r3, #4 c360: d901 bls.n c366 } c362: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} usb_endpoint_config(endpoint_queue_head + ep * 2, config, cb); c366: f8df 9044 ldr.w r9, [pc, #68] ; c3ac c36a: 460e mov r6, r1 uint32_t config = (packet_size << 16) | (mult << 30); c36c: 07a4 lsls r4, r4, #30 memset(qh, 0, sizeof(endpoint_t)); c36e: 223c movs r2, #60 ; 0x3c usb_endpoint_config(endpoint_queue_head + ep * 2, config, cb); c370: eb09 18c0 add.w r8, r9, r0, lsl #7 memset(qh, 0, sizeof(endpoint_t)); c374: 2100 movs r1, #0 usb_endpoint_config(endpoint_queue_head + ep * 2, config, cb); c376: ea4f 1ac0 mov.w sl, r0, lsl #7 memset(qh, 0, sizeof(endpoint_t)); c37a: f108 0004 add.w r0, r8, #4 uint32_t config = (packet_size << 16) | (mult << 30); c37e: ea44 4406 orr.w r4, r4, r6, lsl #16 memset(qh, 0, sizeof(endpoint_t)); c382: f001 fbd5 bl db30 qh->next = 1; // Terminate bit = 1 c386: 2301 movs r3, #1 qh->config = config; c388: f849 400a str.w r4, [r9, sl] qh->callback_function = callback; c38c: f8c8 5038 str.w r5, [r8, #56] ; 0x38 qh->next = 1; // Terminate bit = 1 c390: f8c8 3008 str.w r3, [r8, #8] if (cb) endpointN_notify_mask |= (1 << ep); c394: 2d00 cmp r5, #0 c396: d0e4 beq.n c362 c398: 4a03 ldr r2, [pc, #12] ; (c3a8 ) c39a: 40bb lsls r3, r7 c39c: 6811 ldr r1, [r2, #0] c39e: 430b orrs r3, r1 c3a0: 6013 str r3, [r2, #0] } c3a2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} c3a6: bf00 nop c3a8: 20002960 .word 0x20002960 c3ac: 20000000 .word 0x20000000 0000c3b0 : { c3b0: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} c3b4: 4614 mov r4, r2 if (mult < 1 || mult > 3) return; c3b6: 3a01 subs r2, #1 c3b8: 2a02 cmp r2, #2 c3ba: d804 bhi.n c3c6 c3bc: 461d mov r5, r3 if (ep < 2 || ep > NUM_ENDPOINTS) return; c3be: 1e83 subs r3, r0, #2 c3c0: 4607 mov r7, r0 c3c2: 2b04 cmp r3, #4 c3c4: d901 bls.n c3ca } c3c6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} usb_endpoint_config(endpoint_queue_head + ep * 2 + 1, config, cb); c3ca: ea4f 18c0 mov.w r8, r0, lsl #7 c3ce: f8df a048 ldr.w sl, [pc, #72] ; c418 c3d2: 460e mov r6, r1 uint32_t config = (packet_size << 16) | (mult << 30); c3d4: 07a4 lsls r4, r4, #30 usb_endpoint_config(endpoint_queue_head + ep * 2 + 1, config, cb); c3d6: f108 0840 add.w r8, r8, #64 ; 0x40 memset(qh, 0, sizeof(endpoint_t)); c3da: 223c movs r2, #60 ; 0x3c c3dc: 2100 movs r1, #0 uint32_t config = (packet_size << 16) | (mult << 30); c3de: ea44 4406 orr.w r4, r4, r6, lsl #16 usb_endpoint_config(endpoint_queue_head + ep * 2 + 1, config, cb); c3e2: eb0a 0908 add.w r9, sl, r8 memset(qh, 0, sizeof(endpoint_t)); c3e6: f109 0004 add.w r0, r9, #4 c3ea: f001 fba1 bl db30 qh->next = 1; // Terminate bit = 1 c3ee: 2301 movs r3, #1 qh->config = config; c3f0: f84a 4008 str.w r4, [sl, r8] qh->callback_function = callback; c3f4: f8c9 5038 str.w r5, [r9, #56] ; 0x38 qh->next = 1; // Terminate bit = 1 c3f8: f8c9 3008 str.w r3, [r9, #8] if (cb) endpointN_notify_mask |= (1 << (ep + 16)); c3fc: 2d00 cmp r5, #0 c3fe: d0e2 beq.n c3c6 c400: 4a04 ldr r2, [pc, #16] ; (c414 ) c402: f107 0010 add.w r0, r7, #16 c406: 6811 ldr r1, [r2, #0] c408: 4083 lsls r3, r0 c40a: 430b orrs r3, r1 c40c: 6013 str r3, [r2, #0] } c40e: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} c412: bf00 nop c414: 20002960 .word 0x20002960 c418: 20000000 .word 0x20000000 0000c41c : transfer->status = (len << 16) | (1<<7); c41c: 0412 lsls r2, r2, #16 transfer->pointer0 = addr; c41e: 6081 str r1, [r0, #8] transfer->callback_param = param; c420: 61c3 str r3, [r0, #28] transfer->pointer3 = addr + 12288; c422: f501 5340 add.w r3, r1, #12288 ; 0x3000 transfer->status = (len << 16) | (1<<7); c426: f042 0280 orr.w r2, r2, #128 ; 0x80 { c42a: b410 push {r4} transfer->next = 1; c42c: 2401 movs r4, #1 transfer->status = (len << 16) | (1<<7); c42e: 6042 str r2, [r0, #4] transfer->pointer2 = addr + 8192; c430: f501 5200 add.w r2, r1, #8192 ; 0x2000 transfer->next = 1; c434: 6004 str r4, [r0, #0] transfer->pointer1 = addr + 4096; c436: f501 5480 add.w r4, r1, #4096 ; 0x1000 transfer->pointer4 = addr + 16384; c43a: f501 4180 add.w r1, r1, #16384 ; 0x4000 transfer->pointer1 = addr + 4096; c43e: 60c4 str r4, [r0, #12] transfer->pointer4 = addr + 16384; c440: 6181 str r1, [r0, #24] } c442: f85d 4b04 ldr.w r4, [sp], #4 transfer->pointer3 = addr + 12288; c446: e9c0 2304 strd r2, r3, [r0, #16] } c44a: 4770 bx lr 0000c44c : void usb_transmit(int endpoint_number, transfer_t *transfer) { if (endpoint_number < 2 || endpoint_number > NUM_ENDPOINTS) return; c44c: 1e83 subs r3, r0, #2 { c44e: 460a mov r2, r1 if (endpoint_number < 2 || endpoint_number > NUM_ENDPOINTS) return; c450: 2b04 cmp r3, #4 c452: d900 bls.n c456 endpoint_t *endpoint = endpoint_queue_head + endpoint_number * 2 + 1; uint32_t mask = 1 << (endpoint_number + 16); schedule_transfer(endpoint, mask, transfer); } c454: 4770 bx lr endpoint_t *endpoint = endpoint_queue_head + endpoint_number * 2 + 1; c456: 4b06 ldr r3, [pc, #24] ; (c470 ) uint32_t mask = 1 << (endpoint_number + 16); c458: f100 0110 add.w r1, r0, #16 c45c: f04f 0c01 mov.w ip, #1 endpoint_t *endpoint = endpoint_queue_head + endpoint_number * 2 + 1; c460: eb03 10c0 add.w r0, r3, r0, lsl #7 schedule_transfer(endpoint, mask, transfer); c464: fa0c f101 lsl.w r1, ip, r1 c468: 3040 adds r0, #64 ; 0x40 c46a: f7ff baa9 b.w b9c0 c46e: bf00 nop c470: 20000000 .word 0x20000000 0000c474 : void usb_receive(int endpoint_number, transfer_t *transfer) { if (endpoint_number < 2 || endpoint_number > NUM_ENDPOINTS) return; c474: 1e83 subs r3, r0, #2 { c476: 460a mov r2, r1 if (endpoint_number < 2 || endpoint_number > NUM_ENDPOINTS) return; c478: 2b04 cmp r3, #4 c47a: d900 bls.n c47e endpoint_t *endpoint = endpoint_queue_head + endpoint_number * 2; uint32_t mask = 1 << endpoint_number; schedule_transfer(endpoint, mask, transfer); } c47c: 4770 bx lr uint32_t mask = 1 << endpoint_number; c47e: 2101 movs r1, #1 endpoint_t *endpoint = endpoint_queue_head + endpoint_number * 2; c480: 4b02 ldr r3, [pc, #8] ; (c48c ) schedule_transfer(endpoint, mask, transfer); c482: 4081 lsls r1, r0 c484: eb03 10c0 add.w r0, r3, r0, lsl #7 c488: f7ff ba9a b.w b9c0 c48c: 20000000 .word 0x20000000 0000c490 : //if (!(cmd & USB_USBCMD_ATDTW)) continue; //if (status & 0x80) break; // for still active, only 1 reading needed //if (++count > 1) break; // for completed, check 10 times } #else return transfer->status; c490: 6840 ldr r0, [r0, #4] #endif } c492: 4770 bx lr 0000c494 : update_responsibility = false; } static void copy_to_buffers(const uint32_t *src, int16_t *left, int16_t *right, unsigned int len) { uint32_t *target = (uint32_t*) src + len; c494: eb00 0383 add.w r3, r0, r3, lsl #2 while ((src < target) && (((uintptr_t) left & 0x02) != 0)) { c498: 4298 cmp r0, r3 { c49a: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} while ((src < target) && (((uintptr_t) left & 0x02) != 0)) { c49e: d309 bcc.n c4b4 c4a0: e00a b.n c4b8 uint32_t n = *src++; c4a2: f850 4b04 ldr.w r4, [r0], #4 *left++ = n & 0xFFFF; *right++ = n >> 16; c4a6: 0c25 lsrs r5, r4, #16 while ((src < target) && (((uintptr_t) left & 0x02) != 0)) { c4a8: 4283 cmp r3, r0 *left++ = n & 0xFFFF; c4aa: f821 4b02 strh.w r4, [r1], #2 *right++ = n >> 16; c4ae: f822 5b02 strh.w r5, [r2], #2 while ((src < target) && (((uintptr_t) left & 0x02) != 0)) { c4b2: d901 bls.n c4b8 c4b4: 078c lsls r4, r1, #30 c4b6: d4f4 bmi.n c4a2 } while ((src < target - 2)) { c4b8: f1a3 0408 sub.w r4, r3, #8 c4bc: 42a0 cmp r0, r4 c4be: d230 bcs.n c522 c4c0: f1a3 0809 sub.w r8, r3, #9 c4c4: f100 0c08 add.w ip, r0, #8 c4c8: 4696 mov lr, r2 uint32_t n1 = *src++; uint32_t n = *src++; *(uint32_t *)left = (n1 & 0xFFFF) | ((n & 0xFFFF) << 16); left+=2; *(uint32_t *)right = (n1 >> 16) | ((n & 0xFFFF0000)) ; c4ca: 4f17 ldr r7, [pc, #92] ; (c528 ) c4cc: eba8 0800 sub.w r8, r8, r0 c4d0: ea4f 08d8 mov.w r8, r8, lsr #3 c4d4: f108 0801 add.w r8, r8, #1 c4d8: ea4f 0988 mov.w r9, r8, lsl #2 c4dc: eb01 0688 add.w r6, r1, r8, lsl #2 uint32_t n = *src++; c4e0: e95c a402 ldrd sl, r4, [ip, #-8] while ((src < target - 2)) { c4e4: f10c 0c08 add.w ip, ip, #8 *(uint32_t *)left = (n1 & 0xFFFF) | ((n & 0xFFFF) << 16); c4e8: fa1f f58a uxth.w r5, sl c4ec: ea45 4504 orr.w r5, r5, r4, lsl #16 *(uint32_t *)right = (n1 >> 16) | ((n & 0xFFFF0000)) ; c4f0: 403c ands r4, r7 *(uint32_t *)left = (n1 & 0xFFFF) | ((n & 0xFFFF) << 16); c4f2: f841 5b04 str.w r5, [r1], #4 *(uint32_t *)right = (n1 >> 16) | ((n & 0xFFFF0000)) ; c4f6: ea44 441a orr.w r4, r4, sl, lsr #16 while ((src < target - 2)) { c4fa: 42b1 cmp r1, r6 *(uint32_t *)right = (n1 >> 16) | ((n & 0xFFFF0000)) ; c4fc: f84e 4b04 str.w r4, [lr], #4 while ((src < target - 2)) { c500: d1ee bne.n c4e0 uint32_t n = *src++; c502: eb00 00c8 add.w r0, r0, r8, lsl #3 right+=2; c506: 444a add r2, r9 } while ((src < target)) { c508: 4283 cmp r3, r0 c50a: d908 bls.n c51e uint32_t n = *src++; c50c: f850 1b04 ldr.w r1, [r0], #4 *left++ = n & 0xFFFF; *right++ = n >> 16; c510: 0c0c lsrs r4, r1, #16 while ((src < target)) { c512: 4283 cmp r3, r0 *left++ = n & 0xFFFF; c514: f826 1b02 strh.w r1, [r6], #2 *right++ = n >> 16; c518: f822 4b02 strh.w r4, [r2], #2 while ((src < target)) { c51c: d8f6 bhi.n c50c } } c51e: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} while ((src < target - 2)) { c522: 460e mov r6, r1 while ((src < target)) { c524: e7f0 b.n c508 c526: bf00 nop c528: ffff0000 .word 0xffff0000 0000c52c : { c52c: b538 push {r3, r4, r5, lr} usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c52e: 4a11 ldr r2, [pc, #68] ; (c574 ) c530: 4b11 ldr r3, [pc, #68] ; (c578 ) c532: 7811 ldrb r1, [r2, #0] c534: 681a ldr r2, [r3, #0] usb_prepare_transfer(&sync_transfer, &usb_audio_sync_feedback, usb_audio_sync_nbytes, 0); c536: 2300 movs r3, #0 usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c538: 4c10 ldr r4, [pc, #64] ; (c57c ) usb_prepare_transfer(&sync_transfer, &usb_audio_sync_feedback, usb_audio_sync_nbytes, 0); c53a: 4d11 ldr r5, [pc, #68] ; (c580 ) usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c53c: 40ca lsrs r2, r1 usb_prepare_transfer(&sync_transfer, &usb_audio_sync_feedback, usb_audio_sync_nbytes, 0); c53e: 4811 ldr r0, [pc, #68] ; (c584 ) c540: 4621 mov r1, r4 usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c542: 6022 str r2, [r4, #0] usb_prepare_transfer(&sync_transfer, &usb_audio_sync_feedback, usb_audio_sync_nbytes, 0); c544: 782a ldrb r2, [r5, #0] c546: f7ff ff69 bl c41c arm_dcache_flush(&usb_audio_sync_feedback, usb_audio_sync_nbytes); c54a: 782b ldrb r3, [r5, #0] uint32_t end_addr = (uint32_t)addr + size; c54c: 4423 add r3, r4 asm("dsb"); c54e: f3bf 8f4f dsb sy SCB_CACHE_DCCMVAC = location; c552: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 c556: f8c2 4f68 str.w r4, [r2, #3944] ; 0xf68 location += 32; c55a: 3420 adds r4, #32 } while (location < end_addr); c55c: 42a3 cmp r3, r4 c55e: d8fa bhi.n c556 asm("dsb"); c560: f3bf 8f4f dsb sy asm("isb"); c564: f3bf 8f6f isb sy usb_transmit(AUDIO_SYNC_ENDPOINT, &sync_transfer); c568: 4906 ldr r1, [pc, #24] ; (c584 ) c56a: 2006 movs r0, #6 } c56c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} usb_transmit(AUDIO_SYNC_ENDPOINT, &sync_transfer); c570: f7ff bf6c b.w c44c c574: 20002e0f .word 0x20002e0f c578: 20002978 .word 0x20002978 c57c: 20201860 .word 0x20201860 c580: 20002e0e .word 0x20002e0e c584: 20001d40 .word 0x20001d40 0000c588 : len--; } } void AudioOutputUSB::update(void) { c588: b538 push {r3, r4, r5, lr} c58a: 4605 mov r5, r0 audio_block_t *left, *right; // TODO: we shouldn't be writing to these...... //left = receiveReadOnly(0); // input 0 = left channel //right = receiveReadOnly(1); // input 1 = right channel left = receiveWritable(0); // input 0 = left channel c58c: 2100 movs r1, #0 c58e: f7fe f917 bl a7c0 right = receiveWritable(1); // input 1 = right channel c592: 2101 movs r1, #1 left = receiveWritable(0); // input 0 = left channel c594: 4604 mov r4, r0 right = receiveWritable(1); // input 1 = right channel c596: 4628 mov r0, r5 c598: f7fe f912 bl a7c0 if (usb_audio_transmit_setting == 0) { c59c: 4b3b ldr r3, [pc, #236] ; (c68c ) right = receiveWritable(1); // input 1 = right channel c59e: 4605 mov r5, r0 if (usb_audio_transmit_setting == 0) { c5a0: 781b ldrb r3, [r3, #0] c5a2: b1f3 cbz r3, c5e2 if (right_1st) { release(right_1st); right_1st = NULL; } if (right_2nd) { release(right_2nd); right_2nd = NULL; } offset_1st = 0; return; } if (left == NULL) { c5a4: 2c00 cmp r4, #0 c5a6: d04a beq.n c63e if (right) release(right); return; } memset(left->data, 0, sizeof(left->data)); } if (right == NULL) { c5a8: 2d00 cmp r5, #0 c5aa: d054 beq.n c656 release(left); return; } memset(right->data, 0, sizeof(right->data)); } __disable_irq(); c5ac: b672 cpsid i if (left_1st == NULL) { c5ae: 4b38 ldr r3, [pc, #224] ; (c690 ) c5b0: 6818 ldr r0, [r3, #0] c5b2: 2800 cmp r0, #0 c5b4: d03d beq.n c632 left_1st = left; right_1st = right; offset_1st = 0; } else if (left_2nd == NULL) { c5b6: 4a37 ldr r2, [pc, #220] ; (c694 ) c5b8: 6811 ldr r1, [r2, #0] c5ba: 2900 cmp r1, #0 c5bc: d056 beq.n c66c left_2nd = left; right_2nd = right; } else { // buffer overrun - PC is consuming too slowly audio_block_t *discard1 = left_1st; left_1st = left_2nd; c5be: 6019 str r1, [r3, #0] left_2nd = left; audio_block_t *discard2 = right_1st; right_1st = right_2nd; c5c0: 4935 ldr r1, [pc, #212] ; (c698 ) audio_block_t *discard2 = right_1st; c5c2: 4b36 ldr r3, [pc, #216] ; (c69c ) left_2nd = left; c5c4: 6014 str r4, [r2, #0] right_2nd = right; offset_1st = 0; // TODO: discard part of this data? c5c6: 2400 movs r4, #0 right_1st = right_2nd; c5c8: 680a ldr r2, [r1, #0] right_2nd = right; c5ca: 600d str r5, [r1, #0] offset_1st = 0; // TODO: discard part of this data? c5cc: 4934 ldr r1, [pc, #208] ; (c6a0 ) c5ce: 800c strh r4, [r1, #0] audio_block_t *discard2 = right_1st; c5d0: 681c ldr r4, [r3, #0] right_1st = right_2nd; c5d2: 601a str r2, [r3, #0] //serial_print("*"); release(discard1); c5d4: f7fe f89c bl a710 release(discard2); c5d8: 4620 mov r0, r4 c5da: f7fe f899 bl a710 } __enable_irq(); c5de: b662 cpsie i } c5e0: bd38 pop {r3, r4, r5, pc} if (left) release(left); c5e2: b114 cbz r4, c5ea c5e4: 4620 mov r0, r4 c5e6: f7fe f893 bl a710 if (right) release(right); c5ea: b115 cbz r5, c5f2 c5ec: 4628 mov r0, r5 c5ee: f7fe f88f bl a710 if (left_1st) { release(left_1st); left_1st = NULL; } c5f2: 4c27 ldr r4, [pc, #156] ; (c690 ) c5f4: 6820 ldr r0, [r4, #0] c5f6: b118 cbz r0, c600 c5f8: f7fe f88a bl a710 c5fc: 2300 movs r3, #0 c5fe: 6023 str r3, [r4, #0] if (left_2nd) { release(left_2nd); left_2nd = NULL; } c600: 4c24 ldr r4, [pc, #144] ; (c694 ) c602: 6820 ldr r0, [r4, #0] c604: b118 cbz r0, c60e c606: f7fe f883 bl a710 c60a: 2300 movs r3, #0 c60c: 6023 str r3, [r4, #0] if (right_1st) { release(right_1st); right_1st = NULL; } c60e: 4c23 ldr r4, [pc, #140] ; (c69c ) c610: 6820 ldr r0, [r4, #0] c612: b118 cbz r0, c61c c614: f7fe f87c bl a710 c618: 2300 movs r3, #0 c61a: 6023 str r3, [r4, #0] if (right_2nd) { release(right_2nd); right_2nd = NULL; } c61c: 4c1e ldr r4, [pc, #120] ; (c698 ) c61e: 6820 ldr r0, [r4, #0] c620: b118 cbz r0, c62a c622: f7fe f875 bl a710 c626: 2300 movs r3, #0 c628: 6023 str r3, [r4, #0] offset_1st = 0; c62a: 4b1d ldr r3, [pc, #116] ; (c6a0 ) c62c: 2200 movs r2, #0 c62e: 801a strh r2, [r3, #0] } c630: bd38 pop {r3, r4, r5, pc} left_1st = left; c632: 601c str r4, [r3, #0] right_1st = right; c634: 4a19 ldr r2, [pc, #100] ; (c69c ) offset_1st = 0; c636: 4b1a ldr r3, [pc, #104] ; (c6a0 ) right_1st = right; c638: 6015 str r5, [r2, #0] offset_1st = 0; c63a: 8018 strh r0, [r3, #0] c63c: e7cf b.n c5de left = allocate(); c63e: f7fe f811 bl a664 if (left == NULL) { c642: 4604 mov r4, r0 c644: b1b0 cbz r0, c674 memset(left->data, 0, sizeof(left->data)); c646: f44f 7280 mov.w r2, #256 ; 0x100 c64a: 2100 movs r1, #0 c64c: 3004 adds r0, #4 c64e: f001 fa6f bl db30 if (right == NULL) { c652: 2d00 cmp r5, #0 c654: d1aa bne.n c5ac right = allocate(); c656: f7fe f805 bl a664 if (right == NULL) { c65a: 4605 mov r5, r0 c65c: b188 cbz r0, c682 memset(right->data, 0, sizeof(right->data)); c65e: f44f 7280 mov.w r2, #256 ; 0x100 c662: 2100 movs r1, #0 c664: 3004 adds r0, #4 c666: f001 fa63 bl db30 c66a: e79f b.n c5ac right_2nd = right; c66c: 4b0a ldr r3, [pc, #40] ; (c698 ) left_2nd = left; c66e: 6014 str r4, [r2, #0] right_2nd = right; c670: 601d str r5, [r3, #0] c672: e7b4 b.n c5de if (right) release(right); c674: 2d00 cmp r5, #0 c676: d0b3 beq.n c5e0 c678: 4628 mov r0, r5 } c67a: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} if (right) release(right); c67e: f7fe b847 b.w a710 release(left); c682: 4620 mov r0, r4 } c684: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} release(left); c688: f7fe b842 b.w a710 c68c: 20002e10 .word 0x20002e10 c690: 2000253c .word 0x2000253c c694: 20002540 .word 0x20002540 c698: 20002548 .word 0x20002548 c69c: 20002544 .word 0x20002544 c6a0: 20002de2 .word 0x20002de2 0000c6a4 : { c6a4: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} AudioInputUSB::receive_flag = 1; c6a8: 2201 movs r2, #1 c6aa: 4b4a ldr r3, [pc, #296] ; (c7d4 ) left = AudioInputUSB::incoming_left; c6ac: f8df a138 ldr.w sl, [pc, #312] ; c7e8 len >>= 2; // 1 sample = 4 bytes: 2 left, 2 right c6b0: 0886 lsrs r6, r0, #2 AudioInputUSB::receive_flag = 1; c6b2: 701a strb r2, [r3, #0] count = AudioInputUSB::incoming_count; c6b4: 4b48 ldr r3, [pc, #288] ; (c7d8 ) left = AudioInputUSB::incoming_left; c6b6: f8da 4000 ldr.w r4, [sl] count = AudioInputUSB::incoming_count; c6ba: 881f ldrh r7, [r3, #0] right = AudioInputUSB::incoming_right; c6bc: 4b47 ldr r3, [pc, #284] ; (c7dc ) count = AudioInputUSB::incoming_count; c6be: 46b9 mov r9, r7 right = AudioInputUSB::incoming_right; c6c0: 681d ldr r5, [r3, #0] if (left == NULL) { c6c2: 2c00 cmp r4, #0 c6c4: d04a beq.n c75c if (right == NULL) { c6c6: 2d00 cmp r5, #0 c6c8: d051 beq.n c76e while (len > 0) { c6ca: 2e00 cmp r6, #0 c6cc: d058 beq.n c780 avail = AUDIO_BLOCK_SAMPLES - count; c6ce: f1c7 0380 rsb r3, r7, #128 ; 0x80 if (len < avail) { c6d2: 429e cmp r6, r3 c6d4: d37a bcc.n c7cc c6d6: f8df b114 ldr.w fp, [pc, #276] ; c7ec c6da: 4f41 ldr r7, [pc, #260] ; (c7e0 ) if (AudioInputUSB::ready_left || AudioInputUSB::ready_right) return; c6dc: f8df 8110 ldr.w r8, [pc, #272] ; c7f0 } else if (avail > 0) { c6e0: b9fb cbnz r3, c722 if (AudioInputUSB::ready_left || AudioInputUSB::ready_right) return; c6e2: 683b ldr r3, [r7, #0] c6e4: 2b00 cmp r3, #0 c6e6: d137 bne.n c758 c6e8: f8d8 3000 ldr.w r3, [r8] c6ec: 2b00 cmp r3, #0 c6ee: d133 bne.n c758 AudioInputUSB::ready_left = left; c6f0: 603c str r4, [r7, #0] AudioInputUSB::ready_right = right; c6f2: f8c8 5000 str.w r5, [r8] left = AudioStream::allocate(); c6f6: f7fd ffb5 bl a664 if (left == NULL) { c6fa: 4604 mov r4, r0 c6fc: 2800 cmp r0, #0 c6fe: d043 beq.n c788 right = AudioStream::allocate(); c700: f7fd ffb0 bl a664 if (right == NULL) { c704: 4605 mov r5, r0 c706: 2800 cmp r0, #0 c708: d046 beq.n c798 AudioInputUSB::incoming_right = right; c70a: 4b34 ldr r3, [pc, #208] ; (c7dc ) AudioInputUSB::incoming_left = left; c70c: f8ca 4000 str.w r4, [sl] AudioInputUSB::incoming_right = right; c710: 6018 str r0, [r3, #0] while (len > 0) { c712: 2e00 cmp r6, #0 c714: d033 beq.n c77e if (len < avail) { c716: 2e7f cmp r6, #127 ; 0x7f count = 0; c718: f04f 0900 mov.w r9, #0 avail = AUDIO_BLOCK_SAMPLES - count; c71c: f04f 0380 mov.w r3, #128 ; 0x80 if (len < avail) { c720: d945 bls.n c7ae copy_to_buffers(data, left->data + count, right->data + count, avail); c722: 1d2a adds r2, r5, #4 c724: 1d21 adds r1, r4, #4 c726: 4658 mov r0, fp c728: 444e add r6, r9 c72a: eb02 0249 add.w r2, r2, r9, lsl #1 c72e: eb01 0149 add.w r1, r1, r9, lsl #1 len -= avail; c732: 3e80 subs r6, #128 ; 0x80 data += avail; c734: eb0b 0b83 add.w fp, fp, r3, lsl #2 copy_to_buffers(data, left->data + count, right->data + count, avail); c738: f7ff feac bl c494 if (AudioInputUSB::ready_left || AudioInputUSB::ready_right) { c73c: 683b ldr r3, [r7, #0] c73e: b91b cbnz r3, c748 c740: f8d8 3000 ldr.w r3, [r8] c744: 2b00 cmp r3, #0 c746: d0d3 beq.n c6f0 AudioInputUSB::incoming_count = count + avail; c748: 2380 movs r3, #128 ; 0x80 c74a: 4a23 ldr r2, [pc, #140] ; (c7d8 ) c74c: 8013 strh r3, [r2, #0] if (len > 0) { c74e: b11e cbz r6, c758 usb_audio_overrun_count++; c750: 4a24 ldr r2, [pc, #144] ; (c7e4 ) c752: 6813 ldr r3, [r2, #0] c754: 3301 adds r3, #1 c756: 6013 str r3, [r2, #0] } c758: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} left = AudioStream::allocate(); c75c: f7fd ff82 bl a664 if (left == NULL) return; c760: 4604 mov r4, r0 c762: 2800 cmp r0, #0 c764: d0f8 beq.n c758 AudioInputUSB::incoming_left = left; c766: f8ca 0000 str.w r0, [sl] if (right == NULL) { c76a: 2d00 cmp r5, #0 c76c: d1ad bne.n c6ca right = AudioStream::allocate(); c76e: f7fd ff79 bl a664 if (right == NULL) return; c772: 4605 mov r5, r0 c774: 2800 cmp r0, #0 c776: d0ef beq.n c758 AudioInputUSB::incoming_right = right; c778: 4b18 ldr r3, [pc, #96] ; (c7dc ) c77a: 6018 str r0, [r3, #0] c77c: e7a5 b.n c6ca c77e: 4637 mov r7, r6 AudioInputUSB::incoming_count = count; c780: 4b15 ldr r3, [pc, #84] ; (c7d8 ) c782: 801f strh r7, [r3, #0] } c784: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} AudioInputUSB::incoming_right = NULL; c788: 4b14 ldr r3, [pc, #80] ; (c7dc ) AudioInputUSB::incoming_left = NULL; c78a: f8ca 0000 str.w r0, [sl] AudioInputUSB::incoming_right = NULL; c78e: 6018 str r0, [r3, #0] AudioInputUSB::incoming_count = 0; c790: 4b11 ldr r3, [pc, #68] ; (c7d8 ) c792: 8018 strh r0, [r3, #0] } c794: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} AudioStream::release(left); c798: 4620 mov r0, r4 c79a: f7fd ffb9 bl a710 AudioInputUSB::incoming_right = NULL; c79e: 4b0f ldr r3, [pc, #60] ; (c7dc ) AudioInputUSB::incoming_left = NULL; c7a0: f8ca 5000 str.w r5, [sl] AudioInputUSB::incoming_right = NULL; c7a4: 601d str r5, [r3, #0] AudioInputUSB::incoming_count = 0; c7a6: 4b0c ldr r3, [pc, #48] ; (c7d8 ) c7a8: 801d strh r5, [r3, #0] } c7aa: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} c7ae: 464f mov r7, r9 c7b0: 464b mov r3, r9 copy_to_buffers(data, left->data + count, right->data + count, len); c7b2: 1d2a adds r2, r5, #4 c7b4: 1d21 adds r1, r4, #4 c7b6: 4658 mov r0, fp AudioInputUSB::incoming_count = count + len; c7b8: 4437 add r7, r6 copy_to_buffers(data, left->data + count, right->data + count, len); c7ba: 441a add r2, r3 c7bc: 4419 add r1, r3 c7be: 4633 mov r3, r6 c7c0: f7ff fe68 bl c494 AudioInputUSB::incoming_count = count + len; c7c4: 4b04 ldr r3, [pc, #16] ; (c7d8 ) c7c6: 801f strh r7, [r3, #0] } c7c8: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} copy_to_buffers(data, left->data + count, right->data + count, len); c7cc: 007b lsls r3, r7, #1 c7ce: f8df b01c ldr.w fp, [pc, #28] ; c7ec c7d2: e7ee b.n c7b2 c7d4: 20002df8 .word 0x20002df8 c7d8: 20002de0 .word 0x20002de0 c7dc: 200024f8 .word 0x200024f8 c7e0: 200024ec .word 0x200024ec c7e4: 20002db8 .word 0x20002db8 c7e8: 200024f4 .word 0x200024f4 c7ec: 20201880 .word 0x20201880 c7f0: 200024f0 .word 0x200024f0 0000c7f4 : { c7f4: b508 push {r3, lr} if (t) { c7f6: b138 cbz r0, c808 int len = AUDIO_RX_SIZE - ((rx_transfer.status >> 16) & 0x7FFF); c7f8: 4b11 ldr r3, [pc, #68] ; (c840 ) c7fa: 6858 ldr r0, [r3, #4] c7fc: f3c0 400e ubfx r0, r0, #16, #15 usb_audio_receive_callback(len); c800: f1c0 00b4 rsb r0, r0, #180 ; 0xb4 c804: f7ff ff4e bl c6a4 usb_prepare_transfer(&rx_transfer, rx_buffer, AUDIO_RX_SIZE, 0); c808: 2300 movs r3, #0 c80a: 22b4 movs r2, #180 ; 0xb4 c80c: 490d ldr r1, [pc, #52] ; (c844 ) c80e: 480c ldr r0, [pc, #48] ; (c840 ) c810: f7ff fe04 bl c41c uint32_t location = (uint32_t)addr & 0xFFFFFFE0; c814: 4b0b ldr r3, [pc, #44] ; (c844 ) uint32_t end_addr = (uint32_t)addr + size; c816: f103 01b4 add.w r1, r3, #180 ; 0xb4 asm("dsb"); c81a: f3bf 8f4f dsb sy SCB_CACHE_DCIMVAC = location; c81e: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 c822: f8c2 3f5c str.w r3, [r2, #3932] ; 0xf5c location += 32; c826: 3320 adds r3, #32 } while (location < end_addr); c828: 4299 cmp r1, r3 c82a: d8fa bhi.n c822 asm("dsb"); c82c: f3bf 8f4f dsb sy asm("isb"); c830: f3bf 8f6f isb sy usb_receive(AUDIO_RX_ENDPOINT, &rx_transfer); c834: 4902 ldr r1, [pc, #8] ; (c840 ) c836: 2005 movs r0, #5 } c838: e8bd 4008 ldmia.w sp!, {r3, lr} usb_receive(AUDIO_RX_ENDPOINT, &rx_transfer); c83c: f7ff be1a b.w c474 c840: 20001b60 .word 0x20001b60 c844: 20201880 .word 0x20201880 0000c848 : update_responsibility = false; c848: 2300 movs r3, #0 c84a: 4803 ldr r0, [pc, #12] ; (c858 ) left_1st = NULL; c84c: 4903 ldr r1, [pc, #12] ; (c85c ) right_1st = NULL; c84e: 4a04 ldr r2, [pc, #16] ; (c860 ) update_responsibility = false; c850: 7003 strb r3, [r0, #0] left_1st = NULL; c852: 600b str r3, [r1, #0] right_1st = NULL; c854: 6013 str r3, [r2, #0] } c856: 4770 bx lr c858: 20002df9 .word 0x20002df9 c85c: 2000253c .word 0x2000253c c860: 20002544 .word 0x20002544 0000c864 : { static uint32_t count=5; uint32_t avail, num, target, offset, len=0; audio_block_t *left, *right; if (++count < 10) { // TODO: dynamic adjust to match USB rate c864: 4a39 ldr r2, [pc, #228] ; (c94c ) { c866: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} if (++count < 10) { // TODO: dynamic adjust to match USB rate c86a: 6813 ldr r3, [r2, #0] c86c: 3301 adds r3, #1 c86e: 2b09 cmp r3, #9 { c870: ed2d 8b02 vpush {d8} if (++count < 10) { // TODO: dynamic adjust to match USB rate c874: d955 bls.n c922 target = 44; } else { count = 0; c876: 21b4 movs r1, #180 ; 0xb4 c878: 2300 movs r3, #0 target = 45; c87a: f04f 092d mov.w r9, #45 ; 0x2d count = 0; c87e: ee08 1a10 vmov s16, r1 c882: 6013 str r3, [r2, #0] { c884: 2700 movs r7, #0 c886: f8df b0d8 ldr.w fp, [pc, #216] ; c960 memset(usb_audio_transmit_buffer + len, 0, num * 4); //serial_print("%"); break; } right = AudioOutputUSB::right_1st; offset = AudioOutputUSB::offset_1st; c88a: f8df a0d8 ldr.w sl, [pc, #216] ; c964 left = AudioOutputUSB::left_1st; c88e: f8db 0000 ldr.w r0, [fp] num = target - len; c892: eba9 0207 sub.w r2, r9, r7 if (left == NULL) { c896: 2800 cmp r0, #0 c898: d04a beq.n c930 offset = AudioOutputUSB::offset_1st; c89a: f8ba c000 ldrh.w ip, [sl] avail = AUDIO_BLOCK_SAMPLES - offset; if (num > avail) num = avail; copy_from_buffers((uint32_t *)usb_audio_transmit_buffer + len, left->data + offset, right->data + offset, num); c89e: 1d05 adds r5, r0, #4 right = AudioOutputUSB::right_1st; c8a0: 4b2b ldr r3, [pc, #172] ; (c950 ) copy_from_buffers((uint32_t *)usb_audio_transmit_buffer + len, c8a2: eb05 054c add.w r5, r5, ip, lsl #1 right = AudioOutputUSB::right_1st; c8a6: f8d3 8000 ldr.w r8, [r3] avail = AUDIO_BLOCK_SAMPLES - offset; c8aa: f1cc 0380 rsb r3, ip, #128 ; 0x80 c8ae: 429a cmp r2, r3 left->data + offset, right->data + offset, num); c8b0: f108 0404 add.w r4, r8, #4 c8b4: bf28 it cs c8b6: 461a movcs r2, r3 copy_from_buffers((uint32_t *)usb_audio_transmit_buffer + len, c8b8: 4b26 ldr r3, [pc, #152] ; (c954 ) c8ba: eb04 044c add.w r4, r4, ip, lsl #1 c8be: eb03 0687 add.w r6, r3, r7, lsl #2 while (len > 0) { c8c2: b15a cbz r2, c8dc c8c4: 4611 mov r1, r2 *dst++ = (*right++ << 16) | (*left++ & 0xFFFF); c8c6: f935 3b02 ldrsh.w r3, [r5], #2 while (len > 0) { c8ca: 3901 subs r1, #1 *dst++ = (*right++ << 16) | (*left++ & 0xFFFF); c8cc: f934 eb02 ldrsh.w lr, [r4], #2 c8d0: b29b uxth r3, r3 c8d2: ea43 430e orr.w r3, r3, lr, lsl #16 c8d6: f846 3b04 str.w r3, [r6], #4 while (len > 0) { c8da: d1f4 bne.n c8c6 len += num; offset += num; c8dc: 4494 add ip, r2 len += num; c8de: 4417 add r7, r2 if (offset >= AUDIO_BLOCK_SAMPLES) { c8e0: f1bc 0f7f cmp.w ip, #127 ; 0x7f c8e4: d80b bhi.n c8fe AudioOutputUSB::left_2nd = NULL; AudioOutputUSB::right_1st = AudioOutputUSB::right_2nd; AudioOutputUSB::right_2nd = NULL; AudioOutputUSB::offset_1st = 0; } else { AudioOutputUSB::offset_1st = offset; c8e6: fa1f fc8c uxth.w ip, ip while (len < target) { c8ea: 454f cmp r7, r9 AudioOutputUSB::offset_1st = offset; c8ec: f8aa c000 strh.w ip, [sl] while (len < target) { c8f0: d3cd bcc.n c88e } } return target * 4; } c8f2: ee18 0a10 vmov r0, s16 c8f6: ecbd 8b02 vpop {d8} c8fa: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} AudioStream::release(left); c8fe: f7fd ff07 bl a710 AudioStream::release(right); c902: 4640 mov r0, r8 c904: f7fd ff04 bl a710 AudioOutputUSB::left_1st = AudioOutputUSB::left_2nd; c908: 4813 ldr r0, [pc, #76] ; (c958 ) AudioOutputUSB::right_1st = AudioOutputUSB::right_2nd; c90a: 4b14 ldr r3, [pc, #80] ; (c95c ) AudioOutputUSB::left_2nd = NULL; c90c: 2200 movs r2, #0 AudioOutputUSB::left_1st = AudioOutputUSB::left_2nd; c90e: 6801 ldr r1, [r0, #0] c910: 4694 mov ip, r2 AudioOutputUSB::left_2nd = NULL; c912: 6002 str r2, [r0, #0] AudioOutputUSB::left_1st = AudioOutputUSB::left_2nd; c914: f8cb 1000 str.w r1, [fp] AudioOutputUSB::right_1st = AudioOutputUSB::right_2nd; c918: 6819 ldr r1, [r3, #0] AudioOutputUSB::right_2nd = NULL; c91a: 601a str r2, [r3, #0] AudioOutputUSB::right_1st = AudioOutputUSB::right_2nd; c91c: 4b0c ldr r3, [pc, #48] ; (c950 ) c91e: 6019 str r1, [r3, #0] AudioOutputUSB::offset_1st = 0; c920: e7e3 b.n c8ea if (++count < 10) { // TODO: dynamic adjust to match USB rate c922: 21b0 movs r1, #176 ; 0xb0 target = 44; c924: f04f 092c mov.w r9, #44 ; 0x2c if (++count < 10) { // TODO: dynamic adjust to match USB rate c928: 6013 str r3, [r2, #0] c92a: ee08 1a10 vmov s16, r1 c92e: e7a9 b.n c884 memset(usb_audio_transmit_buffer + len, 0, num * 4); c930: 4b08 ldr r3, [pc, #32] ; (c954 ) c932: 4601 mov r1, r0 c934: 0092 lsls r2, r2, #2 c936: eb03 0047 add.w r0, r3, r7, lsl #1 c93a: f001 f8f9 bl db30 } c93e: ee18 0a10 vmov r0, s16 c942: ecbd 8b02 vpop {d8} c946: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} c94a: bf00 nop c94c: 200010a8 .word 0x200010a8 c950: 20002544 .word 0x20002544 c954: 20001e80 .word 0x20001e80 c958: 20002540 .word 0x20002540 c95c: 20002548 .word 0x20002548 c960: 2000253c .word 0x2000253c c964: 20002de2 .word 0x20002de2 0000c968 : { c968: b538 push {r3, r4, r5, lr} int len = usb_audio_transmit_callback(); c96a: f7ff ff7b bl c864 usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c96e: 4a11 ldr r2, [pc, #68] ; (c9b4 ) c970: 4b11 ldr r3, [pc, #68] ; (c9b8 ) int len = usb_audio_transmit_callback(); c972: 4605 mov r5, r0 usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c974: 6812 ldr r2, [r2, #0] c976: 781b ldrb r3, [r3, #0] usb_prepare_transfer(&tx_transfer, usb_audio_transmit_buffer, len, 0); c978: 4c10 ldr r4, [pc, #64] ; (c9bc ) usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c97a: 40da lsrs r2, r3 c97c: 4910 ldr r1, [pc, #64] ; (c9c0 ) usb_prepare_transfer(&tx_transfer, usb_audio_transmit_buffer, len, 0); c97e: 2300 movs r3, #0 usb_audio_sync_feedback = feedback_accumulator >> usb_audio_sync_rshift; c980: 600a str r2, [r1, #0] usb_prepare_transfer(&tx_transfer, usb_audio_transmit_buffer, len, 0); c982: 4602 mov r2, r0 c984: 4621 mov r1, r4 c986: 480f ldr r0, [pc, #60] ; (c9c4 ) c988: f7ff fd48 bl c41c uint32_t end_addr = (uint32_t)addr + size; c98c: 1960 adds r0, r4, r5 asm("dsb"); c98e: f3bf 8f4f dsb sy SCB_CACHE_DCCIMVAC = location; c992: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 c996: f8c3 4f70 str.w r4, [r3, #3952] ; 0xf70 location += 32; c99a: 3420 adds r4, #32 } while (location < end_addr); c99c: 42a0 cmp r0, r4 c99e: d8fa bhi.n c996 asm("dsb"); c9a0: f3bf 8f4f dsb sy asm("isb"); c9a4: f3bf 8f6f isb sy usb_transmit(AUDIO_TX_ENDPOINT, &tx_transfer); c9a8: 4906 ldr r1, [pc, #24] ; (c9c4 ) c9aa: 2005 movs r0, #5 } c9ac: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} usb_transmit(AUDIO_TX_ENDPOINT, &tx_transfer); c9b0: f7ff bd4c b.w c44c c9b4: 20002978 .word 0x20002978 c9b8: 20002e0f .word 0x20002e0f c9bc: 20001e80 .word 0x20001e80 c9c0: 20201860 .word 0x20201860 c9c4: 20001d60 .word 0x20001d60 0000c9c8 : { c9c8: b538 push {r3, r4, r5, lr} usb_audio_overrun_count = 0; c9ca: 492b ldr r1, [pc, #172] ; (ca78 ) usb_audio_underrun_count = 0; c9cc: 2400 movs r4, #0 c9ce: 4b2b ldr r3, [pc, #172] ; (ca7c ) if (usb_high_speed) { c9d0: 4a2b ldr r2, [pc, #172] ; (ca80 ) usb_audio_underrun_count = 0; c9d2: 601c str r4, [r3, #0] usb_audio_overrun_count = 0; c9d4: 600c str r4, [r1, #0] if (usb_high_speed) { c9d6: 7811 ldrb r1, [r2, #0] feedback_accumulator = 739875226; // 44.1 * 2^24 c9d8: 4b2a ldr r3, [pc, #168] ; (ca84 ) if (usb_high_speed) { c9da: 42a1 cmp r1, r4 feedback_accumulator = 739875226; // 44.1 * 2^24 c9dc: 4a2a ldr r2, [pc, #168] ; (ca88 ) usb_audio_sync_nbytes = 4; c9de: 4d2b ldr r5, [pc, #172] ; (ca8c ) memset(&rx_transfer, 0, sizeof(rx_transfer)); c9e0: 4621 mov r1, r4 feedback_accumulator = 739875226; // 44.1 * 2^24 c9e2: 601a str r2, [r3, #0] if (usb_high_speed) { c9e4: bf0b itete eq c9e6: 2303 moveq r3, #3 c9e8: 2304 movne r3, #4 c9ea: 200a moveq r0, #10 c9ec: 2008 movne r0, #8 memset(&rx_transfer, 0, sizeof(rx_transfer)); c9ee: 2220 movs r2, #32 usb_audio_sync_nbytes = 4; c9f0: 702b strb r3, [r5, #0] usb_audio_sync_rshift = 8; c9f2: 4b27 ldr r3, [pc, #156] ; (ca90 ) c9f4: 7018 strb r0, [r3, #0] memset(&rx_transfer, 0, sizeof(rx_transfer)); c9f6: 4827 ldr r0, [pc, #156] ; (ca94 ) c9f8: f001 f89a bl db30 usb_config_rx_iso(AUDIO_RX_ENDPOINT, AUDIO_RX_SIZE, 1, rx_event); c9fc: 2201 movs r2, #1 c9fe: 21b4 movs r1, #180 ; 0xb4 ca00: 2005 movs r0, #5 ca02: 4b25 ldr r3, [pc, #148] ; (ca98 ) ca04: f7ff fca2 bl c34c usb_prepare_transfer(&rx_transfer, rx_buffer, AUDIO_RX_SIZE, 0); ca08: 4623 mov r3, r4 ca0a: 22b4 movs r2, #180 ; 0xb4 ca0c: 4923 ldr r1, [pc, #140] ; (ca9c ) ca0e: 4821 ldr r0, [pc, #132] ; (ca94 ) ca10: f7ff fd04 bl c41c uint32_t location = (uint32_t)addr & 0xFFFFFFE0; ca14: 4b21 ldr r3, [pc, #132] ; (ca9c ) uint32_t end_addr = (uint32_t)addr + size; ca16: f103 01b4 add.w r1, r3, #180 ; 0xb4 asm("dsb"); ca1a: f3bf 8f4f dsb sy SCB_CACHE_DCIMVAC = location; ca1e: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 ca22: f8c2 3f5c str.w r3, [r2, #3932] ; 0xf5c location += 32; ca26: 3320 adds r3, #32 } while (location < end_addr); ca28: 4299 cmp r1, r3 ca2a: d8fa bhi.n ca22 asm("dsb"); ca2c: f3bf 8f4f dsb sy asm("isb"); ca30: f3bf 8f6f isb sy usb_receive(AUDIO_RX_ENDPOINT, &rx_transfer); ca34: 4917 ldr r1, [pc, #92] ; (ca94 ) ca36: 2005 movs r0, #5 ca38: f7ff fd1c bl c474 memset(&sync_transfer, 0, sizeof(sync_transfer)); ca3c: 2220 movs r2, #32 ca3e: 2100 movs r1, #0 ca40: 4817 ldr r0, [pc, #92] ; (caa0 ) ca42: f001 f875 bl db30 usb_config_tx_iso(AUDIO_SYNC_ENDPOINT, usb_audio_sync_nbytes, 1, sync_event); ca46: 4b17 ldr r3, [pc, #92] ; (caa4 ) ca48: 7829 ldrb r1, [r5, #0] ca4a: 2201 movs r2, #1 ca4c: 2006 movs r0, #6 ca4e: f7ff fcaf bl c3b0 sync_event(NULL); ca52: 2000 movs r0, #0 ca54: f7ff fd6a bl c52c memset(&tx_transfer, 0, sizeof(tx_transfer)); ca58: 2220 movs r2, #32 ca5a: 2100 movs r1, #0 ca5c: 4812 ldr r0, [pc, #72] ; (caa8 ) ca5e: f001 f867 bl db30 usb_config_tx_iso(AUDIO_TX_ENDPOINT, AUDIO_TX_SIZE, 1, tx_event); ca62: 2005 movs r0, #5 ca64: 4b11 ldr r3, [pc, #68] ; (caac ) ca66: 2201 movs r2, #1 ca68: 21b4 movs r1, #180 ; 0xb4 ca6a: f7ff fca1 bl c3b0 tx_event(NULL); ca6e: 2000 movs r0, #0 } ca70: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} tx_event(NULL); ca74: f7ff bf78 b.w c968 ca78: 20002db8 .word 0x20002db8 ca7c: 20002dbc .word 0x20002dbc ca80: 20002e13 .word 0x20002e13 ca84: 20002978 .word 0x20002978 ca88: 2c19999a .word 0x2c19999a ca8c: 20002e0e .word 0x20002e0e ca90: 20002e0f .word 0x20002e0f ca94: 20001b60 .word 0x20001b60 ca98: 0000c7f5 .word 0x0000c7f5 ca9c: 20201880 .word 0x20201880 caa0: 20001d40 .word 0x20001d40 caa4: 0000c52d .word 0x0000c52d caa8: 20001d60 .word 0x20001d60 caac: 0000c969 .word 0x0000c969 0000cab0 : }; int usb_audio_get_feature(void *stp, uint8_t *data, uint32_t *datalen) { struct setup_struct setup = *((struct setup_struct *)stp); if (setup.bmRequestType==0xA1) { // should check bRequest, bChannel, and UnitID cab0: 7803 ldrb r3, [r0, #0] cab2: 2ba1 cmp r3, #161 ; 0xa1 cab4: d001 beq.n caba if (setup.bCS==0x01) { // mute data[0] = AudioInputUSB::features.mute; // 1=mute, 0=unmute *datalen = 1; return 1; } else if (setup.bCS==0x02) { // volume cab6: 2000 movs r0, #0 *datalen = 2; return 1; } } return 0; } cab8: 4770 bx lr struct setup_struct setup = *((struct setup_struct *)stp); caba: 78c3 ldrb r3, [r0, #3] cabc: 7840 ldrb r0, [r0, #1] if (setup.bCS==0x01) { // mute cabe: 2b01 cmp r3, #1 cac0: d008 beq.n cad4 else if (setup.bCS==0x02) { // volume cac2: 2b02 cmp r3, #2 cac4: d1f7 bne.n cab6 if (setup.bRequest==0x81) { // GET_CURR cac6: 3881 subs r0, #129 ; 0x81 cac8: 2803 cmp r0, #3 caca: d8f4 bhi.n cab6 cacc: e8df f000 tbb [pc, r0] cad0: 0b13171b .word 0x0b13171b { cad4: b410 push {r4} data[0] = AudioInputUSB::features.mute; // 1=mute, 0=unmute cad6: 4c0e ldr r4, [pc, #56] ; (cb10 ) return 1; cad8: 4618 mov r0, r3 data[0] = AudioInputUSB::features.mute; // 1=mute, 0=unmute cada: 6864 ldr r4, [r4, #4] cadc: 700c strb r4, [r1, #0] } cade: f85d 4b04 ldr.w r4, [sp], #4 *datalen = 1; cae2: 6013 str r3, [r2, #0] } cae4: 4770 bx lr data[0] = 1; // increment vol by by 1 cae6: 2301 movs r3, #1 cae8: 2000 movs r0, #0 caea: 700b strb r3, [r1, #0] *datalen = 2; caec: 2302 movs r3, #2 data[1] = (AudioInputUSB::features.volume>>8) & 0xFF; caee: 7048 strb r0, [r1, #1] return 1; caf0: 2001 movs r0, #1 *datalen = 2; caf2: 6013 str r3, [r2, #0] return 1; caf4: 4770 bx lr data[0] = FEATURE_MAX_VOLUME; // max level, for range of 0 to MAX caf6: 23ff movs r3, #255 ; 0xff caf8: 2000 movs r0, #0 cafa: 700b strb r3, [r1, #0] data[1] = 0; cafc: e7f6 b.n caec data[0] = 0; // min level is 0 cafe: 2300 movs r3, #0 cb00: 4618 mov r0, r3 cb02: 700b strb r3, [r1, #0] data[1] = 0; cb04: e7f2 b.n caec data[0] = AudioInputUSB::features.volume & 0xFF; cb06: 4b02 ldr r3, [pc, #8] ; (cb10 ) cb08: 6898 ldr r0, [r3, #8] cb0a: 7008 strb r0, [r1, #0] data[1] = (AudioInputUSB::features.volume>>8) & 0xFF; cb0c: 7a58 ldrb r0, [r3, #9] cb0e: e7ed b.n caec cb10: 20001098 .word 0x20001098 0000cb14 : int usb_audio_set_feature(void *stp, uint8_t *buf) { struct setup_struct setup = *((struct setup_struct *)stp); if (setup.bmRequestType==0x21) { // should check bRequest, bChannel and UnitID cb14: 7803 ldrb r3, [r0, #0] cb16: 2b21 cmp r3, #33 ; 0x21 cb18: d001 beq.n cb1e AudioInputUSB::features.change = 1; return 1; } } } return 0; cb1a: 2000 movs r0, #0 } cb1c: 4770 bx lr struct setup_struct setup = *((struct setup_struct *)stp); cb1e: 78c3 ldrb r3, [r0, #3] cb20: 7842 ldrb r2, [r0, #1] if (setup.bCS==0x01) { // mute cb22: 2b01 cmp r3, #1 cb24: d009 beq.n cb3a if (setup.bRequest==0x01) { // SET_CUR cb26: 2b02 cmp r3, #2 cb28: d1f7 bne.n cb1a cb2a: 2a01 cmp r2, #1 cb2c: d1f5 bne.n cb1a AudioInputUSB::features.volume = buf[0]; cb2e: 4b07 ldr r3, [pc, #28] ; (cb4c ) return 1; cb30: 4610 mov r0, r2 AudioInputUSB::features.volume = buf[0]; cb32: 7809 ldrb r1, [r1, #0] AudioInputUSB::features.change = 1; cb34: 601a str r2, [r3, #0] AudioInputUSB::features.volume = buf[0]; cb36: 6099 str r1, [r3, #8] return 1; cb38: 4770 bx lr if (setup.bRequest==0x01) { // SET_CUR cb3a: 2a01 cmp r2, #1 cb3c: d1ed bne.n cb1a AudioInputUSB::features.mute = buf[0]; // 1=mute,0=unmute cb3e: 4b03 ldr r3, [pc, #12] ; (cb4c ) return 1; cb40: 4610 mov r0, r2 AudioInputUSB::features.mute = buf[0]; // 1=mute,0=unmute cb42: 7809 ldrb r1, [r1, #0] AudioInputUSB::features.change = 1; cb44: e9c3 2100 strd r2, r1, [r3] return 1; cb48: 4770 bx lr cb4a: bf00 nop cb4c: 20001098 .word 0x20001098 0000cb50 : void usb_init_serialnumber(void) { char buf[11]; uint32_t i, num; num = HW_OCOTP_MAC0 & 0xFFFFFF; cb50: 4a12 ldr r2, [pc, #72] ; (cb9c ) // add extra zero to work around OS-X CDC-ACM driver bug if (num < 10000000) num = num * 10; cb52: 4b13 ldr r3, [pc, #76] ; (cba0 ) num = HW_OCOTP_MAC0 & 0xFFFFFF; cb54: f8d2 0220 ldr.w r0, [r2, #544] ; 0x220 cb58: f020 407f bic.w r0, r0, #4278190080 ; 0xff000000 if (num < 10000000) num = num * 10; cb5c: 4298 cmp r0, r3 { cb5e: b510 push {r4, lr} cb60: b084 sub sp, #16 if (num < 10000000) num = num * 10; cb62: d202 bcs.n cb6a cb64: eb00 0080 add.w r0, r0, r0, lsl #2 cb68: 0040 lsls r0, r0, #1 ultoa(num, buf, 10); cb6a: 4c0e ldr r4, [pc, #56] ; (cba4 ) cb6c: a901 add r1, sp, #4 cb6e: 220a movs r2, #10 cb70: f7fe fcb2 bl b4d8 for (i=0; i<10; i++) { cb74: a901 add r1, sp, #4 cb76: 2300 movs r3, #0 cb78: 4620 mov r0, r4 char c = buf[i]; cb7a: f811 2b01 ldrb.w r2, [r1], #1 for (i=0; i<10; i++) { cb7e: 3301 adds r3, #1 if (!c) break; cb80: b13a cbz r2, cb92 for (i=0; i<10; i++) { cb82: 2b0a cmp r3, #10 usb_string_serial_number_default.wString[i] = c; cb84: f820 2f02 strh.w r2, [r0, #2]! for (i=0; i<10; i++) { cb88: d1f7 bne.n cb7a cb8a: 2316 movs r3, #22 } usb_string_serial_number_default.bLength = i * 2 + 2; cb8c: 7023 strb r3, [r4, #0] } cb8e: b004 add sp, #16 cb90: bd10 pop {r4, pc} usb_string_serial_number_default.bLength = i * 2 + 2; cb92: 005b lsls r3, r3, #1 cb94: b2db uxtb r3, r3 cb96: 7023 strb r3, [r4, #0] } cb98: b004 add sp, #16 cb9a: bd10 pop {r4, pc} cb9c: 401f4400 .word 0x401f4400 cba0: 00989680 .word 0x00989680 cba4: 20001524 .word 0x20001524 0000cba8 : static void rx_queue_transfer(int i) { cba8: b5f8 push {r3, r4, r5, r6, r7, lr} NVIC_DISABLE_IRQ(IRQ_USB1); void *buffer = rx_buffer + i * MIDI_RX_SIZE_480; cbaa: 4c14 ldr r4, [pc, #80] ; (cbfc ) NVIC_DISABLE_IRQ(IRQ_USB1); cbac: f04f 25e0 mov.w r5, #3758153728 ; 0xe000e000 usb_prepare_transfer(rx_transfer + i, buffer, rx_packet_size, i); cbb0: 4e13 ldr r6, [pc, #76] ; (cc00 ) NVIC_DISABLE_IRQ(IRQ_USB1); cbb2: f44f 3200 mov.w r2, #131072 ; 0x20000 void *buffer = rx_buffer + i * MIDI_RX_SIZE_480; cbb6: eb04 2440 add.w r4, r4, r0, lsl #9 usb_prepare_transfer(rx_transfer + i, buffer, rx_packet_size, i); cbba: 4f12 ldr r7, [pc, #72] ; (cc04 ) cbbc: eb06 1640 add.w r6, r6, r0, lsl #5 { cbc0: 4603 mov r3, r0 NVIC_DISABLE_IRQ(IRQ_USB1); cbc2: f8c5 218c str.w r2, [r5, #396] ; 0x18c usb_prepare_transfer(rx_transfer + i, buffer, rx_packet_size, i); cbc6: 4621 mov r1, r4 cbc8: 883a ldrh r2, [r7, #0] cbca: 4630 mov r0, r6 cbcc: f7ff fc26 bl c41c arm_dcache_delete(buffer, rx_packet_size); cbd0: 883b ldrh r3, [r7, #0] uint32_t end_addr = (uint32_t)addr + size; cbd2: 4423 add r3, r4 asm("dsb"); cbd4: f3bf 8f4f dsb sy SCB_CACHE_DCIMVAC = location; cbd8: f8c5 4f5c str.w r4, [r5, #3932] ; 0xf5c location += 32; cbdc: 3420 adds r4, #32 } while (location < end_addr); cbde: 42a3 cmp r3, r4 cbe0: d8fa bhi.n cbd8 asm("dsb"); cbe2: f3bf 8f4f dsb sy asm("isb"); cbe6: f3bf 8f6f isb sy usb_receive(MIDI_RX_ENDPOINT, rx_transfer + i); cbea: 2004 movs r0, #4 cbec: 4631 mov r1, r6 cbee: f7ff fc41 bl c474 NVIC_ENABLE_IRQ(IRQ_USB1); cbf2: f44f 3300 mov.w r3, #131072 ; 0x20000 cbf6: f8c5 310c str.w r3, [r5, #268] ; 0x10c } cbfa: bdf8 pop {r3, r4, r5, r6, r7, pc} cbfc: 20201b60 .word 0x20201b60 cc00: 20001b80 .word 0x20001b80 cc04: 20002de6 .word 0x20002de6 0000cc08 : // called by USB interrupt when any packet is received static void rx_event(transfer_t *t) { int len = rx_packet_size - ((t->status >> 16) & 0x7FFF); cc08: 6842 ldr r2, [r0, #4] len &= 0xFFFC; // MIDI packets must be multiple of 4 bytes cc0a: f64f 71fc movw r1, #65532 ; 0xfffc int len = rx_packet_size - ((t->status >> 16) & 0x7FFF); cc0e: 4b11 ldr r3, [pc, #68] ; (cc54 ) cc10: f3c2 420e ubfx r2, r2, #16, #15 int i = t->callback_param; cc14: 69c0 ldr r0, [r0, #28] int len = rx_packet_size - ((t->status >> 16) & 0x7FFF); cc16: 881b ldrh r3, [r3, #0] cc18: 1a9b subs r3, r3, r2 printf("rx event, len=%d, i=%d\n", len, i); if (len > 0) { cc1a: 400b ands r3, r1 cc1c: d017 beq.n cc4e uint32_t head = rx_head; rx_count[i] = len; cc1e: 490e ldr r1, [pc, #56] ; (cc58 ) { cc20: b430 push {r4, r5} uint32_t head = rx_head; cc22: 4c0e ldr r4, [pc, #56] ; (cc5c ) rx_index[i] = 0; cc24: 4d0e ldr r5, [pc, #56] ; (cc60 ) uint32_t head = rx_head; cc26: 7822 ldrb r2, [r4, #0] rx_count[i] = len; cc28: f821 3010 strh.w r3, [r1, r0, lsl #1] rx_index[i] = 0; cc2c: 2100 movs r1, #0 if (++head > RX_NUM) head = 0; cc2e: 3201 adds r2, #1 rx_index[i] = 0; cc30: f825 1010 strh.w r1, [r5, r0, lsl #1] if (++head > RX_NUM) head = 0; cc34: 2a06 cmp r2, #6 rx_list[head] = i; rx_head = head; cc36: bf94 ite ls cc38: b2d1 uxtbls r1, r2 if (++head > RX_NUM) head = 0; cc3a: 460a movhi r2, r1 rx_head = head; cc3c: 7021 strb r1, [r4, #0] rx_available += len; cc3e: 4909 ldr r1, [pc, #36] ; (cc64 ) cc40: 680c ldr r4, [r1, #0] cc42: 4423 add r3, r4 cc44: 600b str r3, [r1, #0] rx_list[head] = i; cc46: 4b08 ldr r3, [pc, #32] ; (cc68 ) cc48: 5498 strb r0, [r3, r2] } else { // received a zero length packet rx_queue_transfer(i); } } cc4a: bc30 pop {r4, r5} cc4c: 4770 bx lr rx_queue_transfer(i); cc4e: f7ff bfab b.w cba8 cc52: bf00 nop cc54: 20002de6 .word 0x20002de6 cc58: 20002d28 .word 0x20002d28 cc5c: 20002e01 .word 0x20002e01 cc60: 20002d44 .word 0x20002d44 cc64: 20002d20 .word 0x20002d20 cc68: 20002d60 .word 0x20002d60 0000cc6c : if (usb_high_speed) { cc6c: 4b21 ldr r3, [pc, #132] ; (ccf4 ) { cc6e: b570 push {r4, r5, r6, lr} if (usb_high_speed) { cc70: 781b ldrb r3, [r3, #0] cc72: 2b00 cmp r3, #0 cc74: d03b beq.n ccee cc76: f44f 7300 mov.w r3, #512 ; 0x200 cc7a: 461e mov r6, r3 rx_packet_size = MIDI_RX_SIZE_480; cc7c: 491e ldr r1, [pc, #120] ; (ccf8 ) memset(tx_transfer, 0, sizeof(tx_transfer)); cc7e: 2280 movs r2, #128 ; 0x80 tx_packet_size = MIDI_TX_SIZE_480; cc80: 4d1e ldr r5, [pc, #120] ; (ccfc ) tx_head = 0; cc82: 2400 movs r4, #0 rx_packet_size = MIDI_RX_SIZE_480; cc84: 800b strh r3, [r1, #0] memset(tx_transfer, 0, sizeof(tx_transfer)); cc86: 2100 movs r1, #0 cc88: 481d ldr r0, [pc, #116] ; (cd00 ) tx_packet_size = MIDI_TX_SIZE_480; cc8a: 802b strh r3, [r5, #0] memset(tx_transfer, 0, sizeof(tx_transfer)); cc8c: f000 ff50 bl db30 tx_head = 0; cc90: 4a1c ldr r2, [pc, #112] ; (cd04 ) memset(rx_transfer, 0, sizeof(rx_transfer)); cc92: 4621 mov r1, r4 tx_available = 0; cc94: 4b1c ldr r3, [pc, #112] ; (cd08 ) tx_head = 0; cc96: 7014 strb r4, [r2, #0] memset(rx_transfer, 0, sizeof(rx_transfer)); cc98: 22c0 movs r2, #192 ; 0xc0 cc9a: 481c ldr r0, [pc, #112] ; (cd0c ) tx_available = 0; cc9c: 801c strh r4, [r3, #0] memset(rx_transfer, 0, sizeof(rx_transfer)); cc9e: f000 ff47 bl db30 memset(rx_count, 0, sizeof(rx_count)); cca2: 4a1b ldr r2, [pc, #108] ; (cd10 ) usb_config_rx(MIDI_RX_ENDPOINT, rx_packet_size, 0, rx_event); cca4: 4631 mov r1, r6 memset(rx_index, 0, sizeof(rx_index)); cca6: 4b1b ldr r3, [pc, #108] ; (cd14 ) usb_config_rx(MIDI_RX_ENDPOINT, rx_packet_size, 0, rx_event); cca8: 2004 movs r0, #4 memset(rx_count, 0, sizeof(rx_count)); ccaa: 6094 str r4, [r2, #8] memset(rx_index, 0, sizeof(rx_index)); ccac: 609c str r4, [r3, #8] memset(rx_count, 0, sizeof(rx_count)); ccae: e9c2 4400 strd r4, r4, [r2] rx_head = 0; ccb2: 4a19 ldr r2, [pc, #100] ; (cd18 ) memset(rx_index, 0, sizeof(rx_index)); ccb4: e9c3 4400 strd r4, r4, [r3] rx_head = 0; ccb8: 7014 strb r4, [r2, #0] rx_tail = 0; ccba: 4b18 ldr r3, [pc, #96] ; (cd1c ) rx_available = 0; ccbc: 4a18 ldr r2, [pc, #96] ; (cd20 ) rx_tail = 0; ccbe: 701c strb r4, [r3, #0] usb_config_rx(MIDI_RX_ENDPOINT, rx_packet_size, 0, rx_event); ccc0: 4b18 ldr r3, [pc, #96] ; (cd24 ) rx_available = 0; ccc2: 6014 str r4, [r2, #0] usb_config_rx(MIDI_RX_ENDPOINT, rx_packet_size, 0, rx_event); ccc4: 4622 mov r2, r4 ccc6: f7ff fadd bl c284 usb_config_tx(MIDI_TX_ENDPOINT, tx_packet_size, 0, NULL); // TODO: is ZLP needed? ccca: 4623 mov r3, r4 cccc: 4622 mov r2, r4 ccce: 8829 ldrh r1, [r5, #0] ccd0: 2004 movs r0, #4 ccd2: f7ff fb09 bl c2e8 for (i=0; i < RX_NUM; i++) rx_queue_transfer(i); ccd6: 4620 mov r0, r4 ccd8: 3401 adds r4, #1 ccda: f7ff ff65 bl cba8 ccde: 2c06 cmp r4, #6 cce0: d1f9 bne.n ccd6 transmit_previous_timeout = 0; cce2: 2300 movs r3, #0 cce4: 4910 ldr r1, [pc, #64] ; (cd28 ) tx_noautoflush = 0; cce6: 4a11 ldr r2, [pc, #68] ; (cd2c ) transmit_previous_timeout = 0; cce8: 700b strb r3, [r1, #0] tx_noautoflush = 0; ccea: 7013 strb r3, [r2, #0] } ccec: bd70 pop {r4, r5, r6, pc} ccee: 2340 movs r3, #64 ; 0x40 ccf0: 461e mov r6, r3 ccf2: e7c3 b.n cc7c ccf4: 20002e13 .word 0x20002e13 ccf8: 20002de6 .word 0x20002de6 ccfc: 20002dee .word 0x20002dee cd00: 20001d80 .word 0x20001d80 cd04: 20002e09 .word 0x20002e09 cd08: 20002dea .word 0x20002dea cd0c: 20001b80 .word 0x20001b80 cd10: 20002d28 .word 0x20002d28 cd14: 20002d44 .word 0x20002d44 cd18: 20002e01 .word 0x20002e01 cd1c: 20002e03 .word 0x20002e03 cd20: 20002d20 .word 0x20002d20 cd24: 0000cc09 .word 0x0000cc09 cd28: 20002e07 .word 0x20002e07 cd2c: 20002e0b .word 0x20002e0b 0000cd30 : { cd30: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} if (tx_noautoflush == 0 && tx_available > 0) { cd34: 4b21 ldr r3, [pc, #132] ; (cdbc ) cd36: 781d ldrb r5, [r3, #0] cd38: b915 cbnz r5, cd40 cd3a: 4e21 ldr r6, [pc, #132] ; (cdc0 ) cd3c: 8833 ldrh r3, [r6, #0] cd3e: b90b cbnz r3, cd44 } cd40: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} uint32_t head = tx_head; cd44: f8df 8088 ldr.w r8, [pc, #136] ; cdd0 transfer_t *xfer = tx_transfer + head; cd48: 4a1e ldr r2, [pc, #120] ; (cdc4 ) uint32_t head = tx_head; cd4a: f898 7000 ldrb.w r7, [r8] uint8_t *txbuf = txbuffer + (head * TX_SIZE); cd4e: 4c1e ldr r4, [pc, #120] ; (cdc8 ) transfer_t *xfer = tx_transfer + head; cd50: eb02 1947 add.w r9, r2, r7, lsl #5 uint32_t len = tx_packet_size - tx_available; cd54: 4a1d ldr r2, [pc, #116] ; (cdcc ) uint8_t *txbuf = txbuffer + (head * TX_SIZE); cd56: eb04 2447 add.w r4, r4, r7, lsl #9 uint32_t len = tx_packet_size - tx_available; cd5a: 8812 ldrh r2, [r2, #0] usb_prepare_transfer(xfer, txbuf, len, 0); cd5c: 4648 mov r0, r9 cd5e: 4621 mov r1, r4 cd60: 1ad2 subs r2, r2, r3 cd62: 462b mov r3, r5 cd64: f7ff fb5a bl c41c asm("dsb"); cd68: f3bf 8f4f dsb sy cd6c: f104 0220 add.w r2, r4, #32 uint32_t end_addr = (uint32_t)addr + size; cd70: f504 7300 add.w r3, r4, #512 ; 0x200 cd74: 4293 cmp r3, r2 cd76: bf34 ite cc cd78: 2301 movcc r3, #1 cd7a: 2310 movcs r3, #16 SCB_CACHE_DCCIMVAC = location; cd7c: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 cd80: eb04 1343 add.w r3, r4, r3, lsl #5 cd84: f8c2 4f70 str.w r4, [r2, #3952] ; 0xf70 location += 32; cd88: 3420 adds r4, #32 } while (location < end_addr); cd8a: 429c cmp r4, r3 cd8c: d1fa bne.n cd84 asm("dsb"); cd8e: f3bf 8f4f dsb sy asm("isb"); cd92: f3bf 8f6f isb sy if (++head >= TX_NUM) head = 0; cd96: 3701 adds r7, #1 usb_transmit(MIDI_TX_ENDPOINT, xfer); cd98: 4649 mov r1, r9 cd9a: 2004 movs r0, #4 cd9c: f7ff fb56 bl c44c if (++head >= TX_NUM) head = 0; cda0: 2f03 cmp r7, #3 tx_available = 0; cda2: f04f 0300 mov.w r3, #0 usb_stop_sof_interrupts(MIDI_INTERFACE); cda6: f04f 0002 mov.w r0, #2 tx_head = head; cdaa: bf98 it ls cdac: b2fd uxtbls r5, r7 tx_available = 0; cdae: 8033 strh r3, [r6, #0] tx_head = head; cdb0: f888 5000 strb.w r5, [r8] } cdb4: e8bd 43f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, lr} usb_stop_sof_interrupts(MIDI_INTERFACE); cdb8: f7fe beae b.w bb18 cdbc: 20002e0b .word 0x20002e0b cdc0: 20002dea .word 0x20002dea cdc4: 20001d80 .word 0x20001d80 cdc8: 20202760 .word 0x20202760 cdcc: 20002dee .word 0x20002dee cdd0: 20002e09 .word 0x20002e09 0000cdd4 : /*************************************************************************/ /** Receive **/ /*************************************************************************/ static void rx_queue_transfer(int i) { cdd4: b5f8 push {r3, r4, r5, r6, r7, lr} NVIC_DISABLE_IRQ(IRQ_USB1); printf("rx queue i=%d\n", i); void *buffer = rx_buffer + i * CDC_RX_SIZE_480; cdd6: 4c14 ldr r4, [pc, #80] ; (ce28 ) NVIC_DISABLE_IRQ(IRQ_USB1); cdd8: f04f 25e0 mov.w r5, #3758153728 ; 0xe000e000 usb_prepare_transfer(rx_transfer + i, buffer, rx_packet_size, i); cddc: 4e13 ldr r6, [pc, #76] ; (ce2c ) NVIC_DISABLE_IRQ(IRQ_USB1); cdde: f44f 3200 mov.w r2, #131072 ; 0x20000 void *buffer = rx_buffer + i * CDC_RX_SIZE_480; cde2: eb04 2440 add.w r4, r4, r0, lsl #9 usb_prepare_transfer(rx_transfer + i, buffer, rx_packet_size, i); cde6: 4f12 ldr r7, [pc, #72] ; (ce30 ) cde8: eb06 1640 add.w r6, r6, r0, lsl #5 { cdec: 4603 mov r3, r0 NVIC_DISABLE_IRQ(IRQ_USB1); cdee: f8c5 218c str.w r2, [r5, #396] ; 0x18c usb_prepare_transfer(rx_transfer + i, buffer, rx_packet_size, i); cdf2: 4621 mov r1, r4 cdf4: 883a ldrh r2, [r7, #0] cdf6: 4630 mov r0, r6 cdf8: f7ff fb10 bl c41c arm_dcache_delete(buffer, rx_packet_size); cdfc: 883b ldrh r3, [r7, #0] uint32_t end_addr = (uint32_t)addr + size; cdfe: 4423 add r3, r4 asm("dsb"); ce00: f3bf 8f4f dsb sy SCB_CACHE_DCIMVAC = location; ce04: f8c5 4f5c str.w r4, [r5, #3932] ; 0xf5c location += 32; ce08: 3420 adds r4, #32 } while (location < end_addr); ce0a: 42a3 cmp r3, r4 ce0c: d8fa bhi.n ce04 asm("dsb"); ce0e: f3bf 8f4f dsb sy asm("isb"); ce12: f3bf 8f6f isb sy usb_receive(CDC_RX_ENDPOINT, rx_transfer + i); ce16: 2003 movs r0, #3 ce18: 4631 mov r1, r6 ce1a: f7ff fb2b bl c474 NVIC_ENABLE_IRQ(IRQ_USB1); ce1e: f44f 3300 mov.w r3, #131072 ; 0x20000 ce22: f8c5 310c str.w r3, [r5, #268] ; 0x10c } ce26: bdf8 pop {r3, r4, r5, r6, r7, pc} ce28: 20202f60 .word 0x20202f60 ce2c: 20001c40 .word 0x20001c40 ce30: 20002de8 .word 0x20002de8 0000ce34 : // called by USB interrupt when any packet is received static void rx_event(transfer_t *t) { int len = rx_packet_size - ((t->status >> 16) & 0x7FFF); ce34: 4b24 ldr r3, [pc, #144] ; (cec8 ) { ce36: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} int len = rx_packet_size - ((t->status >> 16) & 0x7FFF); ce3a: 881c ldrh r4, [r3, #0] ce3c: 6843 ldr r3, [r0, #4] int i = t->callback_param; ce3e: 69c5 ldr r5, [r0, #28] int len = rx_packet_size - ((t->status >> 16) & 0x7FFF); ce40: f3c3 430e ubfx r3, r3, #16, #15 ce44: 1ae4 subs r4, r4, r3 printf("rx event, len=%d, i=%d\n", len, i); if (len > 0) { ce46: 2c00 cmp r4, #0 ce48: dd24 ble.n ce94 // received a packet with data uint32_t head = rx_head; ce4a: 4920 ldr r1, [pc, #128] ; (cecc ) if (head != rx_tail) { ce4c: 4820 ldr r0, [pc, #128] ; (ced0 ) uint32_t head = rx_head; ce4e: 780a ldrb r2, [r1, #0] if (head != rx_tail) { ce50: 7800 ldrb r0, [r0, #0] uint32_t head = rx_head; ce52: b2d3 uxtb r3, r2 // a previous packet is still buffered uint32_t ii = rx_list[head]; uint32_t count = rx_count[ii]; ce54: 4e1f ldr r6, [pc, #124] ; (ced4 ) if (head != rx_tail) { ce56: 4282 cmp r2, r0 uint32_t ii = rx_list[head]; ce58: 481f ldr r0, [pc, #124] ; (ced8 ) if (head != rx_tail) { ce5a: d007 beq.n ce6c uint32_t ii = rx_list[head]; ce5c: f810 8003 ldrb.w r8, [r0, r3] uint32_t count = rx_count[ii]; ce60: f836 7018 ldrh.w r7, [r6, r8, lsl #1] if (len <= CDC_RX_SIZE_480 - count) { ce64: f5c7 7200 rsb r2, r7, #512 ; 0x200 ce68: 4294 cmp r4, r2 ce6a: d918 bls.n ce9e } } // add this packet to rx_list rx_count[i] = len; rx_index[i] = 0; if (++head > RX_NUM) head = 0; ce6c: 3301 adds r3, #1 rx_index[i] = 0; ce6e: 2200 movs r2, #0 rx_count[i] = len; ce70: f826 4015 strh.w r4, [r6, r5, lsl #1] if (++head > RX_NUM) head = 0; ce74: 2b08 cmp r3, #8 rx_index[i] = 0; ce76: 4e19 ldr r6, [pc, #100] ; (cedc ) if (++head > RX_NUM) head = 0; ce78: bf88 it hi ce7a: 4613 movhi r3, r2 rx_index[i] = 0; ce7c: f826 2015 strh.w r2, [r6, r5, lsl #1] rx_list[head] = i; rx_head = head; ce80: bf98 it ls ce82: b2da uxtbls r2, r3 rx_list[head] = i; ce84: 54c5 strb r5, [r0, r3] rx_available += len; ce86: 4b16 ldr r3, [pc, #88] ; (cee0 ) rx_head = head; ce88: 700a strb r2, [r1, #0] rx_available += len; ce8a: 681a ldr r2, [r3, #0] ce8c: 4414 add r4, r2 ce8e: 601c str r4, [r3, #0] // TODO: trigger serialEvent } else { // received a zero length packet rx_queue_transfer(i); } } ce90: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} rx_queue_transfer(i); ce94: 4628 mov r0, r5 } ce96: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} rx_queue_transfer(i); ce9a: f7ff bf9b b.w cdd4 memcpy(rx_buffer + ii * CDC_RX_SIZE_480 + count, ce9e: eb07 2048 add.w r0, r7, r8, lsl #9 cea2: 4910 ldr r1, [pc, #64] ; (cee4 ) cea4: 4622 mov r2, r4 rx_count[ii] = count + len; cea6: 4427 add r7, r4 memcpy(rx_buffer + ii * CDC_RX_SIZE_480 + count, cea8: 4408 add r0, r1 ceaa: eb01 2145 add.w r1, r1, r5, lsl #9 ceae: f7fe fa75 bl b39c rx_available += len; ceb2: 4a0b ldr r2, [pc, #44] ; (cee0 ) rx_queue_transfer(i); ceb4: 4628 mov r0, r5 rx_count[ii] = count + len; ceb6: f826 7018 strh.w r7, [r6, r8, lsl #1] rx_available += len; ceba: 6813 ldr r3, [r2, #0] cebc: 4423 add r3, r4 } cebe: e8bd 41f0 ldmia.w sp!, {r4, r5, r6, r7, r8, lr} rx_available += len; cec2: 6013 str r3, [r2, #0] rx_queue_transfer(i); cec4: f7ff bf86 b.w cdd4 cec8: 20002de8 .word 0x20002de8 cecc: 20002e02 .word 0x20002e02 ced0: 20002e04 .word 0x20002e04 ced4: 20002d34 .word 0x20002d34 ced8: 20002d68 .word 0x20002d68 cedc: 20002d50 .word 0x20002d50 cee0: 20002d24 .word 0x20002d24 cee4: 20202f60 .word 0x20202f60 0000cee8 : tx_noautoflush = 0; } static void usb_serial_flush_callback(void) { if (tx_noautoflush) return; cee8: 4b1d ldr r3, [pc, #116] ; (cf60 ) ceea: 781a ldrb r2, [r3, #0] ceec: 2a00 cmp r2, #0 ceee: d136 bne.n cf5e if (!usb_configuration) return; cef0: f002 03ff and.w r3, r2, #255 ; 0xff cef4: 4a1b ldr r2, [pc, #108] ; (cf64 ) cef6: 7812 ldrb r2, [r2, #0] cef8: b38a cbz r2, cf5e { cefa: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} if (tx_available == 0) return; cefe: 4d1a ldr r5, [pc, #104] ; (cf68 ) cf00: 882a ldrh r2, [r5, #0] cf02: b352 cbz r2, cf5a //printf("flush callback, %d bytes\n", TX_SIZE - tx_available); transfer_t *xfer = tx_transfer + tx_head; cf04: 4e19 ldr r6, [pc, #100] ; (cf6c ) uint8_t *txbuf = txbuffer + (tx_head * TX_SIZE); uint32_t txnum = TX_SIZE - tx_available; cf06: f5c2 6800 rsb r8, r2, #2048 ; 0x800 transfer_t *xfer = tx_transfer + tx_head; cf0a: 4f19 ldr r7, [pc, #100] ; (cf70 ) cf0c: 7832 ldrb r2, [r6, #0] uint8_t *txbuf = txbuffer + (tx_head * TX_SIZE); cf0e: 4c19 ldr r4, [pc, #100] ; (cf74 ) transfer_t *xfer = tx_transfer + tx_head; cf10: eb07 1742 add.w r7, r7, r2, lsl #5 uint8_t *txbuf = txbuffer + (tx_head * TX_SIZE); cf14: eb04 24c2 add.w r4, r4, r2, lsl #11 usb_prepare_transfer(xfer, txbuf, txnum, 0); cf18: 4642 mov r2, r8 cf1a: 4638 mov r0, r7 cf1c: 4621 mov r1, r4 cf1e: f7ff fa7d bl c41c uint32_t end_addr = (uint32_t)addr + size; cf22: eb04 0208 add.w r2, r4, r8 asm("dsb"); cf26: f3bf 8f4f dsb sy SCB_CACHE_DCCIMVAC = location; cf2a: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 cf2e: f8c3 4f70 str.w r4, [r3, #3952] ; 0xf70 location += 32; cf32: 3420 adds r4, #32 } while (location < end_addr); cf34: 42a2 cmp r2, r4 cf36: d8fa bhi.n cf2e asm("dsb"); cf38: f3bf 8f4f dsb sy asm("isb"); cf3c: f3bf 8f6f isb sy arm_dcache_flush_delete(txbuf, txnum); usb_transmit(CDC_TX_ENDPOINT, xfer); cf40: 2003 movs r0, #3 cf42: 4639 mov r1, r7 cf44: f7ff fa82 bl c44c if (++tx_head >= TX_NUM) tx_head = 0; cf48: 7833 ldrb r3, [r6, #0] cf4a: 3301 adds r3, #1 cf4c: b2db uxtb r3, r3 cf4e: 2b03 cmp r3, #3 cf50: bf88 it hi cf52: 2300 movhi r3, #0 cf54: 7033 strb r3, [r6, #0] tx_available = 0; cf56: 2300 movs r3, #0 cf58: 802b strh r3, [r5, #0] } cf5a: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} cf5e: 4770 bx lr cf60: 20002e0c .word 0x20002e0c cf64: 20002e12 .word 0x20002e12 cf68: 20002dec .word 0x20002dec cf6c: 20002e0a .word 0x20002e0a cf70: 20001e00 .word 0x20001e00 cf74: 20203f60 .word 0x20203f60 0000cf78 : int usb_serial_write(const void *buffer, uint32_t size) cf78: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} cf7c: b085 sub sp, #20 while (size > 0) { cf7e: e9cd 1001 strd r1, r0, [sp, #4] cf82: 2900 cmp r1, #0 cf84: f000 80bf beq.w d106 uint32_t sent=0; cf88: 2300 movs r3, #0 cf8a: 4c60 ldr r4, [pc, #384] ; (d10c ) cf8c: f8df 8198 ldr.w r8, [pc, #408] ; d128 cf90: f8df a198 ldr.w sl, [pc, #408] ; d12c wait_begin_at = systick_millis_count; cf94: 4f5e ldr r7, [pc, #376] ; (d110 ) uint32_t sent=0; cf96: 9300 str r3, [sp, #0] tx_noautoflush = 1; cf98: 2301 movs r3, #1 transfer_t *xfer = tx_transfer + tx_head; cf9a: 4a5e ldr r2, [pc, #376] ; (d114 ) tx_noautoflush = 1; cf9c: 7023 strb r3, [r4, #0] transfer_t *xfer = tx_transfer + tx_head; cf9e: 4b5e ldr r3, [pc, #376] ; (d118 ) cfa0: 7819 ldrb r1, [r3, #0] while (!tx_available) { cfa2: f8b8 3000 ldrh.w r3, [r8] transfer_t *xfer = tx_transfer + tx_head; cfa6: eb02 1941 add.w r9, r2, r1, lsl #5 while (!tx_available) { cfaa: 2b00 cmp r3, #0 cfac: f040 80a7 bne.w d0fe uint32_t wait_begin_at=0; cfb0: 461e mov r6, r3 int waiting=0; cfb2: 461d mov r5, r3 tx_noautoflush = 0; cfb4: 469b mov fp, r3 uint32_t status = usb_transfer_status(xfer); cfb6: 4648 mov r0, r9 cfb8: f7ff fa6a bl c490 if (!(status & 0x80)) { cfbc: f010 0080 ands.w r0, r0, #128 ; 0x80 cfc0: f000 808c beq.w d0dc asm("dsb" ::: "memory"); cfc4: f3bf 8f4f dsb sy if (transmit_previous_timeout) return sent; cfc8: f89a 3000 ldrb.w r3, [sl] tx_noautoflush = 0; cfcc: f884 b000 strb.w fp, [r4] if (!waiting) { cfd0: b905 cbnz r5, cfd4 wait_begin_at = systick_millis_count; cfd2: 683e ldr r6, [r7, #0] if (transmit_previous_timeout) return sent; cfd4: 2b00 cmp r3, #0 cfd6: d17d bne.n d0d4 if (systick_millis_count - wait_begin_at > TX_TIMEOUT_MSEC) { cfd8: 683b ldr r3, [r7, #0] cfda: 1b9b subs r3, r3, r6 cfdc: 2b78 cmp r3, #120 ; 0x78 cfde: f200 8087 bhi.w d0f0 if (!usb_configuration) return sent; cfe2: 4b4e ldr r3, [pc, #312] ; (d11c ) cfe4: 781b ldrb r3, [r3, #0] cfe6: 2b00 cmp r3, #0 cfe8: d074 beq.n d0d4 yield(); cfea: f000 f9c5 bl d378 tx_noautoflush = 1; cfee: 2201 movs r2, #1 while (!tx_available) { cff0: f8b8 3000 ldrh.w r3, [r8] cff4: 4615 mov r5, r2 tx_noautoflush = 1; cff6: 7022 strb r2, [r4, #0] while (!tx_available) { cff8: 2b00 cmp r3, #0 cffa: d0dc beq.n cfb6 uint8_t *txdata = txbuffer + (tx_head * TX_SIZE) + (TX_SIZE - tx_available); cffc: 4a46 ldr r2, [pc, #280] ; (d118 ) cffe: f5c3 6000 rsb r0, r3, #2048 ; 0x800 d002: 7811 ldrb r1, [r2, #0] d004: 461a mov r2, r3 d006: eb00 20c1 add.w r0, r0, r1, lsl #11 d00a: 4d45 ldr r5, [pc, #276] ; (d120 ) d00c: 02c9 lsls r1, r1, #11 d00e: 4428 add r0, r5 if (size >= tx_available) { d010: 9d01 ldr r5, [sp, #4] d012: 4295 cmp r5, r2 d014: d217 bcs.n d046 memcpy(txdata, data, size); d016: 9303 str r3, [sp, #12] d018: e9dd 5101 ldrd r5, r1, [sp, #4] d01c: 462a mov r2, r5 d01e: f7fe f9bd bl b39c tx_available -= size; d022: 9b03 ldr r3, [sp, #12] USB1_GPTIMER0CTRL = USB_GPTIMERCTRL_GPTRUN | USB_GPTIMERCTRL_GPTRST; d024: f04f 4240 mov.w r2, #3221225472 ; 0xc0000000 tx_available -= size; d028: 1b5b subs r3, r3, r5 d02a: f8a8 3000 strh.w r3, [r8] USB1_GPTIMER0CTRL = USB_GPTIMERCTRL_GPTRUN | USB_GPTIMERCTRL_GPTRST; d02e: 4b3d ldr r3, [pc, #244] ; (d124 ) d030: f8c3 2084 str.w r2, [r3, #132] ; 0x84 asm("dsb" ::: "memory"); d034: f3bf 8f4f dsb sy sent += size; d038: 9800 ldr r0, [sp, #0] tx_noautoflush = 0; d03a: 2300 movs r3, #0 sent += size; d03c: 4428 add r0, r5 tx_noautoflush = 0; d03e: 7023 strb r3, [r4, #0] } d040: b005 add sp, #20 d042: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} uint8_t *txbuf = txbuffer + (tx_head * TX_SIZE); d046: 4b36 ldr r3, [pc, #216] ; (d120 ) d048: 18cd adds r5, r1, r3 memcpy(txdata, data, tx_available); d04a: 9902 ldr r1, [sp, #8] d04c: f7fe f9a6 bl b39c usb_prepare_transfer(xfer, txbuf, TX_SIZE, 0); d050: 2300 movs r3, #0 d052: f44f 6200 mov.w r2, #2048 ; 0x800 d056: 4629 mov r1, r5 d058: 4648 mov r0, r9 d05a: f7ff f9df bl c41c asm("dsb"); d05e: f3bf 8f4f dsb sy d062: f105 0220 add.w r2, r5, #32 uint32_t end_addr = (uint32_t)addr + size; d066: f505 6300 add.w r3, r5, #2048 ; 0x800 d06a: 4293 cmp r3, r2 d06c: bf34 ite cc d06e: 2301 movcc r3, #1 d070: 2340 movcs r3, #64 ; 0x40 SCB_CACHE_DCCIMVAC = location; d072: f04f 22e0 mov.w r2, #3758153728 ; 0xe000e000 d076: eb05 1343 add.w r3, r5, r3, lsl #5 d07a: f8c2 5f70 str.w r5, [r2, #3952] ; 0xf70 location += 32; d07e: 3520 adds r5, #32 } while (location < end_addr); d080: 42ab cmp r3, r5 d082: d1fa bne.n d07a asm("dsb"); d084: f3bf 8f4f dsb sy asm("isb"); d088: f3bf 8f6f isb sy usb_transmit(CDC_TX_ENDPOINT, xfer); d08c: 2003 movs r0, #3 d08e: 4649 mov r1, r9 d090: f7ff f9dc bl c44c if (++tx_head >= TX_NUM) tx_head = 0; d094: 4a20 ldr r2, [pc, #128] ; (d118 ) d096: 7813 ldrb r3, [r2, #0] d098: 3301 adds r3, #1 d09a: b2db uxtb r3, r3 d09c: 2b03 cmp r3, #3 d09e: bf84 itt hi d0a0: 2300 movhi r3, #0 d0a2: 4a1d ldrhi r2, [pc, #116] ; (d118 ) d0a4: 7013 strb r3, [r2, #0] size -= tx_available; d0a6: f8b8 3000 ldrh.w r3, [r8] d0aa: 9a01 ldr r2, [sp, #4] d0ac: 1ad1 subs r1, r2, r3 sent += tx_available; d0ae: 9a00 ldr r2, [sp, #0] d0b0: 441a add r2, r3 size -= tx_available; d0b2: 9101 str r1, [sp, #4] sent += tx_available; d0b4: 9200 str r2, [sp, #0] data += tx_available; d0b6: 9a02 ldr r2, [sp, #8] d0b8: 441a add r2, r3 tx_available = 0; d0ba: 2300 movs r3, #0 data += tx_available; d0bc: 9202 str r2, [sp, #8] USB1_GPTIMER0CTRL = 0; d0be: 4a19 ldr r2, [pc, #100] ; (d124 ) tx_available = 0; d0c0: f8a8 3000 strh.w r3, [r8] USB1_GPTIMER0CTRL = 0; d0c4: f8c2 3084 str.w r3, [r2, #132] ; 0x84 asm("dsb" ::: "memory"); d0c8: f3bf 8f4f dsb sy tx_noautoflush = 0; d0cc: 7023 strb r3, [r4, #0] while (size > 0) { d0ce: 2900 cmp r1, #0 d0d0: f47f af62 bne.w cf98 return sent; d0d4: 9800 ldr r0, [sp, #0] } d0d6: b005 add sp, #20 d0d8: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} tx_available = TX_SIZE; d0dc: f44f 6200 mov.w r2, #2048 ; 0x800 uint8_t *txdata = txbuffer + (tx_head * TX_SIZE) + (TX_SIZE - tx_available); d0e0: 4b0d ldr r3, [pc, #52] ; (d118 ) transmit_previous_timeout = 0; d0e2: f88a 0000 strb.w r0, [sl] uint8_t *txdata = txbuffer + (tx_head * TX_SIZE) + (TX_SIZE - tx_available); d0e6: 7819 ldrb r1, [r3, #0] break; d0e8: 4613 mov r3, r2 tx_available = TX_SIZE; d0ea: f8a8 2000 strh.w r2, [r8] break; d0ee: e78a b.n d006 transmit_previous_timeout = 1; d0f0: 2301 movs r3, #1 return sent; d0f2: 9800 ldr r0, [sp, #0] transmit_previous_timeout = 1; d0f4: f88a 3000 strb.w r3, [sl] } d0f8: b005 add sp, #20 d0fa: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} uint8_t *txdata = txbuffer + (tx_head * TX_SIZE) + (TX_SIZE - tx_available); d0fe: 461a mov r2, r3 d100: f5c3 6000 rsb r0, r3, #2048 ; 0x800 d104: e77f b.n d006 while (size > 0) { d106: 9801 ldr r0, [sp, #4] return sent; d108: e7e5 b.n d0d6 d10a: bf00 nop d10c: 20002e0c .word 0x20002e0c d110: 20002d90 .word 0x20002d90 d114: 20001e00 .word 0x20001e00 d118: 20002e0a .word 0x20002e0a d11c: 20002e12 .word 0x20002e12 d120: 20203f60 .word 0x20203f60 d124: 402e0000 .word 0x402e0000 d128: 20002dec .word 0x20002dec d12c: 20002e08 .word 0x20002e08 0000d130 : } d130: 4770 bx lr d132: bf00 nop 0000d134 : if (usb_high_speed) { d134: 4b2d ldr r3, [pc, #180] ; (d1ec ) memset(tx_transfer, 0, sizeof(tx_transfer)); d136: 2100 movs r1, #0 d138: 2280 movs r2, #128 ; 0x80 d13a: 482d ldr r0, [pc, #180] ; (d1f0 ) { d13c: b570 push {r4, r5, r6, lr} if (usb_high_speed) { d13e: 781b ldrb r3, [r3, #0] tx_head = 0; d140: 2400 movs r4, #0 tx_packet_size = CDC_TX_SIZE_480; d142: 4d2c ldr r5, [pc, #176] ; (d1f4 ) if (usb_high_speed) { d144: 428b cmp r3, r1 rx_packet_size = CDC_RX_SIZE_480; d146: 4e2c ldr r6, [pc, #176] ; (d1f8 ) if (usb_high_speed) { d148: bf0c ite eq d14a: 2340 moveq r3, #64 ; 0x40 d14c: f44f 7300 movne.w r3, #512 ; 0x200 tx_packet_size = CDC_TX_SIZE_480; d150: 802b strh r3, [r5, #0] rx_packet_size = CDC_RX_SIZE_480; d152: 8033 strh r3, [r6, #0] memset(tx_transfer, 0, sizeof(tx_transfer)); d154: f000 fcec bl db30 tx_head = 0; d158: 4a28 ldr r2, [pc, #160] ; (d1fc ) memset(rx_transfer, 0, sizeof(rx_transfer)); d15a: 4621 mov r1, r4 tx_available = 0; d15c: 4b28 ldr r3, [pc, #160] ; (d200 ) tx_head = 0; d15e: 7014 strb r4, [r2, #0] memset(rx_transfer, 0, sizeof(rx_transfer)); d160: f44f 7280 mov.w r2, #256 ; 0x100 d164: 4827 ldr r0, [pc, #156] ; (d204 ) tx_available = 0; d166: 801c strh r4, [r3, #0] memset(rx_transfer, 0, sizeof(rx_transfer)); d168: f000 fce2 bl db30 memset(rx_count, 0, sizeof(rx_count)); d16c: 4a26 ldr r2, [pc, #152] ; (d208 ) usb_config_tx(CDC_ACM_ENDPOINT, CDC_ACM_SIZE, 0, NULL); // size same 12 & 480 d16e: 2110 movs r1, #16 memset(rx_index, 0, sizeof(rx_index)); d170: 4b26 ldr r3, [pc, #152] ; (d20c ) usb_config_tx(CDC_ACM_ENDPOINT, CDC_ACM_SIZE, 0, NULL); // size same 12 & 480 d172: 2002 movs r0, #2 memset(rx_count, 0, sizeof(rx_count)); d174: e9c2 4400 strd r4, r4, [r2] d178: e9c2 4402 strd r4, r4, [r2, #8] rx_head = 0; d17c: 4a24 ldr r2, [pc, #144] ; (d210 ) memset(rx_index, 0, sizeof(rx_index)); d17e: e9c3 4400 strd r4, r4, [r3] rx_head = 0; d182: 7014 strb r4, [r2, #0] rx_available = 0; d184: 4a23 ldr r2, [pc, #140] ; (d214 ) memset(rx_index, 0, sizeof(rx_index)); d186: e9c3 4402 strd r4, r4, [r3, #8] rx_tail = 0; d18a: 4b23 ldr r3, [pc, #140] ; (d218 ) d18c: 701c strb r4, [r3, #0] usb_config_tx(CDC_ACM_ENDPOINT, CDC_ACM_SIZE, 0, NULL); // size same 12 & 480 d18e: 4623 mov r3, r4 rx_available = 0; d190: 6014 str r4, [r2, #0] usb_config_tx(CDC_ACM_ENDPOINT, CDC_ACM_SIZE, 0, NULL); // size same 12 & 480 d192: 4622 mov r2, r4 d194: f7ff f8a8 bl c2e8 usb_config_rx(CDC_RX_ENDPOINT, rx_packet_size, 0, rx_event); d198: 4622 mov r2, r4 d19a: 8831 ldrh r1, [r6, #0] d19c: 2003 movs r0, #3 d19e: 4b1f ldr r3, [pc, #124] ; (d21c ) d1a0: f7ff f870 bl c284 usb_config_tx(CDC_TX_ENDPOINT, tx_packet_size, 1, NULL); d1a4: 4623 mov r3, r4 d1a6: 2201 movs r2, #1 d1a8: 8829 ldrh r1, [r5, #0] d1aa: 2003 movs r0, #3 d1ac: f7ff f89c bl c2e8 for (i=0; i < RX_NUM; i++) rx_queue_transfer(i); d1b0: 4620 mov r0, r4 d1b2: 3401 adds r4, #1 d1b4: f7ff fe0e bl cdd4 d1b8: 2c08 cmp r4, #8 d1ba: d1f9 bne.n d1b0 USB1_GPTIMER0CTRL = 0; d1bc: 4b18 ldr r3, [pc, #96] ; (d220 ) d1be: 2100 movs r1, #0 USB1_GPTIMER0LD = microseconds - 1; d1c0: 224a movs r2, #74 ; 0x4a usb_timer0_callback = callback; d1c2: 4818 ldr r0, [pc, #96] ; (d224 ) d1c4: 4c18 ldr r4, [pc, #96] ; (d228 ) d1c6: 6004 str r4, [r0, #0] USB1_GPTIMER0CTRL = 0; d1c8: f8c3 1084 str.w r1, [r3, #132] ; 0x84 USB1_GPTIMER0LD = microseconds - 1; d1cc: f8c3 2080 str.w r2, [r3, #128] ; 0x80 USB1_USBINTR |= USB_USBINTR_TIE0; d1d0: f8d3 2148 ldr.w r2, [r3, #328] ; 0x148 if (serialEvent) yield_active_check_flags |= YIELD_CHECK_USB_SERIAL; d1d4: 4915 ldr r1, [pc, #84] ; (d22c ) USB1_USBINTR |= USB_USBINTR_TIE0; d1d6: f042 7280 orr.w r2, r2, #16777216 ; 0x1000000 d1da: f8c3 2148 str.w r2, [r3, #328] ; 0x148 if (serialEvent) yield_active_check_flags |= YIELD_CHECK_USB_SERIAL; d1de: b121 cbz r1, d1ea d1e0: 4a13 ldr r2, [pc, #76] ; (d230 ) d1e2: 7813 ldrb r3, [r2, #0] d1e4: f043 0301 orr.w r3, r3, #1 d1e8: 7013 strb r3, [r2, #0] } d1ea: bd70 pop {r4, r5, r6, pc} d1ec: 20002e13 .word 0x20002e13 d1f0: 20001e00 .word 0x20001e00 d1f4: 20002df0 .word 0x20002df0 d1f8: 20002de8 .word 0x20002de8 d1fc: 20002e0a .word 0x20002e0a d200: 20002dec .word 0x20002dec d204: 20001c40 .word 0x20001c40 d208: 20002d34 .word 0x20002d34 d20c: 20002d50 .word 0x20002d50 d210: 20002e02 .word 0x20002e02 d214: 20002d24 .word 0x20002d24 d218: 20002e04 .word 0x20002e04 d21c: 0000ce35 .word 0x0000ce35 d220: 402e0000 .word 0x402e0000 d224: 20002dcc .word 0x20002dcc d228: 0000cee9 .word 0x0000cee9 d22c: 00000000 .word 0x00000000 d230: 20002e15 .word 0x20002e15 0000d234 : { d234: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} NVIC_DISABLE_IRQ(IRQ_USB1); d238: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 d23c: f44f 3200 mov.w r2, #131072 ; 0x20000 uint32_t tail = rx_tail; d240: f8df a0c8 ldr.w sl, [pc, #200] ; d30c { d244: b083 sub sp, #12 NVIC_DISABLE_IRQ(IRQ_USB1); d246: f8c3 218c str.w r2, [r3, #396] ; 0x18c while (count < size && tail != rx_head) { d24a: 468b mov fp, r1 uint32_t tail = rx_tail; d24c: f89a 4000 ldrb.w r4, [sl] while (count < size && tail != rx_head) { d250: 2900 cmp r1, #0 d252: d04f beq.n d2f4 d254: 4680 mov r8, r0 d256: b2e4 uxtb r4, r4 uint32_t count=0; d258: 2700 movs r7, #0 uint32_t avail = rx_count[i] - rx_index[i]; d25a: f8df 90b4 ldr.w r9, [pc, #180] ; d310 while (count < size && tail != rx_head) { d25e: 4b26 ldr r3, [pc, #152] ; (d2f8 ) uint32_t len = size - count; d260: ebab 0207 sub.w r2, fp, r7 memcpy(p, rx_buffer + i * CDC_RX_SIZE_480 + rx_index[i], avail); d264: 4925 ldr r1, [pc, #148] ; (d2fc ) while (count < size && tail != rx_head) { d266: 781b ldrb r3, [r3, #0] d268: 42a3 cmp r3, r4 if (++tail > RX_NUM) tail = 0; d26a: f104 0401 add.w r4, r4, #1 while (count < size && tail != rx_head) { d26e: d03f beq.n d2f0 if (++tail > RX_NUM) tail = 0; d270: 2c09 cmp r4, #9 uint32_t i = rx_list[tail]; d272: 4b23 ldr r3, [pc, #140] ; (d300 ) memcpy(p, rx_buffer + i * CDC_RX_SIZE_480 + rx_index[i], avail); d274: 4640 mov r0, r8 if (++tail > RX_NUM) tail = 0; d276: bf28 it cs d278: 2400 movcs r4, #0 uint32_t i = rx_list[tail]; d27a: 5d1e ldrb r6, [r3, r4] uint32_t avail = rx_count[i] - rx_index[i]; d27c: f839 c016 ldrh.w ip, [r9, r6, lsl #1] memcpy(p, rx_buffer + i * CDC_RX_SIZE_480 + rx_index[i], avail); d280: eb0c 2346 add.w r3, ip, r6, lsl #9 d284: 4419 add r1, r3 uint32_t avail = rx_count[i] - rx_index[i]; d286: 4b1f ldr r3, [pc, #124] ; (d304 ) d288: f833 5016 ldrh.w r5, [r3, r6, lsl #1] d28c: eba5 050c sub.w r5, r5, ip if (avail > len) { d290: 42aa cmp r2, r5 d292: d21c bcs.n d2ce memcpy(p, rx_buffer + i * CDC_RX_SIZE_480 + rx_index[i], len); d294: eb0c 2c46 add.w ip, ip, r6, lsl #9 d298: 4918 ldr r1, [pc, #96] ; (d2fc ) rx_available -= len; d29a: 4c1b ldr r4, [pc, #108] ; (d308 ) memcpy(p, rx_buffer + i * CDC_RX_SIZE_480 + rx_index[i], len); d29c: 4461 add r1, ip d29e: 9201 str r2, [sp, #4] d2a0: f7fe f87c bl b39c rx_available -= len; d2a4: 6821 ldr r1, [r4, #0] rx_index[i] += len; d2a6: f839 5016 ldrh.w r5, [r9, r6, lsl #1] return count; d2aa: 4658 mov r0, fp rx_index[i] += len; d2ac: 9a01 ldr r2, [sp, #4] rx_available -= len; d2ae: eba1 010b sub.w r1, r1, fp rx_index[i] += len; d2b2: 442a add r2, r5 rx_available -= len; d2b4: 4439 add r1, r7 rx_index[i] += len; d2b6: f829 2016 strh.w r2, [r9, r6, lsl #1] rx_available -= len; d2ba: 6021 str r1, [r4, #0] NVIC_ENABLE_IRQ(IRQ_USB1); d2bc: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000 d2c0: f44f 3200 mov.w r2, #131072 ; 0x20000 d2c4: f8c3 210c str.w r2, [r3, #268] ; 0x10c } d2c8: b003 add sp, #12 d2ca: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} memcpy(p, rx_buffer + i * CDC_RX_SIZE_480 + rx_index[i], avail); d2ce: 462a mov r2, r5 count += avail; d2d0: 442f add r7, r5 memcpy(p, rx_buffer + i * CDC_RX_SIZE_480 + rx_index[i], avail); d2d2: f7fe f863 bl b39c rx_available -= avail; d2d6: 490c ldr r1, [pc, #48] ; (d308 ) rx_tail = tail; d2d8: b2e3 uxtb r3, r4 rx_queue_transfer(i); d2da: 4630 mov r0, r6 rx_available -= avail; d2dc: 680a ldr r2, [r1, #0] p += avail; d2de: 44a8 add r8, r5 rx_available -= avail; d2e0: 1b52 subs r2, r2, r5 d2e2: 600a str r2, [r1, #0] rx_tail = tail; d2e4: f88a 3000 strb.w r3, [sl] rx_queue_transfer(i); d2e8: f7ff fd74 bl cdd4 while (count < size && tail != rx_head) { d2ec: 45bb cmp fp, r7 d2ee: d8b6 bhi.n d25e return count; d2f0: 4638 mov r0, r7 d2f2: e7e3 b.n d2bc while (count < size && tail != rx_head) { d2f4: 4608 mov r0, r1 d2f6: e7e1 b.n d2bc d2f8: 20002e02 .word 0x20002e02 d2fc: 20202f60 .word 0x20202f60 d300: 20002d68 .word 0x20002d68 d304: 20002d34 .word 0x20002d34 d308: 20002d24 .word 0x20002d24 d30c: 20002e04 .word 0x20002e04 d310: 20002d50 .word 0x20002d50 0000d314 : uint32_t n = rx_available; d314: 4b04 ldr r3, [pc, #16] ; (d328 ) { d316: b510 push {r4, lr} uint32_t n = rx_available; d318: 681c ldr r4, [r3, #0] if (n == 0) yield(); d31a: b10c cbz r4, d320 } d31c: 4620 mov r0, r4 d31e: bd10 pop {r4, pc} if (n == 0) yield(); d320: f000 f82a bl d378 } d324: 4620 mov r0, r4 d326: bd10 pop {r4, pc} d328: 20002d24 .word 0x20002d24 0000d32c : { d32c: b500 push {lr} d32e: b083 sub sp, #12 if (usb_serial_read(&c, 1)) return c; d330: 2101 movs r1, #1 d332: f10d 0007 add.w r0, sp, #7 d336: f7ff ff7d bl d234 d33a: b120 cbz r0, d346 d33c: f89d 0007 ldrb.w r0, [sp, #7] } d340: b003 add sp, #12 d342: f85d fb04 ldr.w pc, [sp], #4 return -1; d346: f04f 30ff mov.w r0, #4294967295 d34a: e7f9 b.n d340 0000d34c : if (!usb_configuration) return 0; d34c: 4b09 ldr r3, [pc, #36] ; (d374 ) { d34e: b500 push {lr} d350: b083 sub sp, #12 if (!usb_configuration) return 0; d352: 781b ldrb r3, [r3, #0] { d354: f88d 0007 strb.w r0, [sp, #7] if (!usb_configuration) return 0; d358: b13b cbz r3, d36a d35a: 2101 movs r1, #1 d35c: f10d 0007 add.w r0, sp, #7 d360: f7ff fe0a bl cf78 } d364: b003 add sp, #12 d366: f85d fb04 ldr.w pc, [sp], #4 d36a: f003 00ff and.w r0, r3, #255 ; 0xff d36e: b003 add sp, #12 d370: f85d fb04 ldr.w pc, [sp], #4 d374: 20002e12 .word 0x20002e12 0000d378 : uint8_t yield_active_check_flags = 0; void yield(void) __attribute__ ((weak)); void yield(void) { d378: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} const uint8_t check_flags = yield_active_check_flags; d37c: 4b2d ldr r3, [pc, #180] ; (d434 ) d37e: 781e ldrb r6, [r3, #0] if (!check_flags) return; // nothing to do d380: b166 cbz r6, d39c // TODO: do nothing if called from interrupt static uint8_t running=0; if (running) return; // TODO: does this need to be atomic? d382: 4f2d ldr r7, [pc, #180] ; (d438 ) d384: 783b ldrb r3, [r7, #0] d386: b94b cbnz r3, d39c running = 1; d388: 2301 movs r3, #1 // USB Serial - Add hack to minimize impact... if (check_flags & YIELD_CHECK_USB_SERIAL) { d38a: 07f1 lsls r1, r6, #31 running = 1; d38c: 703b strb r3, [r7, #0] if (check_flags & YIELD_CHECK_USB_SERIAL) { d38e: d443 bmi.n d418 if (SerialUSB2.available()) serialEventUSB2(); } #endif // Current workaround until integrate with EventResponder. if (check_flags & YIELD_CHECK_HARDWARE_SERIAL) { d390: 07b2 lsls r2, r6, #30 d392: d426 bmi.n d3e2 HardwareSerialIMXRT::processSerialEventsList(); } running = 0; d394: 2300 movs r3, #0 d396: 703b strb r3, [r7, #0] if (check_flags & YIELD_CHECK_EVENT_RESPONDER) { d398: 0773 lsls r3, r6, #29 d39a: d401 bmi.n d3a0 EventResponder::runFromYield(); } }; d39c: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} if (!firstYield) return; d3a0: 4b26 ldr r3, [pc, #152] ; (d43c ) d3a2: 681a ldr r2, [r3, #0] d3a4: 2a00 cmp r2, #0 d3a6: d0f9 beq.n d39c __asm__ volatile("mrs %0, ipsr\n" : "=r" (ipsr)::); d3a8: f3ef 8205 mrs r2, IPSR if (ipsr != 0) return; d3ac: 2a00 cmp r2, #0 d3ae: d1f5 bne.n d39c __asm__ volatile("mrs %0, primask\n" : "=r" (primask)::); d3b0: f3ef 8510 mrs r5, PRIMASK __disable_irq(); d3b4: b672 cpsid i EventResponder *first = firstYield; d3b6: 6818 ldr r0, [r3, #0] if (first == nullptr) { d3b8: 2800 cmp r0, #0 d3ba: d034 beq.n d426 if (runningFromYield) { d3bc: 4c20 ldr r4, [pc, #128] ; (d440 ) d3be: 7821 ldrb r1, [r4, #0] d3c0: 2900 cmp r1, #0 d3c2: d130 bne.n d426 runningFromYield = true; d3c4: 2201 movs r2, #1 d3c6: 7022 strb r2, [r4, #0] firstYield = first->_next; d3c8: 6942 ldr r2, [r0, #20] d3ca: 601a str r2, [r3, #0] if (firstYield) { d3cc: 2a00 cmp r2, #0 d3ce: d02e beq.n d42e firstYield->_prev = nullptr; d3d0: 6191 str r1, [r2, #24] if (doit) __enable_irq(); d3d2: b905 cbnz r5, d3d6 d3d4: b662 cpsie i first->_triggered = false; d3d6: 2500 movs r5, #0 (*(first->_function))(*first); d3d8: 6883 ldr r3, [r0, #8] first->_triggered = false; d3da: 7745 strb r5, [r0, #29] (*(first->_function))(*first); d3dc: 4798 blx r3 runningFromYield = false; d3de: 7025 strb r5, [r4, #0] d3e0: e7dc b.n d39c */ operator bool() { return true; } static inline void processSerialEventsList() { for (uint8_t i = 0; i < s_count_serials_with_serial_events; i++) { d3e2: f8df 8064 ldr.w r8, [pc, #100] ; d448 d3e6: f898 3000 ldrb.w r3, [r8] d3ea: 2b00 cmp r3, #0 d3ec: d0d2 beq.n d394 d3ee: 2500 movs r5, #0 d3f0: f8df 9058 ldr.w r9, [pc, #88] ; d44c d3f4: 462b mov r3, r5 s_serials_with_serial_events[i]->doYieldCode(); d3f6: f859 4023 ldr.w r4, [r9, r3, lsl #2] for (uint8_t i = 0; i < s_count_serials_with_serial_events; i++) { d3fa: 3501 adds r5, #1 static HardwareSerialIMXRT *s_serials_with_serial_events[7]; #endif static uint8_t s_count_serials_with_serial_events; void addToSerialEventsList(); inline void doYieldCode() { if (available()) (*hardware->_serialEvent)(); d3fc: 6823 ldr r3, [r4, #0] d3fe: 4620 mov r0, r4 d400: 691b ldr r3, [r3, #16] d402: 4798 blx r3 d404: b110 cbz r0, d40c d406: 6963 ldr r3, [r4, #20] d408: 689b ldr r3, [r3, #8] d40a: 4798 blx r3 for (uint8_t i = 0; i < s_count_serials_with_serial_events; i++) { d40c: f898 2000 ldrb.w r2, [r8] d410: b2eb uxtb r3, r5 d412: 429a cmp r2, r3 d414: d8ef bhi.n d3f6 d416: e7bd b.n d394 virtual int available() { return usb_serial_available(); } d418: f7ff ff7c bl d314 if (Serial.available()) serialEvent(); d41c: 2800 cmp r0, #0 d41e: d0b7 beq.n d390 d420: f3af 8000 nop.w d424: e7b4 b.n d390 if (doit) __enable_irq(); d426: 2d00 cmp r5, #0 d428: d1b8 bne.n d39c d42a: b662 cpsie i d42c: e7b6 b.n d39c lastYield = nullptr; d42e: 4b05 ldr r3, [pc, #20] ; (d444 ) d430: 601a str r2, [r3, #0] d432: e7ce b.n d3d2 d434: 20002e15 .word 0x20002e15 d438: 20002dfc .word 0x20002dfc d43c: 2000254c .word 0x2000254c d440: 20002dfa .word 0x20002dfa d444: 20002558 .word 0x20002558 d448: 20002dfb .word 0x20002dfb d44c: 200025d4 .word 0x200025d4 0000d450 : if (spool->pool_size % HEADER_SZ) return 0; return 1; } int sm_align_pool(struct smalloc_pool *spool) { d450: b508 push {r3, lr} size_t x; if (smalloc_verify_pool(spool)) return 1; x = spool->pool_size % HEADER_SZ; d452: e9d0 3200 ldrd r3, r2, [r0] if (!spool->pool || !spool->pool_size) return 0; d456: b15b cbz r3, d470 d458: b1ba cbz r2, d48a if (spool->pool_size % HEADER_SZ) return 0; d45a: 4b0f ldr r3, [pc, #60] ; (d498 ) d45c: fba3 1302 umull r1, r3, r3, r2 d460: 08db lsrs r3, r3, #3 d462: eb03 0343 add.w r3, r3, r3, lsl #1 d466: ebb2 0383 subs.w r3, r2, r3, lsl #2 d46a: d10a bne.n d482 if (smalloc_verify_pool(spool)) return 1; d46c: 2001 movs r0, #1 errno = ENOSPC; return 0; } return 1; } d46e: bd08 pop {r3, pc} x = spool->pool_size % HEADER_SZ; d470: 4b09 ldr r3, [pc, #36] ; (d498 ) d472: fba3 1302 umull r1, r3, r3, r2 d476: 08db lsrs r3, r3, #3 d478: eb03 0343 add.w r3, r3, r3, lsl #1 if (x) spool->pool_size -= x; d47c: ebb2 0383 subs.w r3, r2, r3, lsl #2 d480: d001 beq.n d486 d482: 1ad2 subs r2, r2, r3 d484: 6042 str r2, [r0, #4] if (spool->pool_size <= MIN_POOL_SZ) { d486: 2af0 cmp r2, #240 ; 0xf0 d488: d8f0 bhi.n d46c errno = ENOSPC; d48a: f000 fbfb bl dc84 <__errno> d48e: 221c movs r2, #28 d490: 4603 mov r3, r0 d492: 2000 movs r0, #0 d494: 601a str r2, [r3, #0] } d496: bd08 pop {r3, pc} d498: aaaaaaab .word 0xaaaaaaab 0000d49c : int sm_set_pool(struct smalloc_pool *spool, void *new_pool, size_t new_pool_size, int do_zero, smalloc_oom_handler oom_handler) { d49c: b570 push {r4, r5, r6, lr} if (!spool) { d49e: 4604 mov r4, r0 d4a0: b338 cbz r0, d4f2 errno = EINVAL; return 0; } if (!new_pool || !new_pool_size) { d4a2: b119 cbz r1, d4ac d4a4: fab2 f682 clz r6, r2 d4a8: 0976 lsrs r6, r6, #5 d4aa: b9a2 cbnz r2, d4d6 if (!spool->pool || !spool->pool_size) return 0; d4ac: 6820 ldr r0, [r4, #0] d4ae: b300 cbz r0, d4f2 d4b0: 6862 ldr r2, [r4, #4] d4b2: b1f2 cbz r2, d4f2 if (spool->pool_size % HEADER_SZ) return 0; d4b4: 4b18 ldr r3, [pc, #96] ; (d518 ) d4b6: 4919 ldr r1, [pc, #100] ; (d51c ) d4b8: fb02 f303 mul.w r3, r2, r3 d4bc: ebb1 0fb3 cmp.w r1, r3, ror #2 d4c0: d317 bcc.n d4f2 if (smalloc_verify_pool(spool)) { if (spool->do_zero) memset(spool->pool, 0, spool->pool_size); d4c2: 68a3 ldr r3, [r4, #8] d4c4: b9e3 cbnz r3, d500 memset(spool, 0, sizeof(struct smalloc_pool)); d4c6: 2200 movs r2, #0 return 1; d4c8: 2301 movs r3, #1 memset(spool, 0, sizeof(struct smalloc_pool)); d4ca: 6022 str r2, [r4, #0] d4cc: 6062 str r2, [r4, #4] d4ce: 60a2 str r2, [r4, #8] d4d0: 60e2 str r2, [r4, #12] spool->do_zero = do_zero; memset(spool->pool, 0, spool->pool_size); } return 1; } d4d2: 4618 mov r0, r3 d4d4: bd70 pop {r4, r5, r6, pc} spool->pool = new_pool; d4d6: 461d mov r5, r3 spool->oomfn = oom_handler; d4d8: 9b04 ldr r3, [sp, #16] spool->pool_size = new_pool_size; d4da: e9c0 1200 strd r1, r2, [r0] spool->oomfn = oom_handler; d4de: 60c3 str r3, [r0, #12] if (!sm_align_pool(spool)) return 0; d4e0: f7ff ffb6 bl d450 d4e4: 4603 mov r3, r0 d4e6: 2800 cmp r0, #0 d4e8: d0f3 beq.n d4d2 if (do_zero) { d4ea: b96d cbnz r5, d508 return 1; d4ec: 2301 movs r3, #1 } d4ee: 4618 mov r0, r3 d4f0: bd70 pop {r4, r5, r6, pc} errno = EINVAL; d4f2: f000 fbc7 bl dc84 <__errno> d4f6: 2216 movs r2, #22 return 0; d4f8: 2300 movs r3, #0 errno = EINVAL; d4fa: 6002 str r2, [r0, #0] } d4fc: 4618 mov r0, r3 d4fe: bd70 pop {r4, r5, r6, pc} if (spool->do_zero) memset(spool->pool, 0, spool->pool_size); d500: 2100 movs r1, #0 d502: f000 fb15 bl db30 d506: e7de b.n d4c6 memset(spool->pool, 0, spool->pool_size); d508: 6862 ldr r2, [r4, #4] d50a: 4631 mov r1, r6 d50c: 6820 ldr r0, [r4, #0] spool->do_zero = do_zero; d50e: 60a5 str r5, [r4, #8] memset(spool->pool, 0, spool->pool_size); d510: f000 fb0e bl db30 return 1; d514: 2301 movs r3, #1 d516: e7dc b.n d4d2 d518: aaaaaaab .word 0xaaaaaaab d51c: 15555555 .word 0x15555555 0000d520 <__aeabi_atexit>: d520: 4603 mov r3, r0 d522: 4608 mov r0, r1 d524: 4619 mov r1, r3 d526: f000 bacd b.w dac4 <__cxa_atexit> d52a: bf00 nop 0000d52c : d52c: 4b02 ldr r3, [pc, #8] ; (d538 ) d52e: 4601 mov r1, r0 d530: 6818 ldr r0, [r3, #0] d532: f000 b80b b.w d54c <_malloc_r> d536: bf00 nop d538: 200014c8 .word 0x200014c8 0000d53c : d53c: 4b02 ldr r3, [pc, #8] ; (d548 ) d53e: 4601 mov r1, r0 d540: 6818 ldr r0, [r3, #0] d542: f000 bcdf b.w df04 <_free_r> d546: bf00 nop d548: 200014c8 .word 0x200014c8 0000d54c <_malloc_r>: d54c: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} d550: f101 060b add.w r6, r1, #11 d554: 2e16 cmp r6, #22 d556: b083 sub sp, #12 d558: 4604 mov r4, r0 d55a: d824 bhi.n d5a6 <_malloc_r+0x5a> d55c: 2910 cmp r1, #16 d55e: f200 80ba bhi.w d6d6 <_malloc_r+0x18a> d562: f000 faa3 bl daac <__malloc_lock> d566: 2610 movs r6, #16 d568: 2218 movs r2, #24 d56a: 2002 movs r0, #2 d56c: 4fb5 ldr r7, [pc, #724] ; (d844 <_malloc_r+0x2f8>) d56e: 443a add r2, r7 d570: f1a2 0108 sub.w r1, r2, #8 d574: 6853 ldr r3, [r2, #4] d576: 428b cmp r3, r1 d578: f000 80ba beq.w d6f0 <_malloc_r+0x1a4> d57c: 685a ldr r2, [r3, #4] d57e: 68d9 ldr r1, [r3, #12] d580: f022 0203 bic.w r2, r2, #3 d584: 441a add r2, r3 d586: 689d ldr r5, [r3, #8] d588: 60e9 str r1, [r5, #12] d58a: 608d str r5, [r1, #8] d58c: 6851 ldr r1, [r2, #4] d58e: f041 0101 orr.w r1, r1, #1 d592: 4620 mov r0, r4 d594: 6051 str r1, [r2, #4] d596: f103 0508 add.w r5, r3, #8 d59a: f000 fa8d bl dab8 <__malloc_unlock> d59e: 4628 mov r0, r5 d5a0: b003 add sp, #12 d5a2: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} d5a6: f036 0607 bics.w r6, r6, #7 d5aa: f100 8094 bmi.w d6d6 <_malloc_r+0x18a> d5ae: 42b1 cmp r1, r6 d5b0: f200 8091 bhi.w d6d6 <_malloc_r+0x18a> d5b4: f000 fa7a bl daac <__malloc_lock> d5b8: f5b6 7ffc cmp.w r6, #504 ; 0x1f8 d5bc: f0c0 819a bcc.w d8f4 <_malloc_r+0x3a8> d5c0: 0a73 lsrs r3, r6, #9 d5c2: f000 808f beq.w d6e4 <_malloc_r+0x198> d5c6: 2b04 cmp r3, #4 d5c8: f200 816f bhi.w d8aa <_malloc_r+0x35e> d5cc: 09b3 lsrs r3, r6, #6 d5ce: f103 0039 add.w r0, r3, #57 ; 0x39 d5d2: f103 0c38 add.w ip, r3, #56 ; 0x38 d5d6: 00c3 lsls r3, r0, #3 d5d8: 4f9a ldr r7, [pc, #616] ; (d844 <_malloc_r+0x2f8>) d5da: 443b add r3, r7 d5dc: f1a3 0508 sub.w r5, r3, #8 d5e0: 685b ldr r3, [r3, #4] d5e2: 429d cmp r5, r3 d5e4: d106 bne.n d5f4 <_malloc_r+0xa8> d5e6: e00c b.n d602 <_malloc_r+0xb6> d5e8: 2900 cmp r1, #0 d5ea: f280 8127 bge.w d83c <_malloc_r+0x2f0> d5ee: 68db ldr r3, [r3, #12] d5f0: 429d cmp r5, r3 d5f2: d006 beq.n d602 <_malloc_r+0xb6> d5f4: 685a ldr r2, [r3, #4] d5f6: f022 0203 bic.w r2, r2, #3 d5fa: 1b91 subs r1, r2, r6 d5fc: 290f cmp r1, #15 d5fe: ddf3 ble.n d5e8 <_malloc_r+0x9c> d600: 4660 mov r0, ip d602: 693d ldr r5, [r7, #16] d604: f8df c250 ldr.w ip, [pc, #592] ; d858 <_malloc_r+0x30c> d608: 4565 cmp r5, ip d60a: d07c beq.n d706 <_malloc_r+0x1ba> d60c: 686a ldr r2, [r5, #4] d60e: f022 0203 bic.w r2, r2, #3 d612: 1b93 subs r3, r2, r6 d614: 2b0f cmp r3, #15 d616: f300 817b bgt.w d910 <_malloc_r+0x3c4> d61a: 2b00 cmp r3, #0 d61c: e9c7 cc04 strd ip, ip, [r7, #16] d620: f280 816c bge.w d8fc <_malloc_r+0x3b0> d624: f5b2 7f00 cmp.w r2, #512 ; 0x200 d628: f080 811a bcs.w d860 <_malloc_r+0x314> d62c: 08d3 lsrs r3, r2, #3 d62e: 6879 ldr r1, [r7, #4] d630: 3301 adds r3, #1 d632: ea4f 1e52 mov.w lr, r2, lsr #5 d636: 2201 movs r2, #1 d638: fa02 f20e lsl.w r2, r2, lr d63c: 430a orrs r2, r1 d63e: f857 e033 ldr.w lr, [r7, r3, lsl #3] d642: f8c5 e008 str.w lr, [r5, #8] d646: eb07 01c3 add.w r1, r7, r3, lsl #3 d64a: 3908 subs r1, #8 d64c: 60e9 str r1, [r5, #12] d64e: 607a str r2, [r7, #4] d650: f847 5033 str.w r5, [r7, r3, lsl #3] d654: f8ce 500c str.w r5, [lr, #12] d658: 1083 asrs r3, r0, #2 d65a: 2101 movs r1, #1 d65c: 4099 lsls r1, r3 d65e: 4291 cmp r1, r2 d660: d857 bhi.n d712 <_malloc_r+0x1c6> d662: 4211 tst r1, r2 d664: d106 bne.n d674 <_malloc_r+0x128> d666: f020 0003 bic.w r0, r0, #3 d66a: 0049 lsls r1, r1, #1 d66c: 4211 tst r1, r2 d66e: f100 0004 add.w r0, r0, #4 d672: d0fa beq.n d66a <_malloc_r+0x11e> d674: eb07 09c0 add.w r9, r7, r0, lsl #3 d678: 464d mov r5, r9 d67a: 4686 mov lr, r0 d67c: f8d5 800c ldr.w r8, [r5, #12] d680: 4545 cmp r5, r8 d682: d108 bne.n d696 <_malloc_r+0x14a> d684: e11d b.n d8c2 <_malloc_r+0x376> d686: 2b00 cmp r3, #0 d688: f280 8124 bge.w d8d4 <_malloc_r+0x388> d68c: f8d8 800c ldr.w r8, [r8, #12] d690: 4545 cmp r5, r8 d692: f000 8116 beq.w d8c2 <_malloc_r+0x376> d696: f8d8 2004 ldr.w r2, [r8, #4] d69a: f022 0203 bic.w r2, r2, #3 d69e: 1b93 subs r3, r2, r6 d6a0: 2b0f cmp r3, #15 d6a2: ddf0 ble.n d686 <_malloc_r+0x13a> d6a4: 4620 mov r0, r4 d6a6: e9d8 5402 ldrd r5, r4, [r8, #8] d6aa: eb08 0106 add.w r1, r8, r6 d6ae: f046 0601 orr.w r6, r6, #1 d6b2: f8c8 6004 str.w r6, [r8, #4] d6b6: 60ec str r4, [r5, #12] d6b8: 60a5 str r5, [r4, #8] d6ba: f043 0401 orr.w r4, r3, #1 d6be: e9c7 1104 strd r1, r1, [r7, #16] d6c2: e9c1 cc02 strd ip, ip, [r1, #8] d6c6: 604c str r4, [r1, #4] d6c8: f848 3002 str.w r3, [r8, r2] d6cc: f000 f9f4 bl dab8 <__malloc_unlock> d6d0: f108 0508 add.w r5, r8, #8 d6d4: e002 b.n d6dc <_malloc_r+0x190> d6d6: 230c movs r3, #12 d6d8: 6023 str r3, [r4, #0] d6da: 2500 movs r5, #0 d6dc: 4628 mov r0, r5 d6de: b003 add sp, #12 d6e0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} d6e4: f44f 7300 mov.w r3, #512 ; 0x200 d6e8: 2040 movs r0, #64 ; 0x40 d6ea: f04f 0c3f mov.w ip, #63 ; 0x3f d6ee: e773 b.n d5d8 <_malloc_r+0x8c> d6f0: 68d3 ldr r3, [r2, #12] d6f2: 429a cmp r2, r3 d6f4: bf08 it eq d6f6: 3002 addeq r0, #2 d6f8: f47f af40 bne.w d57c <_malloc_r+0x30> d6fc: 693d ldr r5, [r7, #16] d6fe: f8df c158 ldr.w ip, [pc, #344] ; d858 <_malloc_r+0x30c> d702: 4565 cmp r5, ip d704: d182 bne.n d60c <_malloc_r+0xc0> d706: 687a ldr r2, [r7, #4] d708: 1083 asrs r3, r0, #2 d70a: 2101 movs r1, #1 d70c: 4099 lsls r1, r3 d70e: 4291 cmp r1, r2 d710: d9a7 bls.n d662 <_malloc_r+0x116> d712: 68bd ldr r5, [r7, #8] d714: 686b ldr r3, [r5, #4] d716: f023 0903 bic.w r9, r3, #3 d71a: 454e cmp r6, r9 d71c: d803 bhi.n d726 <_malloc_r+0x1da> d71e: eba9 0306 sub.w r3, r9, r6 d722: 2b0f cmp r3, #15 d724: dc7a bgt.n d81c <_malloc_r+0x2d0> d726: f8df b134 ldr.w fp, [pc, #308] ; d85c <_malloc_r+0x310> d72a: 4b47 ldr r3, [pc, #284] ; (d848 <_malloc_r+0x2fc>) d72c: f8db 2000 ldr.w r2, [fp] d730: 681b ldr r3, [r3, #0] d732: 3201 adds r2, #1 d734: 4433 add r3, r6 d736: eb05 0a09 add.w sl, r5, r9 d73a: f000 8133 beq.w d9a4 <_malloc_r+0x458> d73e: f503 5380 add.w r3, r3, #4096 ; 0x1000 d742: 330f adds r3, #15 d744: f423 687f bic.w r8, r3, #4080 ; 0xff0 d748: f028 080f bic.w r8, r8, #15 d74c: 4641 mov r1, r8 d74e: 4620 mov r0, r4 d750: f000 fa86 bl dc60 <_sbrk_r> d754: 1c41 adds r1, r0, #1 d756: 4602 mov r2, r0 d758: f000 80f3 beq.w d942 <_malloc_r+0x3f6> d75c: 4582 cmp sl, r0 d75e: f200 80ee bhi.w d93e <_malloc_r+0x3f2> d762: 4b3a ldr r3, [pc, #232] ; (d84c <_malloc_r+0x300>) d764: 6819 ldr r1, [r3, #0] d766: 4441 add r1, r8 d768: 6019 str r1, [r3, #0] d76a: 4608 mov r0, r1 d76c: f000 814e beq.w da0c <_malloc_r+0x4c0> d770: f8db 1000 ldr.w r1, [fp] d774: 9301 str r3, [sp, #4] d776: 3101 adds r1, #1 d778: bf1b ittet ne d77a: eba2 010a subne.w r1, r2, sl d77e: 1809 addne r1, r1, r0 d780: f8cb 2000 streq.w r2, [fp] d784: 6019 strne r1, [r3, #0] d786: f012 0b07 ands.w fp, r2, #7 d78a: f000 8117 beq.w d9bc <_malloc_r+0x470> d78e: f1cb 0108 rsb r1, fp, #8 d792: 440a add r2, r1 d794: f5cb 5180 rsb r1, fp, #4096 ; 0x1000 d798: 4490 add r8, r2 d79a: 3108 adds r1, #8 d79c: eba1 0108 sub.w r1, r1, r8 d7a0: f3c1 0a0b ubfx sl, r1, #0, #12 d7a4: 4651 mov r1, sl d7a6: 4620 mov r0, r4 d7a8: 9200 str r2, [sp, #0] d7aa: f000 fa59 bl dc60 <_sbrk_r> d7ae: 1c42 adds r2, r0, #1 d7b0: e9dd 2300 ldrd r2, r3, [sp] d7b4: f000 814f beq.w da56 <_malloc_r+0x50a> d7b8: 1a80 subs r0, r0, r2 d7ba: eb00 080a add.w r8, r0, sl d7be: 6819 ldr r1, [r3, #0] d7c0: 60ba str r2, [r7, #8] d7c2: f048 0001 orr.w r0, r8, #1 d7c6: 4451 add r1, sl d7c8: 42bd cmp r5, r7 d7ca: 6050 str r0, [r2, #4] d7cc: 6019 str r1, [r3, #0] d7ce: f000 8129 beq.w da24 <_malloc_r+0x4d8> d7d2: f1b9 0f0f cmp.w r9, #15 d7d6: f240 8127 bls.w da28 <_malloc_r+0x4dc> d7da: 6868 ldr r0, [r5, #4] d7dc: f1a9 0c0c sub.w ip, r9, #12 d7e0: f02c 0c07 bic.w ip, ip, #7 d7e4: f000 0001 and.w r0, r0, #1 d7e8: ea40 000c orr.w r0, r0, ip d7ec: 6068 str r0, [r5, #4] d7ee: f04f 0e05 mov.w lr, #5 d7f2: eb05 000c add.w r0, r5, ip d7f6: f1bc 0f0f cmp.w ip, #15 d7fa: e9c0 ee01 strd lr, lr, [r0, #4] d7fe: f200 8132 bhi.w da66 <_malloc_r+0x51a> d802: 6850 ldr r0, [r2, #4] d804: 4615 mov r5, r2 d806: 4b12 ldr r3, [pc, #72] ; (d850 <_malloc_r+0x304>) d808: 681a ldr r2, [r3, #0] d80a: 428a cmp r2, r1 d80c: bf38 it cc d80e: 6019 strcc r1, [r3, #0] d810: 4b10 ldr r3, [pc, #64] ; (d854 <_malloc_r+0x308>) d812: 681a ldr r2, [r3, #0] d814: 428a cmp r2, r1 d816: bf38 it cc d818: 6019 strcc r1, [r3, #0] d81a: e094 b.n d946 <_malloc_r+0x3fa> d81c: 19aa adds r2, r5, r6 d81e: f043 0301 orr.w r3, r3, #1 d822: f046 0601 orr.w r6, r6, #1 d826: 606e str r6, [r5, #4] d828: 4620 mov r0, r4 d82a: 60ba str r2, [r7, #8] d82c: 6053 str r3, [r2, #4] d82e: f000 f943 bl dab8 <__malloc_unlock> d832: 3508 adds r5, #8 d834: 4628 mov r0, r5 d836: b003 add sp, #12 d838: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} d83c: 68d9 ldr r1, [r3, #12] d83e: 441a add r2, r3 d840: e6a1 b.n d586 <_malloc_r+0x3a> d842: bf00 nop d844: 200010b8 .word 0x200010b8 d848: 200027d0 .word 0x200027d0 d84c: 200027a0 .word 0x200027a0 d850: 200027c8 .word 0x200027c8 d854: 200027cc .word 0x200027cc d858: 200010c0 .word 0x200010c0 d85c: 200014c0 .word 0x200014c0 d860: f5b2 6f20 cmp.w r2, #2560 ; 0xa00 d864: ea4f 2352 mov.w r3, r2, lsr #9 d868: d363 bcc.n d932 <_malloc_r+0x3e6> d86a: 2b14 cmp r3, #20 d86c: f200 80b7 bhi.w d9de <_malloc_r+0x492> d870: f103 015c add.w r1, r3, #92 ; 0x5c d874: 00c9 lsls r1, r1, #3 d876: 335b adds r3, #91 ; 0x5b d878: eb07 0e01 add.w lr, r7, r1 d87c: 5879 ldr r1, [r7, r1] d87e: f1ae 0e08 sub.w lr, lr, #8 d882: 458e cmp lr, r1 d884: f000 8091 beq.w d9aa <_malloc_r+0x45e> d888: 684b ldr r3, [r1, #4] d88a: f023 0303 bic.w r3, r3, #3 d88e: 4293 cmp r3, r2 d890: d902 bls.n d898 <_malloc_r+0x34c> d892: 6889 ldr r1, [r1, #8] d894: 458e cmp lr, r1 d896: d1f7 bne.n d888 <_malloc_r+0x33c> d898: f8d1 e00c ldr.w lr, [r1, #12] d89c: 687a ldr r2, [r7, #4] d89e: e9c5 1e02 strd r1, lr, [r5, #8] d8a2: f8ce 5008 str.w r5, [lr, #8] d8a6: 60cd str r5, [r1, #12] d8a8: e6d6 b.n d658 <_malloc_r+0x10c> d8aa: 2b14 cmp r3, #20 d8ac: d959 bls.n d962 <_malloc_r+0x416> d8ae: 2b54 cmp r3, #84 ; 0x54 d8b0: f200 809d bhi.w d9ee <_malloc_r+0x4a2> d8b4: 0b33 lsrs r3, r6, #12 d8b6: f103 006f add.w r0, r3, #111 ; 0x6f d8ba: f103 0c6e add.w ip, r3, #110 ; 0x6e d8be: 00c3 lsls r3, r0, #3 d8c0: e68a b.n d5d8 <_malloc_r+0x8c> d8c2: f10e 0e01 add.w lr, lr, #1 d8c6: f01e 0f03 tst.w lr, #3 d8ca: f105 0508 add.w r5, r5, #8 d8ce: f47f aed5 bne.w d67c <_malloc_r+0x130> d8d2: e051 b.n d978 <_malloc_r+0x42c> d8d4: 4442 add r2, r8 d8d6: 4645 mov r5, r8 d8d8: 6853 ldr r3, [r2, #4] d8da: f8d8 100c ldr.w r1, [r8, #12] d8de: f043 0301 orr.w r3, r3, #1 d8e2: 6053 str r3, [r2, #4] d8e4: f855 3f08 ldr.w r3, [r5, #8]! d8e8: 4620 mov r0, r4 d8ea: 60d9 str r1, [r3, #12] d8ec: 608b str r3, [r1, #8] d8ee: f000 f8e3 bl dab8 <__malloc_unlock> d8f2: e6f3 b.n d6dc <_malloc_r+0x190> d8f4: 08f0 lsrs r0, r6, #3 d8f6: f106 0208 add.w r2, r6, #8 d8fa: e637 b.n d56c <_malloc_r+0x20> d8fc: 442a add r2, r5 d8fe: 4620 mov r0, r4 d900: 6853 ldr r3, [r2, #4] d902: f043 0301 orr.w r3, r3, #1 d906: 6053 str r3, [r2, #4] d908: 3508 adds r5, #8 d90a: f000 f8d5 bl dab8 <__malloc_unlock> d90e: e6e5 b.n d6dc <_malloc_r+0x190> d910: 19a9 adds r1, r5, r6 d912: 4620 mov r0, r4 d914: f046 0601 orr.w r6, r6, #1 d918: f043 0401 orr.w r4, r3, #1 d91c: 606e str r6, [r5, #4] d91e: e9c7 1104 strd r1, r1, [r7, #16] d922: e9c1 cc02 strd ip, ip, [r1, #8] d926: 604c str r4, [r1, #4] d928: 50ab str r3, [r5, r2] d92a: f000 f8c5 bl dab8 <__malloc_unlock> d92e: 3508 adds r5, #8 d930: e6d4 b.n d6dc <_malloc_r+0x190> d932: 0993 lsrs r3, r2, #6 d934: f103 0139 add.w r1, r3, #57 ; 0x39 d938: 00c9 lsls r1, r1, #3 d93a: 3338 adds r3, #56 ; 0x38 d93c: e79c b.n d878 <_malloc_r+0x32c> d93e: 42bd cmp r5, r7 d940: d05f beq.n da02 <_malloc_r+0x4b6> d942: 68bd ldr r5, [r7, #8] d944: 6868 ldr r0, [r5, #4] d946: f020 0803 bic.w r8, r0, #3 d94a: 4546 cmp r6, r8 d94c: eba8 0306 sub.w r3, r8, r6 d950: d802 bhi.n d958 <_malloc_r+0x40c> d952: 2b0f cmp r3, #15 d954: f73f af62 bgt.w d81c <_malloc_r+0x2d0> d958: 4620 mov r0, r4 d95a: f000 f8ad bl dab8 <__malloc_unlock> d95e: 2500 movs r5, #0 d960: e6bc b.n d6dc <_malloc_r+0x190> d962: f103 005c add.w r0, r3, #92 ; 0x5c d966: f103 0c5b add.w ip, r3, #91 ; 0x5b d96a: 00c3 lsls r3, r0, #3 d96c: e634 b.n d5d8 <_malloc_r+0x8c> d96e: f859 3908 ldr.w r3, [r9], #-8 d972: 454b cmp r3, r9 d974: f040 8096 bne.w daa4 <_malloc_r+0x558> d978: f010 0f03 tst.w r0, #3 d97c: f100 30ff add.w r0, r0, #4294967295 d980: d1f5 bne.n d96e <_malloc_r+0x422> d982: 687b ldr r3, [r7, #4] d984: ea23 0301 bic.w r3, r3, r1 d988: 607b str r3, [r7, #4] d98a: 0049 lsls r1, r1, #1 d98c: 4299 cmp r1, r3 d98e: f63f aec0 bhi.w d712 <_malloc_r+0x1c6> d992: b919 cbnz r1, d99c <_malloc_r+0x450> d994: e6bd b.n d712 <_malloc_r+0x1c6> d996: 0049 lsls r1, r1, #1 d998: f10e 0e04 add.w lr, lr, #4 d99c: 4219 tst r1, r3 d99e: d0fa beq.n d996 <_malloc_r+0x44a> d9a0: 4670 mov r0, lr d9a2: e667 b.n d674 <_malloc_r+0x128> d9a4: f103 0810 add.w r8, r3, #16 d9a8: e6d0 b.n d74c <_malloc_r+0x200> d9aa: 109a asrs r2, r3, #2 d9ac: f04f 0801 mov.w r8, #1 d9b0: 687b ldr r3, [r7, #4] d9b2: fa08 f202 lsl.w r2, r8, r2 d9b6: 431a orrs r2, r3 d9b8: 607a str r2, [r7, #4] d9ba: e770 b.n d89e <_malloc_r+0x352> d9bc: eb02 0108 add.w r1, r2, r8 d9c0: 4249 negs r1, r1 d9c2: f3c1 0a0b ubfx sl, r1, #0, #12 d9c6: 4651 mov r1, sl d9c8: 4620 mov r0, r4 d9ca: 9200 str r2, [sp, #0] d9cc: f000 f948 bl dc60 <_sbrk_r> d9d0: 1c43 adds r3, r0, #1 d9d2: e9dd 2300 ldrd r2, r3, [sp] d9d6: f47f aeef bne.w d7b8 <_malloc_r+0x26c> d9da: 46da mov sl, fp d9dc: e6ef b.n d7be <_malloc_r+0x272> d9de: 2b54 cmp r3, #84 ; 0x54 d9e0: d825 bhi.n da2e <_malloc_r+0x4e2> d9e2: 0b13 lsrs r3, r2, #12 d9e4: f103 016f add.w r1, r3, #111 ; 0x6f d9e8: 00c9 lsls r1, r1, #3 d9ea: 336e adds r3, #110 ; 0x6e d9ec: e744 b.n d878 <_malloc_r+0x32c> d9ee: f5b3 7faa cmp.w r3, #340 ; 0x154 d9f2: d825 bhi.n da40 <_malloc_r+0x4f4> d9f4: 0bf3 lsrs r3, r6, #15 d9f6: f103 0078 add.w r0, r3, #120 ; 0x78 d9fa: f103 0c77 add.w ip, r3, #119 ; 0x77 d9fe: 00c3 lsls r3, r0, #3 da00: e5ea b.n d5d8 <_malloc_r+0x8c> da02: 4b29 ldr r3, [pc, #164] ; (daa8 <_malloc_r+0x55c>) da04: 6818 ldr r0, [r3, #0] da06: 4440 add r0, r8 da08: 6018 str r0, [r3, #0] da0a: e6b1 b.n d770 <_malloc_r+0x224> da0c: f3ca 0c0b ubfx ip, sl, #0, #12 da10: f1bc 0f00 cmp.w ip, #0 da14: f47f aeac bne.w d770 <_malloc_r+0x224> da18: 68bd ldr r5, [r7, #8] da1a: 44c8 add r8, r9 da1c: f048 0001 orr.w r0, r8, #1 da20: 6068 str r0, [r5, #4] da22: e6f0 b.n d806 <_malloc_r+0x2ba> da24: 4615 mov r5, r2 da26: e6ee b.n d806 <_malloc_r+0x2ba> da28: 2301 movs r3, #1 da2a: 6053 str r3, [r2, #4] da2c: e794 b.n d958 <_malloc_r+0x40c> da2e: f5b3 7faa cmp.w r3, #340 ; 0x154 da32: d823 bhi.n da7c <_malloc_r+0x530> da34: 0bd3 lsrs r3, r2, #15 da36: f103 0178 add.w r1, r3, #120 ; 0x78 da3a: 00c9 lsls r1, r1, #3 da3c: 3377 adds r3, #119 ; 0x77 da3e: e71b b.n d878 <_malloc_r+0x32c> da40: f240 5254 movw r2, #1364 ; 0x554 da44: 4293 cmp r3, r2 da46: d823 bhi.n da90 <_malloc_r+0x544> da48: 0cb3 lsrs r3, r6, #18 da4a: f103 007d add.w r0, r3, #125 ; 0x7d da4e: f103 0c7c add.w ip, r3, #124 ; 0x7c da52: 00c3 lsls r3, r0, #3 da54: e5c0 b.n d5d8 <_malloc_r+0x8c> da56: f1ab 0b08 sub.w fp, fp, #8 da5a: 44d8 add r8, fp da5c: eba8 0802 sub.w r8, r8, r2 da60: f04f 0a00 mov.w sl, #0 da64: e6ab b.n d7be <_malloc_r+0x272> da66: f105 0108 add.w r1, r5, #8 da6a: 4620 mov r0, r4 da6c: 9300 str r3, [sp, #0] da6e: f000 fa49 bl df04 <_free_r> da72: 68bd ldr r5, [r7, #8] da74: 9b00 ldr r3, [sp, #0] da76: 6868 ldr r0, [r5, #4] da78: 6819 ldr r1, [r3, #0] da7a: e6c4 b.n d806 <_malloc_r+0x2ba> da7c: f240 5154 movw r1, #1364 ; 0x554 da80: 428b cmp r3, r1 da82: d80b bhi.n da9c <_malloc_r+0x550> da84: 0c93 lsrs r3, r2, #18 da86: f103 017d add.w r1, r3, #125 ; 0x7d da8a: 00c9 lsls r1, r1, #3 da8c: 337c adds r3, #124 ; 0x7c da8e: e6f3 b.n d878 <_malloc_r+0x32c> da90: f44f 737e mov.w r3, #1016 ; 0x3f8 da94: 207f movs r0, #127 ; 0x7f da96: f04f 0c7e mov.w ip, #126 ; 0x7e da9a: e59d b.n d5d8 <_malloc_r+0x8c> da9c: f44f 717e mov.w r1, #1016 ; 0x3f8 daa0: 237e movs r3, #126 ; 0x7e daa2: e6e9 b.n d878 <_malloc_r+0x32c> daa4: 687b ldr r3, [r7, #4] daa6: e770 b.n d98a <_malloc_r+0x43e> daa8: 200027a0 .word 0x200027a0 0000daac <__malloc_lock>: daac: 4801 ldr r0, [pc, #4] ; (dab4 <__malloc_lock+0x8>) daae: f000 b913 b.w dcd8 <__retarget_lock_acquire_recursive> dab2: bf00 nop dab4: 2000279c .word 0x2000279c 0000dab8 <__malloc_unlock>: dab8: 4801 ldr r0, [pc, #4] ; (dac0 <__malloc_unlock+0x8>) daba: f000 b90f b.w dcdc <__retarget_lock_release_recursive> dabe: bf00 nop dac0: 2000279c .word 0x2000279c 0000dac4 <__cxa_atexit>: dac4: 4613 mov r3, r2 dac6: 460a mov r2, r1 dac8: 4601 mov r1, r0 daca: 2002 movs r0, #2 dacc: f000 b986 b.w dddc <__register_exitproc> 0000dad0 : dad0: 2a03 cmp r2, #3 dad2: b570 push {r4, r5, r6, lr} dad4: d914 bls.n db00 dad6: ea40 0301 orr.w r3, r0, r1 dada: 079b lsls r3, r3, #30 dadc: d122 bne.n db24 dade: 4604 mov r4, r0 dae0: 460b mov r3, r1 dae2: 4619 mov r1, r3 dae4: 4620 mov r0, r4 dae6: 680e ldr r6, [r1, #0] dae8: 6805 ldr r5, [r0, #0] daea: 42b5 cmp r5, r6 daec: f104 0404 add.w r4, r4, #4 daf0: f103 0304 add.w r3, r3, #4 daf4: d116 bne.n db24 daf6: 3a04 subs r2, #4 daf8: 2a03 cmp r2, #3 dafa: 4620 mov r0, r4 dafc: 4619 mov r1, r3 dafe: d8f0 bhi.n dae2 db00: 1e54 subs r4, r2, #1 db02: b19a cbz r2, db2c db04: 1e42 subs r2, r0, #1 db06: 3901 subs r1, #1 db08: e001 b.n db0e db0a: 18c3 adds r3, r0, r3 db0c: d00c beq.n db28 db0e: f812 ef01 ldrb.w lr, [r2, #1]! db12: f811 cf01 ldrb.w ip, [r1, #1]! db16: 45e6 cmp lr, ip db18: eba4 0302 sub.w r3, r4, r2 db1c: d0f5 beq.n db0a db1e: ebae 000c sub.w r0, lr, ip db22: bd70 pop {r4, r5, r6, pc} db24: 1e54 subs r4, r2, #1 db26: e7ed b.n db04 db28: 4618 mov r0, r3 db2a: bd70 pop {r4, r5, r6, pc} db2c: 4610 mov r0, r2 db2e: bd70 pop {r4, r5, r6, pc} 0000db30 : db30: 0783 lsls r3, r0, #30 db32: b530 push {r4, r5, lr} db34: d048 beq.n dbc8 db36: 1e54 subs r4, r2, #1 db38: 2a00 cmp r2, #0 db3a: d03f beq.n dbbc db3c: b2ca uxtb r2, r1 db3e: 4603 mov r3, r0 db40: e001 b.n db46 db42: 3c01 subs r4, #1 db44: d33a bcc.n dbbc db46: f803 2b01 strb.w r2, [r3], #1 db4a: 079d lsls r5, r3, #30 db4c: d1f9 bne.n db42 db4e: 2c03 cmp r4, #3 db50: d92d bls.n dbae db52: b2cd uxtb r5, r1 db54: ea45 2505 orr.w r5, r5, r5, lsl #8 db58: 2c0f cmp r4, #15 db5a: ea45 4505 orr.w r5, r5, r5, lsl #16 db5e: d936 bls.n dbce db60: f1a4 0210 sub.w r2, r4, #16 db64: f022 0c0f bic.w ip, r2, #15 db68: f103 0e20 add.w lr, r3, #32 db6c: 44e6 add lr, ip db6e: ea4f 1c12 mov.w ip, r2, lsr #4 db72: f103 0210 add.w r2, r3, #16 db76: e942 5504 strd r5, r5, [r2, #-16] db7a: e942 5502 strd r5, r5, [r2, #-8] db7e: 3210 adds r2, #16 db80: 4572 cmp r2, lr db82: d1f8 bne.n db76 db84: f10c 0201 add.w r2, ip, #1 db88: f014 0f0c tst.w r4, #12 db8c: eb03 1202 add.w r2, r3, r2, lsl #4 db90: f004 0c0f and.w ip, r4, #15 db94: d013 beq.n dbbe db96: f1ac 0304 sub.w r3, ip, #4 db9a: f023 0303 bic.w r3, r3, #3 db9e: 3304 adds r3, #4 dba0: 4413 add r3, r2 dba2: f842 5b04 str.w r5, [r2], #4 dba6: 4293 cmp r3, r2 dba8: d1fb bne.n dba2 dbaa: f00c 0403 and.w r4, ip, #3 dbae: b12c cbz r4, dbbc dbb0: b2c9 uxtb r1, r1 dbb2: 441c add r4, r3 dbb4: f803 1b01 strb.w r1, [r3], #1 dbb8: 429c cmp r4, r3 dbba: d1fb bne.n dbb4 dbbc: bd30 pop {r4, r5, pc} dbbe: 4664 mov r4, ip dbc0: 4613 mov r3, r2 dbc2: 2c00 cmp r4, #0 dbc4: d1f4 bne.n dbb0 dbc6: e7f9 b.n dbbc dbc8: 4603 mov r3, r0 dbca: 4614 mov r4, r2 dbcc: e7bf b.n db4e dbce: 461a mov r2, r3 dbd0: 46a4 mov ip, r4 dbd2: e7e0 b.n db96 0000dbd4 : dbd4: 2a00 cmp r2, #0 dbd6: d03e beq.n dc56 dbd8: ea40 0301 orr.w r3, r0, r1 dbdc: 079b lsls r3, r3, #30 dbde: b530 push {r4, r5, lr} dbe0: 4684 mov ip, r0 dbe2: d12f bne.n dc44 dbe4: 2a03 cmp r2, #3 dbe6: d92d bls.n dc44 dbe8: 460b mov r3, r1 dbea: e008 b.n dbfe dbec: 3a04 subs r2, #4 dbee: 4684 mov ip, r0 dbf0: 4619 mov r1, r3 dbf2: d025 beq.n dc40 dbf4: f01e 3f80 tst.w lr, #2155905152 ; 0x80808080 dbf8: d122 bne.n dc40 dbfa: 2a03 cmp r2, #3 dbfc: d922 bls.n dc44 dbfe: 6804 ldr r4, [r0, #0] dc00: 4619 mov r1, r3 dc02: f853 5b04 ldr.w r5, [r3], #4 dc06: f1a4 3e01 sub.w lr, r4, #16843009 ; 0x1010101 dc0a: 42ac cmp r4, r5 dc0c: 4684 mov ip, r0 dc0e: ea2e 0e04 bic.w lr, lr, r4 dc12: f100 0004 add.w r0, r0, #4 dc16: d0e9 beq.n dbec dc18: f89c 0000 ldrb.w r0, [ip] dc1c: 780c ldrb r4, [r1, #0] dc1e: 42a0 cmp r0, r4 dc20: d11b bne.n dc5a dc22: 46e6 mov lr, ip dc24: b168 cbz r0, dc42 dc26: f81e 0f01 ldrb.w r0, [lr, #1]! dc2a: f811 4f01 ldrb.w r4, [r1, #1]! dc2e: eba2 030e sub.w r3, r2, lr dc32: 42a0 cmp r0, r4 dc34: f103 33ff add.w r3, r3, #4294967295 dc38: d10f bne.n dc5a dc3a: eb1c 0303 adds.w r3, ip, r3 dc3e: d1f1 bne.n dc24 dc40: 2000 movs r0, #0 dc42: bd30 pop {r4, r5, pc} dc44: f89c 0000 ldrb.w r0, [ip] dc48: 780c ldrb r4, [r1, #0] dc4a: 4284 cmp r4, r0 dc4c: d105 bne.n dc5a dc4e: 2a01 cmp r2, #1 dc50: d0f6 beq.n dc40 dc52: 46e6 mov lr, ip dc54: e7e6 b.n dc24 dc56: 4610 mov r0, r2 dc58: 4770 bx lr dc5a: 1b00 subs r0, r0, r4 dc5c: bd30 pop {r4, r5, pc} dc5e: bf00 nop 0000dc60 <_sbrk_r>: dc60: b538 push {r3, r4, r5, lr} dc62: 4d07 ldr r5, [pc, #28] ; (dc80 <_sbrk_r+0x20>) dc64: 2200 movs r2, #0 dc66: 4604 mov r4, r0 dc68: 4608 mov r0, r1 dc6a: 602a str r2, [r5, #0] dc6c: f7fd fdf6 bl b85c <_sbrk> dc70: 1c43 adds r3, r0, #1 dc72: d000 beq.n dc76 <_sbrk_r+0x16> dc74: bd38 pop {r3, r4, r5, pc} dc76: 682b ldr r3, [r5, #0] dc78: 2b00 cmp r3, #0 dc7a: d0fb beq.n dc74 <_sbrk_r+0x14> dc7c: 6023 str r3, [r4, #0] dc7e: bd38 pop {r3, r4, r5, pc} dc80: 20002964 .word 0x20002964 0000dc84 <__errno>: dc84: 4b01 ldr r3, [pc, #4] ; (dc8c <__errno+0x8>) dc86: 6818 ldr r0, [r3, #0] dc88: 4770 bx lr dc8a: bf00 nop dc8c: 200014c8 .word 0x200014c8 0000dc90 <__libc_init_array>: dc90: b570 push {r4, r5, r6, lr} dc92: 4e0d ldr r6, [pc, #52] ; (dcc8 <__libc_init_array+0x38>) dc94: 4d0d ldr r5, [pc, #52] ; (dccc <__libc_init_array+0x3c>) dc96: 1b76 subs r6, r6, r5 dc98: 10b6 asrs r6, r6, #2 dc9a: d006 beq.n dcaa <__libc_init_array+0x1a> dc9c: 2400 movs r4, #0 dc9e: f855 3b04 ldr.w r3, [r5], #4 dca2: 3401 adds r4, #1 dca4: 4798 blx r3 dca6: 42a6 cmp r6, r4 dca8: d1f9 bne.n dc9e <__libc_init_array+0xe> dcaa: 4e09 ldr r6, [pc, #36] ; (dcd0 <__libc_init_array+0x40>) dcac: 4d09 ldr r5, [pc, #36] ; (dcd4 <__libc_init_array+0x44>) dcae: 1b76 subs r6, r6, r5 dcb0: f000 fa32 bl e118 <___init_veneer> dcb4: 10b6 asrs r6, r6, #2 dcb6: d006 beq.n dcc6 <__libc_init_array+0x36> dcb8: 2400 movs r4, #0 dcba: f855 3b04 ldr.w r3, [r5], #4 dcbe: 3401 adds r4, #1 dcc0: 4798 blx r3 dcc2: 42a6 cmp r6, r4 dcc4: d1f9 bne.n dcba <__libc_init_array+0x2a> dcc6: bd70 pop {r4, r5, r6, pc} dcc8: 60001ee0 .word 0x60001ee0 dccc: 60001ee0 .word 0x60001ee0 dcd0: 60001f58 .word 0x60001f58 dcd4: 60001ee0 .word 0x60001ee0 0000dcd8 <__retarget_lock_acquire_recursive>: dcd8: 4770 bx lr dcda: bf00 nop 0000dcdc <__retarget_lock_release_recursive>: dcdc: 4770 bx lr dcde: bf00 nop ... 0000dd00 : dd00: f890 f000 pld [r0] dd04: e96d 4502 strd r4, r5, [sp, #-8]! dd08: f020 0107 bic.w r1, r0, #7 dd0c: f06f 0c00 mvn.w ip, #0 dd10: f010 0407 ands.w r4, r0, #7 dd14: f891 f020 pld [r1, #32] dd18: f040 8049 bne.w ddae dd1c: f04f 0400 mov.w r4, #0 dd20: f06f 0007 mvn.w r0, #7 dd24: e9d1 2300 ldrd r2, r3, [r1] dd28: f891 f040 pld [r1, #64] ; 0x40 dd2c: f100 0008 add.w r0, r0, #8 dd30: fa82 f24c uadd8 r2, r2, ip dd34: faa4 f28c sel r2, r4, ip dd38: fa83 f34c uadd8 r3, r3, ip dd3c: faa2 f38c sel r3, r2, ip dd40: bb4b cbnz r3, dd96 dd42: e9d1 2302 ldrd r2, r3, [r1, #8] dd46: fa82 f24c uadd8 r2, r2, ip dd4a: f100 0008 add.w r0, r0, #8 dd4e: faa4 f28c sel r2, r4, ip dd52: fa83 f34c uadd8 r3, r3, ip dd56: faa2 f38c sel r3, r2, ip dd5a: b9e3 cbnz r3, dd96 dd5c: e9d1 2304 ldrd r2, r3, [r1, #16] dd60: fa82 f24c uadd8 r2, r2, ip dd64: f100 0008 add.w r0, r0, #8 dd68: faa4 f28c sel r2, r4, ip dd6c: fa83 f34c uadd8 r3, r3, ip dd70: faa2 f38c sel r3, r2, ip dd74: b97b cbnz r3, dd96 dd76: e9d1 2306 ldrd r2, r3, [r1, #24] dd7a: f101 0120 add.w r1, r1, #32 dd7e: fa82 f24c uadd8 r2, r2, ip dd82: f100 0008 add.w r0, r0, #8 dd86: faa4 f28c sel r2, r4, ip dd8a: fa83 f34c uadd8 r3, r3, ip dd8e: faa2 f38c sel r3, r2, ip dd92: 2b00 cmp r3, #0 dd94: d0c6 beq.n dd24 dd96: 2a00 cmp r2, #0 dd98: bf04 itt eq dd9a: 3004 addeq r0, #4 dd9c: 461a moveq r2, r3 dd9e: ba12 rev r2, r2 dda0: fab2 f282 clz r2, r2 dda4: e8fd 4502 ldrd r4, r5, [sp], #8 dda8: eb00 00d2 add.w r0, r0, r2, lsr #3 ddac: 4770 bx lr ddae: e9d1 2300 ldrd r2, r3, [r1] ddb2: f004 0503 and.w r5, r4, #3 ddb6: f1c4 0000 rsb r0, r4, #0 ddba: ea4f 05c5 mov.w r5, r5, lsl #3 ddbe: f014 0f04 tst.w r4, #4 ddc2: f891 f040 pld [r1, #64] ; 0x40 ddc6: fa0c f505 lsl.w r5, ip, r5 ddca: ea62 0205 orn r2, r2, r5 ddce: bf1c itt ne ddd0: ea63 0305 ornne r3, r3, r5 ddd4: 4662 movne r2, ip ddd6: f04f 0400 mov.w r4, #0 ddda: e7a9 b.n dd30 0000dddc <__register_exitproc>: dddc: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} dde0: f8df a07c ldr.w sl, [pc, #124] ; de60 <__register_exitproc+0x84> dde4: 4606 mov r6, r0 dde6: f8da 0000 ldr.w r0, [sl] ddea: 4698 mov r8, r3 ddec: 460f mov r7, r1 ddee: 4691 mov r9, r2 ddf0: f7ff ff72 bl dcd8 <__retarget_lock_acquire_recursive> ddf4: 4b18 ldr r3, [pc, #96] ; (de58 <__register_exitproc+0x7c>) ddf6: 681c ldr r4, [r3, #0] ddf8: b324 cbz r4, de44 <__register_exitproc+0x68> ddfa: 6865 ldr r5, [r4, #4] ddfc: 2d1f cmp r5, #31 ddfe: dc24 bgt.n de4a <__register_exitproc+0x6e> de00: b95e cbnz r6, de1a <__register_exitproc+0x3e> de02: 1c6b adds r3, r5, #1 de04: 3502 adds r5, #2 de06: f8da 0000 ldr.w r0, [sl] de0a: 6063 str r3, [r4, #4] de0c: f844 7025 str.w r7, [r4, r5, lsl #2] de10: f7ff ff64 bl dcdc <__retarget_lock_release_recursive> de14: 2000 movs r0, #0 de16: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} de1a: eb04 0185 add.w r1, r4, r5, lsl #2 de1e: 2301 movs r3, #1 de20: f8c1 9088 str.w r9, [r1, #136] ; 0x88 de24: f8d4 2188 ldr.w r2, [r4, #392] ; 0x188 de28: 40ab lsls r3, r5 de2a: 431a orrs r2, r3 de2c: 2e02 cmp r6, #2 de2e: f8c4 2188 str.w r2, [r4, #392] ; 0x188 de32: f8c1 8108 str.w r8, [r1, #264] ; 0x108 de36: d1e4 bne.n de02 <__register_exitproc+0x26> de38: f8d4 218c ldr.w r2, [r4, #396] ; 0x18c de3c: 431a orrs r2, r3 de3e: f8c4 218c str.w r2, [r4, #396] ; 0x18c de42: e7de b.n de02 <__register_exitproc+0x26> de44: 4c05 ldr r4, [pc, #20] ; (de5c <__register_exitproc+0x80>) de46: 601c str r4, [r3, #0] de48: e7d7 b.n ddfa <__register_exitproc+0x1e> de4a: f8da 0000 ldr.w r0, [sl] de4e: f7ff ff45 bl dcdc <__retarget_lock_release_recursive> de52: f04f 30ff mov.w r0, #4294967295 de56: e7de b.n de16 <__register_exitproc+0x3a> de58: 20002604 .word 0x20002604 de5c: 20002608 .word 0x20002608 de60: 200010ac .word 0x200010ac 0000de64 <_malloc_trim_r>: de64: b5f8 push {r3, r4, r5, r6, r7, lr} de66: 4f24 ldr r7, [pc, #144] ; (def8 <_malloc_trim_r+0x94>) de68: 460c mov r4, r1 de6a: 4606 mov r6, r0 de6c: f7ff fe1e bl daac <__malloc_lock> de70: 68bb ldr r3, [r7, #8] de72: 685d ldr r5, [r3, #4] de74: f5c4 617e rsb r1, r4, #4064 ; 0xfe0 de78: 310f adds r1, #15 de7a: f025 0503 bic.w r5, r5, #3 de7e: 194b adds r3, r1, r5 de80: f423 637f bic.w r3, r3, #4080 ; 0xff0 de84: f023 030f bic.w r3, r3, #15 de88: f5a3 5480 sub.w r4, r3, #4096 ; 0x1000 de8c: f5b4 5f80 cmp.w r4, #4096 ; 0x1000 de90: db07 blt.n dea2 <_malloc_trim_r+0x3e> de92: 2100 movs r1, #0 de94: 4630 mov r0, r6 de96: f7ff fee3 bl dc60 <_sbrk_r> de9a: 68bb ldr r3, [r7, #8] de9c: 442b add r3, r5 de9e: 4298 cmp r0, r3 dea0: d004 beq.n deac <_malloc_trim_r+0x48> dea2: 4630 mov r0, r6 dea4: f7ff fe08 bl dab8 <__malloc_unlock> dea8: 2000 movs r0, #0 deaa: bdf8 pop {r3, r4, r5, r6, r7, pc} deac: 4261 negs r1, r4 deae: 4630 mov r0, r6 deb0: f7ff fed6 bl dc60 <_sbrk_r> deb4: 3001 adds r0, #1 deb6: d00d beq.n ded4 <_malloc_trim_r+0x70> deb8: 4a10 ldr r2, [pc, #64] ; (defc <_malloc_trim_r+0x98>) deba: 68bb ldr r3, [r7, #8] debc: 1b2d subs r5, r5, r4 debe: f045 0501 orr.w r5, r5, #1 dec2: 605d str r5, [r3, #4] dec4: 6813 ldr r3, [r2, #0] dec6: 4630 mov r0, r6 dec8: 1b1b subs r3, r3, r4 deca: 6013 str r3, [r2, #0] decc: f7ff fdf4 bl dab8 <__malloc_unlock> ded0: 2001 movs r0, #1 ded2: bdf8 pop {r3, r4, r5, r6, r7, pc} ded4: 2100 movs r1, #0 ded6: 4630 mov r0, r6 ded8: f7ff fec2 bl dc60 <_sbrk_r> dedc: 68ba ldr r2, [r7, #8] dede: 1a83 subs r3, r0, r2 dee0: 2b0f cmp r3, #15 dee2: ddde ble.n dea2 <_malloc_trim_r+0x3e> dee4: f043 0301 orr.w r3, r3, #1 dee8: 6053 str r3, [r2, #4] deea: 4b05 ldr r3, [pc, #20] ; (df00 <_malloc_trim_r+0x9c>) deec: 4903 ldr r1, [pc, #12] ; (defc <_malloc_trim_r+0x98>) deee: 681b ldr r3, [r3, #0] def0: 1ac0 subs r0, r0, r3 def2: 6008 str r0, [r1, #0] def4: e7d5 b.n dea2 <_malloc_trim_r+0x3e> def6: bf00 nop def8: 200010b8 .word 0x200010b8 defc: 200027a0 .word 0x200027a0 df00: 200014c0 .word 0x200014c0 0000df04 <_free_r>: df04: 2900 cmp r1, #0 df06: d061 beq.n dfcc <_free_r+0xc8> df08: b5f8 push {r3, r4, r5, r6, r7, lr} df0a: 460c mov r4, r1 df0c: 4606 mov r6, r0 df0e: f7ff fdcd bl daac <__malloc_lock> df12: f854 2c04 ldr.w r2, [r4, #-4] df16: 4f7b ldr r7, [pc, #492] ; (e104 <_free_r+0x200>) df18: f1a4 0508 sub.w r5, r4, #8 df1c: f022 0101 bic.w r1, r2, #1 df20: eb05 0c01 add.w ip, r5, r1 df24: 68b8 ldr r0, [r7, #8] df26: f8dc 3004 ldr.w r3, [ip, #4] df2a: 4560 cmp r0, ip df2c: f023 0303 bic.w r3, r3, #3 df30: f000 808b beq.w e04a <_free_r+0x146> df34: 07d2 lsls r2, r2, #31 df36: f8cc 3004 str.w r3, [ip, #4] df3a: d432 bmi.n dfa2 <_free_r+0x9e> df3c: f854 2c08 ldr.w r2, [r4, #-8] df40: 1aad subs r5, r5, r2 df42: 4411 add r1, r2 df44: 68aa ldr r2, [r5, #8] df46: f107 0008 add.w r0, r7, #8 df4a: 4282 cmp r2, r0 df4c: d06a beq.n e024 <_free_r+0x120> df4e: eb0c 0403 add.w r4, ip, r3 df52: f8d4 e004 ldr.w lr, [r4, #4] df56: 68ec ldr r4, [r5, #12] df58: 60d4 str r4, [r2, #12] df5a: f01e 0f01 tst.w lr, #1 df5e: 60a2 str r2, [r4, #8] df60: f000 8097 beq.w e092 <_free_r+0x18e> df64: f041 0301 orr.w r3, r1, #1 df68: 606b str r3, [r5, #4] df6a: f8cc 1000 str.w r1, [ip] df6e: f5b1 7f00 cmp.w r1, #512 ; 0x200 df72: d235 bcs.n dfe0 <_free_r+0xdc> df74: 6878 ldr r0, [r7, #4] df76: 08cb lsrs r3, r1, #3 df78: 2201 movs r2, #1 df7a: 0949 lsrs r1, r1, #5 df7c: 3301 adds r3, #1 df7e: 408a lsls r2, r1 df80: 4302 orrs r2, r0 df82: f857 1033 ldr.w r1, [r7, r3, lsl #3] df86: 607a str r2, [r7, #4] df88: eb07 02c3 add.w r2, r7, r3, lsl #3 df8c: 3a08 subs r2, #8 df8e: e9c5 1202 strd r1, r2, [r5, #8] df92: f847 5033 str.w r5, [r7, r3, lsl #3] df96: 60cd str r5, [r1, #12] df98: 4630 mov r0, r6 df9a: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} df9e: f7ff bd8b b.w dab8 <__malloc_unlock> dfa2: eb0c 0203 add.w r2, ip, r3 dfa6: 6852 ldr r2, [r2, #4] dfa8: 07d0 lsls r0, r2, #31 dfaa: d410 bmi.n dfce <_free_r+0xca> dfac: 4419 add r1, r3 dfae: f107 0008 add.w r0, r7, #8 dfb2: f8dc 3008 ldr.w r3, [ip, #8] dfb6: 4283 cmp r3, r0 dfb8: d073 beq.n e0a2 <_free_r+0x19e> dfba: f8dc 200c ldr.w r2, [ip, #12] dfbe: 60da str r2, [r3, #12] dfc0: 6093 str r3, [r2, #8] dfc2: f041 0301 orr.w r3, r1, #1 dfc6: 606b str r3, [r5, #4] dfc8: 5069 str r1, [r5, r1] dfca: e7d0 b.n df6e <_free_r+0x6a> dfcc: 4770 bx lr dfce: f041 0301 orr.w r3, r1, #1 dfd2: f5b1 7f00 cmp.w r1, #512 ; 0x200 dfd6: f844 3c04 str.w r3, [r4, #-4] dfda: f8cc 1000 str.w r1, [ip] dfde: d3c9 bcc.n df74 <_free_r+0x70> dfe0: f5b1 6f20 cmp.w r1, #2560 ; 0xa00 dfe4: ea4f 2351 mov.w r3, r1, lsr #9 dfe8: d248 bcs.n e07c <_free_r+0x178> dfea: 098b lsrs r3, r1, #6 dfec: f103 0039 add.w r0, r3, #57 ; 0x39 dff0: f103 0238 add.w r2, r3, #56 ; 0x38 dff4: 00c3 lsls r3, r0, #3 dff6: 18f8 adds r0, r7, r3 dff8: 58fb ldr r3, [r7, r3] dffa: 3808 subs r0, #8 dffc: 4298 cmp r0, r3 dffe: d059 beq.n e0b4 <_free_r+0x1b0> e000: 685a ldr r2, [r3, #4] e002: f022 0203 bic.w r2, r2, #3 e006: 428a cmp r2, r1 e008: d902 bls.n e010 <_free_r+0x10c> e00a: 689b ldr r3, [r3, #8] e00c: 4298 cmp r0, r3 e00e: d1f7 bne.n e000 <_free_r+0xfc> e010: 68d8 ldr r0, [r3, #12] e012: e9c5 3002 strd r3, r0, [r5, #8] e016: 6085 str r5, [r0, #8] e018: 60dd str r5, [r3, #12] e01a: 4630 mov r0, r6 e01c: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} e020: f7ff bd4a b.w dab8 <__malloc_unlock> e024: eb0c 0203 add.w r2, ip, r3 e028: 6852 ldr r2, [r2, #4] e02a: 07d2 lsls r2, r2, #31 e02c: d463 bmi.n e0f6 <_free_r+0x1f2> e02e: 440b add r3, r1 e030: e9dc 1202 ldrd r1, r2, [ip, #8] e034: 60ca str r2, [r1, #12] e036: 6091 str r1, [r2, #8] e038: f043 0201 orr.w r2, r3, #1 e03c: 606a str r2, [r5, #4] e03e: 4630 mov r0, r6 e040: 50eb str r3, [r5, r3] e042: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr} e046: f7ff bd37 b.w dab8 <__malloc_unlock> e04a: 440b add r3, r1 e04c: 07d1 lsls r1, r2, #31 e04e: d407 bmi.n e060 <_free_r+0x15c> e050: f854 2c08 ldr.w r2, [r4, #-8] e054: 1aad subs r5, r5, r2 e056: 4413 add r3, r2 e058: e9d5 1202 ldrd r1, r2, [r5, #8] e05c: 60ca str r2, [r1, #12] e05e: 6091 str r1, [r2, #8] e060: f043 0201 orr.w r2, r3, #1 e064: 606a str r2, [r5, #4] e066: 4a28 ldr r2, [pc, #160] ; (e108 <_free_r+0x204>) e068: 60bd str r5, [r7, #8] e06a: 6812 ldr r2, [r2, #0] e06c: 429a cmp r2, r3 e06e: d893 bhi.n df98 <_free_r+0x94> e070: 4b26 ldr r3, [pc, #152] ; (e10c <_free_r+0x208>) e072: 4630 mov r0, r6 e074: 6819 ldr r1, [r3, #0] e076: f7ff fef5 bl de64 <_malloc_trim_r> e07a: e78d b.n df98 <_free_r+0x94> e07c: 2b14 cmp r3, #20 e07e: d90a bls.n e096 <_free_r+0x192> e080: 2b54 cmp r3, #84 ; 0x54 e082: d81f bhi.n e0c4 <_free_r+0x1c0> e084: 0b0b lsrs r3, r1, #12 e086: f103 006f add.w r0, r3, #111 ; 0x6f e08a: f103 026e add.w r2, r3, #110 ; 0x6e e08e: 00c3 lsls r3, r0, #3 e090: e7b1 b.n dff6 <_free_r+0xf2> e092: 4419 add r1, r3 e094: e78d b.n dfb2 <_free_r+0xae> e096: f103 005c add.w r0, r3, #92 ; 0x5c e09a: f103 025b add.w r2, r3, #91 ; 0x5b e09e: 00c3 lsls r3, r0, #3 e0a0: e7a9 b.n dff6 <_free_r+0xf2> e0a2: f041 0301 orr.w r3, r1, #1 e0a6: e9c7 5504 strd r5, r5, [r7, #16] e0aa: e9c5 0002 strd r0, r0, [r5, #8] e0ae: 606b str r3, [r5, #4] e0b0: 5069 str r1, [r5, r1] e0b2: e771 b.n df98 <_free_r+0x94> e0b4: 6879 ldr r1, [r7, #4] e0b6: 1092 asrs r2, r2, #2 e0b8: 2401 movs r4, #1 e0ba: fa04 f202 lsl.w r2, r4, r2 e0be: 430a orrs r2, r1 e0c0: 607a str r2, [r7, #4] e0c2: e7a6 b.n e012 <_free_r+0x10e> e0c4: f5b3 7faa cmp.w r3, #340 ; 0x154 e0c8: d806 bhi.n e0d8 <_free_r+0x1d4> e0ca: 0bcb lsrs r3, r1, #15 e0cc: f103 0078 add.w r0, r3, #120 ; 0x78 e0d0: f103 0277 add.w r2, r3, #119 ; 0x77 e0d4: 00c3 lsls r3, r0, #3 e0d6: e78e b.n dff6 <_free_r+0xf2> e0d8: f240 5254 movw r2, #1364 ; 0x554 e0dc: 4293 cmp r3, r2 e0de: d806 bhi.n e0ee <_free_r+0x1ea> e0e0: 0c8b lsrs r3, r1, #18 e0e2: f103 007d add.w r0, r3, #125 ; 0x7d e0e6: f103 027c add.w r2, r3, #124 ; 0x7c e0ea: 00c3 lsls r3, r0, #3 e0ec: e783 b.n dff6 <_free_r+0xf2> e0ee: f44f 737e mov.w r3, #1016 ; 0x3f8 e0f2: 227e movs r2, #126 ; 0x7e e0f4: e77f b.n dff6 <_free_r+0xf2> e0f6: f041 0301 orr.w r3, r1, #1 e0fa: 606b str r3, [r5, #4] e0fc: f8cc 1000 str.w r1, [ip] e100: e74a b.n df98 <_free_r+0x94> e102: bf00 nop e104: 200010b8 .word 0x200010b8 e108: 200014c4 .word 0x200014c4 e10c: 200027d0 .word 0x200027d0 0000e110 <___ZN11AudioStream17initialize_memoryEP18audio_block_structj_veneer>: e110: f85f f000 ldr.w pc, [pc] ; e114 <___ZN11AudioStream17initialize_memoryEP18audio_block_structj_veneer+0x4> e114: 60001619 .word 0x60001619 0000e118 <___init_veneer>: e118: f85f f000 ldr.w pc, [pc] ; e11c <___init_veneer+0x4> e11c: 60001e7d .word 0x60001e7d 0000e120 <___reboot_Teensyduino__veneer>: e120: f85f f000 ldr.w pc, [pc] ; e124 <___reboot_Teensyduino__veneer+0x4> e124: 60001dd5 .word 0x60001dd5 ... Disassembly of section .fini: 0000e130 <_fini>: e130: b5f8 push {r3, r4, r5, r6, r7, lr} e132: bf00 nop