You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6832 lines
254 KiB
Plaintext

spi_sd_mmc_lib.elf: file format elf32-littlearm
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000031c0 00000000 00000000 00010000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .relocate 0000006c 20000000 000031c0 00020000 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bkupram 00000000 47000000 47000000 0002006c 2**0
CONTENTS
3 .qspi 00000000 04000000 04000000 0002006c 2**0
CONTENTS
4 .bss 000002fc 20000070 00003230 0002006c 2**3
ALLOC
5 .stack 00010004 2000036c 0000352c 0002006c 2**0
ALLOC
6 .ARM.attributes 0000002e 00000000 00000000 0002006c 2**0
CONTENTS, READONLY
7 .comment 0000001e 00000000 00000000 0002009a 2**0
CONTENTS, READONLY
8 .debug_info 0002b3e2 00000000 00000000 000200b8 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
9 .debug_abbrev 00004153 00000000 00000000 0004b49a 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
10 .debug_loc 0000d96f 00000000 00000000 0004f5ed 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
11 .debug_aranges 00000e48 00000000 00000000 0005cf5c 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
12 .debug_ranges 00001f20 00000000 00000000 0005dda4 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
13 .debug_macro 0003942f 00000000 00000000 0005fcc4 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
14 .debug_line 0001be9e 00000000 00000000 000990f3 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
15 .debug_str 00126de5 00000000 00000000 000b4f91 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
16 .debug_frame 00002d24 00000000 00000000 001dbd78 2**2
CONTENTS, READONLY, DEBUGGING, OCTETS
Disassembly of section .text:
00000000 <exception_table>:
* \brief Delay loop to delay n number of cycles
*/
void _delay_cycles(void *const hw, uint32_t cycles)
{
(void)hw;
uint8_t n = cycles >> 24;
0: 70 03 01 20 55 18 00 00 53 18 00 00 53 18 00 00 p.. U...S...S...
uint32_t buf = cycles;
while (n--) {
10: 53 18 00 00 53 18 00 00 53 18 00 00 00 00 00 00 S...S...S.......
...
SysTick->LOAD = 0xFFFFFF;
2c: 53 18 00 00 53 18 00 00 00 00 00 00 53 18 00 00 S...S.......S...
3c: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
4c: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
5c: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
6c: b5 19 00 00 53 18 00 00 53 18 00 00 53 18 00 00 ....S...S...S...
7c: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
8c: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
9c: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
ac: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
bc: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
cc: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
dc: 53 18 00 00 53 18 00 00 53 18 00 00 00 00 00 00 S...S...S.......
...
f4: 19 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 ....S...S...S...
104: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
114: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
124: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
134: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
144: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
154: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
164: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
174: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
184: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
194: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
1a4: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
1b4: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
1c4: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
1d4: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
1e4: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
1f4: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
204: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
214: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
224: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
234: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
244: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
254: 53 18 00 00 53 18 00 00 53 18 00 00 53 18 00 00 S...S...S...S...
00000264 <__do_global_dtors_aux>:
264: b510 push {r4, lr}
266: 4c05 ldr r4, [pc, #20] ; (27c <__do_global_dtors_aux+0x18>)
268: 7823 ldrb r3, [r4, #0]
26a: b933 cbnz r3, 27a <__do_global_dtors_aux+0x16>
26c: 4b04 ldr r3, [pc, #16] ; (280 <__do_global_dtors_aux+0x1c>)
26e: b113 cbz r3, 276 <__do_global_dtors_aux+0x12>
270: 4804 ldr r0, [pc, #16] ; (284 <__do_global_dtors_aux+0x20>)
272: f3af 8000 nop.w
276: 2301 movs r3, #1
278: 7023 strb r3, [r4, #0]
27a: bd10 pop {r4, pc}
27c: 20000070 .word 0x20000070
280: 00000000 .word 0x00000000
284: 000031c0 .word 0x000031c0
00000288 <frame_dummy>:
288: b508 push {r3, lr}
28a: 4b03 ldr r3, [pc, #12] ; (298 <frame_dummy+0x10>)
28c: b11b cbz r3, 296 <frame_dummy+0xe>
28e: 4903 ldr r1, [pc, #12] ; (29c <frame_dummy+0x14>)
290: 4803 ldr r0, [pc, #12] ; (2a0 <frame_dummy+0x18>)
292: f3af 8000 nop.w
296: bd08 pop {r3, pc}
298: 00000000 .word 0x00000000
29c: 20000074 .word 0x20000074
2a0: 000031c0 .word 0x000031c0
000002a4 <io_write>:
/**
* \brief I/O write interface
*/
int32_t io_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length)
{
2a4: b570 push {r4, r5, r6, lr}
2a6: 460d mov r5, r1
2a8: 4616 mov r6, r2
ASSERT(io_descr && buf);
2aa: 4604 mov r4, r0
2ac: b110 cbz r0, 2b4 <io_write+0x10>
2ae: 1e08 subs r0, r1, #0
2b0: bf18 it ne
2b2: 2001 movne r0, #1
2b4: 4905 ldr r1, [pc, #20] ; (2cc <io_write+0x28>)
2b6: 4b06 ldr r3, [pc, #24] ; (2d0 <io_write+0x2c>)
2b8: 2234 movs r2, #52 ; 0x34
2ba: 4798 blx r3
return io_descr->write(io_descr, buf, length);
2bc: 6823 ldr r3, [r4, #0]
2be: 4632 mov r2, r6
2c0: 4629 mov r1, r5
2c2: 4620 mov r0, r4
}
2c4: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
return io_descr->write(io_descr, buf, length);
2c8: 4718 bx r3
2ca: bf00 nop
2cc: 00002ae4 .word 0x00002ae4
2d0: 00001605 .word 0x00001605
000002d4 <io_read>:
/**
* \brief I/O read interface
*/
int32_t io_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length)
{
2d4: b570 push {r4, r5, r6, lr}
2d6: 460d mov r5, r1
2d8: 4616 mov r6, r2
ASSERT(io_descr && buf);
2da: 4604 mov r4, r0
2dc: b110 cbz r0, 2e4 <io_read+0x10>
2de: 1e08 subs r0, r1, #0
2e0: bf18 it ne
2e2: 2001 movne r0, #1
2e4: 4905 ldr r1, [pc, #20] ; (2fc <io_read+0x28>)
2e6: 4b06 ldr r3, [pc, #24] ; (300 <io_read+0x2c>)
2e8: 223d movs r2, #61 ; 0x3d
2ea: 4798 blx r3
return io_descr->read(io_descr, buf, length);
2ec: 6863 ldr r3, [r4, #4]
2ee: 4632 mov r2, r6
2f0: 4629 mov r1, r5
2f2: 4620 mov r0, r4
}
2f4: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
return io_descr->read(io_descr, buf, length);
2f8: 4718 bx r3
2fa: bf00 nop
2fc: 00002ae4 .word 0x00002ae4
300: 00001605 .word 0x00001605
00000304 <_delay_init>:
304: f04f 23e0 mov.w r3, #3758153728 ; 0xe000e000
308: f06f 427f mvn.w r2, #4278190080 ; 0xff000000
30c: 615a str r2, [r3, #20]
30e: 2205 movs r2, #5
310: 611a str r2, [r3, #16]
312: 4770 bx lr
00000314 <calendar_init>:
}
/** \brief Initialize Calendar
*/
int32_t calendar_init(struct calendar_descriptor *const calendar, const void *hw)
{
314: b538 push {r3, r4, r5, lr}
int32_t ret = 0;
/* Sanity check arguments */
ASSERT(calendar);
316: 4604 mov r4, r0
318: 3800 subs r0, #0
31a: 4b0c ldr r3, [pc, #48] ; (34c <calendar_init+0x38>)
{
31c: 460d mov r5, r1
ASSERT(calendar);
31e: bf18 it ne
320: 2001 movne r0, #1
322: 490b ldr r1, [pc, #44] ; (350 <calendar_init+0x3c>)
324: f44f 72e0 mov.w r2, #448 ; 0x1c0
328: 4798 blx r3
if (calendar->device.hw == hw) {
32a: 6823 ldr r3, [r4, #0]
32c: 42ab cmp r3, r5
32e: d008 beq.n 342 <calendar_init+0x2e>
/* Already initialized with current configuration */
return ERR_NONE;
} else if (calendar->device.hw != NULL) {
330: b94b cbnz r3, 346 <calendar_init+0x32>
/* Initialized with another configuration */
return ERR_ALREADY_INITIALIZED;
}
calendar->device.hw = (void *)hw;
ret = _calendar_init(&calendar->device);
332: 4b08 ldr r3, [pc, #32] ; (354 <calendar_init+0x40>)
calendar->device.hw = (void *)hw;
334: 6025 str r5, [r4, #0]
ret = _calendar_init(&calendar->device);
336: 4620 mov r0, r4
338: 4798 blx r3
calendar->base_year = DEFAULT_BASE_YEAR;
33a: f240 73b2 movw r3, #1970 ; 0x7b2
33e: 61a3 str r3, [r4, #24]
return ret;
}
340: bd38 pop {r3, r4, r5, pc}
return ERR_NONE;
342: 2000 movs r0, #0
344: e7fc b.n 340 <calendar_init+0x2c>
return ERR_ALREADY_INITIALIZED;
346: f06f 0011 mvn.w r0, #17
34a: e7f9 b.n 340 <calendar_init+0x2c>
34c: 00001605 .word 0x00001605
350: 00002af8 .word 0x00002af8
354: 00001939 .word 0x00001939
00000358 <SDMMC_example>:
/*
* Example
*/
void SDMMC_example(void)
{
358: b537 push {r0, r1, r2, r4, r5, lr}
while (SD_MMC_OK != sd_mmc_check(0)) {
35a: 4d13 ldr r5, [pc, #76] ; (3a8 <SDMMC_example+0x50>)
35c: 2000 movs r0, #0
35e: 47a8 blx r5
360: 4604 mov r4, r0
362: 2800 cmp r0, #0
364: d1fa bne.n 35c <SDMMC_example+0x4>
/* Wait card ready. */
}
if (sd_mmc_get_type(0) & (CARD_TYPE_SD | CARD_TYPE_MMC)) {
366: 4d11 ldr r5, [pc, #68] ; (3ac <SDMMC_example+0x54>)
368: 47a8 blx r5
36a: 0782 lsls r2, r0, #30
36c: d00b beq.n 386 <SDMMC_example+0x2e>
/* Read card block 0 */
sd_mmc_init_read_blocks(0, 0, 1);
36e: 4b10 ldr r3, [pc, #64] ; (3b0 <SDMMC_example+0x58>)
370: 2201 movs r2, #1
372: 4621 mov r1, r4
374: 4620 mov r0, r4
376: 4798 blx r3
sd_mmc_start_read_blocks(sd_mmc_block, 1);
378: 4b0e ldr r3, [pc, #56] ; (3b4 <SDMMC_example+0x5c>)
37a: 480f ldr r0, [pc, #60] ; (3b8 <SDMMC_example+0x60>)
37c: 2101 movs r1, #1
37e: 4798 blx r3
sd_mmc_wait_end_of_read_blocks(false);
380: 4b0e ldr r3, [pc, #56] ; (3bc <SDMMC_example+0x64>)
382: 4620 mov r0, r4
384: 4798 blx r3
}
#if (CONF_SDIO_SUPPORT == 1)
if (sd_mmc_get_type(0) & CARD_TYPE_SDIO) {
386: 2000 movs r0, #0
388: 47a8 blx r5
38a: 0743 lsls r3, r0, #29
38c: d509 bpl.n 3a2 <SDMMC_example+0x4a>
/* Read 22 bytes from SDIO Function 0 (CIA) */
sdio_read_extended(0, 0, 0, 1, sd_mmc_block, 22);
38e: 2316 movs r3, #22
390: 2200 movs r2, #0
392: 9301 str r3, [sp, #4]
394: 4b08 ldr r3, [pc, #32] ; (3b8 <SDMMC_example+0x60>)
396: 9300 str r3, [sp, #0]
398: 4c09 ldr r4, [pc, #36] ; (3c0 <SDMMC_example+0x68>)
39a: 2301 movs r3, #1
39c: 4611 mov r1, r2
39e: 4610 mov r0, r2
3a0: 47a0 blx r4
}
#endif
}
3a2: b003 add sp, #12
3a4: bd30 pop {r4, r5, pc}
3a6: bf00 nop
3a8: 00000721 .word 0x00000721
3ac: 00000d09 .word 0x00000d09
3b0: 00000d2d .word 0x00000d2d
3b4: 00000db1 .word 0x00000db1
3b8: 2000008c .word 0x2000008c
3bc: 00000e01 .word 0x00000e01
3c0: 00000e5d .word 0x00000e5d
000003c4 <sd_mmc_stack_init>:
void sd_mmc_stack_init(void)
{
sd_mmc_init(&SPI_SD_MMC, SDMMC_cd, SDMMC_wp);
3c4: 4a02 ldr r2, [pc, #8] ; (3d0 <sd_mmc_stack_init+0xc>)
3c6: 4803 ldr r0, [pc, #12] ; (3d4 <sd_mmc_stack_init+0x10>)
3c8: 4b03 ldr r3, [pc, #12] ; (3d8 <sd_mmc_stack_init+0x14>)
3ca: 1d11 adds r1, r2, #4
3cc: 4718 bx r3
3ce: bf00 nop
3d0: 20000000 .word 0x20000000
3d4: 2000031c .word 0x2000031c
3d8: 00000709 .word 0x00000709
000003dc <_sbrk>:
extern caddr_t _sbrk(int incr)
{
static unsigned char *heap = NULL;
unsigned char * prev_heap;
if (heap == NULL) {
3dc: 4a04 ldr r2, [pc, #16] ; (3f0 <_sbrk+0x14>)
3de: 6811 ldr r1, [r2, #0]
{
3e0: 4603 mov r3, r0
if (heap == NULL) {
3e2: b909 cbnz r1, 3e8 <_sbrk+0xc>
heap = (unsigned char *)&_end;
3e4: 4903 ldr r1, [pc, #12] ; (3f4 <_sbrk+0x18>)
3e6: 6011 str r1, [r2, #0]
}
prev_heap = heap;
3e8: 6810 ldr r0, [r2, #0]
heap += incr;
3ea: 4403 add r3, r0
3ec: 6013 str r3, [r2, #0]
return (caddr_t)prev_heap;
}
3ee: 4770 bx lr
3f0: 2000028c .word 0x2000028c
3f4: 20010370 .word 0x20010370
000003f8 <SDMMC_UNSTUFF_BITS>:
* Used by : CSD, SCR, Switch status
*/
static inline uint32_t SDMMC_UNSTUFF_BITS(uint8_t *reg, uint16_t reg_size, uint16_t pos, uint8_t size)
{
uint32_t value;
value = reg[((reg_size - pos + 7) / 8) - 1] >> (pos % 8);
3f8: 1a89 subs r1, r1, r2
{
3fa: b570 push {r4, r5, r6, lr}
value = reg[((reg_size - pos + 7) / 8) - 1] >> (pos % 8);
3fc: 1dcc adds r4, r1, #7
3fe: bf48 it mi
400: f101 040e addmi.w r4, r1, #14
404: eb00 00e4 add.w r0, r0, r4, asr #3
408: f002 0207 and.w r2, r2, #7
40c: f810 1c01 ldrb.w r1, [r0, #-1]
if (((pos % 8) + size) > 8) {
410: 18d4 adds r4, r2, r3
412: 2c08 cmp r4, #8
value = reg[((reg_size - pos + 7) / 8) - 1] >> (pos % 8);
414: fa41 f102 asr.w r1, r1, r2
if (((pos % 8) + size) > 8) {
418: dd18 ble.n 44c <SDMMC_UNSTUFF_BITS+0x54>
value |= (uint32_t)reg[((reg_size - pos + 7) / 8) - 2] << (8 - (pos % 8));
41a: f810 5c02 ldrb.w r5, [r0, #-2]
41e: f1c2 0608 rsb r6, r2, #8
422: 40b5 lsls r5, r6
}
if (((pos % 8) + size) > 16) {
424: 2c10 cmp r4, #16
value |= (uint32_t)reg[((reg_size - pos + 7) / 8) - 2] << (8 - (pos % 8));
426: ea41 0105 orr.w r1, r1, r5
if (((pos % 8) + size) > 16) {
42a: dd0f ble.n 44c <SDMMC_UNSTUFF_BITS+0x54>
value |= (uint32_t)reg[((reg_size - pos + 7) / 8) - 3] << (16 - (pos % 8));
42c: f810 0c03 ldrb.w r0, [r0, #-3]
430: f1c2 0510 rsb r5, r2, #16
}
if (((pos % 8) + size) > 24) {
434: 2c18 cmp r4, #24
value |= (uint32_t)reg[((reg_size - pos + 7) / 8) - 3] << (24 - (pos % 8));
436: bfc8 it gt
438: f1c2 0218 rsbgt r2, r2, #24
value |= (uint32_t)reg[((reg_size - pos + 7) / 8) - 3] << (16 - (pos % 8));
43c: fa00 f505 lsl.w r5, r0, r5
440: ea41 0105 orr.w r1, r1, r5
value |= (uint32_t)reg[((reg_size - pos + 7) / 8) - 3] << (24 - (pos % 8));
444: bfc4 itt gt
446: fa00 f202 lslgt.w r2, r0, r2
44a: 4311 orrgt r1, r2
}
value &= ((uint32_t)1 << size) - 1;
44c: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff
450: 4098 lsls r0, r3
return value;
}
452: ea21 0000 bic.w r0, r1, r0
456: bd70 pop {r4, r5, r6, pc}
00000458 <gpio_get_pin_level>:
* Reads the level on pins connected to a port
*
* \param[in] pin The pin number for device
*/
static inline bool gpio_get_pin_level(const uint8_t pin)
{
458: b537 push {r0, r1, r2, r4, r5, lr}
*/
static inline uint32_t _gpio_get_level(const enum gpio_port port)
{
uint32_t tmp;
CRITICAL_SECTION_ENTER();
45a: 4b0e ldr r3, [pc, #56] ; (494 <gpio_get_pin_level+0x3c>)
45c: 4605 mov r5, r0
45e: a801 add r0, sp, #4
460: 4798 blx r3
return tmp;
}
static inline hri_port_dir_reg_t hri_port_read_DIR_reg(const void *const hw, uint8_t submodule_index)
{
return ((Port *)hw)->Group[submodule_index].DIR.reg;
462: 4a0d ldr r2, [pc, #52] ; (498 <gpio_get_pin_level+0x40>)
464: 096b lsrs r3, r5, #5
466: 01d9 lsls r1, r3, #7
468: eb02 13c3 add.w r3, r2, r3, lsl #7
46c: 5851 ldr r1, [r2, r1]
return tmp;
}
static inline hri_port_in_reg_t hri_port_read_IN_reg(const void *const hw, uint8_t submodule_index)
{
return ((Port *)hw)->Group[submodule_index].IN.reg;
46e: 6a1a ldr r2, [r3, #32]
return ((Port *)hw)->Group[submodule_index].OUT.reg;
470: 691c ldr r4, [r3, #16]
uint32_t dir_tmp = hri_port_read_DIR_reg(PORT, port);
tmp = hri_port_read_IN_reg(PORT, port) & ~dir_tmp;
tmp |= hri_port_read_OUT_reg(PORT, port) & dir_tmp;
CRITICAL_SECTION_LEAVE();
472: 4b0a ldr r3, [pc, #40] ; (49c <gpio_get_pin_level+0x44>)
tmp |= hri_port_read_OUT_reg(PORT, port) & dir_tmp;
474: 4054 eors r4, r2
476: 400c ands r4, r1
CRITICAL_SECTION_LEAVE();
478: a801 add r0, sp, #4
tmp |= hri_port_read_OUT_reg(PORT, port) & dir_tmp;
47a: 4054 eors r4, r2
return (bool)(_gpio_get_level((enum gpio_port)GPIO_PORT(pin)) & (0x01U << GPIO_PIN(pin)));
47c: f005 051f and.w r5, r5, #31
CRITICAL_SECTION_LEAVE();
480: 4798 blx r3
482: 2001 movs r0, #1
484: fa00 f505 lsl.w r5, r0, r5
488: 4225 tst r5, r4
}
48a: bf08 it eq
48c: 2000 moveq r0, #0
48e: b003 add sp, #12
490: bd30 pop {r4, r5, pc}
492: bf00 nop
494: 00002099 .word 0x00002099
498: 41008000 .word 0x41008000
49c: 000020a7 .word 0x000020a7
000004a0 <sd_mmc_configure_slot>:
/**
* \brief Configures the driver with the selected card configuration
*/
static void sd_mmc_configure_slot(void)
{
4a0: b513 push {r0, r1, r4, lr}
driver_select_device(
sd_mmc_hal, sd_mmc_slot_sel, sd_mmc_card->clock, sd_mmc_card->bus_width, sd_mmc_card->high_speed);
4a2: 4807 ldr r0, [pc, #28] ; (4c0 <sd_mmc_configure_slot+0x20>)
driver_select_device(
4a4: 4c07 ldr r4, [pc, #28] ; (4c4 <sd_mmc_configure_slot+0x24>)
sd_mmc_hal, sd_mmc_slot_sel, sd_mmc_card->clock, sd_mmc_card->bus_width, sd_mmc_card->high_speed);
4a6: 6802 ldr r2, [r0, #0]
driver_select_device(
4a8: 7f91 ldrb r1, [r2, #30]
4aa: 7b53 ldrb r3, [r2, #13]
4ac: 3900 subs r1, #0
4ae: bf18 it ne
4b0: 2101 movne r1, #1
4b2: 9100 str r1, [sp, #0]
4b4: 7901 ldrb r1, [r0, #4]
4b6: 6812 ldr r2, [r2, #0]
4b8: 6880 ldr r0, [r0, #8]
4ba: 47a0 blx r4
}
4bc: b002 add sp, #8
4be: bd10 pop {r4, pc}
4c0: 20000290 .word 0x20000290
4c4: 000013f9 .word 0x000013f9
000004c8 <sd_mmc_select_slot>:
{
4c8: b538 push {r3, r4, r5, lr}
if (slot >= CONF_SD_MMC_MEM_CNT) {
4ca: 2800 cmp r0, #0
4cc: d143 bne.n 556 <sd_mmc_select_slot+0x8e>
if (_cd && _cd[slot].pin != -1) {
4ce: 4c23 ldr r4, [pc, #140] ; (55c <sd_mmc_select_slot+0x94>)
4d0: 68e3 ldr r3, [r4, #12]
4d2: 2b00 cmp r3, #0
4d4: d038 beq.n 548 <sd_mmc_select_slot+0x80>
4d6: f9b3 0000 ldrsh.w r0, [r3]
4da: 1c42 adds r2, r0, #1
4dc: d034 beq.n 548 <sd_mmc_select_slot+0x80>
if (gpio_get_pin_level(_cd[slot].pin) != _cd[slot].val) {
4de: 4b20 ldr r3, [pc, #128] ; (560 <sd_mmc_select_slot+0x98>)
4e0: b2c0 uxtb r0, r0
4e2: 4798 blx r3
4e4: 68e3 ldr r3, [r4, #12]
4e6: 885b ldrh r3, [r3, #2]
4e8: 4298 cmp r0, r3
4ea: d003 beq.n 4f4 <sd_mmc_select_slot+0x2c>
sd_mmc_cards[slot].state = SD_MMC_CARD_STATE_NO_CARD;
4ec: 2304 movs r3, #4
sd_mmc_cards[slot].state = SD_MMC_CARD_STATE_DEBOUNCE;
4ee: 76a3 strb r3, [r4, #26]
return SD_MMC_ERR_NO_CARD;
4f0: 2002 movs r0, #2
}
4f2: bd38 pop {r3, r4, r5, pc}
if (sd_mmc_cards[slot].state == SD_MMC_CARD_STATE_NO_CARD) {
4f4: 7ea0 ldrb r0, [r4, #26]
4f6: 2804 cmp r0, #4
4f8: d101 bne.n 4fe <sd_mmc_select_slot+0x36>
sd_mmc_cards[slot].state = SD_MMC_CARD_STATE_DEBOUNCE;
4fa: 2301 movs r3, #1
4fc: e7f7 b.n 4ee <sd_mmc_select_slot+0x26>
if (sd_mmc_cards[slot].state == SD_MMC_CARD_STATE_DEBOUNCE) {
4fe: 2801 cmp r0, #1
500: d11f bne.n 542 <sd_mmc_select_slot+0x7a>
sd_mmc_cards[slot].state = SD_MMC_CARD_STATE_INIT;
502: 2302 movs r3, #2
504: 76a3 strb r3, [r4, #26]
sd_mmc_cards[slot].clock = SDMMC_CLOCK_INIT;
506: 4b17 ldr r3, [pc, #92] ; (564 <sd_mmc_select_slot+0x9c>)
508: 6123 str r3, [r4, #16]
sd_mmc_cards[slot].bus_width = 1;
50a: 2301 movs r3, #1
50c: 7763 strb r3, [r4, #29]
sd_mmc_cards[slot].high_speed = 0;
50e: 2300 movs r3, #0
510: f884 302e strb.w r3, [r4, #46] ; 0x2e
assert(!(sd_mmc_slot_sel != slot && sd_mmc_nb_block_remaining != 0), ">>>");
514: 7923 ldrb r3, [r4, #4]
516: b1e3 cbz r3, 552 <sd_mmc_select_slot+0x8a>
518: 8e20 ldrh r0, [r4, #48] ; 0x30
51a: fab0 f080 clz r0, r0
51e: 0940 lsrs r0, r0, #5
520: 4a11 ldr r2, [pc, #68] ; (568 <sd_mmc_select_slot+0xa0>)
522: 4912 ldr r1, [pc, #72] ; (56c <sd_mmc_select_slot+0xa4>)
524: 4d12 ldr r5, [pc, #72] ; (570 <sd_mmc_select_slot+0xa8>)
526: f240 532c movw r3, #1324 ; 0x52c
52a: 47a8 blx r5
sd_mmc_slot_sel = slot;
52c: 2300 movs r3, #0
52e: 7123 strb r3, [r4, #4]
sd_mmc_card = &sd_mmc_cards[slot];
530: 4b10 ldr r3, [pc, #64] ; (574 <sd_mmc_select_slot+0xac>)
532: 6023 str r3, [r4, #0]
sd_mmc_configure_slot();
534: 4b10 ldr r3, [pc, #64] ; (578 <sd_mmc_select_slot+0xb0>)
536: 4798 blx r3
return (sd_mmc_cards[slot].state == SD_MMC_CARD_STATE_INIT) ? SD_MMC_INIT_ONGOING : SD_MMC_OK;
538: 7ea0 ldrb r0, [r4, #26]
53a: 1e83 subs r3, r0, #2
53c: 4258 negs r0, r3
53e: 4158 adcs r0, r3
540: e7d7 b.n 4f2 <sd_mmc_select_slot+0x2a>
if (sd_mmc_cards[slot].state == SD_MMC_CARD_STATE_UNUSABLE) {
542: 2803 cmp r0, #3
544: d1e6 bne.n 514 <sd_mmc_select_slot+0x4c>
546: e7d4 b.n 4f2 <sd_mmc_select_slot+0x2a>
|| (sd_mmc_cards[slot].state == SD_MMC_CARD_STATE_UNUSABLE)) {
548: 7ea3 ldrb r3, [r4, #26]
if ((sd_mmc_cards[slot].state == SD_MMC_CARD_STATE_NO_CARD)
54a: 3b03 subs r3, #3
54c: 2b01 cmp r3, #1
54e: d8e1 bhi.n 514 <sd_mmc_select_slot+0x4c>
550: e7d7 b.n 502 <sd_mmc_select_slot+0x3a>
assert(!(sd_mmc_slot_sel != slot && sd_mmc_nb_block_remaining != 0), ">>>");
552: 2001 movs r0, #1
554: e7e4 b.n 520 <sd_mmc_select_slot+0x58>
return SD_MMC_ERR_SLOT;
556: 2004 movs r0, #4
558: e7cb b.n 4f2 <sd_mmc_select_slot+0x2a>
55a: bf00 nop
55c: 20000290 .word 0x20000290
560: 00000459 .word 0x00000459
564: 00061a80 .word 0x00061a80
568: 00002b12 .word 0x00002b12
56c: 00002b25 .word 0x00002b25
570: 00002169 .word 0x00002169
574: 200002a0 .word 0x200002a0
578: 000004a1 .word 0x000004a1
0000057c <sd_mmc_cmd13>:
{
57c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
580: 4d0b ldr r5, [pc, #44] ; (5b0 <sd_mmc_cmd13+0x34>)
if (!driver_send_cmd(sd_mmc_hal, SDMMC_MCI_CMD13_SEND_STATUS, (uint32_t)sd_mmc_card->rca << 16)) {
582: 4e0c ldr r6, [pc, #48] ; (5b4 <sd_mmc_cmd13+0x38>)
584: 4f0c ldr r7, [pc, #48] ; (5b8 <sd_mmc_cmd13+0x3c>)
if (driver_get_response(sd_mmc_hal) & CARD_STATUS_READY_FOR_DATA) {
586: f8df 8034 ldr.w r8, [pc, #52] ; 5bc <sd_mmc_cmd13+0x40>
if (!driver_send_cmd(sd_mmc_hal, SDMMC_MCI_CMD13_SEND_STATUS, (uint32_t)sd_mmc_card->rca << 16)) {
58a: 6833 ldr r3, [r6, #0]
58c: 68b0 ldr r0, [r6, #8]
58e: 891a ldrh r2, [r3, #8]
590: f241 110d movw r1, #4365 ; 0x110d
594: 0412 lsls r2, r2, #16
596: 47b8 blx r7
598: 4604 mov r4, r0
59a: b128 cbz r0, 5a8 <sd_mmc_cmd13+0x2c>
if (driver_get_response(sd_mmc_hal) & CARD_STATUS_READY_FOR_DATA) {
59c: 68b0 ldr r0, [r6, #8]
59e: 47c0 blx r8
5a0: 05c3 lsls r3, r0, #23
5a2: d402 bmi.n 5aa <sd_mmc_cmd13+0x2e>
if (nec_timeout-- == 0) {
5a4: 3d01 subs r5, #1
5a6: d1f0 bne.n 58a <sd_mmc_cmd13+0xe>
return false;
5a8: 2400 movs r4, #0
}
5aa: 4620 mov r0, r4
5ac: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
5b0: 00030d41 .word 0x00030d41
5b4: 20000290 .word 0x20000290
5b8: 00001249 .word 0x00001249
5bc: 000013b9 .word 0x000013b9
000005c0 <sd_mmc_cmd9_spi>:
* data (CSD) on the CMD line spi.
*
* \return true if success, otherwise false
*/
static bool sd_mmc_cmd9_spi(void)
{
5c0: b573 push {r0, r1, r4, r5, r6, lr}
if (!driver_adtc_start(sd_mmc_hal, SDMMC_SPI_CMD9_SEND_CSD, (uint32_t)sd_mmc_card->rca << 16,
5c2: 4c0e ldr r4, [pc, #56] ; (5fc <sd_mmc_cmd9_spi+0x3c>)
5c4: 490e ldr r1, [pc, #56] ; (600 <sd_mmc_cmd9_spi+0x40>)
5c6: 6823 ldr r3, [r4, #0]
5c8: 68a0 ldr r0, [r4, #8]
5ca: 891a ldrh r2, [r3, #8]
5cc: 4e0d ldr r6, [pc, #52] ; (604 <sd_mmc_cmd9_spi+0x44>)
5ce: 2501 movs r5, #1
5d0: 2310 movs r3, #16
5d2: e9cd 5500 strd r5, r5, [sp]
5d6: 409a lsls r2, r3
5d8: 47b0 blx r6
5da: b160 cbz r0, 5f6 <sd_mmc_cmd9_spi+0x36>
CSD_REG_BSIZE, 1, true)) {
return false;
}
if (!driver_start_read_blocks(sd_mmc_hal, sd_mmc_card->csd, 1)) {
5dc: 6821 ldr r1, [r4, #0]
5de: 68a0 ldr r0, [r4, #8]
5e0: 4b09 ldr r3, [pc, #36] ; (608 <sd_mmc_cmd9_spi+0x48>)
5e2: 462a mov r2, r5
5e4: 310e adds r1, #14
5e6: 4798 blx r3
5e8: b128 cbz r0, 5f6 <sd_mmc_cmd9_spi+0x36>
return false;
}
return driver_wait_end_of_read_blocks(sd_mmc_hal);
5ea: 68a0 ldr r0, [r4, #8]
5ec: 4b07 ldr r3, [pc, #28] ; (60c <sd_mmc_cmd9_spi+0x4c>)
}
5ee: b002 add sp, #8
5f0: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
return driver_wait_end_of_read_blocks(sd_mmc_hal);
5f4: 4718 bx r3
}
5f6: 2000 movs r0, #0
5f8: b002 add sp, #8
5fa: bd70 pop {r4, r5, r6, pc}
5fc: 20000290 .word 0x20000290
600: 00081109 .word 0x00081109
604: 00001061 .word 0x00001061
608: 0000125d .word 0x0000125d
60c: 00001309 .word 0x00001309
00000610 <sd_mmc_deselect_slot>:
if (sd_mmc_slot_sel < CONF_SD_MMC_MEM_CNT) {
610: 4b03 ldr r3, [pc, #12] ; (620 <sd_mmc_deselect_slot+0x10>)
612: 7919 ldrb r1, [r3, #4]
614: b911 cbnz r1, 61c <sd_mmc_deselect_slot+0xc>
driver_deselect_device(sd_mmc_hal, sd_mmc_slot_sel);
616: 6898 ldr r0, [r3, #8]
618: 4b02 ldr r3, [pc, #8] ; (624 <sd_mmc_deselect_slot+0x14>)
61a: 4718 bx r3
}
61c: 4770 bx lr
61e: bf00 nop
620: 20000290 .word 0x20000290
624: 00001411 .word 0x00001411
00000628 <sdio_cmd53.constprop.0>:
static bool sdio_cmd53(uint8_t rw_flag, uint8_t func_nb, uint32_t reg_addr, uint8_t inc_addr, uint32_t size,
628: e92d 43f7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, lr}
62c: 4605 mov r5, r0
assert(size != 0, ">>>");
62e: f8df 9070 ldr.w r9, [pc, #112] ; 6a0 <sdio_cmd53.constprop.0+0x78>
static bool sdio_cmd53(uint8_t rw_flag, uint8_t func_nb, uint32_t reg_addr, uint8_t inc_addr, uint32_t size,
632: 9f0a ldr r7, [sp, #40] ; 0x28
634: 460e mov r6, r1
636: 4690 mov r8, r2
638: 461c mov r4, r3
assert(size != 0, ">>>");
63a: 4a13 ldr r2, [pc, #76] ; (688 <sdio_cmd53.constprop.0+0x60>)
63c: 4913 ldr r1, [pc, #76] ; (68c <sdio_cmd53.constprop.0+0x64>)
63e: f240 4395 movw r3, #1173 ; 0x495
642: 2001 movs r0, #1
644: 47c8 blx r9
assert(size <= 512, ">>>");
646: 4a10 ldr r2, [pc, #64] ; (688 <sdio_cmd53.constprop.0+0x60>)
648: 4910 ldr r1, [pc, #64] ; (68c <sdio_cmd53.constprop.0+0x64>)
64a: f240 4396 movw r3, #1174 ; 0x496
64e: 2001 movs r0, #1
650: 47c8 blx r9
| ((uint32_t)inc_addr << SDIO_CMD53_OP_CODE) | ((uint32_t)0 << SDIO_CMD53_BLOCK_MODE)
652: 06a3 lsls r3, r4, #26
| ((uint32_t)func_nb << SDIO_CMD53_FUNCTION_NUM) | ((uint32_t)rw_flag << SDIO_CMD53_RW_FLAG),
654: ea43 2448 orr.w r4, r3, r8, lsl #9
658: ea44 7206 orr.w r2, r4, r6, lsl #28
((size % 512) << SDIO_CMD53_COUNT) | ((uint32_t)reg_addr << SDIO_CMD53_REG_ADDR)
65c: f3c7 0108 ubfx r1, r7, #0, #9
return driver_adtc_start(
660: 480b ldr r0, [pc, #44] ; (690 <sdio_cmd53.constprop.0+0x68>)
662: 4c0c ldr r4, [pc, #48] ; (694 <sdio_cmd53.constprop.0+0x6c>)
| ((uint32_t)func_nb << SDIO_CMD53_FUNCTION_NUM) | ((uint32_t)rw_flag << SDIO_CMD53_RW_FLAG),
664: 430a orrs r2, r1
return driver_adtc_start(
666: 2301 movs r3, #1
668: 490b ldr r1, [pc, #44] ; (698 <sdio_cmd53.constprop.0+0x70>)
66a: e9cd 3300 strd r3, r3, [sp]
66e: 2d00 cmp r5, #0
670: bf08 it eq
672: 4601 moveq r1, r0
674: 4809 ldr r0, [pc, #36] ; (69c <sdio_cmd53.constprop.0+0x74>)
676: b2bb uxth r3, r7
678: ea42 72c5 orr.w r2, r2, r5, lsl #31
67c: 6880 ldr r0, [r0, #8]
67e: 47a0 blx r4
}
680: b003 add sp, #12
682: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc}
686: bf00 nop
688: 00002b12 .word 0x00002b12
68c: 00002b25 .word 0x00002b25
690: 00011335 .word 0x00011335
694: 00001061 .word 0x00001061
698: 00019335 .word 0x00019335
69c: 20000290 .word 0x20000290
6a0: 00002169 .word 0x00002169
000006a4 <sdio_cmd52.constprop.0>:
static bool sdio_cmd52(uint8_t rw_flag, uint8_t func_nb, uint32_t reg_addr, uint8_t rd_after_wr, uint8_t *io_data)
6a4: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
assert(io_data != NULL, ">>>");
6a8: 461d mov r5, r3
static bool sdio_cmd52(uint8_t rw_flag, uint8_t func_nb, uint32_t reg_addr, uint8_t rd_after_wr, uint8_t *io_data)
6aa: 4606 mov r6, r0
6ac: 4614 mov r4, r2
assert(io_data != NULL, ">>>");
6ae: 1e28 subs r0, r5, #0
6b0: bf18 it ne
6b2: 2001 movne r0, #1
6b4: 4a0e ldr r2, [pc, #56] ; (6f0 <sdio_cmd52.constprop.0+0x4c>)
6b6: f8df 804c ldr.w r8, [pc, #76] ; 704 <sdio_cmd52.constprop.0+0x60>
static bool sdio_cmd52(uint8_t rw_flag, uint8_t func_nb, uint32_t reg_addr, uint8_t rd_after_wr, uint8_t *io_data)
6ba: 460f mov r7, r1
assert(io_data != NULL, ">>>");
6bc: f240 4376 movw r3, #1142 ; 0x476
6c0: 490c ldr r1, [pc, #48] ; (6f4 <sdio_cmd52.constprop.0+0x50>)
| ((uint32_t)reg_addr << SDIO_CMD52_REG_ADRR))) {
6c2: 0264 lsls r4, r4, #9
assert(io_data != NULL, ">>>");
6c4: 47c0 blx r8
if (!driver_send_cmd(sd_mmc_hal,
6c6: ea44 7207 orr.w r2, r4, r7, lsl #28
6ca: ea42 70c6 orr.w r0, r2, r6, lsl #31
((uint32_t)*io_data << SDIO_CMD52_WR_DATA) | ((uint32_t)rw_flag << SDIO_CMD52_RW_FLAG)
6ce: 782a ldrb r2, [r5, #0]
if (!driver_send_cmd(sd_mmc_hal,
6d0: 4e09 ldr r6, [pc, #36] ; (6f8 <sdio_cmd52.constprop.0+0x54>)
6d2: 4b0a ldr r3, [pc, #40] ; (6fc <sdio_cmd52.constprop.0+0x58>)
6d4: 4302 orrs r2, r0
6d6: f241 3134 movw r1, #4916 ; 0x1334
6da: 68b0 ldr r0, [r6, #8]
6dc: 4798 blx r3
6de: 4604 mov r4, r0
6e0: b118 cbz r0, 6ea <sdio_cmd52.constprop.0+0x46>
*io_data = driver_get_response(sd_mmc_hal) & 0xFF;
6e2: 68b0 ldr r0, [r6, #8]
6e4: 4b06 ldr r3, [pc, #24] ; (700 <sdio_cmd52.constprop.0+0x5c>)
6e6: 4798 blx r3
6e8: 7028 strb r0, [r5, #0]
}
6ea: 4620 mov r0, r4
6ec: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
6f0: 00002b12 .word 0x00002b12
6f4: 00002b25 .word 0x00002b25
6f8: 20000290 .word 0x20000290
6fc: 00001249 .word 0x00001249
700: 000013b9 .word 0x000013b9
704: 00002169 .word 0x00002169
00000708 <sd_mmc_init>:
#endif
/*--------------------- PUBLIC FUNCTIONS ----------------------------*/
void sd_mmc_init(void *hal, sd_mmc_detect_t *card_detects, sd_mmc_detect_t *wp_detects)
{
708: b510 push {r4, lr}
/* GPIO will be used to detect card and write protect.
* The related clocks and pinmux must be configurated in good
* condition. */
for (uint8_t slot = 0; slot < CONF_SD_MMC_MEM_CNT; slot++) {
sd_mmc_cards[slot].state = SD_MMC_CARD_STATE_NO_CARD;
70a: 4b04 ldr r3, [pc, #16] ; (71c <sd_mmc_init+0x14>)
70c: 2404 movs r4, #4
70e: 769c strb r4, [r3, #26]
}
sd_mmc_slot_sel = 0xFF; /* No slot configurated */
710: 24ff movs r4, #255 ; 0xff
712: 711c strb r4, [r3, #4]
sd_mmc_hal = hal;
_cd = card_detects;
714: e9c3 0102 strd r0, r1, [r3, #8]
_wp = wp_detects;
718: 635a str r2, [r3, #52] ; 0x34
}
71a: bd10 pop {r4, pc}
71c: 20000290 .word 0x20000290
00000720 <sd_mmc_check>:
{
return CONF_SD_MMC_MEM_CNT;
}
sd_mmc_err_t sd_mmc_check(uint8_t slot)
{
720: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
sd_mmc_err_t sd_mmc_err;
sd_mmc_err = sd_mmc_select_slot(slot);
724: 4b84 ldr r3, [pc, #528] ; (938 <sd_mmc_check+0x218>)
{
726: b089 sub sp, #36 ; 0x24
sd_mmc_err = sd_mmc_select_slot(slot);
728: 4798 blx r3
if (sd_mmc_err != SD_MMC_INIT_ONGOING) {
72a: 2801 cmp r0, #1
sd_mmc_err = sd_mmc_select_slot(slot);
72c: 4680 mov r8, r0
if (sd_mmc_err != SD_MMC_INIT_ONGOING) {
72e: d005 beq.n 73c <sd_mmc_check+0x1c>
// To notify that the card has been just initialized
// It is necessary for USB Device MSC
return SD_MMC_INIT_ONGOING;
}
sd_mmc_card->state = SD_MMC_CARD_STATE_UNUSABLE;
sd_mmc_deselect_slot();
730: 4b82 ldr r3, [pc, #520] ; (93c <sd_mmc_check+0x21c>)
732: 4798 blx r3
return SD_MMC_ERR_UNUSABLE;
}
734: 4640 mov r0, r8
736: b009 add sp, #36 ; 0x24
738: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
sd_mmc_card->type = CARD_TYPE_SD;
73c: 4c80 ldr r4, [pc, #512] ; (940 <sd_mmc_check+0x220>)
sd_mmc_spi_debug("Start SD card install\n\r");
73e: 4f81 ldr r7, [pc, #516] ; (944 <sd_mmc_check+0x224>)
sd_mmc_card->type = CARD_TYPE_SD;
740: 6823 ldr r3, [r4, #0]
sd_mmc_card->version = CARD_VER_UNKNOWN;
742: 2500 movs r5, #0
sd_mmc_card->type = CARD_TYPE_SD;
744: 72d8 strb r0, [r3, #11]
sd_mmc_card->version = CARD_VER_UNKNOWN;
746: 731d strb r5, [r3, #12]
sd_mmc_card->rca = 0;
748: 811d strh r5, [r3, #8]
sd_mmc_spi_debug("Start SD card install\n\r");
74a: 487f ldr r0, [pc, #508] ; (948 <sd_mmc_check+0x228>)
74c: 47b8 blx r7
driver_send_clock(sd_mmc_hal);
74e: 68a0 ldr r0, [r4, #8]
750: 4b7e ldr r3, [pc, #504] ; (94c <sd_mmc_check+0x22c>)
752: 4798 blx r3
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD0_GO_IDLE_STATE, 0)) {
754: 462a mov r2, r5
756: 68a0 ldr r0, [r4, #8]
758: 4d7d ldr r5, [pc, #500] ; (950 <sd_mmc_check+0x230>)
75a: f44f 5188 mov.w r1, #4352 ; 0x1100
75e: 47a8 blx r5
760: b338 cbz r0, 7b2 <sd_mmc_check+0x92>
if (!driver_send_cmd(sd_mmc_hal, SD_CMD8_SEND_IF_COND, SD_CMD8_PATTERN | SD_CMD8_HIGH_VOLTAGE)) {
762: 68a0 ldr r0, [r4, #8]
764: f44f 72d5 mov.w r2, #426 ; 0x1aa
768: f245 5108 movw r1, #21768 ; 0x5508
76c: 47a8 blx r5
76e: bb30 cbnz r0, 7be <sd_mmc_check+0x9e>
*v2 = 0;
770: 2600 movs r6, #0
if (!driver_send_cmd(sd_mmc_hal, SDIO_CMD5_SEND_OP_COND, 0)) {
772: 68a0 ldr r0, [r4, #8]
774: 2200 movs r2, #0
776: f244 5105 movw r1, #17669 ; 0x4505
77a: 47a8 blx r5
77c: 2800 cmp r0, #0
77e: f000 80a6 beq.w 8ce <sd_mmc_check+0x1ae>
resp = driver_get_response(sd_mmc_hal);
782: 68a0 ldr r0, [r4, #8]
784: f8df 91cc ldr.w r9, [pc, #460] ; 954 <sd_mmc_check+0x234>
788: 47c8 blx r9
if ((resp & OCR_SDIO_NF) == 0) {
78a: f010 4fe0 tst.w r0, #1879048192 ; 0x70000000
78e: f000 809e beq.w 8ce <sd_mmc_check+0x1ae>
792: f241 3a89 movw sl, #5001 ; 0x1389
if (!driver_send_cmd(sd_mmc_hal, SDIO_CMD5_SEND_OP_COND, resp & SD_MMC_VOLTAGE_SUPPORT)) {
796: f400 12fc and.w r2, r0, #2064384 ; 0x1f8000
79a: f244 5105 movw r1, #17669 ; 0x4505
79e: 68a0 ldr r0, [r4, #8]
7a0: 47a8 blx r5
7a2: b130 cbz r0, 7b2 <sd_mmc_check+0x92>
resp = driver_get_response(sd_mmc_hal);
7a4: 68a0 ldr r0, [r4, #8]
7a6: 47c8 blx r9
if ((resp & OCR_POWER_UP_BUSY) == OCR_POWER_UP_BUSY) {
7a8: 2800 cmp r0, #0
7aa: db14 blt.n 7d6 <sd_mmc_check+0xb6>
if (cmd5_retry-- == 0) {
7ac: f1ba 0a01 subs.w sl, sl, #1
7b0: d1f1 bne.n 796 <sd_mmc_check+0x76>
sd_mmc_card->state = SD_MMC_CARD_STATE_UNUSABLE;
7b2: 6823 ldr r3, [r4, #0]
7b4: f04f 0803 mov.w r8, #3
7b8: f883 800a strb.w r8, [r3, #10]
7bc: e7b8 b.n 730 <sd_mmc_check+0x10>
resp = driver_get_response(sd_mmc_hal);
7be: 68a0 ldr r0, [r4, #8]
7c0: 4b64 ldr r3, [pc, #400] ; (954 <sd_mmc_check+0x234>)
7c2: 4798 blx r3
if (resp == 0xFFFFFFFF) {
7c4: 1c41 adds r1, r0, #1
7c6: d0d3 beq.n 770 <sd_mmc_check+0x50>
if ((resp & (SD_CMD8_MASK_PATTERN | SD_CMD8_MASK_VOLTAGE)) != (SD_CMD8_PATTERN | SD_CMD8_HIGH_VOLTAGE)) {
7c8: f3c0 000b ubfx r0, r0, #0, #12
7cc: f5b0 7fd5 cmp.w r0, #426 ; 0x1aa
7d0: d1ef bne.n 7b2 <sd_mmc_check+0x92>
*v2 = 1;
7d2: 4646 mov r6, r8
7d4: e7cd b.n 772 <sd_mmc_check+0x52>
if ((resp & OCR_SDIO_MP) > 0) {
7d6: 0102 lsls r2, r0, #4
sd_mmc_card->type = CARD_TYPE_SD_COMBO;
7d8: 6823 ldr r3, [r4, #0]
if ((resp & OCR_SDIO_MP) > 0) {
7da: d52f bpl.n 83c <sd_mmc_check+0x11c>
sd_mmc_card->type = CARD_TYPE_SD_COMBO;
7dc: 2205 movs r2, #5
7de: 72da strb r2, [r3, #11]
if (sd_mmc_card->type & CARD_TYPE_SD) {
7e0: ea4f 7a86 mov.w sl, r6, lsl #30
resp = driver_get_response(sd_mmc_hal);
7e4: 4e5b ldr r6, [pc, #364] ; (954 <sd_mmc_check+0x234>)
7e6: f641 39ef movw r9, #7151 ; 0x1bef
if (!driver_send_cmd(sd_mmc_hal, SDMMC_CMD55_APP_CMD, 0)) {
7ea: 68a0 ldr r0, [r4, #8]
7ec: 2200 movs r2, #0
7ee: f241 1137 movw r1, #4407 ; 0x1137
7f2: 47a8 blx r5
7f4: 2800 cmp r0, #0
7f6: d17f bne.n 8f8 <sd_mmc_check+0x1d8>
sd_mmc_spi_debug("%s: CMD55 Fail\n\r", __func__);
7f8: 4957 ldr r1, [pc, #348] ; (958 <sd_mmc_check+0x238>)
7fa: 4858 ldr r0, [pc, #352] ; (95c <sd_mmc_check+0x23c>)
sd_mmc_spi_debug("%s: ACMD41 Fail\n\r", __func__);
7fc: 47b8 blx r7
sd_mmc_spi_debug("Start MMC Install\n\r");
7fe: 4858 ldr r0, [pc, #352] ; (960 <sd_mmc_check+0x240>)
800: 47b8 blx r7
sd_mmc_card->type = CARD_TYPE_MMC;
802: 6823 ldr r3, [r4, #0]
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD0_GO_IDLE_STATE, 0)) {
804: 68a0 ldr r0, [r4, #8]
sd_mmc_card->type = CARD_TYPE_MMC;
806: 2202 movs r2, #2
808: 72da strb r2, [r3, #11]
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD0_GO_IDLE_STATE, 0)) {
80a: f44f 5188 mov.w r1, #4352 ; 0x1100
80e: 2200 movs r2, #0
810: 47a8 blx r5
812: 2800 cmp r0, #0
814: d0cd beq.n 7b2 <sd_mmc_check+0x92>
resp = driver_get_response(sd_mmc_hal);
816: f8df 913c ldr.w r9, [pc, #316] ; 954 <sd_mmc_check+0x234>
retry = 7150;
81a: f641 36ee movw r6, #7150 ; 0x1bee
if (!driver_send_cmd(sd_mmc_hal, MMC_SPI_CMD1_SEND_OP_COND, 0)) {
81e: 68a0 ldr r0, [r4, #8]
820: 2200 movs r2, #0
822: f241 1101 movw r1, #4353 ; 0x1101
826: 47a8 blx r5
828: 2800 cmp r0, #0
82a: f040 812a bne.w a82 <sd_mmc_check+0x362>
sd_mmc_spi_debug("%s: CMD1 SPI Fail - Busy retry %d\n\r",
82e: f5c6 52df rsb r2, r6, #7136 ; 0x1be0
832: 494c ldr r1, [pc, #304] ; (964 <sd_mmc_check+0x244>)
834: 484c ldr r0, [pc, #304] ; (968 <sd_mmc_check+0x248>)
836: 320e adds r2, #14
838: 47b8 blx r7
return false;
83a: e7ba b.n 7b2 <sd_mmc_check+0x92>
sd_mmc_card->type = CARD_TYPE_SDIO;
83c: 2204 movs r2, #4
83e: 72da strb r2, [r3, #11]
sdio_cmd52(SDIO_CMD52_READ_FLAG, SDIO_CIA, addr_old, 0, &addr_cis[i]);
840: f8df a134 ldr.w sl, [pc, #308] ; 978 <sd_mmc_check+0x258>
844: f10d 0914 add.w r9, sp, #20
addr_old = SDIO_CCCR_CIS_PTR;
848: 2609 movs r6, #9
84a: 46d3 mov fp, sl
sdio_cmd52(SDIO_CMD52_READ_FLAG, SDIO_CIA, addr_old, 0, &addr_cis[i]);
84c: 2100 movs r1, #0
84e: 464b mov r3, r9
850: 4632 mov r2, r6
852: 4608 mov r0, r1
addr_old++;
854: 3601 adds r6, #1
sdio_cmd52(SDIO_CMD52_READ_FLAG, SDIO_CIA, addr_old, 0, &addr_cis[i]);
856: 47d0 blx sl
for (i = 0; i < 4; i++) {
858: 2e0d cmp r6, #13
85a: f109 0901 add.w r9, r9, #1
85e: d1f5 bne.n 84c <sd_mmc_check+0x12c>
addr_old = addr_cis[0] + (addr_cis[1] << 8) + (addr_cis[2] << 16) + (addr_cis[3] << 24);
860: f89d 3015 ldrb.w r3, [sp, #21]
864: f89d 6014 ldrb.w r6, [sp, #20]
868: eb06 2603 add.w r6, r6, r3, lsl #8
86c: f89d 3016 ldrb.w r3, [sp, #22]
870: eb06 4603 add.w r6, r6, r3, lsl #16
874: f89d 3017 ldrb.w r3, [sp, #23]
878: eb06 6603 add.w r6, r6, r3, lsl #24
if (addr_new > (addr_old + 256)) {
87c: f506 7380 add.w r3, r6, #256 ; 0x100
880: 9303 str r3, [sp, #12]
addr_new = addr_old;
882: f04f 0900 mov.w r9, #0
sdio_cmd52(SDIO_CMD52_READ_FLAG, SDIO_CIA, addr_new, 0, &buf[i]);
886: 2100 movs r1, #0
888: f10d 0a18 add.w sl, sp, #24
88c: eb0a 0309 add.w r3, sl, r9
890: eb06 0209 add.w r2, r6, r9
894: 4608 mov r0, r1
for (i = 0; i < 3; i++) {
896: f109 0901 add.w r9, r9, #1
sdio_cmd52(SDIO_CMD52_READ_FLAG, SDIO_CIA, addr_new, 0, &buf[i]);
89a: 47d8 blx fp
for (i = 0; i < 3; i++) {
89c: f1b9 0f03 cmp.w r9, #3
8a0: d1f1 bne.n 886 <sd_mmc_check+0x166>
if (buf[0] == SDIO_CISTPL_END) {
8a2: f89d 3018 ldrb.w r3, [sp, #24]
8a6: 2bff cmp r3, #255 ; 0xff
8a8: d083 beq.n 7b2 <sd_mmc_check+0x92>
if (buf[0] == SDIO_CISTPL_FUNCE && buf[2] == 0x00) {
8aa: 2b22 cmp r3, #34 ; 0x22
8ac: d104 bne.n 8b8 <sd_mmc_check+0x198>
8ae: f89d 301a ldrb.w r3, [sp, #26]
8b2: 2b00 cmp r3, #0
8b4: f000 81fa beq.w cac <sd_mmc_check+0x58c>
if (buf[1] == 0) {
8b8: f89d 3019 ldrb.w r3, [sp, #25]
8bc: 2b00 cmp r3, #0
8be: f43f af78 beq.w 7b2 <sd_mmc_check+0x92>
addr_new += buf[1] - 1;
8c2: 3302 adds r3, #2
8c4: 441e add r6, r3
if (addr_new > (addr_old + 256)) {
8c6: 9b03 ldr r3, [sp, #12]
8c8: 429e cmp r6, r3
8ca: d9da bls.n 882 <sd_mmc_check+0x162>
8cc: e771 b.n 7b2 <sd_mmc_check+0x92>
if (sd_mmc_card->type & CARD_TYPE_SD) {
8ce: 6823 ldr r3, [r4, #0]
8d0: 7adb ldrb r3, [r3, #11]
8d2: 07db lsls r3, r3, #31
8d4: d484 bmi.n 7e0 <sd_mmc_check+0xc0>
if (IS_SDIO()) {
8d6: 6823 ldr r3, [r4, #0]
8d8: 7adb ldrb r3, [r3, #11]
8da: 075a lsls r2, r3, #29
8dc: d4b0 bmi.n 840 <sd_mmc_check+0x120>
if ((sd_mmc_card->type & CARD_TYPE_SD) &&
8de: 6823 ldr r3, [r4, #0]
8e0: 7adb ldrb r3, [r3, #11]
8e2: f003 0309 and.w r3, r3, #9
8e6: 2b01 cmp r3, #1
8e8: f000 8202 beq.w cf0 <sd_mmc_check+0x5d0>
if (sd_mmc_card->type & CARD_TYPE_SD) {
8ec: 6823 ldr r3, [r4, #0]
8ee: 7adb ldrb r3, [r3, #11]
8f0: 07db lsls r3, r3, #31
8f2: f100 8188 bmi.w c06 <sd_mmc_check+0x4e6>
8f6: e18b b.n c10 <sd_mmc_check+0x4f0>
if (!driver_send_cmd(sd_mmc_hal, SD_SPI_ACMD41_SD_SEND_OP_COND, arg)) {
8f8: 68a0 ldr r0, [r4, #8]
8fa: 4652 mov r2, sl
8fc: f241 1129 movw r1, #4393 ; 0x1129
900: 47a8 blx r5
902: b910 cbnz r0, 90a <sd_mmc_check+0x1ea>
sd_mmc_spi_debug("%s: ACMD41 Fail\n\r", __func__);
904: 4914 ldr r1, [pc, #80] ; (958 <sd_mmc_check+0x238>)
906: 4819 ldr r0, [pc, #100] ; (96c <sd_mmc_check+0x24c>)
908: e778 b.n 7fc <sd_mmc_check+0xdc>
resp = driver_get_response(sd_mmc_hal);
90a: 68a0 ldr r0, [r4, #8]
90c: 47b0 blx r6
if (!(resp & R1_SPI_IDLE)) {
90e: f010 0201 ands.w r2, r0, #1
912: d008 beq.n 926 <sd_mmc_check+0x206>
if (retry-- == 0) {
914: f1b9 0901 subs.w r9, r9, #1
918: f47f af67 bne.w 7ea <sd_mmc_check+0xca>
sd_mmc_spi_debug("%s: ACMD41 Timeout on busy, resp32 0x%08x \n\r",
91c: 4602 mov r2, r0
91e: 490e ldr r1, [pc, #56] ; (958 <sd_mmc_check+0x238>)
920: 4813 ldr r0, [pc, #76] ; (970 <sd_mmc_check+0x250>)
922: 47b8 blx r7
return false;
924: e76b b.n 7fe <sd_mmc_check+0xde>
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD58_READ_OCR, 0)) {
926: 68a0 ldr r0, [r4, #8]
928: f240 513a movw r1, #1338 ; 0x53a
92c: 47a8 blx r5
92e: bb28 cbnz r0, 97c <sd_mmc_check+0x25c>
sd_mmc_spi_debug("%s: CMD58 Fail\n\r", __func__);
930: 4909 ldr r1, [pc, #36] ; (958 <sd_mmc_check+0x238>)
932: 4810 ldr r0, [pc, #64] ; (974 <sd_mmc_check+0x254>)
934: e762 b.n 7fc <sd_mmc_check+0xdc>
936: bf00 nop
938: 000004c9 .word 0x000004c9
93c: 00000611 .word 0x00000611
940: 20000290 .word 0x20000290
944: 000020d5 .word 0x000020d5
948: 00002b29 .word 0x00002b29
94c: 000013c5 .word 0x000013c5
950: 00001249 .word 0x00001249
954: 000013b9 .word 0x000013b9
958: 00002c0c .word 0x00002c0c
95c: 00002b41 .word 0x00002b41
960: 00002ba2 .word 0x00002ba2
964: 00002c1b .word 0x00002c1b
968: 00002bb6 .word 0x00002bb6
96c: 00002b52 .word 0x00002b52
970: 00002b64 .word 0x00002b64
974: 00002b91 .word 0x00002b91
978: 000006a5 .word 0x000006a5
if ((driver_get_response(sd_mmc_hal) & OCR_CCS) != 0) {
97c: 68a0 ldr r0, [r4, #8]
97e: 47b0 blx r6
980: 0040 lsls r0, r0, #1
982: d504 bpl.n 98e <sd_mmc_check+0x26e>
sd_mmc_card->type |= CARD_TYPE_HC;
984: 6822 ldr r2, [r4, #0]
986: 7ad3 ldrb r3, [r2, #11]
988: f043 0308 orr.w r3, r3, #8
98c: 72d3 strb r3, [r2, #11]
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD59_CRC_ON_OFF, 0)) {
98e: 68a0 ldr r0, [r4, #8]
990: 2200 movs r2, #0
992: f241 113b movw r1, #4411 ; 0x113b
996: 47a8 blx r5
998: 2800 cmp r0, #0
99a: f43f af0a beq.w 7b2 <sd_mmc_check+0x92>
if (sd_mmc_card->type & CARD_TYPE_SD) {
99e: 6823 ldr r3, [r4, #0]
9a0: 7adb ldrb r3, [r3, #11]
9a2: 07d9 lsls r1, r3, #31
9a4: d597 bpl.n 8d6 <sd_mmc_check+0x1b6>
if (!sd_mmc_cmd9_spi()) {
9a6: 4bb2 ldr r3, [pc, #712] ; (c70 <sd_mmc_check+0x550>)
9a8: 4798 blx r3
9aa: 2800 cmp r0, #0
9ac: f43f af01 beq.w 7b2 <sd_mmc_check+0x92>
tran_speed = CSD_TRAN_SPEED(sd_mmc_card->csd);
9b0: f8d4 a000 ldr.w sl, [r4]
9b4: 4eaf ldr r6, [pc, #700] ; (c74 <sd_mmc_check+0x554>)
9b6: f10a 0b0e add.w fp, sl, #14
9ba: 2308 movs r3, #8
9bc: 2260 movs r2, #96 ; 0x60
9be: 2180 movs r1, #128 ; 0x80
9c0: 4658 mov r0, fp
9c2: 47b0 blx r6
mul = sd_trans_multipliers[(tran_speed >> 3) & 0xF];
9c4: 4bac ldr r3, [pc, #688] ; (c78 <sd_mmc_check+0x558>)
9c6: f3c0 02c3 ubfx r2, r0, #3, #4
unit = sd_mmc_trans_units[tran_speed & 0x7];
9ca: f000 0007 and.w r0, r0, #7
9ce: eb03 0080 add.w r0, r3, r0, lsl #2
mul = sd_trans_multipliers[(tran_speed >> 3) & 0xF];
9d2: eb03 0282 add.w r2, r3, r2, lsl #2
if (CSD_STRUCTURE_VERSION(sd_mmc_card->csd) >= SD_CSD_VER_2_0) {
9d6: 2180 movs r1, #128 ; 0x80
sd_mmc_card->clock = unit * mul * 1000;
9d8: 6fd3 ldr r3, [r2, #124] ; 0x7c
9da: 6e02 ldr r2, [r0, #96] ; 0x60
9dc: 4353 muls r3, r2
9de: f44f 727a mov.w r2, #1000 ; 0x3e8
9e2: 4353 muls r3, r2
9e4: f8ca 3000 str.w r3, [sl]
if (CSD_STRUCTURE_VERSION(sd_mmc_card->csd) >= SD_CSD_VER_2_0) {
9e8: 227e movs r2, #126 ; 0x7e
9ea: 2302 movs r3, #2
9ec: 4658 mov r0, fp
9ee: 47b0 blx r6
9f0: 46b1 mov r9, r6
9f2: 2800 cmp r0, #0
9f4: f000 811e beq.w c34 <sd_mmc_check+0x514>
sd_mmc_card->capacity = (SD_CSD_2_0_C_SIZE(sd_mmc_card->csd) + 1) * 512;
9f8: 2316 movs r3, #22
9fa: 2230 movs r2, #48 ; 0x30
9fc: 2180 movs r1, #128 ; 0x80
9fe: 4658 mov r0, fp
a00: 47b0 blx r6
a02: 3001 adds r0, #1
a04: 0240 lsls r0, r0, #9
if (!driver_send_cmd(sd_mmc_hal, SDMMC_CMD55_APP_CMD, (uint32_t)sd_mmc_card->rca << 16)) {
a06: f8ba 2008 ldrh.w r2, [sl, #8]
a0a: f8ca 0004 str.w r0, [sl, #4]
a0e: 0412 lsls r2, r2, #16
a10: 68a0 ldr r0, [r4, #8]
a12: f241 1137 movw r1, #4407 ; 0x1137
a16: 47a8 blx r5
a18: 2800 cmp r0, #0
a1a: f43f aeca beq.w 7b2 <sd_mmc_check+0x92>
if (!driver_adtc_start(sd_mmc_hal, SD_ACMD51_SEND_SCR, 0, SD_SCR_REG_BSIZE, 1, true)) {
a1e: 2601 movs r6, #1
a20: e9cd 6600 strd r6, r6, [sp]
a24: 4995 ldr r1, [pc, #596] ; (c7c <sd_mmc_check+0x55c>)
a26: 68a0 ldr r0, [r4, #8]
a28: f8df a26c ldr.w sl, [pc, #620] ; c98 <sd_mmc_check+0x578>
a2c: 2308 movs r3, #8
a2e: 2200 movs r2, #0
a30: 47d0 blx sl
a32: 2800 cmp r0, #0
a34: f43f aebd beq.w 7b2 <sd_mmc_check+0x92>
if (!driver_start_read_blocks(sd_mmc_hal, scr, 1)) {
a38: 68a0 ldr r0, [r4, #8]
a3a: 4b91 ldr r3, [pc, #580] ; (c80 <sd_mmc_check+0x560>)
a3c: 4632 mov r2, r6
a3e: a906 add r1, sp, #24
a40: 4798 blx r3
a42: 2800 cmp r0, #0
a44: f43f aeb5 beq.w 7b2 <sd_mmc_check+0x92>
if (!driver_wait_end_of_read_blocks(sd_mmc_hal)) {
a48: 68a0 ldr r0, [r4, #8]
a4a: 4b8e ldr r3, [pc, #568] ; (c84 <sd_mmc_check+0x564>)
a4c: 4798 blx r3
a4e: 2800 cmp r0, #0
a50: f43f aeaf beq.w 7b2 <sd_mmc_check+0x92>
switch (SD_SCR_SD_SPEC(scr)) {
a54: 2304 movs r3, #4
a56: 2238 movs r2, #56 ; 0x38
a58: 2140 movs r1, #64 ; 0x40
a5a: a806 add r0, sp, #24
a5c: 47c8 blx r9
a5e: 42b0 cmp r0, r6
sd_mmc_card->version = CARD_VER_SD_1_0;
a60: f8d4 a000 ldr.w sl, [r4]
switch (SD_SCR_SD_SPEC(scr)) {
a64: f000 80fd beq.w c62 <sd_mmc_check+0x542>
a68: 2802 cmp r0, #2
a6a: f040 80fe bne.w c6a <sd_mmc_check+0x54a>
if (SD_SCR_SD_SPEC3(scr) == SD_SCR_SD_SPEC_3_00) {
a6e: 4633 mov r3, r6
a70: 222f movs r2, #47 ; 0x2f
a72: 2140 movs r1, #64 ; 0x40
a74: a806 add r0, sp, #24
a76: 47c8 blx r9
a78: 2801 cmp r0, #1
sd_mmc_card->version = CARD_VER_SD_3_0;
a7a: bf0c ite eq
a7c: 2330 moveq r3, #48 ; 0x30
sd_mmc_card->version = CARD_VER_SD_2_0;
a7e: 2320 movne r3, #32
a80: e0f0 b.n c64 <sd_mmc_check+0x544>
resp = driver_get_response(sd_mmc_hal);
a82: 68a0 ldr r0, [r4, #8]
a84: 47c8 blx r9
if (!(resp & R1_SPI_IDLE)) {
a86: f010 0201 ands.w r2, r0, #1
a8a: d006 beq.n a9a <sd_mmc_check+0x37a>
if (retry-- == 0) {
a8c: 3e01 subs r6, #1
a8e: f4bf aec6 bcs.w 81e <sd_mmc_check+0xfe>
sd_mmc_spi_debug("%s: CMD1 Timeout on busy\n\r", __func__);
a92: 497d ldr r1, [pc, #500] ; (c88 <sd_mmc_check+0x568>)
a94: 487d ldr r0, [pc, #500] ; (c8c <sd_mmc_check+0x56c>)
sd_mmc_spi_debug("%s: CMD58 Fail\n\r", __func__);
a96: 47b8 blx r7
return false;
a98: e68b b.n 7b2 <sd_mmc_check+0x92>
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD58_READ_OCR, 0)) {
a9a: 68a0 ldr r0, [r4, #8]
a9c: f240 513a movw r1, #1338 ; 0x53a
aa0: 47a8 blx r5
aa2: b910 cbnz r0, aaa <sd_mmc_check+0x38a>
sd_mmc_spi_debug("%s: CMD58 Fail\n\r", __func__);
aa4: 4978 ldr r1, [pc, #480] ; (c88 <sd_mmc_check+0x568>)
aa6: 487a ldr r0, [pc, #488] ; (c90 <sd_mmc_check+0x570>)
aa8: e7f5 b.n a96 <sd_mmc_check+0x376>
if ((driver_get_response(sd_mmc_hal) & OCR_ACCESS_MODE_MASK)
aaa: 68a0 ldr r0, [r4, #8]
aac: 47c8 blx r9
aae: f000 40c0 and.w r0, r0, #1610612736 ; 0x60000000
ab2: f1b0 4f80 cmp.w r0, #1073741824 ; 0x40000000
sd_mmc_card->type |= CARD_TYPE_HC;
ab6: bf08 it eq
ab8: 6822 ldreq r2, [r4, #0]
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD59_CRC_ON_OFF, 0)) {
aba: 68a0 ldr r0, [r4, #8]
sd_mmc_card->type |= CARD_TYPE_HC;
abc: bf02 ittt eq
abe: 7ad3 ldrbeq r3, [r2, #11]
ac0: f043 0308 orreq.w r3, r3, #8
ac4: 72d3 strbeq r3, [r2, #11]
if (!driver_send_cmd(sd_mmc_hal, SDMMC_SPI_CMD59_CRC_ON_OFF, 0)) {
ac6: f241 113b movw r1, #4411 ; 0x113b
aca: 2200 movs r2, #0
acc: 47a8 blx r5
ace: 2800 cmp r0, #0
ad0: f43f ae6f beq.w 7b2 <sd_mmc_check+0x92>
if (!sd_mmc_cmd9_spi()) {
ad4: 4b66 ldr r3, [pc, #408] ; (c70 <sd_mmc_check+0x550>)
ad6: 4798 blx r3
ad8: 2800 cmp r0, #0
ada: f43f ae6a beq.w 7b2 <sd_mmc_check+0x92>
switch (MMC_CSD_SPEC_VERS(sd_mmc_card->csd)) {
ade: f8d4 9000 ldr.w r9, [r4]
ae2: 4e64 ldr r6, [pc, #400] ; (c74 <sd_mmc_check+0x554>)
ae4: f109 0b0e add.w fp, r9, #14
ae8: 2304 movs r3, #4
aea: 227a movs r2, #122 ; 0x7a
aec: 2180 movs r1, #128 ; 0x80
aee: 4658 mov r0, fp
af0: 47b0 blx r6
af2: 3801 subs r0, #1
af4: 46b2 mov sl, r6
af6: 2803 cmp r0, #3
af8: d803 bhi.n b02 <sd_mmc_check+0x3e2>
afa: e8df f000 tbb [pc, r0]
afe: 9391 .short 0x9391
b00: 9795 .short 0x9795
sd_mmc_card->version = CARD_VER_MMC_1_2;
b02: 2312 movs r3, #18
sd_mmc_card->version = CARD_VER_MMC_4;
b04: f889 300c strb.w r3, [r9, #12]
tran_speed = CSD_TRAN_SPEED(sd_mmc_card->csd);
b08: 2260 movs r2, #96 ; 0x60
b0a: 2308 movs r3, #8
b0c: 2180 movs r1, #128 ; 0x80
b0e: 4658 mov r0, fp
b10: 47d0 blx sl
mul = mmc_trans_multipliers[(tran_speed >> 3) & 0xF];
b12: 4b59 ldr r3, [pc, #356] ; (c78 <sd_mmc_check+0x558>)
b14: f3c0 02c3 ubfx r2, r0, #3, #4
unit = sd_mmc_trans_units[tran_speed & 0x7];
b18: f000 0007 and.w r0, r0, #7
b1c: eb03 0080 add.w r0, r3, r0, lsl #2
mul = mmc_trans_multipliers[(tran_speed >> 3) & 0xF];
b20: eb03 0282 add.w r2, r3, r2, lsl #2
if (MMC_CSD_C_SIZE(sd_mmc_card->csd) != 0xFFF) {
b24: 2180 movs r1, #128 ; 0x80
sd_mmc_card->clock = unit * mul * 1000;
b26: 6a13 ldr r3, [r2, #32]
b28: 6e02 ldr r2, [r0, #96] ; 0x60
b2a: 4353 muls r3, r2
b2c: f44f 727a mov.w r2, #1000 ; 0x3e8
b30: 4353 muls r3, r2
b32: f8c9 3000 str.w r3, [r9]
if (MMC_CSD_C_SIZE(sd_mmc_card->csd) != 0xFFF) {
b36: 223e movs r2, #62 ; 0x3e
b38: 230c movs r3, #12
b3a: 4658 mov r0, fp
b3c: 47d0 blx sl
b3e: f640 73ff movw r3, #4095 ; 0xfff
b42: 4298 cmp r0, r3
b44: 4606 mov r6, r0
b46: d012 beq.n b6e <sd_mmc_check+0x44e>
= ((MMC_CSD_C_SIZE(sd_mmc_card->csd) + 1) * (1 << (MMC_CSD_C_SIZE_MULT(sd_mmc_card->csd) + 2)));
b48: 2303 movs r3, #3
b4a: 222f movs r2, #47 ; 0x2f
b4c: 2180 movs r1, #128 ; 0x80
b4e: 4658 mov r0, fp
b50: 47d0 blx sl
b52: 1c73 adds r3, r6, #1
b54: 3002 adds r0, #2
uint32_t blocknr
b56: fa03 f600 lsl.w r6, r3, r0
sd_mmc_card->capacity = blocknr * (1 << MMC_CSD_READ_BL_LEN(sd_mmc_card->csd)) / 1024;
b5a: 2250 movs r2, #80 ; 0x50
b5c: 2304 movs r3, #4
b5e: 2180 movs r1, #128 ; 0x80
b60: 4658 mov r0, fp
b62: 47d0 blx sl
b64: fa06 f000 lsl.w r0, r6, r0
b68: 0a80 lsrs r0, r0, #10
b6a: f8c9 0004 str.w r0, [r9, #4]
if (sd_mmc_card->version >= CARD_VER_MMC_4) {
b6e: f899 300c ldrb.w r3, [r9, #12]
b72: 2b3f cmp r3, #63 ; 0x3f
b74: d93e bls.n bf4 <sd_mmc_check+0x4d4>
if (!driver_adtc_start(sd_mmc_hal, MMC_CMD8_SEND_EXT_CSD, 0, EXT_CSD_BSIZE, 1, false)) {
b76: 2301 movs r3, #1
b78: 2200 movs r2, #0
b7a: e9cd 3200 strd r3, r2, [sp]
b7e: 4945 ldr r1, [pc, #276] ; (c94 <sd_mmc_check+0x574>)
b80: 68a0 ldr r0, [r4, #8]
b82: 4e45 ldr r6, [pc, #276] ; (c98 <sd_mmc_check+0x578>)
b84: f44f 7300 mov.w r3, #512 ; 0x200
b88: 47b0 blx r6
b8a: 2800 cmp r0, #0
b8c: f43f ae11 beq.w 7b2 <sd_mmc_check+0x92>
if (!driver_read_word(sd_mmc_hal, &ext_csd)) {
b90: f8df b114 ldr.w fp, [pc, #276] ; ca8 <sd_mmc_check+0x588>
b94: 2632 movs r6, #50 ; 0x32
b96: 46d9 mov r9, fp
b98: 68a0 ldr r0, [r4, #8]
b9a: a905 add r1, sp, #20
b9c: 47d8 blx fp
b9e: 2800 cmp r0, #0
ba0: f43f ae07 beq.w 7b2 <sd_mmc_check+0x92>
for (i = 0; i < (EXT_CSD_CARD_TYPE_INDEX + 4) / 4; i++) {
ba4: 3e01 subs r6, #1
ba6: b2b6 uxth r6, r6
ba8: 2e00 cmp r6, #0
baa: d1f5 bne.n b98 <sd_mmc_check+0x478>
if (MMC_CSD_C_SIZE(sd_mmc_card->csd) == 0xFFF) {
bac: 6820 ldr r0, [r4, #0]
bae: 230c movs r3, #12
bb0: 223e movs r2, #62 ; 0x3e
bb2: 2180 movs r1, #128 ; 0x80
bb4: 300e adds r0, #14
bb6: 47d0 blx sl
bb8: f640 73ff movw r3, #4095 ; 0xfff
bbc: 4298 cmp r0, r3
bbe: d137 bne.n c30 <sd_mmc_check+0x510>
bc0: 2604 movs r6, #4
if (!driver_read_word(sd_mmc_hal, &sec_count)) {
bc2: 68a0 ldr r0, [r4, #8]
bc4: a906 add r1, sp, #24
bc6: 47c8 blx r9
bc8: 2800 cmp r0, #0
bca: f43f adf2 beq.w 7b2 <sd_mmc_check+0x92>
for (; i < (EXT_CSD_SEC_COUNT_INDEX + 4) / 4; i++) {
bce: 3e01 subs r6, #1
bd0: b2b6 uxth r6, r6
bd2: 2e00 cmp r6, #0
bd4: d1f5 bne.n bc2 <sd_mmc_check+0x4a2>
sd_mmc_card->capacity = sec_count / 2;
bd6: 9b06 ldr r3, [sp, #24]
bd8: 6822 ldr r2, [r4, #0]
bda: 085b lsrs r3, r3, #1
bdc: 6053 str r3, [r2, #4]
bde: 2636 movs r6, #54 ; 0x36
if (!driver_read_word(sd_mmc_hal, &sec_count)) {
be0: 68a0 ldr r0, [r4, #8]
be2: a906 add r1, sp, #24
be4: 47c8 blx r9
be6: 2800 cmp r0, #0
be8: f43f ade3 beq.w 7b2 <sd_mmc_check+0x92>
for (; i < EXT_CSD_BSIZE / 4; i++) {
bec: 3601 adds r6, #1
bee: b2b6 uxth r6, r6
bf0: 2e80 cmp r6, #128 ; 0x80
bf2: d1f5 bne.n be0 <sd_mmc_check+0x4c0>
if (!driver_send_cmd(sd_mmc_hal, SDMMC_CMD16_SET_BLOCKLEN, SD_MMC_BLOCK_SIZE)) {
bf4: 68a0 ldr r0, [r4, #8]
bf6: f44f 7200 mov.w r2, #512 ; 0x200
bfa: f241 1110 movw r1, #4368 ; 0x1110
bfe: 47a8 blx r5
c00: 2800 cmp r0, #0
c02: f43f add6 beq.w 7b2 <sd_mmc_check+0x92>
if (!sd_mmc_cmd13()) {
c06: 4b25 ldr r3, [pc, #148] ; (c9c <sd_mmc_check+0x57c>)
c08: 4798 blx r3
c0a: 2800 cmp r0, #0
c0c: f43f add1 beq.w 7b2 <sd_mmc_check+0x92>
sd_mmc_configure_slot();
c10: 4b23 ldr r3, [pc, #140] ; (ca0 <sd_mmc_check+0x580>)
c12: 4798 blx r3
sd_mmc_spi_debug("SD/MMC card ready\n\r");
c14: 4823 ldr r0, [pc, #140] ; (ca4 <sd_mmc_check+0x584>)
c16: 47b8 blx r7
sd_mmc_card->state = SD_MMC_CARD_STATE_READY;
c18: 6823 ldr r3, [r4, #0]
c1a: 2200 movs r2, #0
c1c: 729a strb r2, [r3, #10]
sd_mmc_deselect_slot();
c1e: e587 b.n 730 <sd_mmc_check+0x10>
sd_mmc_card->version = CARD_VER_MMC_1_4;
c20: 2314 movs r3, #20
c22: e76f b.n b04 <sd_mmc_check+0x3e4>
sd_mmc_card->version = CARD_VER_MMC_2_2;
c24: 2322 movs r3, #34 ; 0x22
c26: e76d b.n b04 <sd_mmc_check+0x3e4>
sd_mmc_card->version = CARD_VER_MMC_3;
c28: 2330 movs r3, #48 ; 0x30
c2a: e76b b.n b04 <sd_mmc_check+0x3e4>
sd_mmc_card->version = CARD_VER_MMC_4;
c2c: 2340 movs r3, #64 ; 0x40
c2e: e769 b.n b04 <sd_mmc_check+0x3e4>
c30: 2632 movs r6, #50 ; 0x32
c32: e7d5 b.n be0 <sd_mmc_check+0x4c0>
= ((SD_CSD_1_0_C_SIZE(sd_mmc_card->csd) + 1) * (1 << (SD_CSD_1_0_C_SIZE_MULT(sd_mmc_card->csd) + 2)));
c34: 230c movs r3, #12
c36: 223e movs r2, #62 ; 0x3e
c38: 2180 movs r1, #128 ; 0x80
c3a: 4658 mov r0, fp
c3c: 47b0 blx r6
c3e: 2303 movs r3, #3
c40: 4606 mov r6, r0
c42: 222f movs r2, #47 ; 0x2f
c44: 2180 movs r1, #128 ; 0x80
c46: 4658 mov r0, fp
c48: 47c8 blx r9
c4a: 3601 adds r6, #1
c4c: 3002 adds r0, #2
uint32_t blocknr
c4e: 4086 lsls r6, r0
sd_mmc_card->capacity = blocknr * (1 << SD_CSD_1_0_READ_BL_LEN(sd_mmc_card->csd)) / 1024;
c50: 2304 movs r3, #4
c52: 2250 movs r2, #80 ; 0x50
c54: 2180 movs r1, #128 ; 0x80
c56: 4658 mov r0, fp
c58: 47c8 blx r9
c5a: fa06 f000 lsl.w r0, r6, r0
c5e: 0a80 lsrs r0, r0, #10
c60: e6d1 b.n a06 <sd_mmc_check+0x2e6>
sd_mmc_card->version = CARD_VER_SD_1_10;
c62: 231a movs r3, #26
sd_mmc_card->version = CARD_VER_SD_1_0;
c64: f88a 300c strb.w r3, [sl, #12]
break;
c68: e635 b.n 8d6 <sd_mmc_check+0x1b6>
sd_mmc_card->version = CARD_VER_SD_1_0;
c6a: 2310 movs r3, #16
c6c: e7fa b.n c64 <sd_mmc_check+0x544>
c6e: bf00 nop
c70: 000005c1 .word 0x000005c1
c74: 000003f9 .word 0x000003f9
c78: 00002c0c .word 0x00002c0c
c7c: 00081133 .word 0x00081133
c80: 0000125d .word 0x0000125d
c84: 00001309 .word 0x00001309
c88: 00002c1b .word 0x00002c1b
c8c: 00002bda .word 0x00002bda
c90: 00002b91 .word 0x00002b91
c94: 00081108 .word 0x00081108
c98: 00001061 .word 0x00001061
c9c: 0000057d .word 0x0000057d
ca0: 000004a1 .word 0x000004a1
ca4: 00002bf5 .word 0x00002bf5
ca8: 0000130d .word 0x0000130d
for (i = 0; i < 6; i++) {
cac: f106 0906 add.w r9, r6, #6
sdio_cmd52(SDIO_CMD52_READ_FLAG, SDIO_CIA, addr_new, 0, &buf[i]);
cb0: 2100 movs r1, #0
cb2: 4653 mov r3, sl
cb4: 4632 mov r2, r6
cb6: 4608 mov r0, r1
addr_new++;
cb8: 3601 adds r6, #1
sdio_cmd52(SDIO_CMD52_READ_FLAG, SDIO_CIA, addr_new, 0, &buf[i]);
cba: 47d8 blx fp
for (i = 0; i < 6; i++) {
cbc: 454e cmp r6, r9
cbe: f10a 0a01 add.w sl, sl, #1
cc2: d1f5 bne.n cb0 <sd_mmc_check+0x590>
tplfe_max_tran_speed = buf[5];
cc4: f89d 301d ldrb.w r3, [sp, #29]
unit = sd_mmc_trans_units[tplfe_max_tran_speed & 0x7];
cc8: 490e ldr r1, [pc, #56] ; (d04 <sd_mmc_check+0x5e4>)
sd_mmc_card->clock = unit * mul * 1000;
cca: 6822 ldr r2, [r4, #0]
ccc: 2b32 cmp r3, #50 ; 0x32
cce: bf28 it cs
cd0: 2332 movcs r3, #50 ; 0x32
unit = sd_mmc_trans_units[tplfe_max_tran_speed & 0x7];
cd2: f003 0007 and.w r0, r3, #7
mul = sd_trans_multipliers[(tplfe_max_tran_speed >> 3) & 0xF];
cd6: 08db lsrs r3, r3, #3
unit = sd_mmc_trans_units[tplfe_max_tran_speed & 0x7];
cd8: eb01 0080 add.w r0, r1, r0, lsl #2
mul = sd_trans_multipliers[(tplfe_max_tran_speed >> 3) & 0xF];
cdc: eb01 0183 add.w r1, r1, r3, lsl #2
sd_mmc_card->clock = unit * mul * 1000;
ce0: 6e03 ldr r3, [r0, #96] ; 0x60
ce2: 6fc9 ldr r1, [r1, #124] ; 0x7c
ce4: 434b muls r3, r1
ce6: f44f 717a mov.w r1, #1000 ; 0x3e8
cea: 434b muls r3, r1
cec: 6013 str r3, [r2, #0]
return true;
cee: e5f6 b.n 8de <sd_mmc_check+0x1be>
if (!driver_send_cmd(sd_mmc_hal, SDMMC_CMD16_SET_BLOCKLEN, SD_MMC_BLOCK_SIZE)) {
cf0: 68a0 ldr r0, [r4, #8]
cf2: f44f 7200 mov.w r2, #512 ; 0x200
cf6: f241 1110 movw r1, #4368 ; 0x1110
cfa: 47a8 blx r5
cfc: 2800 cmp r0, #0
cfe: f47f adf5 bne.w 8ec <sd_mmc_check+0x1cc>
d02: e556 b.n 7b2 <sd_mmc_check+0x92>
d04: 00002c0c .word 0x00002c0c
00000d08 <sd_mmc_get_type>:
card_type_t sd_mmc_get_type(uint8_t slot)
{
d08: b508 push {r3, lr}
if (SD_MMC_OK != sd_mmc_select_slot(slot)) {
d0a: 4b05 ldr r3, [pc, #20] ; (d20 <sd_mmc_get_type+0x18>)
d0c: 4798 blx r3
d0e: b928 cbnz r0, d1c <sd_mmc_get_type+0x14>
return CARD_TYPE_UNKNOWN;
}
sd_mmc_deselect_slot();
d10: 4b04 ldr r3, [pc, #16] ; (d24 <sd_mmc_get_type+0x1c>)
d12: 4798 blx r3
return sd_mmc_card->type;
d14: 4b04 ldr r3, [pc, #16] ; (d28 <sd_mmc_get_type+0x20>)
d16: 681b ldr r3, [r3, #0]
d18: 7ad8 ldrb r0, [r3, #11]
}
d1a: bd08 pop {r3, pc}
return CARD_TYPE_UNKNOWN;
d1c: 2000 movs r0, #0
d1e: e7fc b.n d1a <sd_mmc_get_type+0x12>
d20: 000004c9 .word 0x000004c9
d24: 00000611 .word 0x00000611
d28: 20000290 .word 0x20000290
00000d2c <sd_mmc_init_read_blocks>:
}
return false;
}
sd_mmc_err_t sd_mmc_init_read_blocks(uint8_t slot, uint32_t start, uint16_t nb_block)
{
d2c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
sd_mmc_err_t sd_mmc_err;
uint32_t cmd, arg, resp;
sd_mmc_err = sd_mmc_select_slot(slot);
d2e: 4b17 ldr r3, [pc, #92] ; (d8c <sd_mmc_init_read_blocks+0x60>)
{
d30: 460f mov r7, r1
d32: 4614 mov r4, r2
sd_mmc_err = sd_mmc_select_slot(slot);
d34: 4798 blx r3
if (sd_mmc_err != SD_MMC_OK) {
d36: 4605 mov r5, r0
d38: b928 cbnz r0, d46 <sd_mmc_init_read_blocks+0x1a>
return sd_mmc_err;
}
/* Wait for data ready status */
if (!sd_mmc_cmd13()) {
d3a: 4b15 ldr r3, [pc, #84] ; (d90 <sd_mmc_init_read_blocks+0x64>)
d3c: 4798 blx r3
d3e: b928 cbnz r0, d4c <sd_mmc_init_read_blocks+0x20>
sd_mmc_deselect_slot();
d40: 4b14 ldr r3, [pc, #80] ; (d94 <sd_mmc_init_read_blocks+0x68>)
d42: 4798 blx r3
return SD_MMC_ERR_COMM;
d44: 2505 movs r5, #5
}
sd_mmc_nb_block_remaining = nb_block;
sd_mmc_nb_block_to_tranfer = nb_block;
return SD_MMC_OK;
}
d46: 4628 mov r0, r5
d48: b003 add sp, #12
d4a: bdf0 pop {r4, r5, r6, r7, pc}
cmd = SDMMC_CMD17_READ_SINGLE_BLOCK;
d4c: 4b12 ldr r3, [pc, #72] ; (d98 <sd_mmc_init_read_blocks+0x6c>)
if (sd_mmc_card->type & CARD_TYPE_HC) {
d4e: 4e13 ldr r6, [pc, #76] ; (d9c <sd_mmc_init_read_blocks+0x70>)
cmd = SDMMC_CMD17_READ_SINGLE_BLOCK;
d50: 4913 ldr r1, [pc, #76] ; (da0 <sd_mmc_init_read_blocks+0x74>)
if (!driver_adtc_start(sd_mmc_hal, cmd, arg, SD_MMC_BLOCK_SIZE, nb_block, true)) {
d52: 68b0 ldr r0, [r6, #8]
cmd = SDMMC_CMD17_READ_SINGLE_BLOCK;
d54: 2c01 cmp r4, #1
d56: bf98 it ls
d58: 4619 movls r1, r3
if (sd_mmc_card->type & CARD_TYPE_HC) {
d5a: 6833 ldr r3, [r6, #0]
d5c: 7adb ldrb r3, [r3, #11]
d5e: 071b lsls r3, r3, #28
arg = (start * SD_MMC_BLOCK_SIZE);
d60: bf58 it pl
d62: 027f lslpl r7, r7, #9
if (!driver_adtc_start(sd_mmc_hal, cmd, arg, SD_MMC_BLOCK_SIZE, nb_block, true)) {
d64: 2301 movs r3, #1
d66: e9cd 4300 strd r4, r3, [sp]
d6a: 463a mov r2, r7
d6c: f44f 7300 mov.w r3, #512 ; 0x200
d70: 4f0c ldr r7, [pc, #48] ; (da4 <sd_mmc_init_read_blocks+0x78>)
d72: 47b8 blx r7
d74: 2800 cmp r0, #0
d76: d0e3 beq.n d40 <sd_mmc_init_read_blocks+0x14>
resp = driver_get_response(sd_mmc_hal);
d78: 4b0b ldr r3, [pc, #44] ; (da8 <sd_mmc_init_read_blocks+0x7c>)
d7a: 68b0 ldr r0, [r6, #8]
d7c: 4798 blx r3
if (resp & CARD_STATUS_ERR_RD_WR) {
d7e: 4b0b ldr r3, [pc, #44] ; (dac <sd_mmc_init_read_blocks+0x80>)
d80: 4003 ands r3, r0
d82: 2b00 cmp r3, #0
d84: d1dc bne.n d40 <sd_mmc_init_read_blocks+0x14>
sd_mmc_nb_block_remaining = nb_block;
d86: 8634 strh r4, [r6, #48] ; 0x30
sd_mmc_nb_block_to_tranfer = nb_block;
d88: 8734 strh r4, [r6, #56] ; 0x38
return SD_MMC_OK;
d8a: e7dc b.n d46 <sd_mmc_init_read_blocks+0x1a>
d8c: 000004c9 .word 0x000004c9
d90: 0000057d .word 0x0000057d
d94: 00000611 .word 0x00000611
d98: 00081111 .word 0x00081111
d9c: 20000290 .word 0x20000290
da0: 00101112 .word 0x00101112
da4: 00001061 .word 0x00001061
da8: 000013b9 .word 0x000013b9
dac: e4580000 .word 0xe4580000
00000db0 <sd_mmc_start_read_blocks>:
sd_mmc_err_t sd_mmc_start_read_blocks(void *dest, uint16_t nb_block)
{
db0: b5f8 push {r3, r4, r5, r6, r7, lr}
assert(sd_mmc_nb_block_remaining >= nb_block, ">>>");
db2: 4d0e ldr r5, [pc, #56] ; (dec <sd_mmc_start_read_blocks+0x3c>)
db4: 4a0e ldr r2, [pc, #56] ; (df0 <sd_mmc_start_read_blocks+0x40>)
db6: 4f0f ldr r7, [pc, #60] ; (df4 <sd_mmc_start_read_blocks+0x44>)
{
db8: 4606 mov r6, r0
assert(sd_mmc_nb_block_remaining >= nb_block, ">>>");
dba: 8e28 ldrh r0, [r5, #48] ; 0x30
{
dbc: 460c mov r4, r1
assert(sd_mmc_nb_block_remaining >= nb_block, ">>>");
dbe: 42a0 cmp r0, r4
dc0: bf34 ite cc
dc2: 2000 movcc r0, #0
dc4: 2001 movcs r0, #1
dc6: 490c ldr r1, [pc, #48] ; (df8 <sd_mmc_start_read_blocks+0x48>)
dc8: f44f 63d9 mov.w r3, #1736 ; 0x6c8
dcc: 47b8 blx r7
if (!driver_start_read_blocks(sd_mmc_hal, dest, nb_block)) {
dce: 68a8 ldr r0, [r5, #8]
dd0: 4b0a ldr r3, [pc, #40] ; (dfc <sd_mmc_start_read_blocks+0x4c>)
dd2: 4622 mov r2, r4
dd4: 4631 mov r1, r6
dd6: 4798 blx r3
dd8: b128 cbz r0, de6 <sd_mmc_start_read_blocks+0x36>
sd_mmc_nb_block_remaining = 0;
return SD_MMC_ERR_COMM;
}
sd_mmc_nb_block_remaining -= nb_block;
dda: 8e28 ldrh r0, [r5, #48] ; 0x30
ddc: 1b01 subs r1, r0, r4
dde: b289 uxth r1, r1
return SD_MMC_OK;
de0: 2000 movs r0, #0
de2: 8629 strh r1, [r5, #48] ; 0x30
}
de4: bdf8 pop {r3, r4, r5, r6, r7, pc}
sd_mmc_nb_block_remaining = 0;
de6: 4601 mov r1, r0
return SD_MMC_ERR_COMM;
de8: 2005 movs r0, #5
dea: e7fa b.n de2 <sd_mmc_start_read_blocks+0x32>
dec: 20000290 .word 0x20000290
df0: 00002b12 .word 0x00002b12
df4: 00002169 .word 0x00002169
df8: 00002b25 .word 0x00002b25
dfc: 0000125d .word 0x0000125d
00000e00 <sd_mmc_wait_end_of_read_blocks>:
sd_mmc_err_t sd_mmc_wait_end_of_read_blocks(bool abort)
{
e00: b538 push {r3, r4, r5, lr}
if (!driver_wait_end_of_read_blocks(sd_mmc_hal)) {
e02: 4d12 ldr r5, [pc, #72] ; (e4c <sd_mmc_wait_end_of_read_blocks+0x4c>)
e04: 4b12 ldr r3, [pc, #72] ; (e50 <sd_mmc_wait_end_of_read_blocks+0x50>)
{
e06: 4604 mov r4, r0
if (!driver_wait_end_of_read_blocks(sd_mmc_hal)) {
e08: 68a8 ldr r0, [r5, #8]
e0a: 4798 blx r3
e0c: b1e0 cbz r0, e48 <sd_mmc_wait_end_of_read_blocks+0x48>
return SD_MMC_ERR_COMM;
}
if (abort) {
e0e: b144 cbz r4, e22 <sd_mmc_wait_end_of_read_blocks+0x22>
sd_mmc_nb_block_remaining = 0;
e10: 2300 movs r3, #0
e12: 862b strh r3, [r5, #48] ; 0x30
} else if (sd_mmc_nb_block_remaining) {
return SD_MMC_OK;
}
/* All blocks are transfered then stop read operation */
if (sd_mmc_nb_block_to_tranfer == 1) {
e14: 8f2b ldrh r3, [r5, #56] ; 0x38
e16: 2b01 cmp r3, #1
e18: d108 bne.n e2c <sd_mmc_wait_end_of_read_blocks+0x2c>
/* Single block transfer, then nothing to do */
sd_mmc_deselect_slot();
e1a: 4b0e ldr r3, [pc, #56] ; (e54 <sd_mmc_wait_end_of_read_blocks+0x54>)
e1c: 4798 blx r3
return SD_MMC_OK;
e1e: 2000 movs r0, #0
if (!driver_adtc_stop(sd_mmc_hal, SDMMC_CMD12_STOP_TRANSMISSION, 0)) {
driver_adtc_stop(sd_mmc_hal, SDMMC_CMD12_STOP_TRANSMISSION, 0);
}
sd_mmc_deselect_slot();
return SD_MMC_OK;
}
e20: bd38 pop {r3, r4, r5, pc}
} else if (sd_mmc_nb_block_remaining) {
e22: 8e2b ldrh r3, [r5, #48] ; 0x30
e24: 2b00 cmp r3, #0
e26: d0f5 beq.n e14 <sd_mmc_wait_end_of_read_blocks+0x14>
return SD_MMC_OK;
e28: 4620 mov r0, r4
e2a: e7f9 b.n e20 <sd_mmc_wait_end_of_read_blocks+0x20>
if (!driver_adtc_stop(sd_mmc_hal, SDMMC_CMD12_STOP_TRANSMISSION, 0)) {
e2c: 2200 movs r2, #0
e2e: 68a8 ldr r0, [r5, #8]
e30: 4c09 ldr r4, [pc, #36] ; (e58 <sd_mmc_wait_end_of_read_blocks+0x58>)
e32: f243 110c movw r1, #12556 ; 0x310c
e36: 47a0 blx r4
e38: 4602 mov r2, r0
e3a: 2800 cmp r0, #0
e3c: d1ed bne.n e1a <sd_mmc_wait_end_of_read_blocks+0x1a>
driver_adtc_stop(sd_mmc_hal, SDMMC_CMD12_STOP_TRANSMISSION, 0);
e3e: 68a8 ldr r0, [r5, #8]
e40: f243 110c movw r1, #12556 ; 0x310c
e44: 47a0 blx r4
e46: e7e8 b.n e1a <sd_mmc_wait_end_of_read_blocks+0x1a>
return SD_MMC_ERR_COMM;
e48: 2005 movs r0, #5
e4a: e7e9 b.n e20 <sd_mmc_wait_end_of_read_blocks+0x20>
e4c: 20000290 .word 0x20000290
e50: 00001309 .word 0x00001309
e54: 00000611 .word 0x00000611
e58: 00001249 .word 0x00001249
00000e5c <sdio_read_extended>:
return SD_MMC_OK;
}
sd_mmc_err_t sdio_read_extended(uint8_t slot, uint8_t func_num, uint32_t addr, uint8_t inc_addr, uint8_t *dest,
uint16_t size)
{
e5c: b570 push {r4, r5, r6, lr}
e5e: b086 sub sp, #24
e60: e9cd 2104 strd r2, r1, [sp, #16]
e64: f8bd 502c ldrh.w r5, [sp, #44] ; 0x2c
e68: 9303 str r3, [sp, #12]
sd_mmc_err_t sd_mmc_err;
if ((size == 0) || (size > 512)) {
e6a: 1e6c subs r4, r5, #1
e6c: f5b4 7f00 cmp.w r4, #512 ; 0x200
e70: d21f bcs.n eb2 <sdio_read_extended+0x56>
return SD_MMC_ERR_PARAM;
}
sd_mmc_err = sd_mmc_select_slot(slot);
e72: 4c11 ldr r4, [pc, #68] ; (eb8 <sdio_read_extended+0x5c>)
e74: 47a0 blx r4
if (sd_mmc_err != SD_MMC_OK) {
e76: 4604 mov r4, r0
e78: b948 cbnz r0, e8e <sdio_read_extended+0x32>
return sd_mmc_err;
}
if (!sdio_cmd53(SDIO_CMD53_READ_FLAG, func_num, addr, inc_addr, size, true)) {
e7a: 9500 str r5, [sp, #0]
e7c: e9dd 3203 ldrd r3, r2, [sp, #12]
e80: 4d0e ldr r5, [pc, #56] ; (ebc <sdio_read_extended+0x60>)
e82: 9905 ldr r1, [sp, #20]
e84: 47a8 blx r5
e86: 4d0e ldr r5, [pc, #56] ; (ec0 <sdio_read_extended+0x64>)
e88: b920 cbnz r0, e94 <sdio_read_extended+0x38>
sd_mmc_deselect_slot();
e8a: 47a8 blx r5
return SD_MMC_ERR_COMM;
e8c: 2405 movs r4, #5
return SD_MMC_ERR_COMM;
}
sd_mmc_deselect_slot();
return SD_MMC_OK;
}
e8e: 4620 mov r0, r4
e90: b006 add sp, #24
e92: bd70 pop {r4, r5, r6, pc}
if (!driver_start_read_blocks(sd_mmc_hal, dest, 1)) {
e94: 4e0b ldr r6, [pc, #44] ; (ec4 <sdio_read_extended+0x68>)
e96: 990a ldr r1, [sp, #40] ; 0x28
e98: 68b0 ldr r0, [r6, #8]
e9a: 4b0b ldr r3, [pc, #44] ; (ec8 <sdio_read_extended+0x6c>)
e9c: 2201 movs r2, #1
e9e: 4798 blx r3
ea0: 2800 cmp r0, #0
ea2: d0f2 beq.n e8a <sdio_read_extended+0x2e>
if (!driver_wait_end_of_read_blocks(sd_mmc_hal)) {
ea4: 68b0 ldr r0, [r6, #8]
ea6: 4b09 ldr r3, [pc, #36] ; (ecc <sdio_read_extended+0x70>)
ea8: 4798 blx r3
eaa: 2800 cmp r0, #0
eac: d0ed beq.n e8a <sdio_read_extended+0x2e>
sd_mmc_deselect_slot();
eae: 47a8 blx r5
return SD_MMC_OK;
eb0: e7ed b.n e8e <sdio_read_extended+0x32>
return SD_MMC_ERR_PARAM;
eb2: 2406 movs r4, #6
eb4: e7eb b.n e8e <sdio_read_extended+0x32>
eb6: bf00 nop
eb8: 000004c9 .word 0x000004c9
ebc: 00000629 .word 0x00000629
ec0: 00000611 .word 0x00000611
ec4: 20000290 .word 0x20000290
ec8: 0000125d .word 0x0000125d
ecc: 00001309 .word 0x00001309
00000ed0 <spi_m_sync_wait_busy>:
crc = (crc << 1) | 1;
return crc;
}
static bool spi_m_sync_wait_busy(struct spi_m_sync_descriptor* spi)
{
ed0: b573 push {r0, r1, r4, r5, r6, lr}
uint8_t line = 0xFF;
ed2: 23ff movs r3, #255 ; 0xff
ed4: f88d 3002 strb.w r3, [sp, #2]
uint8_t dummy = 0xFF;
ed8: f88d 3003 strb.w r3, [sp, #3]
/* Delay before check busy
* Nbr timing minimum = 8 cylces
*/
struct io_descriptor* spi_inst = NULL;
edc: 2300 movs r3, #0
ede: 9301 str r3, [sp, #4]
spi_m_sync_get_io_descriptor(spi, &spi_inst);
ee0: a901 add r1, sp, #4
ee2: 4b17 ldr r3, [pc, #92] ; (f40 <spi_m_sync_wait_busy+0x70>)
io_write(spi_inst, &dummy, 1);
ee4: 4d17 ldr r5, [pc, #92] ; (f44 <spi_m_sync_wait_busy+0x74>)
io_read(spi_inst, &line, 1);
ee6: 4e18 ldr r6, [pc, #96] ; (f48 <spi_m_sync_wait_busy+0x78>)
* However a timeout is used.
* 200 000 * 8 cycles
*/
uint32_t nec_timeout = 200000;
io_write(spi_inst, &dummy, 1);
io_read(spi_inst, &line, 1);
ee8: 4c18 ldr r4, [pc, #96] ; (f4c <spi_m_sync_wait_busy+0x7c>)
spi_m_sync_get_io_descriptor(spi, &spi_inst);
eea: 4798 blx r3
io_write(spi_inst, &dummy, 1);
eec: 2201 movs r2, #1
eee: f10d 0103 add.w r1, sp, #3
ef2: 9801 ldr r0, [sp, #4]
ef4: 47a8 blx r5
io_read(spi_inst, &line, 1);
ef6: 2201 movs r2, #1
ef8: f10d 0102 add.w r1, sp, #2
efc: 9801 ldr r0, [sp, #4]
efe: 47b0 blx r6
io_write(spi_inst, &dummy, 1);
f00: 2201 movs r2, #1
f02: f10d 0103 add.w r1, sp, #3
f06: 9801 ldr r0, [sp, #4]
f08: 47a8 blx r5
io_read(spi_inst, &line, 1);
f0a: 9801 ldr r0, [sp, #4]
f0c: 2201 movs r2, #1
f0e: f10d 0102 add.w r1, sp, #2
f12: 47b0 blx r6
do {
io_write(spi_inst, &dummy, 1);
f14: 2201 movs r2, #1
f16: f10d 0103 add.w r1, sp, #3
f1a: 9801 ldr r0, [sp, #4]
f1c: 47a8 blx r5
io_read(spi_inst, &line, 1);
f1e: 9801 ldr r0, [sp, #4]
f20: 2201 movs r2, #1
f22: f10d 0102 add.w r1, sp, #2
f26: 47b0 blx r6
if (!(nec_timeout--)) {
f28: 3c01 subs r4, #1
f2a: d006 beq.n f3a <spi_m_sync_wait_busy+0x6a>
return false;
}
} while (line != 0xFF);
f2c: f89d 3002 ldrb.w r3, [sp, #2]
f30: 2bff cmp r3, #255 ; 0xff
f32: d1ef bne.n f14 <spi_m_sync_wait_busy+0x44>
return true;
f34: 2001 movs r0, #1
}
f36: b002 add sp, #8
f38: bd70 pop {r4, r5, r6, pc}
return false;
f3a: 4620 mov r0, r4
f3c: e7fb b.n f36 <spi_m_sync_wait_busy+0x66>
f3e: bf00 nop
f40: 00001521 .word 0x00001521
f44: 000002a5 .word 0x000002a5
f48: 000002d5 .word 0x000002d5
f4c: 00030d41 .word 0x00030d41
00000f50 <spi_m_sync_stop_read_block>:
return true;
}
static void spi_m_sync_stop_read_block(struct spi_m_sync_descriptor* spi)
{
f50: b51f push {r0, r1, r2, r3, r4, lr}
struct io_descriptor* spi_inst = NULL;
f52: 2300 movs r3, #0
f54: 9303 str r3, [sp, #12]
spi_m_sync_get_io_descriptor(spi, &spi_inst);
f56: a903 add r1, sp, #12
f58: 4b09 ldr r3, [pc, #36] ; (f80 <spi_m_sync_stop_read_block+0x30>)
f5a: 4798 blx r3
uint8_t crc[2];
uint8_t dummy = 0xFF;
f5c: 23ff movs r3, #255 ; 0xff
f5e: f88d 3007 strb.w r3, [sp, #7]
// Read 16-bit CRC (not cheked)
io_write(spi_inst, &dummy, 1);
f62: f10d 0107 add.w r1, sp, #7
f66: 9803 ldr r0, [sp, #12]
f68: 4b06 ldr r3, [pc, #24] ; (f84 <spi_m_sync_stop_read_block+0x34>)
f6a: 2201 movs r2, #1
f6c: 4798 blx r3
io_read(spi_inst, crc, 2);
f6e: 9803 ldr r0, [sp, #12]
f70: 4b05 ldr r3, [pc, #20] ; (f88 <spi_m_sync_stop_read_block+0x38>)
f72: 2202 movs r2, #2
f74: a902 add r1, sp, #8
f76: 4798 blx r3
}
f78: b005 add sp, #20
f7a: f85d fb04 ldr.w pc, [sp], #4
f7e: bf00 nop
f80: 00001521 .word 0x00001521
f84: 000002a5 .word 0x000002a5
f88: 000002d5 .word 0x000002d5
00000f8c <spi_m_sync_start_read_block>:
{
f8c: e92d 41f3 stmdb sp!, {r0, r1, r4, r5, r6, r7, r8, lr}
spi_m_sync_get_io_descriptor(spi, &spi_inst);
f90: 4b26 ldr r3, [pc, #152] ; (102c <spi_m_sync_start_read_block+0xa0>)
assert(!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size), ">>>");
f92: 4d27 ldr r5, [pc, #156] ; (1030 <spi_m_sync_start_read_block+0xa4>)
io_write(spi_inst, &dummy, 1);
f94: 4e27 ldr r6, [pc, #156] ; (1034 <spi_m_sync_start_read_block+0xa8>)
io_read(spi_inst, &token, 1);
f96: f8df 80c4 ldr.w r8, [pc, #196] ; 105c <spi_m_sync_start_read_block+0xd0>
struct io_descriptor* spi_inst = NULL;
f9a: 2400 movs r4, #0
spi_m_sync_get_io_descriptor(spi, &spi_inst);
f9c: a901 add r1, sp, #4
struct io_descriptor* spi_inst = NULL;
f9e: 9401 str r4, [sp, #4]
spi_m_sync_get_io_descriptor(spi, &spi_inst);
fa0: 4798 blx r3
assert(!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size), ">>>");
fa2: 4a25 ldr r2, [pc, #148] ; (1038 <spi_m_sync_start_read_block+0xac>)
fa4: 4925 ldr r1, [pc, #148] ; (103c <spi_m_sync_start_read_block+0xb0>)
fa6: 6810 ldr r0, [r2, #0]
uint8_t dummy = 0xFF;
fa8: 23ff movs r3, #255 ; 0xff
faa: f88d 3003 strb.w r3, [sp, #3]
assert(!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size), ">>>");
fae: 8893 ldrh r3, [r2, #4]
fb0: fbb0 f2f3 udiv r2, r0, r3
fb4: fb03 0012 mls r0, r3, r2, r0
fb8: fab0 f080 clz r0, r0
fbc: 4a20 ldr r2, [pc, #128] ; (1040 <spi_m_sync_start_read_block+0xb4>)
fbe: 23b3 movs r3, #179 ; 0xb3
fc0: 0940 lsrs r0, r0, #5
fc2: 47a8 blx r5
token = 0;
fc4: f88d 4002 strb.w r4, [sp, #2]
fc8: 4c1e ldr r4, [pc, #120] ; (1044 <spi_m_sync_start_read_block+0xb8>)
if (i-- == 0) {
fca: 3c01 subs r4, #1
fcc: d105 bne.n fda <spi_m_sync_start_read_block+0x4e>
sd_mmc_spi_debug("%s: Read blocks timeout\n\r", __func__);
fce: 491e ldr r1, [pc, #120] ; (1048 <spi_m_sync_start_read_block+0xbc>)
fd0: 481e ldr r0, [pc, #120] ; (104c <spi_m_sync_start_read_block+0xc0>)
fd2: 4b1f ldr r3, [pc, #124] ; (1050 <spi_m_sync_start_read_block+0xc4>)
sd_mmc_spi_debug("%s: Out of range data error token\n\r", __func__);
fd4: 4798 blx r3
return false;
fd6: 4620 mov r0, r4
fd8: e01f b.n 101a <spi_m_sync_start_read_block+0x8e>
io_write(spi_inst, &dummy, 1);
fda: 2201 movs r2, #1
fdc: f10d 0103 add.w r1, sp, #3
fe0: 9801 ldr r0, [sp, #4]
fe2: 47b0 blx r6
io_read(spi_inst, &token, 1);
fe4: 9801 ldr r0, [sp, #4]
fe6: 2201 movs r2, #1
fe8: f10d 0102 add.w r1, sp, #2
fec: 47c0 blx r8
if (SPI_TOKEN_DATA_ERROR_VALID(token)) {
fee: f89d 0002 ldrb.w r0, [sp, #2]
ff2: f010 07f0 ands.w r7, r0, #240 ; 0xf0
ff6: d115 bne.n 1024 <spi_m_sync_start_read_block+0x98>
assert(SPI_TOKEN_DATA_ERROR_ERRORS & token, ">>>");
ff8: 3800 subs r0, #0
ffa: bf18 it ne
ffc: 2001 movne r0, #1
ffe: 490f ldr r1, [pc, #60] ; (103c <spi_m_sync_start_read_block+0xb0>)
1000: 4a0f ldr r2, [pc, #60] ; (1040 <spi_m_sync_start_read_block+0xb4>)
1002: 23c9 movs r3, #201 ; 0xc9
1004: 47a8 blx r5
if (token & (SPI_TOKEN_DATA_ERROR_ERROR
1006: f89d 0002 ldrb.w r0, [sp, #2]
sd_mmc_spi_debug("%s: CRC data error token\n\r", __func__);
100a: 490f ldr r1, [pc, #60] ; (1048 <spi_m_sync_start_read_block+0xbc>)
100c: 4b10 ldr r3, [pc, #64] ; (1050 <spi_m_sync_start_read_block+0xc4>)
if (token & (SPI_TOKEN_DATA_ERROR_ERROR
100e: f010 0407 ands.w r4, r0, #7
1012: d005 beq.n 1020 <spi_m_sync_start_read_block+0x94>
sd_mmc_spi_debug("%s: CRC data error token\n\r", __func__);
1014: 480f ldr r0, [pc, #60] ; (1054 <spi_m_sync_start_read_block+0xc8>)
1016: 4798 blx r3
return false;
1018: 4638 mov r0, r7
}
101a: b002 add sp, #8
101c: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
sd_mmc_spi_debug("%s: Out of range data error token\n\r", __func__);
1020: 480d ldr r0, [pc, #52] ; (1058 <spi_m_sync_start_read_block+0xcc>)
1022: e7d7 b.n fd4 <spi_m_sync_start_read_block+0x48>
} while (token != SPI_TOKEN_SINGLE_MULTI_READ);
1024: 28fe cmp r0, #254 ; 0xfe
1026: d1d0 bne.n fca <spi_m_sync_start_read_block+0x3e>
return true;
1028: 2001 movs r0, #1
102a: e7f6 b.n 101a <spi_m_sync_start_read_block+0x8e>
102c: 00001521 .word 0x00001521
1030: 00002169 .word 0x00002169
1034: 000002a5 .word 0x000002a5
1038: 200002cc .word 0x200002cc
103c: 00002b25 .word 0x00002b25
1040: 00002cc8 .word 0x00002cc8
1044: 0007a121 .word 0x0007a121
1048: 00002f1f .word 0x00002f1f
104c: 00002cdf .word 0x00002cdf
1050: 000020d5 .word 0x000020d5
1054: 00002cf9 .word 0x00002cf9
1058: 00002d14 .word 0x00002d14
105c: 000002d5 .word 0x000002d5
00001060 <spi_m_sync_adtc_start>:
return spi_m_sync_adtc_start(spi, cmd, arg, 0, 0, false);
}
bool spi_m_sync_adtc_start(struct spi_m_sync_descriptor* spi,
uint32_t cmd, uint32_t arg, uint16_t block_size,
uint16_t nb_block, bool access_block)
{
1060: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
1064: b089 sub sp, #36 ; 0x24
1066: 460e mov r6, r1
struct io_descriptor* spi_inst = NULL;
1068: 2400 movs r4, #0
{
106a: 9302 str r3, [sp, #8]
spi_m_sync_get_io_descriptor(spi, &spi_inst);
106c: a905 add r1, sp, #20
106e: 4b66 ldr r3, [pc, #408] ; (1208 <spi_m_sync_adtc_start+0x1a8>)
struct io_descriptor* spi_inst = NULL;
1070: 9405 str r4, [sp, #20]
{
1072: 4615 mov r5, r2
1074: 4682 mov sl, r0
spi_m_sync_get_io_descriptor(spi, &spi_inst);
1076: 4798 blx r3
uint8_t dummy = 0xFF;
1078: 23ff movs r3, #255 ; 0xff
uint8_t ncr_timeout;
uint8_t r1;
uint8_t dummy2 = 0xFF;
(void)access_block;
assert(cmd & SDMMC_RESP_PRESENT, "No SD Card response was present...");
107a: 4a64 ldr r2, [pc, #400] ; (120c <spi_m_sync_adtc_start+0x1ac>)
107c: 4f64 ldr r7, [pc, #400] ; (1210 <spi_m_sync_adtc_start+0x1b0>)
uint8_t dummy = 0xFF;
107e: f88d 3011 strb.w r3, [sp, #17]
uint8_t dummy2 = 0xFF;
1082: f88d 3013 strb.w r3, [sp, #19]
assert(cmd & SDMMC_RESP_PRESENT, "No SD Card response was present...");
1086: 4963 ldr r1, [pc, #396] ; (1214 <spi_m_sync_adtc_start+0x1b4>)
1088: 23f7 movs r3, #247 ; 0xf7
108a: f3c6 2000 ubfx r0, r6, #8, #1
sd_mmc_spi_err = SD_MMC_SPI_NO_ERR;
cmd_token[0] = SPI_CMD_ENCODE(SDMMC_CMD_GET_INDEX(cmd));
108e: f006 093f and.w r9, r6, #63 ; 0x3f
assert(cmd & SDMMC_RESP_PRESENT, "No SD Card response was present...");
1092: 47b8 blx r7
cmd_token[0] = SPI_CMD_ENCODE(SDMMC_CMD_GET_INDEX(cmd));
1094: f049 0340 orr.w r3, r9, #64 ; 0x40
1098: f88d 3018 strb.w r3, [sp, #24]
cmd_token[1] = arg >> 24;
109c: 0e2b lsrs r3, r5, #24
109e: f88d 3019 strb.w r3, [sp, #25]
cmd_token[2] = arg >> 16;
10a2: 0c2b lsrs r3, r5, #16
10a4: f88d 301a strb.w r3, [sp, #26]
cmd_token[3] = arg >> 8;
cmd_token[4] = arg;
10a8: af06 add r7, sp, #24
cmd_token[3] = arg >> 8;
10aa: 0a2b lsrs r3, r5, #8
10ac: f88d 301b strb.w r3, [sp, #27]
cmd_token[4] = arg;
10b0: f88d 501c strb.w r5, [sp, #28]
crc = 0;
10b4: 4623 mov r3, r4
cmd_token[4] = arg;
10b6: 2206 movs r2, #6
10b8: 463c mov r4, r7
while (size--) {
10ba: 3a01 subs r2, #1
10bc: f012 02ff ands.w r2, r2, #255 ; 0xff
10c0: d12f bne.n 1122 <spi_m_sync_adtc_start+0xc2>
crc = (crc << 1) | 1;
10c2: 005b lsls r3, r3, #1
10c4: f043 0301 orr.w r3, r3, #1
cmd_token[5] = spi_m_sync_crc7(cmd_token, 5);
// 8 cycles to respect Ncs timing
io_write(spi_inst, &dummy, 1);
10c8: f8df 8174 ldr.w r8, [pc, #372] ; 1240 <spi_m_sync_adtc_start+0x1e0>
10cc: 9805 ldr r0, [sp, #20]
cmd_token[5] = spi_m_sync_crc7(cmd_token, 5);
10ce: f88d 301d strb.w r3, [sp, #29]
io_write(spi_inst, &dummy, 1);
10d2: 2201 movs r2, #1
10d4: f10d 0111 add.w r1, sp, #17
10d8: 47c0 blx r8
// send command
io_write(spi_inst, cmd_token, sizeof(cmd_token));
10da: 4621 mov r1, r4
10dc: 2206 movs r2, #6
10de: 9805 ldr r0, [sp, #20]
// Two retries will be done to manage the Ncr timing between command and response
// Ncr: Min. 1x8 clock cycle, Max 8x8 clock cycles
// WORKAROUND for no compliance (Atmel Internal ref. SD13)
r1 = 0xFF;
// Ignore first byte because Ncr min. = 8 clock cycles
io_read(spi_inst, &r1, 1);
10e0: 4f4d ldr r7, [pc, #308] ; (1218 <spi_m_sync_adtc_start+0x1b8>)
io_write(spi_inst, cmd_token, sizeof(cmd_token));
10e2: 47c0 blx r8
r1 = 0xFF;
10e4: 23ff movs r3, #255 ; 0xff
io_read(spi_inst, &r1, 1);
10e6: 9805 ldr r0, [sp, #20]
r1 = 0xFF;
10e8: f88d 3012 strb.w r3, [sp, #18]
io_read(spi_inst, &r1, 1);
10ec: 2201 movs r2, #1
10ee: f10d 0112 add.w r1, sp, #18
10f2: 47b8 blx r7
10f4: 2407 movs r4, #7
ncr_timeout = 7;
while(1)
{
io_read(spi_inst, &r1, 1);
10f6: 2201 movs r2, #1
10f8: 9805 ldr r0, [sp, #20]
10fa: f10d 0112 add.w r1, sp, #18
10fe: 47b8 blx r7
if((r1 & R1_SPI_ERROR) == 0)
1100: f99d 3012 ldrsb.w r3, [sp, #18]
1104: f89d 2012 ldrb.w r2, [sp, #18]
1108: 2b00 cmp r3, #0
110a: da1e bge.n 114a <spi_m_sync_adtc_start+0xea>
{
// Valid response
break;
}
if(--ncr_timeout == 0)
110c: 3c01 subs r4, #1
110e: f014 04ff ands.w r4, r4, #255 ; 0xff
1112: d1f0 bne.n 10f6 <spi_m_sync_adtc_start+0x96>
{
// Here valid r1 response received
sd_mmc_spi_debug("%s: cmd %02d, arg 0x%08lX, R1 timeout\r\n",
1114: 4941 ldr r1, [pc, #260] ; (121c <spi_m_sync_adtc_start+0x1bc>)
1116: 4842 ldr r0, [pc, #264] ; (1220 <spi_m_sync_adtc_start+0x1c0>)
1118: 462b mov r3, r5
111a: 464a mov r2, r9
// Manage other responses
if (cmd & SDMMC_RESP_BUSY) {
if (!spi_m_sync_wait_busy(spi)) {
sd_mmc_spi_err = SD_MMC_SPI_ERR_RESP_BUSY_TIMEOUT;
sd_mmc_spi_debug("%s: cmd %02d, arg 0x%08lx, Busy signal always high\n\r",
111c: 4d41 ldr r5, [pc, #260] ; (1224 <spi_m_sync_adtc_start+0x1c4>)
111e: 47a8 blx r5
__func__, (int)SDMMC_CMD_GET_INDEX(cmd), arg);
return false;
1120: e023 b.n 116a <spi_m_sync_adtc_start+0x10a>
value = *buf++;
1122: f817 0b01 ldrb.w r0, [r7], #1
1126: 2108 movs r1, #8
crc <<= 1;
1128: 005b lsls r3, r3, #1
112a: b2db uxtb r3, r3
if ((value & 0x80) ^ (crc & 0x80)) {
112c: ea83 0c00 eor.w ip, r3, r0
1130: f01c 0f80 tst.w ip, #128 ; 0x80
for (i = 0; i < 8; i++) {
1134: f101 31ff add.w r1, r1, #4294967295 ; 0xffffffff
crc ^= 0x09;
1138: bf18 it ne
113a: f083 0309 eorne.w r3, r3, #9
value <<= 1;
113e: 0040 lsls r0, r0, #1
for (i = 0; i < 8; i++) {
1140: f011 01ff ands.w r1, r1, #255 ; 0xff
value <<= 1;
1144: b2c0 uxtb r0, r0
for (i = 0; i < 8; i++) {
1146: d1ef bne.n 1128 <spi_m_sync_adtc_start+0xc8>
1148: e7b7 b.n 10ba <spi_m_sync_adtc_start+0x5a>
sd_mmc_spi_response_32 = r1;
114a: f8df b0f8 ldr.w fp, [pc, #248] ; 1244 <spi_m_sync_adtc_start+0x1e4>
if (r1 & R1_SPI_COM_CRC)
114e: f012 0308 ands.w r3, r2, #8
sd_mmc_spi_response_32 = r1;
1152: f8cb 2008 str.w r2, [fp, #8]
if (r1 & R1_SPI_COM_CRC)
1156: 9303 str r3, [sp, #12]
1158: d00b beq.n 1172 <spi_m_sync_adtc_start+0x112>
sd_mmc_spi_debug("%s: cmd %02d, arg 0x%08lx, r1 0x%02x, R1_SPI_COM_CRC\n\r",
115a: 4930 ldr r1, [pc, #192] ; (121c <spi_m_sync_adtc_start+0x1bc>)
115c: 4832 ldr r0, [pc, #200] ; (1228 <spi_m_sync_adtc_start+0x1c8>)
115e: 9200 str r2, [sp, #0]
1160: 462b mov r3, r5
1162: 464a mov r2, r9
1164: 4c2f ldr r4, [pc, #188] ; (1224 <spi_m_sync_adtc_start+0x1c4>)
1166: 47a0 blx r4
return false;
1168: 2400 movs r4, #0
sd_mmc_spi_block_size = block_size;
sd_mmc_spi_nb_block = nb_block;
sd_mmc_spi_transfert_pos = 0;
return true;
}
116a: 4620 mov r0, r4
116c: b009 add sp, #36 ; 0x24
116e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
if (r1 & R1_SPI_ILLEGAL_COMMAND)
1172: f012 0404 ands.w r4, r2, #4
1176: d005 beq.n 1184 <spi_m_sync_adtc_start+0x124>
sd_mmc_spi_debug("%s: cmd %02d, arg 0x%08lx, r1 0x%x, R1 ILLEGAL_COMMAND\n\r",
1178: 9200 str r2, [sp, #0]
117a: 4928 ldr r1, [pc, #160] ; (121c <spi_m_sync_adtc_start+0x1bc>)
117c: 482b ldr r0, [pc, #172] ; (122c <spi_m_sync_adtc_start+0x1cc>)
117e: 462b mov r3, r5
1180: 464a mov r2, r9
1182: e7ef b.n 1164 <spi_m_sync_adtc_start+0x104>
if (r1 & ~R1_SPI_IDLE) {
1184: f012 0ffe tst.w r2, #254 ; 0xfe
1188: d007 beq.n 119a <spi_m_sync_adtc_start+0x13a>
sd_mmc_spi_debug("%s: cmd %02d, arg 0x%08lx, r1 0x%x, R1 error\n\r",
118a: 9200 str r2, [sp, #0]
118c: 462b mov r3, r5
118e: 4923 ldr r1, [pc, #140] ; (121c <spi_m_sync_adtc_start+0x1bc>)
1190: 4d24 ldr r5, [pc, #144] ; (1224 <spi_m_sync_adtc_start+0x1c4>)
1192: 4827 ldr r0, [pc, #156] ; (1230 <spi_m_sync_adtc_start+0x1d0>)
1194: 464a mov r2, r9
1196: 47a8 blx r5
return false;
1198: e7e7 b.n 116a <spi_m_sync_adtc_start+0x10a>
if (cmd & SDMMC_RESP_BUSY) {
119a: 04b1 lsls r1, r6, #18
119c: d509 bpl.n 11b2 <spi_m_sync_adtc_start+0x152>
if (!spi_m_sync_wait_busy(spi)) {
119e: 4a25 ldr r2, [pc, #148] ; (1234 <spi_m_sync_adtc_start+0x1d4>)
11a0: 4650 mov r0, sl
11a2: 4790 blx r2
11a4: 4604 mov r4, r0
11a6: b920 cbnz r0, 11b2 <spi_m_sync_adtc_start+0x152>
sd_mmc_spi_debug("%s: cmd %02d, arg 0x%08lx, Busy signal always high\n\r",
11a8: 491c ldr r1, [pc, #112] ; (121c <spi_m_sync_adtc_start+0x1bc>)
11aa: 4823 ldr r0, [pc, #140] ; (1238 <spi_m_sync_adtc_start+0x1d8>)
11ac: 462b mov r3, r5
11ae: 464a mov r2, r9
11b0: e7b4 b.n 111c <spi_m_sync_adtc_start+0xbc>
if (cmd & SDMMC_RESP_8) {
11b2: 05b2 lsls r2, r6, #22
11b4: d50b bpl.n 11ce <spi_m_sync_adtc_start+0x16e>
sd_mmc_spi_response_32 = 0;
11b6: 2200 movs r2, #0
11b8: f8cb 2008 str.w r2, [fp, #8]
io_write(spi_inst, &dummy2, 1);
11bc: f10d 0113 add.w r1, sp, #19
11c0: 2201 movs r2, #1
11c2: 9805 ldr r0, [sp, #20]
11c4: 47c0 blx r8
io_read(spi_inst, (uint8_t*)&sd_mmc_spi_response_32, 1);
11c6: 491d ldr r1, [pc, #116] ; (123c <spi_m_sync_adtc_start+0x1dc>)
11c8: 9805 ldr r0, [sp, #20]
11ca: 2201 movs r2, #1
11cc: 47b8 blx r7
if (cmd & SDMMC_RESP_32) {
11ce: 0573 lsls r3, r6, #21
11d0: d50d bpl.n 11ee <spi_m_sync_adtc_start+0x18e>
io_write(spi_inst, &dummy2, 1);
11d2: 2201 movs r2, #1
11d4: f10d 0113 add.w r1, sp, #19
11d8: 9805 ldr r0, [sp, #20]
11da: 47c0 blx r8
io_read(spi_inst, (uint8_t*)&sd_mmc_spi_response_32, 4);
11dc: 2204 movs r2, #4
11de: 4917 ldr r1, [pc, #92] ; (123c <spi_m_sync_adtc_start+0x1dc>)
11e0: 9805 ldr r0, [sp, #20]
11e2: 47b8 blx r7
sd_mmc_spi_response_32 = BE32(sd_mmc_spi_response_32);
11e4: f8db 2008 ldr.w r2, [fp, #8]
11e8: ba12 rev r2, r2
11ea: f8cb 2008 str.w r2, [fp, #8]
sd_mmc_spi_nb_block = nb_block;
11ee: f8bd 2048 ldrh.w r2, [sp, #72] ; 0x48
sd_mmc_spi_block_size = block_size;
11f2: 9b02 ldr r3, [sp, #8]
sd_mmc_spi_nb_block = nb_block;
11f4: f8ab 2006 strh.w r2, [fp, #6]
sd_mmc_spi_transfert_pos = 0;
11f8: 2200 movs r2, #0
sd_mmc_spi_block_size = block_size;
11fa: f8ab 3004 strh.w r3, [fp, #4]
sd_mmc_spi_transfert_pos = 0;
11fe: f8cb 2000 str.w r2, [fp]
return true;
1202: 2401 movs r4, #1
1204: e7b1 b.n 116a <spi_m_sync_adtc_start+0x10a>
1206: bf00 nop
1208: 00001521 .word 0x00001521
120c: 00002cc8 .word 0x00002cc8
1210: 00002169 .word 0x00002169
1214: 00002de1 .word 0x00002de1
1218: 000002d5 .word 0x000002d5
121c: 00002f78 .word 0x00002f78
1220: 00002e04 .word 0x00002e04
1224: 000020d5 .word 0x000020d5
1228: 00002e2c .word 0x00002e2c
122c: 00002e63 .word 0x00002e63
1230: 00002e9c .word 0x00002e9c
1234: 00000ed1 .word 0x00000ed1
1238: 00002ecb .word 0x00002ecb
123c: 200002d4 .word 0x200002d4
1240: 000002a5 .word 0x000002a5
1244: 200002cc .word 0x200002cc
00001248 <spi_m_sync_send_cmd>:
{
1248: b513 push {r0, r1, r4, lr}
return spi_m_sync_adtc_start(spi, cmd, arg, 0, 0, false);
124a: 2300 movs r3, #0
124c: e9cd 3300 strd r3, r3, [sp]
1250: 4c01 ldr r4, [pc, #4] ; (1258 <spi_m_sync_send_cmd+0x10>)
1252: 47a0 blx r4
}
1254: b002 add sp, #8
1256: bd10 pop {r4, pc}
1258: 00001061 .word 0x00001061
0000125c <spi_m_sync_start_read_blocks>:
bool spi_m_sync_start_read_blocks(struct spi_m_sync_descriptor* spi,
void *dst, uint16_t nb_block)
{
125c: e92d 4ff7 stmdb sp!, {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
struct io_descriptor* spi_inst = NULL;
spi_m_sync_get_io_descriptor(spi, &spi_inst);
1260: 4b20 ldr r3, [pc, #128] ; (12e4 <spi_m_sync_start_read_blocks+0x88>)
uint8_t dummy = 0xFF;
sd_mmc_spi_err = SD_MMC_SPI_NO_ERR;
pos = 0;
while (nb_block--) {
assert(sd_mmc_spi_nb_block >
1262: 4d21 ldr r5, [pc, #132] ; (12e8 <spi_m_sync_start_read_blocks+0x8c>)
1264: f8df 9094 ldr.w r9, [pc, #148] ; 12fc <spi_m_sync_start_read_blocks+0xa0>
1268: f8df a094 ldr.w sl, [pc, #148] ; 1300 <spi_m_sync_start_read_blocks+0xa4>
{
126c: 4688 mov r8, r1
struct io_descriptor* spi_inst = NULL;
126e: 2600 movs r6, #0
spi_m_sync_get_io_descriptor(spi, &spi_inst);
1270: a901 add r1, sp, #4
{
1272: 4607 mov r7, r0
1274: 4614 mov r4, r2
struct io_descriptor* spi_inst = NULL;
1276: 9601 str r6, [sp, #4]
spi_m_sync_get_io_descriptor(spi, &spi_inst);
1278: 4798 blx r3
uint8_t dummy = 0xFF;
127a: 23ff movs r3, #255 ; 0xff
127c: f88d 3003 strb.w r3, [sp, #3]
while (nb_block--) {
1280: b91c cbnz r4, 128a <spi_m_sync_start_read_blocks+0x2e>
pos += sd_mmc_spi_block_size;
sd_mmc_spi_transfert_pos += sd_mmc_spi_block_size;
spi_m_sync_stop_read_block(spi);
}
return true;
1282: 2001 movs r0, #1
}
1284: b003 add sp, #12
1286: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
assert(sd_mmc_spi_nb_block >
128a: f8b5 c006 ldrh.w ip, [r5, #6]
128e: 682b ldr r3, [r5, #0]
1290: 88a8 ldrh r0, [r5, #4]
1292: fbb3 f0f0 udiv r0, r3, r0
1296: 4584 cmp ip, r0
1298: bf94 ite ls
129a: 2000 movls r0, #0
129c: 2001 movhi r0, #1
129e: f44f 73b2 mov.w r3, #356 ; 0x164
12a2: 464a mov r2, r9
12a4: 4651 mov r1, sl
12a6: f8df b05c ldr.w fp, [pc, #92] ; 1304 <spi_m_sync_start_read_blocks+0xa8>
12aa: 47d8 blx fp
if (!spi_m_sync_start_read_block(spi)) {
12ac: 4b0f ldr r3, [pc, #60] ; (12ec <spi_m_sync_start_read_blocks+0x90>)
12ae: 4638 mov r0, r7
12b0: 4798 blx r3
12b2: 3c01 subs r4, #1
12b4: b2a4 uxth r4, r4
12b6: 2800 cmp r0, #0
12b8: d0e4 beq.n 1284 <spi_m_sync_start_read_blocks+0x28>
io_write(spi_inst, &dummy, 1);
12ba: f10d 0103 add.w r1, sp, #3
12be: 9801 ldr r0, [sp, #4]
12c0: 4b0b ldr r3, [pc, #44] ; (12f0 <spi_m_sync_start_read_blocks+0x94>)
12c2: 2201 movs r2, #1
12c4: 4798 blx r3
io_read(spi_inst, &((uint8_t*)dst)[pos], sd_mmc_spi_block_size);
12c6: 88aa ldrh r2, [r5, #4]
12c8: 9801 ldr r0, [sp, #4]
12ca: 4b0a ldr r3, [pc, #40] ; (12f4 <spi_m_sync_start_read_blocks+0x98>)
12cc: eb08 0106 add.w r1, r8, r6
12d0: 4798 blx r3
pos += sd_mmc_spi_block_size;
12d2: 88aa ldrh r2, [r5, #4]
sd_mmc_spi_transfert_pos += sd_mmc_spi_block_size;
12d4: 682b ldr r3, [r5, #0]
12d6: 4413 add r3, r2
12d8: 602b str r3, [r5, #0]
spi_m_sync_stop_read_block(spi);
12da: 4638 mov r0, r7
12dc: 4b06 ldr r3, [pc, #24] ; (12f8 <spi_m_sync_start_read_blocks+0x9c>)
pos += sd_mmc_spi_block_size;
12de: 4416 add r6, r2
spi_m_sync_stop_read_block(spi);
12e0: 4798 blx r3
12e2: e7cd b.n 1280 <spi_m_sync_start_read_blocks+0x24>
12e4: 00001521 .word 0x00001521
12e8: 200002cc .word 0x200002cc
12ec: 00000f8d .word 0x00000f8d
12f0: 000002a5 .word 0x000002a5
12f4: 000002d5 .word 0x000002d5
12f8: 00000f51 .word 0x00000f51
12fc: 00002cc8 .word 0x00002cc8
1300: 00002b25 .word 0x00002b25
1304: 00002169 .word 0x00002169
00001308 <spi_m_sync_wait_end_of_read_blocks>:
}
bool spi_m_sync_wait_end_of_read_blocks(struct spi_m_sync_descriptor* spi)
{
return true;
}
1308: 2001 movs r0, #1
130a: 4770 bx lr
0000130c <spi_m_sync_read_word>:
}
return spi_m_sync_stop_multiwrite_block(spi);
}
bool spi_m_sync_read_word(struct spi_m_sync_descriptor* spi, uint32_t* value)
{
130c: b57f push {r0, r1, r2, r3, r4, r5, r6, lr}
struct io_descriptor* spi_inst = NULL;
spi_m_sync_get_io_descriptor(spi, &spi_inst);
uint8_t dummy = 0xFF;
sd_mmc_spi_err = SD_MMC_SPI_NO_ERR;
assert(sd_mmc_spi_nb_block >
130e: 4c21 ldr r4, [pc, #132] ; (1394 <spi_m_sync_read_word+0x88>)
{
1310: 9101 str r1, [sp, #4]
struct io_descriptor* spi_inst = NULL;
1312: 2300 movs r3, #0
1314: 9303 str r3, [sp, #12]
spi_m_sync_get_io_descriptor(spi, &spi_inst);
1316: a903 add r1, sp, #12
1318: 4b1f ldr r3, [pc, #124] ; (1398 <spi_m_sync_read_word+0x8c>)
{
131a: 4605 mov r5, r0
spi_m_sync_get_io_descriptor(spi, &spi_inst);
131c: 4798 blx r3
assert(sd_mmc_spi_nb_block >
131e: 88e6 ldrh r6, [r4, #6]
1320: 88a0 ldrh r0, [r4, #4]
1322: 4a1e ldr r2, [pc, #120] ; (139c <spi_m_sync_read_word+0x90>)
1324: 491e ldr r1, [pc, #120] ; (13a0 <spi_m_sync_read_word+0x94>)
uint8_t dummy = 0xFF;
1326: 23ff movs r3, #255 ; 0xff
1328: f88d 300b strb.w r3, [sp, #11]
assert(sd_mmc_spi_nb_block >
132c: 6823 ldr r3, [r4, #0]
132e: fbb3 f0f0 udiv r0, r3, r0
1332: 4286 cmp r6, r0
1334: f44f 73e7 mov.w r3, #462 ; 0x1ce
1338: 4e1a ldr r6, [pc, #104] ; (13a4 <spi_m_sync_read_word+0x98>)
133a: bf94 ite ls
133c: 2000 movls r0, #0
133e: 2001 movhi r0, #1
1340: 47b0 blx r6
(sd_mmc_spi_transfert_pos / sd_mmc_spi_block_size),
">>>");
if (!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size)) {
1342: 88a2 ldrh r2, [r4, #4]
1344: 6823 ldr r3, [r4, #0]
1346: fbb3 f1f2 udiv r1, r3, r2
134a: fb02 3311 mls r3, r2, r1, r3
134e: b1b3 cbz r3, 137e <spi_m_sync_read_word+0x72>
if (!spi_m_sync_start_read_block(spi)) {
return false;
}
}
// Read data
io_write(spi_inst, &dummy, 1);
1350: 4b15 ldr r3, [pc, #84] ; (13a8 <spi_m_sync_read_word+0x9c>)
1352: 9803 ldr r0, [sp, #12]
1354: 2201 movs r2, #1
1356: f10d 010b add.w r1, sp, #11
135a: 4798 blx r3
io_read(spi_inst, (uint8_t*)&value, 4);
135c: 2204 movs r2, #4
135e: eb0d 0102 add.w r1, sp, r2
1362: 4b12 ldr r3, [pc, #72] ; (13ac <spi_m_sync_read_word+0xa0>)
1364: 9803 ldr r0, [sp, #12]
1366: 4798 blx r3
*value = LE32(*value);
sd_mmc_spi_transfert_pos += 4;
1368: 6823 ldr r3, [r4, #0]
if (!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size)) {
136a: 88a2 ldrh r2, [r4, #4]
sd_mmc_spi_transfert_pos += 4;
136c: 3304 adds r3, #4
136e: 6023 str r3, [r4, #0]
if (!(sd_mmc_spi_transfert_pos % sd_mmc_spi_block_size)) {
1370: fbb3 f1f2 udiv r1, r3, r2
1374: fb02 3311 mls r3, r2, r1, r3
1378: b143 cbz r3, 138c <spi_m_sync_read_word+0x80>
// End of block
spi_m_sync_stop_read_block(spi);
}
return true;}
137a: 2001 movs r0, #1
137c: e004 b.n 1388 <spi_m_sync_read_word+0x7c>
if (!spi_m_sync_start_read_block(spi)) {
137e: 4b0c ldr r3, [pc, #48] ; (13b0 <spi_m_sync_read_word+0xa4>)
1380: 4628 mov r0, r5
1382: 4798 blx r3
1384: 2800 cmp r0, #0
1386: d1e3 bne.n 1350 <spi_m_sync_read_word+0x44>
return true;}
1388: b004 add sp, #16
138a: bd70 pop {r4, r5, r6, pc}
spi_m_sync_stop_read_block(spi);
138c: 4b09 ldr r3, [pc, #36] ; (13b4 <spi_m_sync_read_word+0xa8>)
138e: 4628 mov r0, r5
1390: 4798 blx r3
1392: e7f2 b.n 137a <spi_m_sync_read_word+0x6e>
1394: 200002cc .word 0x200002cc
1398: 00001521 .word 0x00001521
139c: 00002cc8 .word 0x00002cc8
13a0: 00002b25 .word 0x00002b25
13a4: 00002169 .word 0x00002169
13a8: 000002a5 .word 0x000002a5
13ac: 000002d5 .word 0x000002d5
13b0: 00000f8d .word 0x00000f8d
13b4: 00000f51 .word 0x00000f51
000013b8 <spi_m_sync_get_response>:
uint32_t spi_m_sync_get_response(struct spi_m_sync_descriptor* spi)
{
return sd_mmc_spi_response_32;
}
13b8: 4b01 ldr r3, [pc, #4] ; (13c0 <spi_m_sync_get_response+0x8>)
13ba: 6898 ldr r0, [r3, #8]
13bc: 4770 bx lr
13be: bf00 nop
13c0: 200002cc .word 0x200002cc
000013c4 <spi_m_sync_send_clock>:
void spi_m_sync_send_clock(struct spi_m_sync_descriptor* spi)
{
13c4: b537 push {r0, r1, r2, r4, r5, lr}
struct io_descriptor* spi_inst = NULL;
13c6: 2300 movs r3, #0
13c8: 9301 str r3, [sp, #4]
spi_m_sync_get_io_descriptor(spi, &spi_inst);
13ca: a901 add r1, sp, #4
13cc: 4b08 ldr r3, [pc, #32] ; (13f0 <spi_m_sync_send_clock+0x2c>)
sd_mmc_spi_err = SD_MMC_SPI_NO_ERR;
// Send 80 cycles
for(i = 0; i < 10; i++)
{
io_write(spi_inst, &dummy, 1); // 8 cycles
13ce: 4d09 ldr r5, [pc, #36] ; (13f4 <spi_m_sync_send_clock+0x30>)
spi_m_sync_get_io_descriptor(spi, &spi_inst);
13d0: 4798 blx r3
uint8_t dummy = 0xFF;
13d2: 23ff movs r3, #255 ; 0xff
13d4: f88d 3003 strb.w r3, [sp, #3]
13d8: 240a movs r4, #10
io_write(spi_inst, &dummy, 1); // 8 cycles
13da: 9801 ldr r0, [sp, #4]
13dc: 2201 movs r2, #1
13de: f10d 0103 add.w r1, sp, #3
for(i = 0; i < 10; i++)
13e2: 3c01 subs r4, #1
io_write(spi_inst, &dummy, 1); // 8 cycles
13e4: 47a8 blx r5
for(i = 0; i < 10; i++)
13e6: f014 04ff ands.w r4, r4, #255 ; 0xff
13ea: d1f6 bne.n 13da <spi_m_sync_send_clock+0x16>
}
}
13ec: b003 add sp, #12
13ee: bd30 pop {r4, r5, pc}
13f0: 00001521 .word 0x00001521
13f4: 000002a5 .word 0x000002a5
000013f8 <spi_m_sync_select_device>:
int32_t spi_m_sync_select_device(struct spi_m_sync_descriptor* spi, uint8_t slot, uint32_t clock, uint8_t bus_width, bool high_speed)
{
UNUSED(bus_width);
UNUSED(high_speed);
sd_mmc_spi_err = SD_MMC_SPI_NO_ERR;
PORT->Group[SPI_CS_PORT].OUT.reg &= ~(1 << SPI_CS_PIN);
13f8: 4a04 ldr r2, [pc, #16] ; (140c <spi_m_sync_select_device+0x14>)
13fa: f8d2 3090 ldr.w r3, [r2, #144] ; 0x90
13fe: f023 5380 bic.w r3, r3, #268435456 ; 0x10000000
1402: f8c2 3090 str.w r3, [r2, #144] ; 0x90
return 0;
}
1406: 2000 movs r0, #0
1408: 4770 bx lr
140a: bf00 nop
140c: 41008000 .word 0x41008000
00001410 <spi_m_sync_deselect_device>:
int32_t spi_m_sync_deselect_device(struct spi_m_sync_descriptor* spi, uint8_t slot)
{
sd_mmc_spi_err = SD_MMC_SPI_NO_ERR;
PORT->Group[1].OUT.reg |= (1 << SPI_CS_PIN);
1410: 4a04 ldr r2, [pc, #16] ; (1424 <spi_m_sync_deselect_device+0x14>)
1412: f8d2 3090 ldr.w r3, [r2, #144] ; 0x90
1416: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000
141a: f8c2 3090 str.w r3, [r2, #144] ; 0x90
return 0;
}
141e: 2000 movs r0, #0
1420: 4770 bx lr
1422: bf00 nop
1424: 41008000 .word 0x41008000
00001428 <spi_m_sync_init>:
ASSERT(spi);
spi->func = (struct _spi_m_sync_hpl_interface *)func;
}
int32_t spi_m_sync_init(struct spi_m_sync_descriptor *spi, void *const hw)
{
1428: b538 push {r3, r4, r5, lr}
142a: 460d mov r5, r1
int32_t rc = 0;
ASSERT(spi && hw);
142c: 4604 mov r4, r0
142e: b110 cbz r0, 1436 <spi_m_sync_init+0xe>
1430: 1e08 subs r0, r1, #0
1432: bf18 it ne
1434: 2001 movne r0, #1
1436: 490a ldr r1, [pc, #40] ; (1460 <spi_m_sync_init+0x38>)
1438: 4b0a ldr r3, [pc, #40] ; (1464 <spi_m_sync_init+0x3c>)
143a: 2240 movs r2, #64 ; 0x40
143c: 4798 blx r3
spi->dev.prvt = (void *)hw;
143e: 4620 mov r0, r4
rc = _spi_m_sync_init(&spi->dev, hw);
1440: 4b09 ldr r3, [pc, #36] ; (1468 <spi_m_sync_init+0x40>)
spi->dev.prvt = (void *)hw;
1442: f840 5f04 str.w r5, [r0, #4]!
rc = _spi_m_sync_init(&spi->dev, hw);
1446: 4629 mov r1, r5
1448: 4798 blx r3
if (rc < 0) {
144a: 2800 cmp r0, #0
144c: db07 blt.n 145e <spi_m_sync_init+0x36>
return rc;
}
spi->flags = SPI_DEACTIVATE_NEXT;
144e: f44f 4300 mov.w r3, #32768 ; 0x8000
1452: 82a3 strh r3, [r4, #20]
spi->io.read = _spi_m_sync_io_read;
1454: 4b05 ldr r3, [pc, #20] ; (146c <spi_m_sync_init+0x44>)
1456: 6123 str r3, [r4, #16]
spi->io.write = _spi_m_sync_io_write;
1458: 4b05 ldr r3, [pc, #20] ; (1470 <spi_m_sync_init+0x48>)
145a: 60e3 str r3, [r4, #12]
return ERR_NONE;
145c: 2000 movs r0, #0
}
145e: bd38 pop {r3, r4, r5, pc}
1460: 00002fe6 .word 0x00002fe6
1464: 00001605 .word 0x00001605
1468: 00001ea5 .word 0x00001ea5
146c: 000014e9 .word 0x000014e9
1470: 000014b1 .word 0x000014b1
00001474 <spi_m_sync_transfer>:
return spi_m_sync_transfer(spi, &xfer);
}
int32_t spi_m_sync_transfer(struct spi_m_sync_descriptor *spi, const struct spi_xfer *p_xfer)
{
1474: b530 push {r4, r5, lr}
1476: 460c mov r4, r1
1478: b085 sub sp, #20
struct spi_msg msg;
ASSERT(spi && p_xfer);
147a: 4605 mov r5, r0
147c: b110 cbz r0, 1484 <spi_m_sync_transfer+0x10>
147e: 1e08 subs r0, r1, #0
1480: bf18 it ne
1482: 2001 movne r0, #1
1484: 22b3 movs r2, #179 ; 0xb3
1486: 4907 ldr r1, [pc, #28] ; (14a4 <spi_m_sync_transfer+0x30>)
1488: 4b07 ldr r3, [pc, #28] ; (14a8 <spi_m_sync_transfer+0x34>)
148a: 4798 blx r3
msg.txbuf = p_xfer->txbuf;
148c: 6823 ldr r3, [r4, #0]
148e: 9301 str r3, [sp, #4]
msg.rxbuf = p_xfer->rxbuf;
1490: 6863 ldr r3, [r4, #4]
1492: 9302 str r3, [sp, #8]
msg.size = p_xfer->size;
1494: 68a3 ldr r3, [r4, #8]
1496: 9303 str r3, [sp, #12]
return _spi_m_sync_trans(&spi->dev, &msg);
1498: a901 add r1, sp, #4
149a: 4b04 ldr r3, [pc, #16] ; (14ac <spi_m_sync_transfer+0x38>)
149c: 1d28 adds r0, r5, #4
149e: 4798 blx r3
}
14a0: b005 add sp, #20
14a2: bd30 pop {r4, r5, pc}
14a4: 00002fe6 .word 0x00002fe6
14a8: 00001605 .word 0x00001605
14ac: 00001fd9 .word 0x00001fd9
000014b0 <_spi_m_sync_io_write>:
{
14b0: b57f push {r0, r1, r2, r3, r4, r5, r6, lr}
ASSERT(io);
14b2: 4604 mov r4, r0
14b4: 3800 subs r0, #0
14b6: bf18 it ne
14b8: 2001 movne r0, #1
{
14ba: 460e mov r6, r1
14bc: 4615 mov r5, r2
ASSERT(io);
14be: 4907 ldr r1, [pc, #28] ; (14dc <_spi_m_sync_io_write+0x2c>)
14c0: 4b07 ldr r3, [pc, #28] ; (14e0 <_spi_m_sync_io_write+0x30>)
14c2: 22a3 movs r2, #163 ; 0xa3
14c4: 4798 blx r3
xfer.rxbuf = 0;
14c6: 2300 movs r3, #0
xfer.txbuf = (uint8_t *)buf;
14c8: e9cd 6301 strd r6, r3, [sp, #4]
return spi_m_sync_transfer(spi, &xfer);
14cc: a901 add r1, sp, #4
14ce: 4b05 ldr r3, [pc, #20] ; (14e4 <_spi_m_sync_io_write+0x34>)
xfer.size = length;
14d0: 9503 str r5, [sp, #12]
return spi_m_sync_transfer(spi, &xfer);
14d2: f1a4 000c sub.w r0, r4, #12
14d6: 4798 blx r3
}
14d8: b004 add sp, #16
14da: bd70 pop {r4, r5, r6, pc}
14dc: 00002fe6 .word 0x00002fe6
14e0: 00001605 .word 0x00001605
14e4: 00001475 .word 0x00001475
000014e8 <_spi_m_sync_io_read>:
{
14e8: b57f push {r0, r1, r2, r3, r4, r5, r6, lr}
ASSERT(io);
14ea: 4604 mov r4, r0
14ec: 3800 subs r0, #0
14ee: bf18 it ne
14f0: 2001 movne r0, #1
{
14f2: 460e mov r6, r1
14f4: 4615 mov r5, r2
ASSERT(io);
14f6: 4907 ldr r1, [pc, #28] ; (1514 <_spi_m_sync_io_read+0x2c>)
14f8: 4b07 ldr r3, [pc, #28] ; (1518 <_spi_m_sync_io_read+0x30>)
14fa: 2287 movs r2, #135 ; 0x87
14fc: 4798 blx r3
xfer.txbuf = 0;
14fe: 2300 movs r3, #0
1500: 9301 str r3, [sp, #4]
return spi_m_sync_transfer(spi, &xfer);
1502: a901 add r1, sp, #4
1504: 4b05 ldr r3, [pc, #20] ; (151c <_spi_m_sync_io_read+0x34>)
xfer.rxbuf = buf;
1506: 9602 str r6, [sp, #8]
return spi_m_sync_transfer(spi, &xfer);
1508: f1a4 000c sub.w r0, r4, #12
xfer.size = length;
150c: 9503 str r5, [sp, #12]
return spi_m_sync_transfer(spi, &xfer);
150e: 4798 blx r3
}
1510: b004 add sp, #16
1512: bd70 pop {r4, r5, r6, pc}
1514: 00002fe6 .word 0x00002fe6
1518: 00001605 .word 0x00001605
151c: 00001475 .word 0x00001475
00001520 <spi_m_sync_get_io_descriptor>:
int32_t spi_m_sync_get_io_descriptor(struct spi_m_sync_descriptor *const spi, struct io_descriptor **io)
{
1520: b538 push {r3, r4, r5, lr}
1522: 460d mov r5, r1
ASSERT(spi && io);
1524: 4604 mov r4, r0
1526: b110 cbz r0, 152e <spi_m_sync_get_io_descriptor+0xe>
1528: 1e08 subs r0, r1, #0
152a: bf18 it ne
152c: 2001 movne r0, #1
152e: 4904 ldr r1, [pc, #16] ; (1540 <spi_m_sync_get_io_descriptor+0x20>)
1530: 4b04 ldr r3, [pc, #16] ; (1544 <spi_m_sync_get_io_descriptor+0x24>)
1532: 22bd movs r2, #189 ; 0xbd
*io = &spi->io;
1534: 340c adds r4, #12
ASSERT(spi && io);
1536: 4798 blx r3
*io = &spi->io;
1538: 602c str r4, [r5, #0]
return 0;
}
153a: 2000 movs r0, #0
153c: bd38 pop {r3, r4, r5, pc}
153e: bf00 nop
1540: 00002fe6 .word 0x00002fe6
1544: 00001605 .word 0x00001605
00001548 <mci_sync_init>:
/**
* \brief Initialize MCI low level driver.
*/
int32_t mci_sync_init(struct mci_sync_desc *mci, void *hw)
{
1548: b570 push {r4, r5, r6, lr}
154a: 460d mov r5, r1
ASSERT(mci && hw);
154c: 4604 mov r4, r0
154e: b110 cbz r0, 1556 <mci_sync_init+0xe>
1550: 1e08 subs r0, r1, #0
1552: bf18 it ne
1554: 2001 movne r0, #1
1556: 4905 ldr r1, [pc, #20] ; (156c <mci_sync_init+0x24>)
1558: 4b05 ldr r3, [pc, #20] ; (1570 <mci_sync_init+0x28>)
155a: 2231 movs r2, #49 ; 0x31
155c: 4798 blx r3
return _mci_sync_init(&mci->device, hw);
155e: 4629 mov r1, r5
1560: 4620 mov r0, r4
1562: 4b04 ldr r3, [pc, #16] ; (1574 <mci_sync_init+0x2c>)
}
1564: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
return _mci_sync_init(&mci->device, hw);
1568: 4718 bx r3
156a: bf00 nop
156c: 00003002 .word 0x00003002
1570: 00001605 .word 0x00001605
1574: 00001649 .word 0x00001649
00001578 <delay_init>:
/**
* \brief Initialize Delay driver
*/
void delay_init(void *const hw)
{
_delay_init(hardware = hw);
1578: 4b01 ldr r3, [pc, #4] ; (1580 <delay_init+0x8>)
157a: 6018 str r0, [r3, #0]
157c: 4b01 ldr r3, [pc, #4] ; (1584 <delay_init+0xc>)
157e: 4718 bx r3
1580: 200002d8 .word 0x200002d8
1584: 00000305 .word 0x00000305
00001588 <_init_chip>:
}
static inline void hri_nvmctrl_set_CTRLA_RWS_bf(const void *const hw, hri_nvmctrl_ctrla_reg_t mask)
{
NVMCTRL_CRITICAL_SECTION_ENTER();
((Nvmctrl *)hw)->CTRLA.reg |= NVMCTRL_CTRLA_RWS(mask);
1588: 4a0a ldr r2, [pc, #40] ; (15b4 <_init_chip+0x2c>)
158a: 8813 ldrh r3, [r2, #0]
158c: b29b uxth r3, r3
/**
* \brief Initialize the hardware abstraction layer
*/
void _init_chip(void)
{
158e: b510 push {r4, lr}
1590: f443 63a0 orr.w r3, r3, #1280 ; 0x500
1594: 8013 strh r3, [r2, #0]
hri_nvmctrl_set_CTRLA_RWS_bf(NVMCTRL, CONF_NVM_WAIT_STATE);
_osc32kctrl_init_sources();
1596: 4b08 ldr r3, [pc, #32] ; (15b8 <_init_chip+0x30>)
1598: 4798 blx r3
_oscctrl_init_sources();
159a: 4b08 ldr r3, [pc, #32] ; (15bc <_init_chip+0x34>)
159c: 4798 blx r3
_mclk_init();
159e: 4b08 ldr r3, [pc, #32] ; (15c0 <_init_chip+0x38>)
15a0: 4798 blx r3
#if _GCLK_INIT_1ST
_gclk_init_generators_by_fref(_GCLK_INIT_1ST);
#endif
_oscctrl_init_referenced_generators();
15a2: 4b08 ldr r3, [pc, #32] ; (15c4 <_init_chip+0x3c>)
15a4: 4798 blx r3
#endif
#if CONF_CMCC_ENABLE
cache_init();
#endif
}
15a6: e8bd 4010 ldmia.w sp!, {r4, lr}
_gclk_init_generators_by_fref(_GCLK_INIT_LAST);
15aa: 4b07 ldr r3, [pc, #28] ; (15c8 <_init_chip+0x40>)
15ac: f640 70ff movw r0, #4095 ; 0xfff
15b0: 4718 bx r3
15b2: bf00 nop
15b4: 41004000 .word 0x41004000
15b8: 00001911 .word 0x00001911
15bc: 0000160b .word 0x0000160b
15c0: 0000180d .word 0x0000180d
15c4: 0000160d .word 0x0000160d
15c8: 000015cd .word 0x000015cd
000015cc <_gclk_init_generators_by_fref>:
void _gclk_init_generators_by_fref(uint32_t bm)
{
#if CONF_GCLK_GENERATOR_0_CONFIG == 1
if (bm & (1ul << 0)) {
15cc: 07c2 lsls r2, r0, #31
15ce: d507 bpl.n 15e0 <_gclk_init_generators_by_fref+0x14>
}
static inline void hri_gclk_write_GENCTRL_reg(const void *const hw, uint8_t index, hri_gclk_genctrl_reg_t data)
{
GCLK_CRITICAL_SECTION_ENTER();
((Gclk *)hw)->GENCTRL[index].reg = data;
15d0: 4b09 ldr r3, [pc, #36] ; (15f8 <_gclk_init_generators_by_fref+0x2c>)
15d2: 4a0a ldr r2, [pc, #40] ; (15fc <_gclk_init_generators_by_fref+0x30>)
15d4: 621a str r2, [r3, #32]
while (((Gclk *)hw)->SYNCBUSY.reg & reg) {
15d6: f643 72fd movw r2, #16381 ; 0x3ffd
15da: 6859 ldr r1, [r3, #4]
15dc: 4211 tst r1, r2
15de: d1fc bne.n 15da <_gclk_init_generators_by_fref+0xe>
| (CONF_GCLK_GENERATOR_2_CONFIG << GCLK_GENCTRL_GENEN_Pos) | CONF_GCLK_GEN_2_SOURCE);
}
#endif
#if CONF_GCLK_GENERATOR_3_CONFIG == 1
if (bm & (1ul << 3)) {
15e0: 0703 lsls r3, r0, #28
15e2: d507 bpl.n 15f4 <_gclk_init_generators_by_fref+0x28>
((Gclk *)hw)->GENCTRL[index].reg = data;
15e4: 4b04 ldr r3, [pc, #16] ; (15f8 <_gclk_init_generators_by_fref+0x2c>)
15e6: 4a06 ldr r2, [pc, #24] ; (1600 <_gclk_init_generators_by_fref+0x34>)
15e8: 62da str r2, [r3, #44] ; 0x2c
while (((Gclk *)hw)->SYNCBUSY.reg & reg) {
15ea: f643 72fd movw r2, #16381 ; 0x3ffd
15ee: 6859 ldr r1, [r3, #4]
15f0: 4211 tst r1, r2
15f2: d1fc bne.n 15ee <_gclk_init_generators_by_fref+0x22>
| (CONF_GCLK_GEN_11_DIVSEL << GCLK_GENCTRL_DIVSEL_Pos) | (CONF_GCLK_GEN_11_OE << GCLK_GENCTRL_OE_Pos)
| (CONF_GCLK_GEN_11_OOV << GCLK_GENCTRL_OOV_Pos) | (CONF_GCLK_GEN_11_IDC << GCLK_GENCTRL_IDC_Pos)
| (CONF_GCLK_GENERATOR_11_CONFIG << GCLK_GENCTRL_GENEN_Pos) | CONF_GCLK_GEN_11_SOURCE);
}
#endif
}
15f4: 4770 bx lr
15f6: bf00 nop
15f8: 40001c00 .word 0x40001c00
15fc: 00010107 .word 0x00010107
1600: 00010105 .word 0x00010105
00001604 <assert>:
/**
* \brief Assert function
*/
void assert(const bool condition, const char *const file, const int line)
{
if (!(condition)) {
1604: b900 cbnz r0, 1608 <assert+0x4>
__asm("BKPT #0");
1606: be00 bkpt 0x0000
}
(void)file;
(void)line;
}
1608: 4770 bx lr
0000160a <_oscctrl_init_sources>:
hri_oscctrl_set_XOSCCTRL_ONDEMAND_bit(hw, 1);
#endif
#endif
(void)hw;
}
160a: 4770 bx lr
0000160c <_oscctrl_init_referenced_generators>:
static inline void hri_oscctrl_write_DPLLRATIO_reg(const void *const hw, uint8_t submodule_index,
hri_oscctrl_dpllratio_reg_t data)
{
OSCCTRL_CRITICAL_SECTION_ENTER();
((Oscctrl *)hw)->Dpll[submodule_index].DPLLRATIO.reg = data;
160c: 4b0c ldr r3, [pc, #48] ; (1640 <_oscctrl_init_referenced_generators+0x34>)
160e: 4a0d ldr r2, [pc, #52] ; (1644 <_oscctrl_init_referenced_generators+0x38>)
1610: 635a str r2, [r3, #52] ; 0x34
while (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSYNCBUSY.reg & reg) {
1612: 6bda ldr r2, [r3, #60] ; 0x3c
1614: f012 0f06 tst.w r2, #6
1618: d1fb bne.n 1612 <_oscctrl_init_referenced_generators+0x6>
static inline void hri_oscctrl_write_DPLLCTRLB_reg(const void *const hw, uint8_t submodule_index,
hri_oscctrl_dpllctrlb_reg_t data)
{
OSCCTRL_CRITICAL_SECTION_ENTER();
((Oscctrl *)hw)->Dpll[submodule_index].DPLLCTRLB.reg = data;
161a: f44f 6202 mov.w r2, #2080 ; 0x820
161e: 639a str r2, [r3, #56] ; 0x38
((Oscctrl *)hw)->Dpll[submodule_index].DPLLCTRLA.reg = data;
1620: 2202 movs r2, #2
1622: f883 2030 strb.w r2, [r3, #48] ; 0x30
while (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSYNCBUSY.reg & reg) {
1626: 4a06 ldr r2, [pc, #24] ; (1640 <_oscctrl_init_referenced_generators+0x34>)
1628: 6bd3 ldr r3, [r2, #60] ; 0x3c
162a: 0798 lsls r0, r3, #30
162c: d4fc bmi.n 1628 <_oscctrl_init_referenced_generators+0x1c>
return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_LOCK)
162e: 4b04 ldr r3, [pc, #16] ; (1640 <_oscctrl_init_referenced_generators+0x34>)
1630: 6c1a ldr r2, [r3, #64] ; 0x40
#endif
#endif
#if CONF_FDPLL0_CONFIG == 1
#if CONF_FDPLL0_ENABLE == 1
while (!(hri_oscctrl_get_DPLLSTATUS_LOCK_bit(hw, 0) || hri_oscctrl_get_DPLLSTATUS_CLKRDY_bit(hw, 0)))
1632: 07d1 lsls r1, r2, #31
1634: d402 bmi.n 163c <_oscctrl_init_referenced_generators+0x30>
return (((Oscctrl *)hw)->Dpll[submodule_index].DPLLSTATUS.reg & OSCCTRL_DPLLSTATUS_CLKRDY)
1636: 6c1a ldr r2, [r3, #64] ; 0x40
1638: 0792 lsls r2, r2, #30
163a: d5f9 bpl.n 1630 <_oscctrl_init_referenced_generators+0x24>
hri_gclk_write_GENCTRL_SRC_bf(GCLK, 0, CONF_GCLK_GEN_0_SOURCE);
while (hri_gclk_get_SYNCBUSY_GENCTRL0_bit(GCLK))
;
#endif
(void)hw;
}
163c: 4770 bx lr
163e: bf00 nop
1640: 40001000 .word 0x40001000
1644: 00010e4d .word 0x00010e4d
00001648 <_mci_sync_init>:
/**
* \brief Initialize MCI low level driver.
*/
int32_t _mci_sync_init(struct _mci_sync_device *const mci_dev, void *const hw)
{
1648: b538 push {r3, r4, r5, lr}
164a: 460c mov r4, r1
ASSERT(mci_dev && hw);
164c: 4605 mov r5, r0
164e: b110 cbz r0, 1656 <_mci_sync_init+0xe>
1650: 1e08 subs r0, r1, #0
1652: bf18 it ne
1654: 2001 movne r0, #1
1656: 4b12 ldr r3, [pc, #72] ; (16a0 <_mci_sync_init+0x58>)
1658: 4912 ldr r1, [pc, #72] ; (16a4 <_mci_sync_init+0x5c>)
165a: 22d8 movs r2, #216 ; 0xd8
165c: 4798 blx r3
}
static inline void hri_sdhc_set_SRR_SWRSTALL_bit(const void *const hw)
{
SDHC_CRITICAL_SECTION_ENTER();
((Sdhc *)hw)->SRR.reg |= SDHC_SRR_SWRSTALL;
165e: f894 302f ldrb.w r3, [r4, #47] ; 0x2f
mci_dev->hw = hw;
1662: 602c str r4, [r5, #0]
1664: f043 0301 orr.w r3, r3, #1
1668: f884 302f strb.w r3, [r4, #47] ; 0x2f
}
static inline bool hri_sdhc_get_SRR_SWRSTALL_bit(const void *const hw)
{
uint8_t tmp;
tmp = ((Sdhc *)hw)->SRR.reg;
166c: f894 002f ldrb.w r0, [r4, #47] ; 0x2f
hri_sdhc_set_SRR_SWRSTALL_bit(hw);
while (hri_sdhc_get_SRR_SWRSTALL_bit(hw))
1670: f010 0001 ands.w r0, r0, #1
1674: d1fa bne.n 166c <_mci_sync_init+0x24>
((Sdhc *)hw)->TCR.reg = data;
1676: 230e movs r3, #14
1678: f884 302e strb.w r3, [r4, #46] ; 0x2e
((Sdhc *)hw)->PCR.reg = data;
167c: 230f movs r3, #15
167e: f884 3029 strb.w r3, [r4, #41] ; 0x29
}
static inline void hri_sdhc_set_NISTER_reg(const void *const hw, hri_sdhc_nister_reg_t mask)
{
SDHC_CRITICAL_SECTION_ENTER();
((Sdhc *)hw)->NISTER.reg |= mask;
1682: 8ea3 ldrh r3, [r4, #52] ; 0x34
1684: b29b uxth r3, r3
1686: ea6f 2353 mvn.w r3, r3, lsr #9
168a: ea6f 2343 mvn.w r3, r3, lsl #9
168e: 86a3 strh r3, [r4, #52] ; 0x34
}
static inline void hri_sdhc_set_EISTER_reg(const void *const hw, hri_sdhc_eister_reg_t mask)
{
SDHC_CRITICAL_SECTION_ENTER();
((Sdhc *)hw)->EISTER.reg |= mask;
1690: 8ee3 ldrh r3, [r4, #54] ; 0x36
1692: b29b uxth r3, r3
1694: ea6f 2393 mvn.w r3, r3, lsr #10
1698: ea6f 2383 mvn.w r3, r3, lsl #10
169c: 86e3 strh r3, [r4, #54] ; 0x36
hri_sdhc_set_NISTER_reg(hw, SDHC_NISTER_MASK);
hri_sdhc_set_EISTER_reg(hw, SDHC_EISTER_MASK);
return ERR_NONE;
}
169e: bd38 pop {r3, r4, r5, pc}
16a0: 00001605 .word 0x00001605
16a4: 0000301c .word 0x0000301c
000016a8 <usart_sync_write>:
* \param[in] length The number of bytes to write
*
* \return The number of bytes written.
*/
static int32_t usart_sync_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length)
{
16a8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
16ac: 460e mov r6, r1
16ae: 4615 mov r5, r2
uint32_t offset = 0;
struct usart_sync_descriptor *descr = CONTAINER_OF(io_descr, struct usart_sync_descriptor, io);
ASSERT(io_descr && buf && length);
16b0: 4604 mov r4, r0
16b2: b118 cbz r0, 16bc <usart_sync_write+0x14>
16b4: b329 cbz r1, 1702 <usart_sync_write+0x5a>
16b6: 1e10 subs r0, r2, #0
16b8: bf18 it ne
16ba: 2001 movne r0, #1
16bc: 4912 ldr r1, [pc, #72] ; (1708 <usart_sync_write+0x60>)
16be: 4b13 ldr r3, [pc, #76] ; (170c <usart_sync_write+0x64>)
while (!_usart_sync_is_ready_to_send(&descr->device))
16c0: 4f13 ldr r7, [pc, #76] ; (1710 <usart_sync_write+0x68>)
ASSERT(io_descr && buf && length);
16c2: 22f1 movs r2, #241 ; 0xf1
16c4: 4798 blx r3
while (!_usart_sync_is_ready_to_send(&descr->device))
16c6: 3408 adds r4, #8
16c8: 46b9 mov r9, r7
16ca: 4620 mov r0, r4
16cc: 47b8 blx r7
16ce: 2800 cmp r0, #0
16d0: d0fb beq.n 16ca <usart_sync_write+0x22>
;
do {
_usart_sync_write_byte(&descr->device, buf[offset]);
16d2: f8df 8044 ldr.w r8, [pc, #68] ; 1718 <usart_sync_write+0x70>
uint32_t offset = 0;
16d6: 2700 movs r7, #0
_usart_sync_write_byte(&descr->device, buf[offset]);
16d8: 5df1 ldrb r1, [r6, r7]
16da: 4620 mov r0, r4
16dc: 47c0 blx r8
while (!_usart_sync_is_ready_to_send(&descr->device))
16de: 4620 mov r0, r4
16e0: 47c8 blx r9
16e2: 2800 cmp r0, #0
16e4: d0fb beq.n 16de <usart_sync_write+0x36>
;
} while (++offset < length);
16e6: 3701 adds r7, #1
16e8: 42bd cmp r5, r7
16ea: d8f5 bhi.n 16d8 <usart_sync_write+0x30>
16ec: 2d00 cmp r5, #0
while (!_usart_sync_is_transmit_done(&descr->device))
16ee: 4e09 ldr r6, [pc, #36] ; (1714 <usart_sync_write+0x6c>)
} while (++offset < length);
16f0: bf08 it eq
16f2: 2501 moveq r5, #1
while (!_usart_sync_is_transmit_done(&descr->device))
16f4: 4620 mov r0, r4
16f6: 47b0 blx r6
16f8: 2800 cmp r0, #0
16fa: d0fb beq.n 16f4 <usart_sync_write+0x4c>
;
return (int32_t)offset;
}
16fc: 4628 mov r0, r5
16fe: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
ASSERT(io_descr && buf && length);
1702: 4608 mov r0, r1
1704: e7da b.n 16bc <usart_sync_write+0x14>
1706: bf00 nop
1708: 00003033 .word 0x00003033
170c: 00001605 .word 0x00001605
1710: 00001e87 .word 0x00001e87
1714: 00001e91 .word 0x00001e91
1718: 00001e79 .word 0x00001e79
0000171c <usart_sync_read>:
* \param[in] length The size of a buffer
*
* \return The number of bytes read.
*/
static int32_t usart_sync_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length)
{
171c: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
1720: 460e mov r6, r1
1722: 4615 mov r5, r2
uint32_t offset = 0;
struct usart_sync_descriptor *descr = CONTAINER_OF(io_descr, struct usart_sync_descriptor, io);
ASSERT(io_descr && buf && length);
1724: 4604 mov r4, r0
1726: b118 cbz r0, 1730 <usart_sync_read+0x14>
1728: b1e9 cbz r1, 1766 <usart_sync_read+0x4a>
172a: 1e10 subs r0, r2, #0
172c: bf18 it ne
172e: 2001 movne r0, #1
1730: 490e ldr r1, [pc, #56] ; (176c <usart_sync_read+0x50>)
1732: 4b0f ldr r3, [pc, #60] ; (1770 <usart_sync_read+0x54>)
do {
while (!_usart_sync_is_byte_received(&descr->device))
1734: f8df 903c ldr.w r9, [pc, #60] ; 1774 <usart_sync_read+0x58>
;
buf[offset] = _usart_sync_read_byte(&descr->device);
1738: f8df 803c ldr.w r8, [pc, #60] ; 1778 <usart_sync_read+0x5c>
ASSERT(io_descr && buf && length);
173c: f44f 7286 mov.w r2, #268 ; 0x10c
1740: 4798 blx r3
uint32_t offset = 0;
1742: 2700 movs r7, #0
while (!_usart_sync_is_byte_received(&descr->device))
1744: 3408 adds r4, #8
1746: 4620 mov r0, r4
1748: 47c8 blx r9
174a: 2800 cmp r0, #0
174c: d0fb beq.n 1746 <usart_sync_read+0x2a>
buf[offset] = _usart_sync_read_byte(&descr->device);
174e: 4620 mov r0, r4
1750: 47c0 blx r8
1752: 55f0 strb r0, [r6, r7]
} while (++offset < length);
1754: 3701 adds r7, #1
1756: 42bd cmp r5, r7
1758: d8f5 bhi.n 1746 <usart_sync_read+0x2a>
175a: 2d00 cmp r5, #0
return (int32_t)offset;
}
175c: bf14 ite ne
175e: 4628 movne r0, r5
1760: 2001 moveq r0, #1
1762: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
ASSERT(io_descr && buf && length);
1766: 4608 mov r0, r1
1768: e7e2 b.n 1730 <usart_sync_read+0x14>
176a: bf00 nop
176c: 00003033 .word 0x00003033
1770: 00001605 .word 0x00001605
1774: 00001e9b .word 0x00001e9b
1778: 00001e7f .word 0x00001e7f
0000177c <usart_sync_init>:
{
177c: b538 push {r3, r4, r5, lr}
177e: 460d mov r5, r1
ASSERT(descr && hw);
1780: 4604 mov r4, r0
1782: b110 cbz r0, 178a <usart_sync_init+0xe>
1784: 1e08 subs r0, r1, #0
1786: bf18 it ne
1788: 2001 movne r0, #1
178a: 4907 ldr r1, [pc, #28] ; (17a8 <usart_sync_init+0x2c>)
178c: 4b07 ldr r3, [pc, #28] ; (17ac <usart_sync_init+0x30>)
178e: 2234 movs r2, #52 ; 0x34
1790: 4798 blx r3
init_status = _usart_sync_init(&descr->device, hw);
1792: 4b07 ldr r3, [pc, #28] ; (17b0 <usart_sync_init+0x34>)
1794: 4629 mov r1, r5
1796: f104 0008 add.w r0, r4, #8
179a: 4798 blx r3
if (init_status) {
179c: b918 cbnz r0, 17a6 <usart_sync_init+0x2a>
descr->io.read = usart_sync_read;
179e: 4b05 ldr r3, [pc, #20] ; (17b4 <usart_sync_init+0x38>)
17a0: 6063 str r3, [r4, #4]
descr->io.write = usart_sync_write;
17a2: 4b05 ldr r3, [pc, #20] ; (17b8 <usart_sync_init+0x3c>)
17a4: 6023 str r3, [r4, #0]
}
17a6: bd38 pop {r3, r4, r5, pc}
17a8: 00003033 .word 0x00003033
17ac: 00001605 .word 0x00001605
17b0: 00001e39 .word 0x00001e39
17b4: 0000171d .word 0x0000171d
17b8: 000016a9 .word 0x000016a9
000017bc <usart_sync_enable>:
{
17bc: b510 push {r4, lr}
ASSERT(descr);
17be: 4604 mov r4, r0
17c0: 3800 subs r0, #0
17c2: bf18 it ne
17c4: 2001 movne r0, #1
17c6: 4905 ldr r1, [pc, #20] ; (17dc <usart_sync_enable+0x20>)
17c8: 4b05 ldr r3, [pc, #20] ; (17e0 <usart_sync_enable+0x24>)
17ca: 2253 movs r2, #83 ; 0x53
17cc: 4798 blx r3
_usart_sync_enable(&descr->device);
17ce: f104 0008 add.w r0, r4, #8
17d2: 4b04 ldr r3, [pc, #16] ; (17e4 <usart_sync_enable+0x28>)
17d4: 4798 blx r3
}
17d6: 2000 movs r0, #0
17d8: bd10 pop {r4, pc}
17da: bf00 nop
17dc: 00003033 .word 0x00003033
17e0: 00001605 .word 0x00001605
17e4: 00001e65 .word 0x00001e65
000017e8 <usart_sync_get_io_descriptor>:
{
17e8: b538 push {r3, r4, r5, lr}
17ea: 460d mov r5, r1
ASSERT(descr && io);
17ec: 4604 mov r4, r0
17ee: b110 cbz r0, 17f6 <usart_sync_get_io_descriptor+0xe>
17f0: 1e08 subs r0, r1, #0
17f2: bf18 it ne
17f4: 2001 movne r0, #1
17f6: 4903 ldr r1, [pc, #12] ; (1804 <usart_sync_get_io_descriptor+0x1c>)
17f8: 4b03 ldr r3, [pc, #12] ; (1808 <usart_sync_get_io_descriptor+0x20>)
17fa: 2269 movs r2, #105 ; 0x69
17fc: 4798 blx r3
*io = &descr->io;
17fe: 602c str r4, [r5, #0]
}
1800: 2000 movs r0, #0
1802: bd38 pop {r3, r4, r5, pc}
1804: 00003033 .word 0x00003033
1808: 00001605 .word 0x00001605
0000180c <_mclk_init>:
}
static inline void hri_mclk_write_CPUDIV_reg(const void *const hw, hri_mclk_cpudiv_reg_t data)
{
MCLK_CRITICAL_SECTION_ENTER();
((Mclk *)hw)->CPUDIV.reg = data;
180c: 4b01 ldr r3, [pc, #4] ; (1814 <_mclk_init+0x8>)
180e: 2201 movs r2, #1
1810: 715a strb r2, [r3, #5]
*/
void _mclk_init(void)
{
void *hw = (void *)MCLK;
hri_mclk_write_CPUDIV_reg(hw, MCLK_CPUDIV_DIV(CONF_MCLK_CPUDIV));
}
1812: 4770 bx lr
1814: 40000800 .word 0x40000800
00001818 <RAMECC_Handler>:
return tmp;
}
static inline hri_ramecc_intflag_reg_t hri_ramecc_read_INTFLAG_reg(const void *const hw)
{
return ((Ramecc *)hw)->INTFLAG.reg;
1818: 4a0b ldr r2, [pc, #44] ; (1848 <RAMECC_Handler+0x30>)
181a: 7893 ldrb r3, [r2, #2]
/**
* \internal RAMECC interrupt handler
*/
void RAMECC_Handler(void)
{
181c: b082 sub sp, #8
181e: b2db uxtb r3, r3
struct _ramecc_device *dev = (struct _ramecc_device *)&device;
volatile uint32_t int_mask = hri_ramecc_read_INTFLAG_reg(RAMECC);
1820: 9301 str r3, [sp, #4]
if (int_mask & RAMECC_INTFLAG_DUALE && dev->ramecc_cb.dual_bit_err) {
1822: 9b01 ldr r3, [sp, #4]
1824: 0799 lsls r1, r3, #30
1826: d505 bpl.n 1834 <RAMECC_Handler+0x1c>
1828: 4b08 ldr r3, [pc, #32] ; (184c <RAMECC_Handler+0x34>)
182a: 681b ldr r3, [r3, #0]
182c: b113 cbz r3, 1834 <RAMECC_Handler+0x1c>
return tmp;
}
static inline hri_ramecc_erraddr_reg_t hri_ramecc_read_ERRADDR_reg(const void *const hw)
{
return ((Ramecc *)hw)->ERRADDR.reg;
182e: 6850 ldr r0, [r2, #4]
} else if (int_mask & RAMECC_INTFLAG_SINGLEE && dev->ramecc_cb.single_bit_err) {
dev->ramecc_cb.single_bit_err((uint32_t)hri_ramecc_read_ERRADDR_reg(RAMECC));
} else {
return;
}
}
1830: b002 add sp, #8
dev->ramecc_cb.single_bit_err((uint32_t)hri_ramecc_read_ERRADDR_reg(RAMECC));
1832: 4718 bx r3
} else if (int_mask & RAMECC_INTFLAG_SINGLEE && dev->ramecc_cb.single_bit_err) {
1834: 9b01 ldr r3, [sp, #4]
1836: 07db lsls r3, r3, #31
1838: d504 bpl.n 1844 <RAMECC_Handler+0x2c>
183a: 4b04 ldr r3, [pc, #16] ; (184c <RAMECC_Handler+0x34>)
183c: 685b ldr r3, [r3, #4]
183e: b10b cbz r3, 1844 <RAMECC_Handler+0x2c>
1840: 4a01 ldr r2, [pc, #4] ; (1848 <RAMECC_Handler+0x30>)
1842: e7f4 b.n 182e <RAMECC_Handler+0x16>
}
1844: b002 add sp, #8
1846: 4770 bx lr
1848: 41020000 .word 0x41020000
184c: 200002dc .word 0x200002dc
00001850 <diskio_init>:
#include "diskio_start.h"
void diskio_init(void)
{
}
1850: 4770 bx lr
00001852 <Dummy_Handler>:
/**
* \brief Default interrupt handler for unused IRQs.
*/
void Dummy_Handler(void)
{
while (1) {
1852: e7fe b.n 1852 <Dummy_Handler>
00001854 <Reset_Handler>:
if (pSrc != pDest) {
1854: 4918 ldr r1, [pc, #96] ; (18b8 <Reset_Handler+0x64>)
1856: 4819 ldr r0, [pc, #100] ; (18bc <Reset_Handler+0x68>)
1858: 4281 cmp r1, r0
{
185a: b510 push {r4, lr}
if (pSrc != pDest) {
185c: d00a beq.n 1874 <Reset_Handler+0x20>
*pDest++ = *pSrc++;
185e: 4b18 ldr r3, [pc, #96] ; (18c0 <Reset_Handler+0x6c>)
1860: 1cda adds r2, r3, #3
1862: 1a12 subs r2, r2, r0
1864: f022 0203 bic.w r2, r2, #3
1868: 1ec4 subs r4, r0, #3
186a: 42a3 cmp r3, r4
186c: bf38 it cc
186e: 2200 movcc r2, #0
1870: 4b14 ldr r3, [pc, #80] ; (18c4 <Reset_Handler+0x70>)
1872: 4798 blx r3
*pDest++ = 0;
1874: 4b14 ldr r3, [pc, #80] ; (18c8 <Reset_Handler+0x74>)
1876: 4815 ldr r0, [pc, #84] ; (18cc <Reset_Handler+0x78>)
1878: 1cda adds r2, r3, #3
187a: 1a12 subs r2, r2, r0
187c: 1ec1 subs r1, r0, #3
187e: f022 0203 bic.w r2, r2, #3
1882: 4299 cmp r1, r3
1884: bf88 it hi
1886: 2200 movhi r2, #0
1888: 4b11 ldr r3, [pc, #68] ; (18d0 <Reset_Handler+0x7c>)
188a: 2100 movs r1, #0
188c: 4798 blx r3
SCB->VTOR = ((uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk);
188e: 4a11 ldr r2, [pc, #68] ; (18d4 <Reset_Handler+0x80>)
1890: 4b11 ldr r3, [pc, #68] ; (18d8 <Reset_Handler+0x84>)
1892: f022 027f bic.w r2, r2, #127 ; 0x7f
1896: 609a str r2, [r3, #8]
SCB->CPACR |= (0xFu << 20);
1898: f8d3 2088 ldr.w r2, [r3, #136] ; 0x88
189c: f442 0270 orr.w r2, r2, #15728640 ; 0xf00000
18a0: f8c3 2088 str.w r2, [r3, #136] ; 0x88
\details Acts as a special kind of Data Memory Barrier.
It completes when all explicit memory accesses before this instruction complete.
*/
__STATIC_FORCEINLINE void __DSB(void)
{
__ASM volatile ("dsb 0xF":::"memory");
18a4: f3bf 8f4f dsb sy
__ASM volatile ("isb 0xF":::"memory");
18a8: f3bf 8f6f isb sy
__libc_init_array();
18ac: 4b0b ldr r3, [pc, #44] ; (18dc <Reset_Handler+0x88>)
18ae: 4798 blx r3
main();
18b0: 4b0b ldr r3, [pc, #44] ; (18e0 <Reset_Handler+0x8c>)
18b2: 4798 blx r3
while (1)
18b4: e7fe b.n 18b4 <Reset_Handler+0x60>
18b6: bf00 nop
18b8: 000031c0 .word 0x000031c0
18bc: 20000000 .word 0x20000000
18c0: 2000006c .word 0x2000006c
18c4: 000021cd .word 0x000021cd
18c8: 2000036c .word 0x2000036c
18cc: 20000070 .word 0x20000070
18d0: 000021e9 .word 0x000021e9
18d4: 00000000 .word 0x00000000
18d8: e000ed00 .word 0xe000ed00
18dc: 00002185 .word 0x00002185
18e0: 000018e5 .word 0x000018e5
000018e4 <main>:
#include <atmel_start.h>
#include "pdebug.h"
#include "sd_mmc_start.h"
int main(void)
{
18e4: b508 push {r3, lr}
/* Initializes MCU, drivers and middleware */
atmel_start_init();
18e6: 4b05 ldr r3, [pc, #20] ; (18fc <main+0x18>)
18e8: 4798 blx r3
pdebug_init();
18ea: 4b05 ldr r3, [pc, #20] ; (1900 <main+0x1c>)
18ec: 4798 blx r3
printf("Hello world\n");
18ee: 4b05 ldr r3, [pc, #20] ; (1904 <main+0x20>)
18f0: 4805 ldr r0, [pc, #20] ; (1908 <main+0x24>)
18f2: 4798 blx r3
SDMMC_example();
18f4: 4b05 ldr r3, [pc, #20] ; (190c <main+0x28>)
18f6: 4798 blx r3
/* Replace with your application code */
while (1) {
18f8: e7fe b.n 18f8 <main+0x14>
18fa: bf00 nop
18fc: 000020b5 .word 0x000020b5
1900: 00002135 .word 0x00002135
1904: 000020d5 .word 0x000020d5
1908: 0000304f .word 0x0000304f
190c: 00000359 .word 0x00000359
00001910 <_osc32kctrl_init_sources>:
}
static inline void hri_osc32kctrl_write_XOSC32K_reg(const void *const hw, hri_osc32kctrl_xosc32k_reg_t data)
{
OSC32KCTRL_CRITICAL_SECTION_ENTER();
((Osc32kctrl *)hw)->XOSC32K.reg = data;
1910: 4b06 ldr r3, [pc, #24] ; (192c <_osc32kctrl_init_sources+0x1c>)
1912: f242 328e movw r2, #9102 ; 0x238e
1916: 829a strh r2, [r3, #20]
}
static inline void hri_osc32kctrl_write_CFDCTRL_reg(const void *const hw, hri_osc32kctrl_cfdctrl_reg_t data)
{
OSC32KCTRL_CRITICAL_SECTION_ENTER();
((Osc32kctrl *)hw)->CFDCTRL.reg = data;
1918: 2200 movs r2, #0
191a: 759a strb r2, [r3, #22]
}
static inline void hri_osc32kctrl_write_EVCTRL_reg(const void *const hw, hri_osc32kctrl_evctrl_reg_t data)
{
OSC32KCTRL_CRITICAL_SECTION_ENTER();
((Osc32kctrl *)hw)->EVCTRL.reg = data;
191c: 75da strb r2, [r3, #23]
}
static inline hri_osc32kctrl_osculp32k_reg_t hri_osc32kctrl_read_OSCULP32K_CALIB_bf(const void *const hw)
{
uint32_t tmp;
tmp = ((Osc32kctrl *)hw)->OSCULP32K.reg;
191e: 69da ldr r2, [r3, #28]
calib = hri_osc32kctrl_read_OSCULP32K_CALIB_bf(hw);
hri_osc32kctrl_write_OSCULP32K_reg(hw,
#if CONF_OSCULP32K_CALIB_ENABLE == 1
OSC32KCTRL_OSCULP32K_CALIB(CONF_OSCULP32K_CALIB)
#else
OSC32KCTRL_OSCULP32K_CALIB(calib)
1920: f402 527c and.w r2, r2, #16128 ; 0x3f00
}
static inline void hri_osc32kctrl_write_OSCULP32K_reg(const void *const hw, hri_osc32kctrl_osculp32k_reg_t data)
{
OSC32KCTRL_CRITICAL_SECTION_ENTER();
((Osc32kctrl *)hw)->OSCULP32K.reg = data;
1924: 61da str r2, [r3, #28]
((Osc32kctrl *)hw)->RTCCTRL.reg = data;
1926: 2201 movs r2, #1
1928: 741a strb r2, [r3, #16]
#endif
#endif
hri_osc32kctrl_write_RTCCTRL_reg(hw, OSC32KCTRL_RTCCTRL_RTCSEL(CONF_RTCCTRL));
(void)calib;
}
192a: 4770 bx lr
192c: 40001400 .word 0x40001400
00001930 <hri_rtcmode0_wait_for_sync>:
typedef uint8_t hri_rtcalarm_mask_reg_t;
typedef uint8_t hri_rtcmode2_mask_reg_t;
static inline void hri_rtcmode0_wait_for_sync(const void *const hw, hri_rtcmode0_syncbusy_reg_t reg)
{
while (((Rtc *)hw)->MODE0.SYNCBUSY.reg & reg) {
1930: 6903 ldr r3, [r0, #16]
1932: 420b tst r3, r1
1934: d1fc bne.n 1930 <hri_rtcmode0_wait_for_sync>
};
}
1936: 4770 bx lr
00001938 <_calendar_init>:
/**
* \brief Initializes the RTC module with given configurations.
*/
int32_t _calendar_init(struct calendar_dev *const dev)
{
1938: b510 push {r4, lr}
ASSERT(dev && dev->hw);
193a: 4604 mov r4, r0
193c: b118 cbz r0, 1946 <_calendar_init+0xe>
193e: 6800 ldr r0, [r0, #0]
1940: 3800 subs r0, #0
1942: bf18 it ne
1944: 2001 movne r0, #1
1946: 4917 ldr r1, [pc, #92] ; (19a4 <_calendar_init+0x6c>)
1948: 4b17 ldr r3, [pc, #92] ; (19a8 <_calendar_init+0x70>)
194a: 222f movs r2, #47 ; 0x2f
194c: 4798 blx r3
_rtc_dev = dev;
194e: 4b17 ldr r3, [pc, #92] ; (19ac <_calendar_init+0x74>)
}
static inline bool hri_rtcmode0_get_CTRLA_ENABLE_bit(const void *const hw)
{
uint16_t tmp;
hri_rtcmode0_wait_for_sync(hw, RTC_MODE0_SYNCBUSY_SWRST | RTC_MODE0_SYNCBUSY_ENABLE | RTC_MODE0_SYNCBUSY_COUNTSYNC);
1950: 6820 ldr r0, [r4, #0]
1952: 4a17 ldr r2, [pc, #92] ; (19b0 <_calendar_init+0x78>)
1954: 601c str r4, [r3, #0]
1956: f248 0103 movw r1, #32771 ; 0x8003
195a: 4790 blx r2
tmp = ((Rtc *)hw)->MODE0.CTRLA.reg;
195c: 8803 ldrh r3, [r0, #0]
if (hri_rtcmode0_get_CTRLA_ENABLE_bit(dev->hw)) {
195e: 079b lsls r3, r3, #30
1960: d50a bpl.n 1978 <_calendar_init+0x40>
#if !CONF_RTC_INIT_RESET
return ERR_DENIED;
#else
hri_rtcmode0_clear_CTRLA_ENABLE_bit(dev->hw);
1962: 6820 ldr r0, [r4, #0]
}
static inline void hri_rtcmode0_clear_CTRLA_ENABLE_bit(const void *const hw)
{
RTC_CRITICAL_SECTION_ENTER();
((Rtc *)hw)->MODE0.CTRLA.reg &= ~RTC_MODE0_CTRLA_ENABLE;
1964: 8803 ldrh r3, [r0, #0]
1966: f023 0302 bic.w r3, r3, #2
196a: 041b lsls r3, r3, #16
196c: 0c1b lsrs r3, r3, #16
196e: 8003 strh r3, [r0, #0]
hri_rtcmode0_wait_for_sync(hw, RTC_MODE0_SYNCBUSY_SWRST | RTC_MODE0_SYNCBUSY_ENABLE | RTC_MODE0_SYNCBUSY_COUNTSYNC);
1970: 4790 blx r2
hri_rtcmode0_wait_for_sync(dev->hw, RTC_MODE0_SYNCBUSY_ENABLE);
1972: 6820 ldr r0, [r4, #0]
1974: 2102 movs r1, #2
1976: 4790 blx r2
#endif
}
hri_rtcmode0_set_CTRLA_SWRST_bit(dev->hw);
1978: 6820 ldr r0, [r4, #0]
((Rtc *)hw)->MODE0.CTRLA.reg |= RTC_MODE0_CTRLA_SWRST;
197a: 8803 ldrh r3, [r0, #0]
197c: b29b uxth r3, r3
197e: f043 0301 orr.w r3, r3, #1
1982: 8003 strh r3, [r0, #0]
hri_rtcmode0_wait_for_sync(hw, RTC_MODE0_SYNCBUSY_SWRST);
1984: 2101 movs r1, #1
1986: 4790 blx r2
hri_rtcmode0_wait_for_sync(dev->hw, RTC_MODE0_SYNCBUSY_SWRST);
1988: 6820 ldr r0, [r4, #0]
198a: 4790 blx r2
| (CONF_RTC_COMPE0 << RTC_MODE0_EVCTRL_CMPEO_Pos) | (CONF_RTC_COMPE1 << RTC_MODE0_EVCTRL_CMPEO1_Pos)
| (CONF_RTC_TAMPEREO << RTC_MODE0_EVCTRL_TAMPEREO_Pos)
| (CONF_RTC_TAMPEVEI << RTC_MODE0_EVCTRL_TAMPEVEI_Pos) | (CONF_RTC_OVFEO << RTC_MODE0_EVCTRL_OVFEO_Pos));
#endif
hri_rtcmode0_write_CTRLA_reg(dev->hw, RTC_MODE0_CTRLA_PRESCALER(CONF_RTC_PRESCALER) | RTC_MODE0_CTRLA_COUNTSYNC);
198c: 6820 ldr r0, [r4, #0]
}
static inline void hri_rtcmode0_write_CTRLA_reg(const void *const hw, hri_rtcmode0_ctrla_reg_t data)
{
RTC_CRITICAL_SECTION_ENTER();
((Rtc *)hw)->MODE0.CTRLA.reg = data;
198e: f44f 4301 mov.w r3, #33024 ; 0x8100
1992: 8003 strh r3, [r0, #0]
hri_rtcmode0_wait_for_sync(hw, RTC_MODE0_SYNCBUSY_SWRST | RTC_MODE0_SYNCBUSY_ENABLE | RTC_MODE0_SYNCBUSY_COUNTSYNC);
1994: f248 0103 movw r1, #32771 ; 0x8003
1998: 4790 blx r2
hri_rtc_write_TAMPCTRL_reg(
dev->hw,
199a: 6823 ldr r3, [r4, #0]
}
static inline void hri_rtc_write_TAMPCTRL_reg(const void *const hw, hri_rtc_tampctrl_reg_t data)
{
RTC_CRITICAL_SECTION_ENTER();
((Rtc *)hw)->MODE0.TAMPCTRL.reg = data;
199c: 2000 movs r0, #0
199e: 6618 str r0, [r3, #96] ; 0x60
| (CONF_RTC_TAMPER_INACT_2 == TAMPER_MODE_ACTL) | (CONF_RTC_TAMPER_INACT_3 == TAMPER_MODE_ACTL)
| (CONF_RTC_TAMPER_INACT_4 == TAMPER_MODE_ACTL)) {
hri_rtcmode0_set_CTRLB_RTCOUT_bit(dev->hw);
}
return ERR_NONE;
}
19a0: bd10 pop {r4, pc}
19a2: bf00 nop
19a4: 0000305c .word 0x0000305c
19a8: 00001605 .word 0x00001605
19ac: 200002ec .word 0x200002ec
19b0: 00001931 .word 0x00001931
000019b4 <RTC_Handler>:
/**
* \brief Rtc interrupt handler
*/
void RTC_Handler(void)
{
_rtc_interrupt_handler(_rtc_dev);
19b4: 4b0d ldr r3, [pc, #52] ; (19ec <RTC_Handler+0x38>)
{
19b6: b510 push {r4, lr}
_rtc_interrupt_handler(_rtc_dev);
19b8: 681c ldr r4, [r3, #0]
uint16_t interrupt_status = hri_rtcmode0_read_INTFLAG_reg(dev->hw);
19ba: 6822 ldr r2, [r4, #0]
return ((Rtc *)hw)->MODE0.INTFLAG.reg;
19bc: 8991 ldrh r1, [r2, #12]
return ((Rtc *)hw)->MODE0.INTENSET.reg;
19be: 8953 ldrh r3, [r2, #10]
19c0: b29b uxth r3, r3
if ((interrupt_status & interrupt_enabled) & RTC_MODE2_INTFLAG_ALARM0) {
19c2: 400b ands r3, r1
19c4: 05da lsls r2, r3, #23
19c6: d507 bpl.n 19d8 <RTC_Handler+0x24>
dev->callback(dev);
19c8: 6863 ldr r3, [r4, #4]
19ca: 4620 mov r0, r4
19cc: 4798 blx r3
hri_rtcmode0_clear_interrupt_CMP0_bit(dev->hw);
19ce: 6823 ldr r3, [r4, #0]
((Rtc *)hw)->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0;
19d0: f44f 7280 mov.w r2, #256 ; 0x100
((Rtc *)hw)->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_TAMPER;
19d4: 819a strh r2, [r3, #12]
}
19d6: bd10 pop {r4, pc}
} else if ((interrupt_status & interrupt_enabled) & RTC_MODE2_INTFLAG_TAMPER) {
19d8: 045b lsls r3, r3, #17
19da: d5fc bpl.n 19d6 <RTC_Handler+0x22>
dev->callback_tamper(dev);
19dc: 68a3 ldr r3, [r4, #8]
19de: 4620 mov r0, r4
19e0: 4798 blx r3
hri_rtcmode0_clear_interrupt_TAMPER_bit(dev->hw);
19e2: 6823 ldr r3, [r4, #0]
19e4: f44f 4280 mov.w r2, #16384 ; 0x4000
19e8: e7f4 b.n 19d4 <RTC_Handler+0x20>
19ea: bf00 nop
19ec: 200002ec .word 0x200002ec
000019f0 <gpio_set_pin_direction>:
_gpio_set_direction((enum gpio_port)GPIO_PORT(pin), 1U << GPIO_PIN(pin), direction);
19f0: f000 031f and.w r3, r0, #31
{
19f4: b530 push {r4, r5, lr}
_gpio_set_direction((enum gpio_port)GPIO_PORT(pin), 1U << GPIO_PIN(pin), direction);
19f6: 2501 movs r5, #1
19f8: 409d lsls r5, r3
((Port *)hw)->Group[submodule_index].DIRCLR.reg = mask;
19fa: 0940 lsrs r0, r0, #5
19fc: 4b0d ldr r3, [pc, #52] ; (1a34 <gpio_set_pin_direction+0x44>)
19fe: 01c0 lsls r0, r0, #7
switch (direction) {
1a00: 2902 cmp r1, #2
hri_port_write_WRCONFIG_reg(PORT, port, PORT_WRCONFIG_WRPINCFG | PORT_WRCONFIG_INEN | (mask & 0xffff));
1a02: b2ac uxth r4, r5
| ((mask & 0xffff0000) >> 16));
1a04: ea4f 4215 mov.w r2, r5, lsr #16
((Port *)hw)->Group[submodule_index].DIRSET.reg = mask;
1a08: 4403 add r3, r0
switch (direction) {
1a0a: d00b beq.n 1a24 <gpio_set_pin_direction+0x34>
hri_port_write_WRCONFIG_reg(PORT, port, PORT_WRCONFIG_WRPINCFG | PORT_WRCONFIG_INEN | (mask & 0xffff));
1a0c: f044 4480 orr.w r4, r4, #1073741824 ; 0x40000000
1a10: f444 3400 orr.w r4, r4, #131072 ; 0x20000
hri_port_write_WRCONFIG_reg(PORT,
1a14: f042 4240 orr.w r2, r2, #3221225472 ; 0xc0000000
((Port *)hw)->Group[submodule_index].DIRCLR.reg = mask;
1a18: 605d str r5, [r3, #4]
1a1a: f442 3200 orr.w r2, r2, #131072 ; 0x20000
static inline void hri_port_write_WRCONFIG_reg(const void *const hw, uint8_t submodule_index,
hri_port_wrconfig_reg_t data)
{
PORT_CRITICAL_SECTION_ENTER();
((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data;
1a1e: 629c str r4, [r3, #40] ; 0x28
1a20: 629a str r2, [r3, #40] ; 0x28
}
1a22: bd30 pop {r4, r5, pc}
hri_port_write_WRCONFIG_reg(PORT, port, PORT_WRCONFIG_WRPINCFG | (mask & 0xffff));
1a24: f044 4480 orr.w r4, r4, #1073741824 ; 0x40000000
((Port *)hw)->Group[submodule_index].DIRSET.reg = mask;
1a28: 609d str r5, [r3, #8]
hri_port_write_WRCONFIG_reg(
1a2a: f042 4240 orr.w r2, r2, #3221225472 ; 0xc0000000
((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data;
1a2e: 629c str r4, [r3, #40] ; 0x28
1a30: e7f6 b.n 1a20 <gpio_set_pin_direction+0x30>
1a32: bf00 nop
1a34: 41008000 .word 0x41008000
00001a38 <gpio_set_pin_pull_mode.constprop.0>:
((Port *)hw)->Group[submodule_index].PINCFG[index].reg &= ~PORT_PINCFG_PULLEN;
1a38: 0942 lsrs r2, r0, #5
1a3a: f000 031f and.w r3, r0, #31
1a3e: eb03 13c2 add.w r3, r3, r2, lsl #7
1a42: f103 4382 add.w r3, r3, #1090519040 ; 0x41000000
1a46: f503 4300 add.w r3, r3, #32768 ; 0x8000
1a4a: f893 2040 ldrb.w r2, [r3, #64] ; 0x40
1a4e: f002 02fb and.w r2, r2, #251 ; 0xfb
1a52: f883 2040 strb.w r2, [r3, #64] ; 0x40
}
1a56: 4770 bx lr
00001a58 <_gpio_set_pin_function>:
/**
* \brief Set gpio pin function
*/
static inline void _gpio_set_pin_function(const uint32_t gpio, const uint32_t function)
{
uint8_t port = GPIO_PORT(gpio);
1a58: 0943 lsrs r3, r0, #5
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
1a5a: 01db lsls r3, r3, #7
1a5c: f103 4382 add.w r3, r3, #1090519040 ; 0x41000000
{
1a60: b530 push {r4, r5, lr}
1a62: f503 4300 add.w r3, r3, #32768 ; 0x8000
uint8_t pin = GPIO_PIN(gpio);
1a66: f000 041f and.w r4, r0, #31
1a6a: 191d adds r5, r3, r4
1a6c: eb03 0354 add.w r3, r3, r4, lsr #1
1a70: f895 2040 ldrb.w r2, [r5, #64] ; 0x40
tmp &= ~PORT_PINCFG_PMUXEN;
1a74: f002 02fe and.w r2, r2, #254 ; 0xfe
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
1a78: f042 0201 orr.w r2, r2, #1
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
1a7c: f885 2040 strb.w r2, [r5, #64] ; 0x40
} else {
hri_port_write_PINCFG_PMUXEN_bit(PORT, port, pin, true);
if (pin & 1) {
// Odd numbered pin
hri_port_write_PMUX_PMUXO_bf(PORT, port, pin >> 1, function & 0xffff);
1a80: b2ca uxtb r2, r1
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
1a82: f893 1030 ldrb.w r1, [r3, #48] ; 0x30
if (pin & 1) {
1a86: f010 0f01 tst.w r0, #1
tmp &= ~PORT_PMUX_PMUXO_Msk;
1a8a: bf1b ittet ne
1a8c: f001 010f andne.w r1, r1, #15
tmp |= PORT_PMUX_PMUXO(data);
1a90: ea41 1102 orrne.w r1, r1, r2, lsl #4
tmp &= ~PORT_PMUX_PMUXE_Msk;
1a94: f001 01f0 andeq.w r1, r1, #240 ; 0xf0
tmp |= PORT_PMUX_PMUXO(data);
1a98: b2c9 uxtbne r1, r1
tmp |= PORT_PMUX_PMUXE(data);
1a9a: bf08 it eq
1a9c: 4311 orreq r1, r2
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
1a9e: f883 1030 strb.w r1, [r3, #48] ; 0x30
} else {
// Even numbered pin
hri_port_write_PMUX_PMUXE_bf(PORT, port, pin >> 1, function & 0xffff);
}
}
}
1aa2: bd30 pop {r4, r5, pc}
00001aa4 <CALENDER_INTERFACE_CLOCK_init>:
}
static inline void hri_mclk_set_APBAMASK_RTC_bit(const void *const hw)
{
MCLK_CRITICAL_SECTION_ENTER();
((Mclk *)hw)->APBAMASK.reg |= MCLK_APBAMASK_RTC;
1aa4: 4a02 ldr r2, [pc, #8] ; (1ab0 <CALENDER_INTERFACE_CLOCK_init+0xc>)
1aa6: 6953 ldr r3, [r2, #20]
1aa8: f443 7300 orr.w r3, r3, #512 ; 0x200
1aac: 6153 str r3, [r2, #20]
struct mci_sync_desc IO_BUS;
void CALENDER_INTERFACE_CLOCK_init(void)
{
hri_mclk_set_APBAMASK_RTC_bit(MCLK);
}
1aae: 4770 bx lr
1ab0: 40000800 .word 0x40000800
00001ab4 <CALENDER_INTERFACE_init>:
void CALENDER_INTERFACE_init(void)
{
1ab4: b510 push {r4, lr}
CALENDER_INTERFACE_CLOCK_init();
1ab6: 4b04 ldr r3, [pc, #16] ; (1ac8 <CALENDER_INTERFACE_init+0x14>)
calendar_init(&CALENDER_INTERFACE, RTC);
1ab8: 4904 ldr r1, [pc, #16] ; (1acc <CALENDER_INTERFACE_init+0x18>)
1aba: 4805 ldr r0, [pc, #20] ; (1ad0 <CALENDER_INTERFACE_init+0x1c>)
CALENDER_INTERFACE_CLOCK_init();
1abc: 4798 blx r3
}
1abe: e8bd 4010 ldmia.w sp!, {r4, lr}
calendar_init(&CALENDER_INTERFACE, RTC);
1ac2: 4b04 ldr r3, [pc, #16] ; (1ad4 <CALENDER_INTERFACE_init+0x20>)
1ac4: 4718 bx r3
1ac6: bf00 nop
1ac8: 00001aa5 .word 0x00001aa5
1acc: 40002400 .word 0x40002400
1ad0: 200002f0 .word 0x200002f0
1ad4: 00000315 .word 0x00000315
00001ad8 <USART_DBG_PORT_init>:
void USART_DBG_PORT_init(void)
{
1ad8: b510 push {r4, lr}
_gpio_set_pin_function(pin, function);
1ada: 4c05 ldr r4, [pc, #20] ; (1af0 <USART_DBG_PORT_init+0x18>)
1adc: 4905 ldr r1, [pc, #20] ; (1af4 <USART_DBG_PORT_init+0x1c>)
1ade: 2039 movs r0, #57 ; 0x39
1ae0: 47a0 blx r4
1ae2: 4623 mov r3, r4
1ae4: 4904 ldr r1, [pc, #16] ; (1af8 <USART_DBG_PORT_init+0x20>)
gpio_set_pin_function(PB25, PINMUX_PB25D_SERCOM2_PAD0);
gpio_set_pin_function(PB24, PINMUX_PB24D_SERCOM2_PAD1);
}
1ae6: e8bd 4010 ldmia.w sp!, {r4, lr}
1aea: 2038 movs r0, #56 ; 0x38
1aec: 4718 bx r3
1aee: bf00 nop
1af0: 00001a59 .word 0x00001a59
1af4: 00390003 .word 0x00390003
1af8: 00380003 .word 0x00380003
00001afc <USART_DBG_CLOCK_init>:
}
static inline void hri_gclk_write_PCHCTRL_reg(const void *const hw, uint8_t index, hri_gclk_pchctrl_reg_t data)
{
GCLK_CRITICAL_SECTION_ENTER();
((Gclk *)hw)->PCHCTRL[index].reg = data;
1afc: 4b06 ldr r3, [pc, #24] ; (1b18 <USART_DBG_CLOCK_init+0x1c>)
1afe: 2240 movs r2, #64 ; 0x40
1b00: f8c3 20dc str.w r2, [r3, #220] ; 0xdc
1b04: 2243 movs r2, #67 ; 0x43
1b06: f8c3 208c str.w r2, [r3, #140] ; 0x8c
}
static inline void hri_mclk_set_APBBMASK_SERCOM2_bit(const void *const hw)
{
MCLK_CRITICAL_SECTION_ENTER();
((Mclk *)hw)->APBBMASK.reg |= MCLK_APBBMASK_SERCOM2;
1b0a: 4a04 ldr r2, [pc, #16] ; (1b1c <USART_DBG_CLOCK_init+0x20>)
1b0c: 6993 ldr r3, [r2, #24]
1b0e: f443 7300 orr.w r3, r3, #512 ; 0x200
1b12: 6193 str r3, [r2, #24]
{
hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_CORE, CONF_GCLK_SERCOM2_CORE_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));
hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_SLOW, CONF_GCLK_SERCOM2_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));
hri_mclk_set_APBBMASK_SERCOM2_bit(MCLK);
}
1b14: 4770 bx lr
1b16: bf00 nop
1b18: 40001c00 .word 0x40001c00
1b1c: 40000800 .word 0x40000800
00001b20 <USART_DBG_init>:
void USART_DBG_init(void)
{
1b20: b510 push {r4, lr}
USART_DBG_CLOCK_init();
1b22: 4b05 ldr r3, [pc, #20] ; (1b38 <USART_DBG_init+0x18>)
usart_sync_init(&USART_DBG, SERCOM2, (void *)NULL);
1b24: 4905 ldr r1, [pc, #20] ; (1b3c <USART_DBG_init+0x1c>)
1b26: 4806 ldr r0, [pc, #24] ; (1b40 <USART_DBG_init+0x20>)
USART_DBG_CLOCK_init();
1b28: 4798 blx r3
usart_sync_init(&USART_DBG, SERCOM2, (void *)NULL);
1b2a: 4b06 ldr r3, [pc, #24] ; (1b44 <USART_DBG_init+0x24>)
1b2c: 2200 movs r2, #0
1b2e: 4798 blx r3
USART_DBG_PORT_init();
}
1b30: e8bd 4010 ldmia.w sp!, {r4, lr}
USART_DBG_PORT_init();
1b34: 4b04 ldr r3, [pc, #16] ; (1b48 <USART_DBG_init+0x28>)
1b36: 4718 bx r3
1b38: 00001afd .word 0x00001afd
1b3c: 41012000 .word 0x41012000
1b40: 20000310 .word 0x20000310
1b44: 0000177d .word 0x0000177d
1b48: 00001ad9 .word 0x00001ad9
00001b4c <SPI_SD_MMC_PORT_init>:
void SPI_SD_MMC_PORT_init(void)
{
1b4c: b570 push {r4, r5, r6, lr}
((Port *)hw)->Group[submodule_index].OUTCLR.reg = mask;
1b4e: 4e11 ldr r6, [pc, #68] ; (1b94 <SPI_SD_MMC_PORT_init+0x48>)
// <false"> Low
// <true"> High
false);
// Set pin direction to output
gpio_set_pin_direction(PB27, GPIO_DIRECTION_OUT);
1b50: 4d11 ldr r5, [pc, #68] ; (1b98 <SPI_SD_MMC_PORT_init+0x4c>)
1b52: 4c12 ldr r4, [pc, #72] ; (1b9c <SPI_SD_MMC_PORT_init+0x50>)
1b54: f04f 6300 mov.w r3, #134217728 ; 0x8000000
1b58: f8c6 3094 str.w r3, [r6, #148] ; 0x94
1b5c: 2102 movs r1, #2
1b5e: 203b movs r0, #59 ; 0x3b
1b60: 47a8 blx r5
1b62: 490f ldr r1, [pc, #60] ; (1ba0 <SPI_SD_MMC_PORT_init+0x54>)
1b64: 203b movs r0, #59 ; 0x3b
1b66: 47a0 blx r4
1b68: f04f 6380 mov.w r3, #67108864 ; 0x4000000
1b6c: f8c6 3094 str.w r3, [r6, #148] ; 0x94
// <false"> Low
// <true"> High
false);
// Set pin direction to output
gpio_set_pin_direction(PB26, GPIO_DIRECTION_OUT);
1b70: 2102 movs r1, #2
1b72: 203a movs r0, #58 ; 0x3a
1b74: 47a8 blx r5
1b76: 490b ldr r1, [pc, #44] ; (1ba4 <SPI_SD_MMC_PORT_init+0x58>)
1b78: 203a movs r0, #58 ; 0x3a
1b7a: 47a0 blx r4
gpio_set_pin_function(PB26, PINMUX_PB26D_SERCOM4_PAD1);
// Set pin direction to input
gpio_set_pin_direction(PB29, GPIO_DIRECTION_IN);
1b7c: 2101 movs r1, #1
1b7e: 203d movs r0, #61 ; 0x3d
1b80: 47a8 blx r5
gpio_set_pin_pull_mode(PB29,
1b82: 4b09 ldr r3, [pc, #36] ; (1ba8 <SPI_SD_MMC_PORT_init+0x5c>)
1b84: 4909 ldr r1, [pc, #36] ; (1bac <SPI_SD_MMC_PORT_init+0x60>)
1b86: 203d movs r0, #61 ; 0x3d
1b88: 4798 blx r3
1b8a: 4623 mov r3, r4
// <GPIO_PULL_UP"> Pull-up
// <GPIO_PULL_DOWN"> Pull-down
GPIO_PULL_OFF);
gpio_set_pin_function(PB29, PINMUX_PB29D_SERCOM4_PAD3);
}
1b8c: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
1b90: 4718 bx r3
1b92: bf00 nop
1b94: 41008000 .word 0x41008000
1b98: 000019f1 .word 0x000019f1
1b9c: 00001a59 .word 0x00001a59
1ba0: 003b0003 .word 0x003b0003
1ba4: 003a0003 .word 0x003a0003
1ba8: 00001a39 .word 0x00001a39
1bac: 003d0003 .word 0x003d0003
00001bb0 <SPI_SD_MMC_CLOCK_init>:
1bb0: 4b06 ldr r3, [pc, #24] ; (1bcc <SPI_SD_MMC_CLOCK_init+0x1c>)
1bb2: 2240 movs r2, #64 ; 0x40
1bb4: f8c3 2108 str.w r2, [r3, #264] ; 0x108
1bb8: 2243 movs r2, #67 ; 0x43
1bba: f8c3 208c str.w r2, [r3, #140] ; 0x8c
}
static inline void hri_mclk_set_APBDMASK_SERCOM4_bit(const void *const hw)
{
MCLK_CRITICAL_SECTION_ENTER();
((Mclk *)hw)->APBDMASK.reg |= MCLK_APBDMASK_SERCOM4;
1bbe: 4a04 ldr r2, [pc, #16] ; (1bd0 <SPI_SD_MMC_CLOCK_init+0x20>)
1bc0: 6a13 ldr r3, [r2, #32]
1bc2: f043 0301 orr.w r3, r3, #1
1bc6: 6213 str r3, [r2, #32]
{
hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM4_GCLK_ID_CORE, CONF_GCLK_SERCOM4_CORE_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));
hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM4_GCLK_ID_SLOW, CONF_GCLK_SERCOM4_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));
hri_mclk_set_APBDMASK_SERCOM4_bit(MCLK);
}
1bc8: 4770 bx lr
1bca: bf00 nop
1bcc: 40001c00 .word 0x40001c00
1bd0: 40000800 .word 0x40000800
00001bd4 <SPI_SD_MMC_init>:
void SPI_SD_MMC_init(void)
{
1bd4: b510 push {r4, lr}
SPI_SD_MMC_CLOCK_init();
1bd6: 4b05 ldr r3, [pc, #20] ; (1bec <SPI_SD_MMC_init+0x18>)
spi_m_sync_init(&SPI_SD_MMC, SERCOM4);
1bd8: 4805 ldr r0, [pc, #20] ; (1bf0 <SPI_SD_MMC_init+0x1c>)
SPI_SD_MMC_CLOCK_init();
1bda: 4798 blx r3
spi_m_sync_init(&SPI_SD_MMC, SERCOM4);
1bdc: f04f 4186 mov.w r1, #1124073472 ; 0x43000000
1be0: 4b04 ldr r3, [pc, #16] ; (1bf4 <SPI_SD_MMC_init+0x20>)
1be2: 4798 blx r3
SPI_SD_MMC_PORT_init();
}
1be4: e8bd 4010 ldmia.w sp!, {r4, lr}
SPI_SD_MMC_PORT_init();
1be8: 4b03 ldr r3, [pc, #12] ; (1bf8 <SPI_SD_MMC_init+0x24>)
1bea: 4718 bx r3
1bec: 00001bb1 .word 0x00001bb1
1bf0: 2000031c .word 0x2000031c
1bf4: 00001429 .word 0x00001429
1bf8: 00001b4d .word 0x00001b4d
00001bfc <IO_BUS_PORT_init>:
void IO_BUS_PORT_init(void)
{
1bfc: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
1c00: 4e21 ldr r6, [pc, #132] ; (1c88 <IO_BUS_PORT_init+0x8c>)
gpio_set_pin_direction(PB11,
1c02: 4f22 ldr r7, [pc, #136] ; (1c8c <IO_BUS_PORT_init+0x90>)
// <id> pad_initial_level
// <false"> Low
// <true"> High
false);
gpio_set_pin_pull_mode(PB11,
1c04: 4d22 ldr r5, [pc, #136] ; (1c90 <IO_BUS_PORT_init+0x94>)
1c06: 4c23 ldr r4, [pc, #140] ; (1c94 <IO_BUS_PORT_init+0x98>)
1c08: f44f 6900 mov.w r9, #2048 ; 0x800
gpio_set_pin_direction(PB11,
1c0c: 2102 movs r1, #2
1c0e: 202b movs r0, #43 ; 0x2b
1c10: 47b8 blx r7
gpio_set_pin_pull_mode(PB11,
1c12: 202b movs r0, #43 ; 0x2b
1c14: 4920 ldr r1, [pc, #128] ; (1c98 <IO_BUS_PORT_init+0x9c>)
1c16: f8c6 9094 str.w r9, [r6, #148] ; 0x94
1c1a: 47a8 blx r5
1c1c: 47a0 blx r4
// <GPIO_PIN_FUNCTION_L"> L
// <GPIO_PIN_FUNCTION_M"> M
// <GPIO_PIN_FUNCTION_N"> N
PINMUX_PB11I_SDHC0_SDCK);
gpio_set_pin_direction(PA08,
1c1e: 2102 movs r1, #2
1c20: 2008 movs r0, #8
1c22: 47b8 blx r7
1c24: f44f 7380 mov.w r3, #256 ; 0x100
1c28: 6173 str r3, [r6, #20]
// <id> pad_initial_level
// <false"> Low
// <true"> High
false);
gpio_set_pin_pull_mode(PA08,
1c2a: 2008 movs r0, #8
1c2c: f04f 1108 mov.w r1, #524296 ; 0x80008
1c30: 47a8 blx r5
1c32: 47a0 blx r4
// <GPIO_PIN_FUNCTION_L"> L
// <GPIO_PIN_FUNCTION_M"> M
// <GPIO_PIN_FUNCTION_N"> N
PINMUX_PA08I_SDHC0_SDCMD);
gpio_set_pin_direction(PA09,
1c34: 2102 movs r1, #2
1c36: 2009 movs r0, #9
1c38: 47b8 blx r7
1c3a: f44f 7300 mov.w r3, #512 ; 0x200
1c3e: 6173 str r3, [r6, #20]
// <id> pad_initial_level
// <false"> Low
// <true"> High
false);
gpio_set_pin_pull_mode(PA09,
1c40: 2009 movs r0, #9
1c42: 4916 ldr r1, [pc, #88] ; (1c9c <IO_BUS_PORT_init+0xa0>)
1c44: 47a8 blx r5
1c46: f44f 6880 mov.w r8, #1024 ; 0x400
1c4a: 47a0 blx r4
// <GPIO_PIN_FUNCTION_L"> L
// <GPIO_PIN_FUNCTION_M"> M
// <GPIO_PIN_FUNCTION_N"> N
PINMUX_PA09I_SDHC0_SDDAT0);
gpio_set_pin_direction(PA10,
1c4c: 2102 movs r1, #2
1c4e: 200a movs r0, #10
1c50: 47b8 blx r7
// <id> pad_initial_level
// <false"> Low
// <true"> High
false);
gpio_set_pin_pull_mode(PA10,
1c52: 200a movs r0, #10
1c54: 4912 ldr r1, [pc, #72] ; (1ca0 <IO_BUS_PORT_init+0xa4>)
1c56: f8c6 8014 str.w r8, [r6, #20]
1c5a: 47a8 blx r5
1c5c: 47a0 blx r4
// <GPIO_PIN_FUNCTION_L"> L
// <GPIO_PIN_FUNCTION_M"> M
// <GPIO_PIN_FUNCTION_N"> N
PINMUX_PA10I_SDHC0_SDDAT1);
gpio_set_pin_direction(PA11,
1c5e: 2102 movs r1, #2
1c60: 200b movs r0, #11
1c62: 47b8 blx r7
// <id> pad_initial_level
// <false"> Low
// <true"> High
false);
gpio_set_pin_pull_mode(PA11,
1c64: 200b movs r0, #11
1c66: 490f ldr r1, [pc, #60] ; (1ca4 <IO_BUS_PORT_init+0xa8>)
1c68: f8c6 9014 str.w r9, [r6, #20]
1c6c: 47a8 blx r5
1c6e: 47a0 blx r4
// <GPIO_PIN_FUNCTION_L"> L
// <GPIO_PIN_FUNCTION_M"> M
// <GPIO_PIN_FUNCTION_N"> N
PINMUX_PA11I_SDHC0_SDDAT2);
gpio_set_pin_direction(PB10,
1c70: 2102 movs r1, #2
1c72: 202a movs r0, #42 ; 0x2a
1c74: 47b8 blx r7
1c76: f8c6 8094 str.w r8, [r6, #148] ; 0x94
// <id> pad_initial_level
// <false"> Low
// <true"> High
false);
gpio_set_pin_pull_mode(PB10,
1c7a: 202a movs r0, #42 ; 0x2a
1c7c: 47a8 blx r5
1c7e: 490a ldr r1, [pc, #40] ; (1ca8 <IO_BUS_PORT_init+0xac>)
1c80: 4623 mov r3, r4
// <GPIO_PIN_FUNCTION_K"> K
// <GPIO_PIN_FUNCTION_L"> L
// <GPIO_PIN_FUNCTION_M"> M
// <GPIO_PIN_FUNCTION_N"> N
PINMUX_PB10I_SDHC0_SDDAT3);
}
1c82: e8bd 47f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
1c86: 4718 bx r3
1c88: 41008000 .word 0x41008000
1c8c: 000019f1 .word 0x000019f1
1c90: 00001a39 .word 0x00001a39
1c94: 00001a59 .word 0x00001a59
1c98: 002b0008 .word 0x002b0008
1c9c: 00090008 .word 0x00090008
1ca0: 000a0008 .word 0x000a0008
1ca4: 000b0008 .word 0x000b0008
1ca8: 002a0008 .word 0x002a0008
00001cac <IO_BUS_CLOCK_init>:
((Mclk *)hw)->AHBMASK.reg |= MCLK_AHBMASK_SDHC0;
1cac: 4a05 ldr r2, [pc, #20] ; (1cc4 <IO_BUS_CLOCK_init+0x18>)
1cae: 6913 ldr r3, [r2, #16]
1cb0: f443 4300 orr.w r3, r3, #32768 ; 0x8000
1cb4: 6113 str r3, [r2, #16]
1cb6: 4b04 ldr r3, [pc, #16] ; (1cc8 <IO_BUS_CLOCK_init+0x1c>)
1cb8: 2240 movs r2, #64 ; 0x40
1cba: f8c3 2134 str.w r2, [r3, #308] ; 0x134
1cbe: f8c3 208c str.w r2, [r3, #140] ; 0x8c
void IO_BUS_CLOCK_init(void)
{
hri_mclk_set_AHBMASK_SDHC0_bit(MCLK);
hri_gclk_write_PCHCTRL_reg(GCLK, SDHC0_GCLK_ID, CONF_GCLK_SDHC0_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));
hri_gclk_write_PCHCTRL_reg(GCLK, SDHC0_GCLK_ID_SLOW, CONF_GCLK_SDHC0_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));
}
1cc2: 4770 bx lr
1cc4: 40000800 .word 0x40000800
1cc8: 40001c00 .word 0x40001c00
00001ccc <IO_BUS_init>:
void IO_BUS_init(void)
{
1ccc: b510 push {r4, lr}
IO_BUS_CLOCK_init();
1cce: 4b05 ldr r3, [pc, #20] ; (1ce4 <IO_BUS_init+0x18>)
mci_sync_init(&IO_BUS, SDHC0);
1cd0: 4805 ldr r0, [pc, #20] ; (1ce8 <IO_BUS_init+0x1c>)
IO_BUS_CLOCK_init();
1cd2: 4798 blx r3
mci_sync_init(&IO_BUS, SDHC0);
1cd4: f04f 418a mov.w r1, #1157627904 ; 0x45000000
1cd8: 4b04 ldr r3, [pc, #16] ; (1cec <IO_BUS_init+0x20>)
1cda: 4798 blx r3
IO_BUS_PORT_init();
}
1cdc: e8bd 4010 ldmia.w sp!, {r4, lr}
IO_BUS_PORT_init();
1ce0: 4b03 ldr r3, [pc, #12] ; (1cf0 <IO_BUS_init+0x24>)
1ce2: 4718 bx r3
1ce4: 00001cad .word 0x00001cad
1ce8: 20000338 .word 0x20000338
1cec: 00001549 .word 0x00001549
1cf0: 00001bfd .word 0x00001bfd
00001cf4 <delay_driver_init>:
void delay_driver_init(void)
{
delay_init(SysTick);
1cf4: 4801 ldr r0, [pc, #4] ; (1cfc <delay_driver_init+0x8>)
1cf6: 4b02 ldr r3, [pc, #8] ; (1d00 <delay_driver_init+0xc>)
1cf8: 4718 bx r3
1cfa: bf00 nop
1cfc: e000e010 .word 0xe000e010
1d00: 00001579 .word 0x00001579
00001d04 <system_init>:
}
void system_init(void)
{
1d04: b510 push {r4, lr}
* Currently the following initialization functions are supported:
* - System clock initialization
*/
static inline void init_mcu(void)
{
_init_chip();
1d06: 4b07 ldr r3, [pc, #28] ; (1d24 <system_init+0x20>)
1d08: 4798 blx r3
init_mcu();
CALENDER_INTERFACE_init();
1d0a: 4b07 ldr r3, [pc, #28] ; (1d28 <system_init+0x24>)
1d0c: 4798 blx r3
USART_DBG_init();
1d0e: 4b07 ldr r3, [pc, #28] ; (1d2c <system_init+0x28>)
1d10: 4798 blx r3
SPI_SD_MMC_init();
1d12: 4b07 ldr r3, [pc, #28] ; (1d30 <system_init+0x2c>)
1d14: 4798 blx r3
IO_BUS_init();
1d16: 4b07 ldr r3, [pc, #28] ; (1d34 <system_init+0x30>)
1d18: 4798 blx r3
delay_driver_init();
}
1d1a: e8bd 4010 ldmia.w sp!, {r4, lr}
delay_driver_init();
1d1e: 4b06 ldr r3, [pc, #24] ; (1d38 <system_init+0x34>)
1d20: 4718 bx r3
1d22: bf00 nop
1d24: 00001589 .word 0x00001589
1d28: 00001ab5 .word 0x00001ab5
1d2c: 00001b21 .word 0x00001b21
1d30: 00001bd5 .word 0x00001bd5
1d34: 00001ccd .word 0x00001ccd
1d38: 00001cf5 .word 0x00001cf5
00001d3c <hri_sercomspi_wait_for_sync>:
return ((Sercom *)hw)->I2CS.SYNCBUSY.reg & reg;
}
static inline void hri_sercomspi_wait_for_sync(const void *const hw, hri_sercomspi_syncbusy_reg_t reg)
{
while (((Sercom *)hw)->SPI.SYNCBUSY.reg & reg) {
1d3c: 69c3 ldr r3, [r0, #28]
1d3e: 420b tst r3, r1
1d40: d1fc bne.n 1d3c <hri_sercomspi_wait_for_sync>
};
}
1d42: 4770 bx lr
00001d44 <hri_sercomusart_wait_for_sync>:
return ((Sercom *)hw)->SPI.SYNCBUSY.reg & reg;
}
static inline void hri_sercomusart_wait_for_sync(const void *const hw, hri_sercomusart_syncbusy_reg_t reg)
{
while (((Sercom *)hw)->USART.SYNCBUSY.reg & reg) {
1d44: 69c3 ldr r3, [r0, #28]
1d46: 420b tst r3, r1
1d48: d1fc bne.n 1d44 <hri_sercomusart_wait_for_sync>
};
}
1d4a: 4770 bx lr
00001d4c <hri_sercomspi_clear_CTRLA_ENABLE_bit>:
}
static inline void hri_sercomspi_clear_CTRLA_ENABLE_bit(const void *const hw)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->SPI.CTRLA.reg &= ~SERCOM_SPI_CTRLA_ENABLE;
1d4c: 6802 ldr r2, [r0, #0]
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE);
1d4e: 4b03 ldr r3, [pc, #12] ; (1d5c <hri_sercomspi_clear_CTRLA_ENABLE_bit+0x10>)
((Sercom *)hw)->SPI.CTRLA.reg &= ~SERCOM_SPI_CTRLA_ENABLE;
1d50: f022 0202 bic.w r2, r2, #2
1d54: 6002 str r2, [r0, #0]
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE);
1d56: 2103 movs r1, #3
1d58: 4718 bx r3
1d5a: bf00 nop
1d5c: 00001d3d .word 0x00001d3d
00001d60 <hri_sercomusart_clear_CTRLA_ENABLE_bit>:
}
static inline void hri_sercomusart_clear_CTRLA_ENABLE_bit(const void *const hw)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->USART.CTRLA.reg &= ~SERCOM_USART_CTRLA_ENABLE;
1d60: 6802 ldr r2, [r0, #0]
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE);
1d62: 4b03 ldr r3, [pc, #12] ; (1d70 <hri_sercomusart_clear_CTRLA_ENABLE_bit+0x10>)
((Sercom *)hw)->USART.CTRLA.reg &= ~SERCOM_USART_CTRLA_ENABLE;
1d64: f022 0202 bic.w r2, r2, #2
1d68: 6002 str r2, [r0, #0]
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE);
1d6a: 2103 movs r1, #3
1d6c: 4718 bx r3
1d6e: bf00 nop
1d70: 00001d45 .word 0x00001d45
00001d74 <_sercom_get_hardware_index>:
/**
* \brief Retrieve ordinal number of the given sercom hardware instance
*/
static uint8_t _sercom_get_hardware_index(const void *const hw)
{
1d74: b570 push {r4, r5, r6, lr}
Sercom *const sercom_modules[] = SERCOM_INSTS;
1d76: 4d0c ldr r5, [pc, #48] ; (1da8 <_sercom_get_hardware_index+0x34>)
{
1d78: 4606 mov r6, r0
Sercom *const sercom_modules[] = SERCOM_INSTS;
1d7a: cd0f ldmia r5!, {r0, r1, r2, r3}
{
1d7c: b088 sub sp, #32
Sercom *const sercom_modules[] = SERCOM_INSTS;
1d7e: 466c mov r4, sp
1d80: c40f stmia r4!, {r0, r1, r2, r3}
1d82: e895 000f ldmia.w r5, {r0, r1, r2, r3}
1d86: e884 000f stmia.w r4, {r0, r1, r2, r3}
/* Find index for SERCOM instance. */
for (uint32_t i = 0; i < SERCOM_INST_NUM; i++) {
1d8a: 466a mov r2, sp
1d8c: 2300 movs r3, #0
if ((uint32_t)hw == (uint32_t)sercom_modules[i]) {
1d8e: f852 1b04 ldr.w r1, [r2], #4
1d92: 42b1 cmp r1, r6
1d94: d102 bne.n 1d9c <_sercom_get_hardware_index+0x28>
return i;
1d96: b2d8 uxtb r0, r3
}
}
return 0;
}
1d98: b008 add sp, #32
1d9a: bd70 pop {r4, r5, r6, pc}
for (uint32_t i = 0; i < SERCOM_INST_NUM; i++) {
1d9c: 3301 adds r3, #1
1d9e: 2b08 cmp r3, #8
1da0: d1f5 bne.n 1d8e <_sercom_get_hardware_index+0x1a>
return 0;
1da2: 2000 movs r0, #0
1da4: e7f8 b.n 1d98 <_sercom_get_hardware_index+0x24>
1da6: bf00 nop
1da8: 0000308c .word 0x0000308c
00001dac <_usart_init>:
* \param[in] hw The pointer to hardware instance
*
* \return The status of initialization
*/
static int32_t _usart_init(void *const hw)
{
1dac: b538 push {r3, r4, r5, lr}
uint8_t sercom_offset = _sercom_get_hardware_index(hw);
1dae: 4b1b ldr r3, [pc, #108] ; (1e1c <_usart_init+0x70>)
{
1db0: 4604 mov r4, r0
uint8_t sercom_offset = _sercom_get_hardware_index(hw);
1db2: 4798 blx r3
if (_usarts[i].number == sercom_offset) {
1db4: 2802 cmp r0, #2
1db6: d005 beq.n 1dc4 <_usart_init+0x18>
ASSERT(false);
1db8: 4919 ldr r1, [pc, #100] ; (1e20 <_usart_init+0x74>)
1dba: 4b1a ldr r3, [pc, #104] ; (1e24 <_usart_init+0x78>)
1dbc: f240 2247 movw r2, #583 ; 0x247
1dc0: 2000 movs r0, #0
1dc2: 4798 blx r3
return ((Sercom *)hw)->USART.SYNCBUSY.reg & reg;
1dc4: 69e3 ldr r3, [r4, #28]
1dc6: 4d18 ldr r5, [pc, #96] ; (1e28 <_usart_init+0x7c>)
uint8_t i = _get_sercom_index(hw);
if (!hri_sercomusart_is_syncing(hw, SERCOM_USART_SYNCBUSY_SWRST)) {
1dc8: f013 0f01 tst.w r3, #1
1dcc: d10e bne.n 1dec <_usart_init+0x40>
static inline hri_sercomusart_ctrla_reg_t hri_sercomusart_get_CTRLA_reg(const void *const hw,
hri_sercomusart_ctrla_reg_t mask)
{
uint32_t tmp;
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE);
1dce: 2103 movs r1, #3
1dd0: 4620 mov r0, r4
1dd2: 47a8 blx r5
tmp = ((Sercom *)hw)->USART.CTRLA.reg;
1dd4: 6823 ldr r3, [r4, #0]
uint32_t mode = _usarts[i].ctrl_a & SERCOM_USART_CTRLA_MODE_Msk;
if (hri_sercomusart_get_CTRLA_reg(hw, SERCOM_USART_CTRLA_ENABLE)) {
1dd6: 079b lsls r3, r3, #30
1dd8: d503 bpl.n 1de2 <_usart_init+0x36>
hri_sercomusart_clear_CTRLA_ENABLE_bit(hw);
1dda: 4b14 ldr r3, [pc, #80] ; (1e2c <_usart_init+0x80>)
1ddc: 4798 blx r3
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_ENABLE);
1dde: 2102 movs r1, #2
1de0: 47a8 blx r5
}
static inline void hri_sercomusart_write_CTRLA_reg(const void *const hw, hri_sercomusart_ctrla_reg_t data)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->USART.CTRLA.reg = data;
1de2: 2305 movs r3, #5
1de4: 6023 str r3, [r4, #0]
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE);
1de6: 2103 movs r1, #3
1de8: 4620 mov r0, r4
1dea: 47a8 blx r5
}
hri_sercomusart_write_CTRLA_reg(hw, SERCOM_USART_CTRLA_SWRST | mode);
}
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST);
1dec: 4620 mov r0, r4
1dee: 2101 movs r1, #1
1df0: 47a8 blx r5
((Sercom *)hw)->USART.CTRLA.reg = data;
1df2: 4b0f ldr r3, [pc, #60] ; (1e30 <_usart_init+0x84>)
1df4: 6023 str r3, [r4, #0]
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE);
1df6: 2103 movs r1, #3
1df8: 47a8 blx r5
}
static inline void hri_sercomusart_write_CTRLB_reg(const void *const hw, hri_sercomusart_ctrlb_reg_t data)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->USART.CTRLB.reg = data;
1dfa: f44f 3340 mov.w r3, #196608 ; 0x30000
1dfe: 6063 str r3, [r4, #4]
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_MASK);
1e00: 211f movs r1, #31
1e02: 47a8 blx r5
}
static inline void hri_sercomusart_write_CTRLC_reg(const void *const hw, hri_sercomusart_ctrlc_reg_t data)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->USART.CTRLC.reg = data;
1e04: 4b0b ldr r3, [pc, #44] ; (1e34 <_usart_init+0x88>)
1e06: 60a3 str r3, [r4, #8]
}
static inline void hri_sercomusart_write_BAUD_reg(const void *const hw, hri_sercomusart_baud_reg_t data)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->USART.BAUD.reg = data;
1e08: f64f 4311 movw r3, #64529 ; 0xfc11
1e0c: 81a3 strh r3, [r4, #12]
}
static inline void hri_sercomusart_write_RXPL_reg(const void *const hw, hri_sercomusart_rxpl_reg_t data)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->USART.RXPL.reg = data;
1e0e: 2300 movs r3, #0
1e10: 73a3 strb r3, [r4, #14]
hri_sercomusart_write_RXPL_reg(hw, _usarts[i].rxpl);
hri_sercomusart_write_DBGCTRL_reg(hw, _usarts[i].debug_ctrl);
return ERR_NONE;
}
1e12: 4618 mov r0, r3
}
static inline void hri_sercomusart_write_DBGCTRL_reg(const void *const hw, hri_sercomusart_dbgctrl_reg_t data)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->USART.DBGCTRL.reg = data;
1e14: f884 3030 strb.w r3, [r4, #48] ; 0x30
1e18: bd38 pop {r3, r4, r5, pc}
1e1a: bf00 nop
1e1c: 00001d75 .word 0x00001d75
1e20: 00003071 .word 0x00003071
1e24: 00001605 .word 0x00001605
1e28: 00001d45 .word 0x00001d45
1e2c: 00001d61 .word 0x00001d61
1e30: 40100004 .word 0x40100004
1e34: 00700002 .word 0x00700002
00001e38 <_usart_sync_init>:
{
1e38: b570 push {r4, r5, r6, lr}
ASSERT(device);
1e3a: 4605 mov r5, r0
1e3c: 3800 subs r0, #0
{
1e3e: 460c mov r4, r1
ASSERT(device);
1e40: 4b05 ldr r3, [pc, #20] ; (1e58 <_usart_sync_init+0x20>)
1e42: 4906 ldr r1, [pc, #24] ; (1e5c <_usart_sync_init+0x24>)
1e44: bf18 it ne
1e46: 2001 movne r0, #1
1e48: 22bb movs r2, #187 ; 0xbb
1e4a: 4798 blx r3
device->hw = hw;
1e4c: 602c str r4, [r5, #0]
return _usart_init(hw);
1e4e: 4620 mov r0, r4
1e50: 4b03 ldr r3, [pc, #12] ; (1e60 <_usart_sync_init+0x28>)
}
1e52: e8bd 4070 ldmia.w sp!, {r4, r5, r6, lr}
return _usart_init(hw);
1e56: 4718 bx r3
1e58: 00001605 .word 0x00001605
1e5c: 00003071 .word 0x00003071
1e60: 00001dad .word 0x00001dad
00001e64 <_usart_sync_enable>:
hri_sercomusart_set_CTRLA_ENABLE_bit(device->hw);
1e64: 6800 ldr r0, [r0, #0]
((Sercom *)hw)->USART.CTRLA.reg |= SERCOM_USART_CTRLA_ENABLE;
1e66: 6803 ldr r3, [r0, #0]
1e68: f043 0302 orr.w r3, r3, #2
1e6c: 6003 str r3, [r0, #0]
hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE);
1e6e: 2103 movs r1, #3
1e70: 4b00 ldr r3, [pc, #0] ; (1e74 <_usart_sync_enable+0x10>)
1e72: 4718 bx r3
1e74: 00001d45 .word 0x00001d45
00001e78 <_usart_sync_write_byte>:
hri_sercomusart_write_DATA_reg(device->hw, data);
1e78: 6803 ldr r3, [r0, #0]
((Sercom *)hw)->USART.DATA.reg = data;
1e7a: 6299 str r1, [r3, #40] ; 0x28
}
1e7c: 4770 bx lr
00001e7e <_usart_sync_read_byte>:
return hri_sercomusart_read_DATA_reg(device->hw);
1e7e: 6803 ldr r3, [r0, #0]
return ((Sercom *)hw)->USART.DATA.reg;
1e80: 6a98 ldr r0, [r3, #40] ; 0x28
}
1e82: b2c0 uxtb r0, r0
1e84: 4770 bx lr
00001e86 <_usart_sync_is_ready_to_send>:
return hri_sercomusart_get_interrupt_DRE_bit(device->hw);
1e86: 6803 ldr r3, [r0, #0]
return (((Sercom *)hw)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_DRE) >> SERCOM_USART_INTFLAG_DRE_Pos;
1e88: 7e18 ldrb r0, [r3, #24]
}
1e8a: f000 0001 and.w r0, r0, #1
1e8e: 4770 bx lr
00001e90 <_usart_sync_is_transmit_done>:
return hri_sercomusart_get_interrupt_TXC_bit(device->hw);
1e90: 6803 ldr r3, [r0, #0]
return (((Sercom *)hw)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_TXC) >> SERCOM_USART_INTFLAG_TXC_Pos;
1e92: 7e18 ldrb r0, [r3, #24]
}
1e94: f3c0 0040 ubfx r0, r0, #1, #1
1e98: 4770 bx lr
00001e9a <_usart_sync_is_byte_received>:
return hri_sercomusart_get_interrupt_RXC_bit(device->hw);
1e9a: 6803 ldr r3, [r0, #0]
return (((Sercom *)hw)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_RXC) >> SERCOM_USART_INTFLAG_RXC_Pos;
1e9c: 7e18 ldrb r0, [r3, #24]
}
1e9e: f3c0 0080 ubfx r0, r0, #2, #1
1ea2: 4770 bx lr
00001ea4 <_spi_m_sync_init>:
return NULL;
}
int32_t _spi_m_sync_init(struct _spi_m_sync_dev *dev, void *const hw)
{
1ea4: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
uint8_t n = _sercom_get_hardware_index((const void *)hw_addr);
1ea8: 4b44 ldr r3, [pc, #272] ; (1fbc <_spi_m_sync_init+0x118>)
return NULL;
1eaa: 4d45 ldr r5, [pc, #276] ; (1fc0 <_spi_m_sync_init+0x11c>)
{
1eac: 4607 mov r7, r0
uint8_t n = _sercom_get_hardware_index((const void *)hw_addr);
1eae: 4608 mov r0, r1
{
1eb0: 460c mov r4, r1
uint8_t n = _sercom_get_hardware_index((const void *)hw_addr);
1eb2: 4798 blx r3
return NULL;
1eb4: 2804 cmp r0, #4
1eb6: bf18 it ne
1eb8: 2500 movne r5, #0
const struct sercomspi_regs_cfg *regs = _spi_get_regs((uint32_t)hw);
ASSERT(dev && hw);
1eba: 2f00 cmp r7, #0
1ebc: d05d beq.n 1f7a <_spi_m_sync_init+0xd6>
1ebe: 1e20 subs r0, r4, #0
1ec0: bf18 it ne
1ec2: 2001 movne r0, #1
1ec4: 4e3f ldr r6, [pc, #252] ; (1fc4 <_spi_m_sync_init+0x120>)
1ec6: 4940 ldr r1, [pc, #256] ; (1fc8 <_spi_m_sync_init+0x124>)
1ec8: f640 123f movw r2, #2367 ; 0x93f
1ecc: 47b0 blx r6
if (regs == NULL) {
1ece: 46b0 mov r8, r6
1ed0: 2d00 cmp r5, #0
1ed2: d070 beq.n 1fb6 <_spi_m_sync_init+0x112>
return ((Sercom *)hw)->SPI.SYNCBUSY.reg & reg;
1ed4: 69e3 ldr r3, [r4, #28]
1ed6: 4e3d ldr r6, [pc, #244] ; (1fcc <_spi_m_sync_init+0x128>)
return ERR_INVALID_ARG;
}
if (!hri_sercomspi_is_syncing(hw, SERCOM_SPI_SYNCBUSY_SWRST)) {
1ed8: f013 0f01 tst.w r3, #1
1edc: d113 bne.n 1f06 <_spi_m_sync_init+0x62>
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE);
1ede: 2103 movs r1, #3
1ee0: 4620 mov r0, r4
uint32_t mode = regs->ctrla & SERCOM_SPI_CTRLA_MODE_Msk;
1ee2: f8d5 9000 ldr.w r9, [r5]
1ee6: 47b0 blx r6
tmp = ((Sercom *)hw)->SPI.CTRLA.reg;
1ee8: 6823 ldr r3, [r4, #0]
if (hri_sercomspi_get_CTRLA_reg(hw, SERCOM_SPI_CTRLA_ENABLE)) {
1eea: 079b lsls r3, r3, #30
uint32_t mode = regs->ctrla & SERCOM_SPI_CTRLA_MODE_Msk;
1eec: f009 091c and.w r9, r9, #28
if (hri_sercomspi_get_CTRLA_reg(hw, SERCOM_SPI_CTRLA_ENABLE)) {
1ef0: d503 bpl.n 1efa <_spi_m_sync_init+0x56>
hri_sercomspi_clear_CTRLA_ENABLE_bit(hw);
1ef2: 4b37 ldr r3, [pc, #220] ; (1fd0 <_spi_m_sync_init+0x12c>)
1ef4: 4798 blx r3
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_ENABLE);
1ef6: 2102 movs r1, #2
1ef8: 47b0 blx r6
}
hri_sercomspi_write_CTRLA_reg(hw, SERCOM_SPI_CTRLA_SWRST | mode);
1efa: f049 0301 orr.w r3, r9, #1
((Sercom *)hw)->SPI.CTRLA.reg = data;
1efe: 6023 str r3, [r4, #0]
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE);
1f00: 2103 movs r1, #3
1f02: 4620 mov r0, r4
1f04: 47b0 blx r6
}
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST);
1f06: 2101 movs r1, #1
1f08: 4620 mov r0, r4
1f0a: 47b0 blx r6
dev->prvt = hw;
if ((regs->ctrla & SERCOM_SPI_CTRLA_MODE_Msk) == SERCOM_USART_CTRLA_MODE_SPI_SLAVE) {
1f0c: 682b ldr r3, [r5, #0]
1f0e: f8df 90c4 ldr.w r9, [pc, #196] ; 1fd4 <_spi_m_sync_init+0x130>
dev->prvt = hw;
1f12: 603c str r4, [r7, #0]
if ((regs->ctrla & SERCOM_SPI_CTRLA_MODE_Msk) == SERCOM_USART_CTRLA_MODE_SPI_SLAVE) {
1f14: f003 031c and.w r3, r3, #28
1f18: 2b08 cmp r3, #8
1f1a: d130 bne.n 1f7e <_spi_m_sync_init+0xda>
ASSERT(hw && regs);
1f1c: 492a ldr r1, [pc, #168] ; (1fc8 <_spi_m_sync_init+0x124>)
1f1e: 2001 movs r0, #1
1f20: f640 121d movw r2, #2333 ; 0x91d
1f24: 47c0 blx r8
hw, regs->ctrla & ~(SERCOM_SPI_CTRLA_IBON | SERCOM_SPI_CTRLA_ENABLE | SERCOM_SPI_CTRLA_SWRST));
1f26: 682b ldr r3, [r5, #0]
hri_sercomspi_write_CTRLA_reg(
1f28: ea03 0309 and.w r3, r3, r9
((Sercom *)hw)->SPI.CTRLA.reg = data;
1f2c: 6023 str r3, [r4, #0]
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE);
1f2e: 2103 movs r1, #3
1f30: 4620 mov r0, r4
1f32: 47b0 blx r6
(regs->ctrlb & ~(SERCOM_SPI_CTRLB_MSSEN))
1f34: 686b ldr r3, [r5, #4]
| (SERCOM_SPI_CTRLB_RXEN | SERCOM_SPI_CTRLB_SSDE | SERCOM_SPI_CTRLB_PLOADEN));
1f36: f423 3308 bic.w r3, r3, #139264 ; 0x22000
1f3a: f423 7310 bic.w r3, r3, #576 ; 0x240
hri_sercomspi_write_CTRLB_reg(hw,
1f3e: f443 3300 orr.w r3, r3, #131072 ; 0x20000
1f42: f443 7310 orr.w r3, r3, #576 ; 0x240
((Sercom *)hw)->SPI.CTRLB.reg = data;
1f46: 6063 str r3, [r4, #4]
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_MASK);
1f48: 2117 movs r1, #23
1f4a: 47b0 blx r6
hri_sercomspi_write_ADDR_reg(hw, regs->addr);
1f4c: 68ab ldr r3, [r5, #8]
((Sercom *)hw)->SPI.ADDR.reg = data;
1f4e: 6263 str r3, [r4, #36] ; 0x24
hri_sercomspi_write_DBGCTRL_reg(hw, regs->dbgctrl);
1f50: 7b6b ldrb r3, [r5, #13]
((Sercom *)hw)->SPI.DBGCTRL.reg = data;
1f52: f884 3030 strb.w r3, [r4, #48] ; 0x30
return ((Sercom *)hw)->SPI.SYNCBUSY.reg & reg;
1f56: 69e3 ldr r3, [r4, #28]
while (hri_sercomspi_is_syncing(hw, 0xFFFFFFFF))
1f58: 2b00 cmp r3, #0
1f5a: d1fc bne.n 1f56 <_spi_m_sync_init+0xb2>
} else {
_spi_load_regs_master(hw, regs);
}
/* Load character size from default hardware configuration */
dev->char_size = ((regs->ctrlb & SERCOM_SPI_CTRLB_CHSIZE_Msk) == 0) ? 1 : 2;
1f5c: 686b ldr r3, [r5, #4]
1f5e: f013 0f07 tst.w r3, #7
1f62: bf0c ite eq
1f64: 2301 moveq r3, #1
1f66: 2302 movne r3, #2
1f68: 713b strb r3, [r7, #4]
dev->dummy_byte = regs->dummy_byte;
1f6a: 7bab ldrb r3, [r5, #14]
1f6c: 7bea ldrb r2, [r5, #15]
1f6e: ea43 2302 orr.w r3, r3, r2, lsl #8
1f72: 80fb strh r3, [r7, #6]
return ERR_NONE;
1f74: 2000 movs r0, #0
}
1f76: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
ASSERT(dev && hw);
1f7a: 4638 mov r0, r7
1f7c: e7a2 b.n 1ec4 <_spi_m_sync_init+0x20>
ASSERT(hw && regs);
1f7e: 4912 ldr r1, [pc, #72] ; (1fc8 <_spi_m_sync_init+0x124>)
1f80: 2001 movs r0, #1
1f82: f640 1209 movw r2, #2313 ; 0x909
1f86: 47c0 blx r8
hw, regs->ctrla & ~(SERCOM_SPI_CTRLA_IBON | SERCOM_SPI_CTRLA_ENABLE | SERCOM_SPI_CTRLA_SWRST));
1f88: 682b ldr r3, [r5, #0]
hri_sercomspi_write_CTRLA_reg(
1f8a: ea03 0309 and.w r3, r3, r9
((Sercom *)hw)->SPI.CTRLA.reg = data;
1f8e: 6023 str r3, [r4, #0]
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE);
1f90: 2103 movs r1, #3
1f92: 4620 mov r0, r4
1f94: 47b0 blx r6
(regs->ctrlb
1f96: 686b ldr r3, [r5, #4]
| (SERCOM_SPI_CTRLB_RXEN));
1f98: f423 3338 bic.w r3, r3, #188416 ; 0x2e000
1f9c: f423 7310 bic.w r3, r3, #576 ; 0x240
hri_sercomspi_write_CTRLB_reg(
1fa0: f443 3300 orr.w r3, r3, #131072 ; 0x20000
((Sercom *)hw)->SPI.CTRLB.reg = data;
1fa4: 6063 str r3, [r4, #4]
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_MASK);
1fa6: 2117 movs r1, #23
1fa8: 47b0 blx r6
hri_sercomspi_write_BAUD_reg(hw, regs->baud);
1faa: 7b2b ldrb r3, [r5, #12]
((Sercom *)hw)->SPI.BAUD.reg = data;
1fac: 7323 strb r3, [r4, #12]
hri_sercomspi_write_DBGCTRL_reg(hw, regs->dbgctrl);
1fae: 7b6b ldrb r3, [r5, #13]
((Sercom *)hw)->SPI.DBGCTRL.reg = data;
1fb0: f884 3030 strb.w r3, [r4, #48] ; 0x30
}
1fb4: e7d2 b.n 1f5c <_spi_m_sync_init+0xb8>
return ERR_INVALID_ARG;
1fb6: f06f 000c mvn.w r0, #12
1fba: e7dc b.n 1f76 <_spi_m_sync_init+0xd2>
1fbc: 00001d75 .word 0x00001d75
1fc0: 000030c4 .word 0x000030c4
1fc4: 00001605 .word 0x00001605
1fc8: 00003071 .word 0x00003071
1fcc: 00001d3d .word 0x00001d3d
1fd0: 00001d4d .word 0x00001d4d
1fd4: fffffefc .word 0xfffffefc
00001fd8 <_spi_m_sync_trans>:
return ERR_NONE;
}
int32_t _spi_m_sync_trans(struct _spi_m_sync_dev *dev, const struct spi_msg *msg)
{
1fd8: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
void * hw = dev->prvt;
1fdc: 6804 ldr r4, [r0, #0]
int32_t rc = 0;
struct _spi_trans_ctrl ctrl = {msg->txbuf, msg->rxbuf, 0, 0, dev->char_size};
1fde: f890 8004 ldrb.w r8, [r0, #4]
ASSERT(dev && hw);
1fe2: 4b2a ldr r3, [pc, #168] ; (208c <_spi_m_sync_trans+0xb4>)
{
1fe4: 4607 mov r7, r0
ASSERT(dev && hw);
1fe6: 1e20 subs r0, r4, #0
struct _spi_trans_ctrl ctrl = {msg->txbuf, msg->rxbuf, 0, 0, dev->char_size};
1fe8: e9d1 6500 ldrd r6, r5, [r1]
ASSERT(dev && hw);
1fec: f640 22a3 movw r2, #2723 ; 0xaa3
1ff0: bf18 it ne
1ff2: 2001 movne r0, #1
{
1ff4: 4689 mov r9, r1
ASSERT(dev && hw);
1ff6: 4926 ldr r1, [pc, #152] ; (2090 <_spi_m_sync_trans+0xb8>)
1ff8: 4798 blx r3
return ((Sercom *)hw)->SPI.SYNCBUSY.reg & reg;
1ffa: 69e2 ldr r2, [r4, #28]
/* If settings are not applied (pending), we can not go on */
if (hri_sercomspi_is_syncing(
1ffc: f012 0207 ands.w r2, r2, #7
2000: d13e bne.n 2080 <_spi_m_sync_trans+0xa8>
hri_sercomspi_wait_for_sync(hw, SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE);
2002: 4b24 ldr r3, [pc, #144] ; (2094 <_spi_m_sync_trans+0xbc>)
2004: 2103 movs r1, #3
2006: 4620 mov r0, r4
2008: 4798 blx r3
tmp = ((Sercom *)hw)->SPI.CTRLA.reg;
200a: 6823 ldr r3, [r4, #0]
hw, (SERCOM_SPI_SYNCBUSY_SWRST | SERCOM_SPI_SYNCBUSY_ENABLE | SERCOM_SPI_SYNCBUSY_CTRLB))) {
return ERR_BUSY;
}
/* SPI must be enabled to start synchronous transfer */
if (!hri_sercomspi_get_CTRLA_ENABLE_bit(hw)) {
200c: 0799 lsls r1, r3, #30
200e: d53a bpl.n 2086 <_spi_m_sync_trans+0xae>
struct _spi_trans_ctrl ctrl = {msg->txbuf, msg->rxbuf, 0, 0, dev->char_size};
2010: 4611 mov r1, r2
return ((Sercom *)hw)->SPI.INTFLAG.reg;
2012: 7e23 ldrb r3, [r4, #24]
2014: b2d8 uxtb r0, r3
if (!(iflag & SERCOM_SPI_INTFLAG_RXC)) {
2016: 075b lsls r3, r3, #29
2018: d40f bmi.n 203a <_spi_m_sync_trans+0x62>
uint32_t iflag = hri_sercomspi_read_INTFLAG_reg(hw);
if (!_spi_rx_check_and_receive(hw, iflag, &ctrl)) {
/* In master mode, do not start next byte before previous byte received
* to make better output waveform */
if (ctrl.rxcnt >= ctrl.txcnt) {
201a: 428a cmp r2, r1
201c: d818 bhi.n 2050 <_spi_m_sync_trans+0x78>
if (!(SERCOM_SPI_INTFLAG_DRE & iflag)) {
201e: 07c3 lsls r3, r0, #31
2020: d516 bpl.n 2050 <_spi_m_sync_trans+0x78>
_spi_tx_check_and_send(hw, iflag, &ctrl, dev->dummy_byte);
2022: 88fb ldrh r3, [r7, #6]
if (ctrl->txbuf) {
2024: b136 cbz r6, 2034 <_spi_m_sync_trans+0x5c>
if (ctrl->char_size > 1) {
2026: f1b8 0f01 cmp.w r8, #1
data = *ctrl->txbuf++;
202a: 7833 ldrb r3, [r6, #0]
data |= (*ctrl->txbuf) << 8;
202c: bf8c ite hi
202e: f836 3b02 ldrhhi.w r3, [r6], #2
data = *ctrl->txbuf++;
2032: 3601 addls r6, #1
ctrl->txcnt++;
2034: 3201 adds r2, #1
((Sercom *)hw)->SPI.DATA.reg = data;
2036: 62a3 str r3, [r4, #40] ; 0x28
}
2038: e00a b.n 2050 <_spi_m_sync_trans+0x78>
return ((Sercom *)hw)->SPI.DATA.reg;
203a: 6aa3 ldr r3, [r4, #40] ; 0x28
if (ctrl->rxbuf) {
203c: b13d cbz r5, 204e <_spi_m_sync_trans+0x76>
if (ctrl->char_size > 1) {
203e: f1b8 0f01 cmp.w r8, #1
*ctrl->rxbuf++ = (uint8_t)data;
2042: 702b strb r3, [r5, #0]
*ctrl->rxbuf++ = (uint8_t)(data >> 8);
2044: bf85 ittet hi
2046: 0a1b lsrhi r3, r3, #8
2048: 706b strbhi r3, [r5, #1]
*ctrl->rxbuf++ = (uint8_t)data;
204a: 3501 addls r5, #1
*ctrl->rxbuf++ = (uint8_t)(data >> 8);
204c: 3502 addhi r5, #2
ctrl->rxcnt++;
204e: 3101 adds r1, #1
if (SERCOM_SPI_INTFLAG_ERROR & iflag) {
2050: 0600 lsls r0, r0, #24
2052: d407 bmi.n 2064 <_spi_m_sync_trans+0x8c>
rc = _spi_err_check(iflag, hw);
if (rc < 0) {
break;
}
if (ctrl.txcnt >= msg->size && ctrl.rxcnt >= msg->size) {
2054: f8d9 3008 ldr.w r3, [r9, #8]
2058: 4293 cmp r3, r2
205a: d8da bhi.n 2012 <_spi_m_sync_trans+0x3a>
205c: 428b cmp r3, r1
205e: d8d8 bhi.n 2012 <_spi_m_sync_trans+0x3a>
rc = ctrl.txcnt;
2060: 4610 mov r0, r2
while (!(hri_sercomspi_get_INTFLAG_reg(hw, SERCOM_SPI_INTFLAG_TXC | SERCOM_SPI_INTFLAG_DRE))) {
2062: e006 b.n 2072 <_spi_m_sync_trans+0x9a>
}
static inline void hri_sercomspi_clear_STATUS_reg(const void *const hw, hri_sercomspi_status_reg_t mask)
{
SERCOM_CRITICAL_SECTION_ENTER();
((Sercom *)hw)->SPI.STATUS.reg = mask;
2064: f64f 73ff movw r3, #65535 ; 0xffff
2068: 8363 strh r3, [r4, #26]
((Sercom *)hw)->SPI.INTFLAG.reg = mask;
206a: 2380 movs r3, #128 ; 0x80
206c: 7623 strb r3, [r4, #24]
return ERR_OVERFLOW;
206e: f06f 0012 mvn.w r0, #18
tmp = ((Sercom *)hw)->SPI.INTFLAG.reg;
2072: 7e23 ldrb r3, [r4, #24]
while (!(hri_sercomspi_get_INTFLAG_reg(hw, SERCOM_SPI_INTFLAG_TXC | SERCOM_SPI_INTFLAG_DRE))) {
2074: 079b lsls r3, r3, #30
2076: d0fc beq.n 2072 <_spi_m_sync_trans+0x9a>
((Sercom *)hw)->SPI.INTFLAG.reg = mask;
2078: 2303 movs r3, #3
207a: 7623 strb r3, [r4, #24]
}
/* Wait until SPI bus idle */
_spi_wait_bus_idle(hw);
return rc;
}
207c: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
return ERR_BUSY;
2080: f06f 0003 mvn.w r0, #3
2084: e7fa b.n 207c <_spi_m_sync_trans+0xa4>
return ERR_NOT_INITIALIZED;
2086: f06f 0013 mvn.w r0, #19
208a: e7f7 b.n 207c <_spi_m_sync_trans+0xa4>
208c: 00001605 .word 0x00001605
2090: 00003071 .word 0x00003071
2094: 00001d3d .word 0x00001d3d
00002098 <atomic_enter_critical>:
__ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory");
2098: f3ef 8310 mrs r3, PRIMASK
/**
* \brief Disable interrupts, enter critical section
*/
void atomic_enter_critical(hal_atomic_t volatile *atomic)
{
*atomic = __get_PRIMASK();
209c: 6003 str r3, [r0, #0]
__ASM volatile ("cpsid i" : : : "memory");
209e: b672 cpsid i
\details Ensures the apparent order of the explicit memory operations before
and after the instruction, without ensuring their completion.
*/
__STATIC_FORCEINLINE void __DMB(void)
{
__ASM volatile ("dmb 0xF":::"memory");
20a0: f3bf 8f5f dmb sy
__disable_irq();
__DMB();
}
20a4: 4770 bx lr
000020a6 <atomic_leave_critical>:
20a6: f3bf 8f5f dmb sy
* \brief Exit atomic section
*/
void atomic_leave_critical(hal_atomic_t volatile *atomic)
{
__DMB();
__set_PRIMASK(*atomic);
20aa: 6803 ldr r3, [r0, #0]
__ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
20ac: f383 8810 msr PRIMASK, r3
}
20b0: 4770 bx lr
...
000020b4 <atmel_start_init>:
/**
* Initializes MCU, drivers and middleware in the project
**/
void atmel_start_init(void)
{
20b4: b510 push {r4, lr}
system_init();
20b6: 4b04 ldr r3, [pc, #16] ; (20c8 <atmel_start_init+0x14>)
20b8: 4798 blx r3
sd_mmc_stack_init();
20ba: 4b04 ldr r3, [pc, #16] ; (20cc <atmel_start_init+0x18>)
20bc: 4798 blx r3
diskio_init();
}
20be: e8bd 4010 ldmia.w sp!, {r4, lr}
diskio_init();
20c2: 4b03 ldr r3, [pc, #12] ; (20d0 <atmel_start_init+0x1c>)
20c4: 4718 bx r3
20c6: bf00 nop
20c8: 00001d05 .word 0x00001d05
20cc: 000003c5 .word 0x000003c5
20d0: 00001851 .word 0x00001851
000020d4 <pprintf>:
return 0;
}
int pprintf(const char* fmt, ...)
{
20d4: b40f push {r0, r1, r2, r3}
20d6: b530 push {r4, r5, lr}
20d8: b0c3 sub sp, #268 ; 0x10c
size_t size_str = strlen(fmt);
20da: 4c11 ldr r4, [pc, #68] ; (2120 <pprintf+0x4c>)
{
20dc: 9d46 ldr r5, [sp, #280] ; 0x118
size_t size_str = strlen(fmt);
20de: 4628 mov r0, r5
20e0: 47a0 blx r4
if (size_str >= MAX_PRINTF_BUFFER)
20e2: 28ff cmp r0, #255 ; 0xff
20e4: d818 bhi.n 2118 <pprintf+0x44>
{
return -1;
}
uint8_t printf_buffer[MAX_PRINTF_BUFFER];
memset(printf_buffer, '\0', MAX_PRINTF_BUFFER);
20e6: 4b0f ldr r3, [pc, #60] ; (2124 <pprintf+0x50>)
20e8: f44f 7280 mov.w r2, #256 ; 0x100
20ec: 2100 movs r1, #0
20ee: a802 add r0, sp, #8
20f0: 4798 blx r3
va_list args;
va_start(args, fmt);
20f2: aa47 add r2, sp, #284 ; 0x11c
vsprintf((char*)printf_buffer, fmt, args);
20f4: 4b0c ldr r3, [pc, #48] ; (2128 <pprintf+0x54>)
va_start(args, fmt);
20f6: 9201 str r2, [sp, #4]
vsprintf((char*)printf_buffer, fmt, args);
20f8: 4629 mov r1, r5
20fa: a802 add r0, sp, #8
20fc: 4798 blx r3
va_end(args);
return io_write(debug_io, (const uint8_t*)printf_buffer, strlen((const char*)printf_buffer));
20fe: a802 add r0, sp, #8
2100: 47a0 blx r4
2102: 4b0a ldr r3, [pc, #40] ; (212c <pprintf+0x58>)
2104: b282 uxth r2, r0
2106: a902 add r1, sp, #8
2108: 6818 ldr r0, [r3, #0]
210a: 4b09 ldr r3, [pc, #36] ; (2130 <pprintf+0x5c>)
210c: 4798 blx r3
}
210e: b043 add sp, #268 ; 0x10c
2110: e8bd 4030 ldmia.w sp!, {r4, r5, lr}
2114: b004 add sp, #16
2116: 4770 bx lr
return -1;
2118: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff
211c: e7f7 b.n 210e <pprintf+0x3a>
211e: bf00 nop
2120: 000021f9 .word 0x000021f9
2124: 000021e9 .word 0x000021e9
2128: 00002235 .word 0x00002235
212c: 20000350 .word 0x20000350
2130: 000002a5 .word 0x000002a5
00002134 <pdebug_init>:
{
2134: b510 push {r4, lr}
usart_sync_get_io_descriptor(&USART_DBG, &debug_io);
2136: 4c06 ldr r4, [pc, #24] ; (2150 <pdebug_init+0x1c>)
2138: 4906 ldr r1, [pc, #24] ; (2154 <pdebug_init+0x20>)
213a: 4b07 ldr r3, [pc, #28] ; (2158 <pdebug_init+0x24>)
213c: 4620 mov r0, r4
213e: 4798 blx r3
usart_sync_enable(&USART_DBG);
2140: 4b06 ldr r3, [pc, #24] ; (215c <pdebug_init+0x28>)
2142: 4620 mov r0, r4
2144: 4798 blx r3
printf("Debug Initialized\n");
2146: 4b06 ldr r3, [pc, #24] ; (2160 <pdebug_init+0x2c>)
2148: 4806 ldr r0, [pc, #24] ; (2164 <pdebug_init+0x30>)
214a: 4798 blx r3
}
214c: 2000 movs r0, #0
214e: bd10 pop {r4, pc}
2150: 20000310 .word 0x20000310
2154: 20000350 .word 0x20000350
2158: 000017e9 .word 0x000017e9
215c: 000017bd .word 0x000017bd
2160: 000020d5 .word 0x000020d5
2164: 000030d5 .word 0x000030d5
00002168 <passert>:
void passert(const bool cond, const char* msg_failure, const char* file, const int line)
{
2168: b510 push {r4, lr}
216a: 460c mov r4, r1
216c: 4619 mov r1, r3
if(!cond)
216e: b920 cbnz r0, 217a <passert+0x12>
{
printf("Assert Failure at line %d, %s: %s\n",
2170: 4623 mov r3, r4
2172: 4802 ldr r0, [pc, #8] ; (217c <passert+0x14>)
2174: 4c02 ldr r4, [pc, #8] ; (2180 <passert+0x18>)
2176: 47a0 blx r4
line,
file,
msg_failure);
for(;;){}
2178: e7fe b.n 2178 <passert+0x10>
}
}
217a: bd10 pop {r4, pc}
217c: 000030e8 .word 0x000030e8
2180: 000020d5 .word 0x000020d5
00002184 <__libc_init_array>:
2184: b570 push {r4, r5, r6, lr}
2186: 4d0d ldr r5, [pc, #52] ; (21bc <__libc_init_array+0x38>)
2188: 4c0d ldr r4, [pc, #52] ; (21c0 <__libc_init_array+0x3c>)
218a: 1b64 subs r4, r4, r5
218c: 10a4 asrs r4, r4, #2
218e: 2600 movs r6, #0
2190: 42a6 cmp r6, r4
2192: d109 bne.n 21a8 <__libc_init_array+0x24>
2194: 4d0b ldr r5, [pc, #44] ; (21c4 <__libc_init_array+0x40>)
2196: 4c0c ldr r4, [pc, #48] ; (21c8 <__libc_init_array+0x44>)
2198: f001 f802 bl 31a0 <_init>
219c: 1b64 subs r4, r4, r5
219e: 10a4 asrs r4, r4, #2
21a0: 2600 movs r6, #0
21a2: 42a6 cmp r6, r4
21a4: d105 bne.n 21b2 <__libc_init_array+0x2e>
21a6: bd70 pop {r4, r5, r6, pc}
21a8: f855 3b04 ldr.w r3, [r5], #4
21ac: 4798 blx r3
21ae: 3601 adds r6, #1
21b0: e7ee b.n 2190 <__libc_init_array+0xc>
21b2: f855 3b04 ldr.w r3, [r5], #4
21b6: 4798 blx r3
21b8: 3601 adds r6, #1
21ba: e7f2 b.n 21a2 <__libc_init_array+0x1e>
21bc: 000031ac .word 0x000031ac
21c0: 000031ac .word 0x000031ac
21c4: 000031ac .word 0x000031ac
21c8: 000031b0 .word 0x000031b0
000021cc <memcpy>:
21cc: 440a add r2, r1
21ce: 4291 cmp r1, r2
21d0: f100 33ff add.w r3, r0, #4294967295 ; 0xffffffff
21d4: d100 bne.n 21d8 <memcpy+0xc>
21d6: 4770 bx lr
21d8: b510 push {r4, lr}
21da: f811 4b01 ldrb.w r4, [r1], #1
21de: f803 4f01 strb.w r4, [r3, #1]!
21e2: 4291 cmp r1, r2
21e4: d1f9 bne.n 21da <memcpy+0xe>
21e6: bd10 pop {r4, pc}
000021e8 <memset>:
21e8: 4402 add r2, r0
21ea: 4603 mov r3, r0
21ec: 4293 cmp r3, r2
21ee: d100 bne.n 21f2 <memset+0xa>
21f0: 4770 bx lr
21f2: f803 1b01 strb.w r1, [r3], #1
21f6: e7f9 b.n 21ec <memset+0x4>
000021f8 <strlen>:
21f8: 4603 mov r3, r0
21fa: f813 2b01 ldrb.w r2, [r3], #1
21fe: 2a00 cmp r2, #0
2200: d1fb bne.n 21fa <strlen+0x2>
2202: 1a18 subs r0, r3, r0
2204: 3801 subs r0, #1
2206: 4770 bx lr
00002208 <_vsiprintf_r>:
2208: b500 push {lr}
220a: b09b sub sp, #108 ; 0x6c
220c: 9100 str r1, [sp, #0]
220e: 9104 str r1, [sp, #16]
2210: f06f 4100 mvn.w r1, #2147483648 ; 0x80000000
2214: 9105 str r1, [sp, #20]
2216: 9102 str r1, [sp, #8]
2218: 4905 ldr r1, [pc, #20] ; (2230 <_vsiprintf_r+0x28>)
221a: 9103 str r1, [sp, #12]
221c: 4669 mov r1, sp
221e: f000 f8cb bl 23b8 <_svfiprintf_r>
2222: 9b00 ldr r3, [sp, #0]
2224: 2200 movs r2, #0
2226: 701a strb r2, [r3, #0]
2228: b01b add sp, #108 ; 0x6c
222a: f85d fb04 ldr.w pc, [sp], #4
222e: bf00 nop
2230: ffff0208 .word 0xffff0208
00002234 <vsiprintf>:
2234: 4613 mov r3, r2
2236: 460a mov r2, r1
2238: 4601 mov r1, r0
223a: 4802 ldr r0, [pc, #8] ; (2244 <vsiprintf+0x10>)
223c: 6800 ldr r0, [r0, #0]
223e: f7ff bfe3 b.w 2208 <_vsiprintf_r>
2242: bf00 nop
2244: 20000008 .word 0x20000008
00002248 <__retarget_lock_acquire_recursive>:
2248: 4770 bx lr
0000224a <__retarget_lock_release_recursive>:
224a: 4770 bx lr
0000224c <_malloc_r>:
224c: b5f8 push {r3, r4, r5, r6, r7, lr}
224e: 1ccd adds r5, r1, #3
2250: f025 0503 bic.w r5, r5, #3
2254: 3508 adds r5, #8
2256: 2d0c cmp r5, #12
2258: bf38 it cc
225a: 250c movcc r5, #12
225c: 2d00 cmp r5, #0
225e: 4606 mov r6, r0
2260: db01 blt.n 2266 <_malloc_r+0x1a>
2262: 42a9 cmp r1, r5
2264: d903 bls.n 226e <_malloc_r+0x22>
2266: 230c movs r3, #12
2268: 6033 str r3, [r6, #0]
226a: 2000 movs r0, #0
226c: bdf8 pop {r3, r4, r5, r6, r7, pc}
226e: f000 fbb1 bl 29d4 <__malloc_lock>
2272: 4921 ldr r1, [pc, #132] ; (22f8 <_malloc_r+0xac>)
2274: 680a ldr r2, [r1, #0]
2276: 4614 mov r4, r2
2278: b99c cbnz r4, 22a2 <_malloc_r+0x56>
227a: 4f20 ldr r7, [pc, #128] ; (22fc <_malloc_r+0xb0>)
227c: 683b ldr r3, [r7, #0]
227e: b923 cbnz r3, 228a <_malloc_r+0x3e>
2280: 4621 mov r1, r4
2282: 4630 mov r0, r6
2284: f000 fb2c bl 28e0 <_sbrk_r>
2288: 6038 str r0, [r7, #0]
228a: 4629 mov r1, r5
228c: 4630 mov r0, r6
228e: f000 fb27 bl 28e0 <_sbrk_r>
2292: 1c43 adds r3, r0, #1
2294: d123 bne.n 22de <_malloc_r+0x92>
2296: 230c movs r3, #12
2298: 6033 str r3, [r6, #0]
229a: 4630 mov r0, r6
229c: f000 fba0 bl 29e0 <__malloc_unlock>
22a0: e7e3 b.n 226a <_malloc_r+0x1e>
22a2: 6823 ldr r3, [r4, #0]
22a4: 1b5b subs r3, r3, r5
22a6: d417 bmi.n 22d8 <_malloc_r+0x8c>
22a8: 2b0b cmp r3, #11
22aa: d903 bls.n 22b4 <_malloc_r+0x68>
22ac: 6023 str r3, [r4, #0]
22ae: 441c add r4, r3
22b0: 6025 str r5, [r4, #0]
22b2: e004 b.n 22be <_malloc_r+0x72>
22b4: 6863 ldr r3, [r4, #4]
22b6: 42a2 cmp r2, r4
22b8: bf0c ite eq
22ba: 600b streq r3, [r1, #0]
22bc: 6053 strne r3, [r2, #4]
22be: 4630 mov r0, r6
22c0: f000 fb8e bl 29e0 <__malloc_unlock>
22c4: f104 000b add.w r0, r4, #11
22c8: 1d23 adds r3, r4, #4
22ca: f020 0007 bic.w r0, r0, #7
22ce: 1ac2 subs r2, r0, r3
22d0: d0cc beq.n 226c <_malloc_r+0x20>
22d2: 1a1b subs r3, r3, r0
22d4: 50a3 str r3, [r4, r2]
22d6: e7c9 b.n 226c <_malloc_r+0x20>
22d8: 4622 mov r2, r4
22da: 6864 ldr r4, [r4, #4]
22dc: e7cc b.n 2278 <_malloc_r+0x2c>
22de: 1cc4 adds r4, r0, #3
22e0: f024 0403 bic.w r4, r4, #3
22e4: 42a0 cmp r0, r4
22e6: d0e3 beq.n 22b0 <_malloc_r+0x64>
22e8: 1a21 subs r1, r4, r0
22ea: 4630 mov r0, r6
22ec: f000 faf8 bl 28e0 <_sbrk_r>
22f0: 3001 adds r0, #1
22f2: d1dd bne.n 22b0 <_malloc_r+0x64>
22f4: e7cf b.n 2296 <_malloc_r+0x4a>
22f6: bf00 nop
22f8: 20000354 .word 0x20000354
22fc: 20000358 .word 0x20000358
00002300 <__ssputs_r>:
2300: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
2304: 688e ldr r6, [r1, #8]
2306: 429e cmp r6, r3
2308: 4682 mov sl, r0
230a: 460c mov r4, r1
230c: 4690 mov r8, r2
230e: 461f mov r7, r3
2310: d838 bhi.n 2384 <__ssputs_r+0x84>
2312: 898a ldrh r2, [r1, #12]
2314: f412 6f90 tst.w r2, #1152 ; 0x480
2318: d032 beq.n 2380 <__ssputs_r+0x80>
231a: 6825 ldr r5, [r4, #0]
231c: 6909 ldr r1, [r1, #16]
231e: eba5 0901 sub.w r9, r5, r1
2322: 6965 ldr r5, [r4, #20]
2324: eb05 0545 add.w r5, r5, r5, lsl #1
2328: eb05 75d5 add.w r5, r5, r5, lsr #31
232c: 3301 adds r3, #1
232e: 444b add r3, r9
2330: 106d asrs r5, r5, #1
2332: 429d cmp r5, r3
2334: bf38 it cc
2336: 461d movcc r5, r3
2338: 0553 lsls r3, r2, #21
233a: d531 bpl.n 23a0 <__ssputs_r+0xa0>
233c: 4629 mov r1, r5
233e: f7ff ff85 bl 224c <_malloc_r>
2342: 4606 mov r6, r0
2344: b950 cbnz r0, 235c <__ssputs_r+0x5c>
2346: 230c movs r3, #12
2348: f8ca 3000 str.w r3, [sl]
234c: 89a3 ldrh r3, [r4, #12]
234e: f043 0340 orr.w r3, r3, #64 ; 0x40
2352: 81a3 strh r3, [r4, #12]
2354: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff
2358: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
235c: 6921 ldr r1, [r4, #16]
235e: 464a mov r2, r9
2360: f7ff ff34 bl 21cc <memcpy>
2364: 89a3 ldrh r3, [r4, #12]
2366: f423 6390 bic.w r3, r3, #1152 ; 0x480
236a: f043 0380 orr.w r3, r3, #128 ; 0x80
236e: 81a3 strh r3, [r4, #12]
2370: 6126 str r6, [r4, #16]
2372: 6165 str r5, [r4, #20]
2374: 444e add r6, r9
2376: eba5 0509 sub.w r5, r5, r9
237a: 6026 str r6, [r4, #0]
237c: 60a5 str r5, [r4, #8]
237e: 463e mov r6, r7
2380: 42be cmp r6, r7
2382: d900 bls.n 2386 <__ssputs_r+0x86>
2384: 463e mov r6, r7
2386: 4632 mov r2, r6
2388: 6820 ldr r0, [r4, #0]
238a: 4641 mov r1, r8
238c: f000 fb08 bl 29a0 <memmove>
2390: 68a3 ldr r3, [r4, #8]
2392: 6822 ldr r2, [r4, #0]
2394: 1b9b subs r3, r3, r6
2396: 4432 add r2, r6
2398: 60a3 str r3, [r4, #8]
239a: 6022 str r2, [r4, #0]
239c: 2000 movs r0, #0
239e: e7db b.n 2358 <__ssputs_r+0x58>
23a0: 462a mov r2, r5
23a2: f000 fb71 bl 2a88 <_realloc_r>
23a6: 4606 mov r6, r0
23a8: 2800 cmp r0, #0
23aa: d1e1 bne.n 2370 <__ssputs_r+0x70>
23ac: 6921 ldr r1, [r4, #16]
23ae: 4650 mov r0, sl
23b0: f000 fb1c bl 29ec <_free_r>
23b4: e7c7 b.n 2346 <__ssputs_r+0x46>
...
000023b8 <_svfiprintf_r>:
23b8: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
23bc: 4698 mov r8, r3
23be: 898b ldrh r3, [r1, #12]
23c0: 061b lsls r3, r3, #24
23c2: b09d sub sp, #116 ; 0x74
23c4: 4607 mov r7, r0
23c6: 460d mov r5, r1
23c8: 4614 mov r4, r2
23ca: d50e bpl.n 23ea <_svfiprintf_r+0x32>
23cc: 690b ldr r3, [r1, #16]
23ce: b963 cbnz r3, 23ea <_svfiprintf_r+0x32>
23d0: 2140 movs r1, #64 ; 0x40
23d2: f7ff ff3b bl 224c <_malloc_r>
23d6: 6028 str r0, [r5, #0]
23d8: 6128 str r0, [r5, #16]
23da: b920 cbnz r0, 23e6 <_svfiprintf_r+0x2e>
23dc: 230c movs r3, #12
23de: 603b str r3, [r7, #0]
23e0: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff
23e4: e0d1 b.n 258a <_svfiprintf_r+0x1d2>
23e6: 2340 movs r3, #64 ; 0x40
23e8: 616b str r3, [r5, #20]
23ea: 2300 movs r3, #0
23ec: 9309 str r3, [sp, #36] ; 0x24
23ee: 2320 movs r3, #32
23f0: f88d 3029 strb.w r3, [sp, #41] ; 0x29
23f4: f8cd 800c str.w r8, [sp, #12]
23f8: 2330 movs r3, #48 ; 0x30
23fa: f8df 81a8 ldr.w r8, [pc, #424] ; 25a4 <_svfiprintf_r+0x1ec>
23fe: f88d 302a strb.w r3, [sp, #42] ; 0x2a
2402: f04f 0901 mov.w r9, #1
2406: 4623 mov r3, r4
2408: 469a mov sl, r3
240a: f813 2b01 ldrb.w r2, [r3], #1
240e: b10a cbz r2, 2414 <_svfiprintf_r+0x5c>
2410: 2a25 cmp r2, #37 ; 0x25
2412: d1f9 bne.n 2408 <_svfiprintf_r+0x50>
2414: ebba 0b04 subs.w fp, sl, r4
2418: d00b beq.n 2432 <_svfiprintf_r+0x7a>
241a: 465b mov r3, fp
241c: 4622 mov r2, r4
241e: 4629 mov r1, r5
2420: 4638 mov r0, r7
2422: f7ff ff6d bl 2300 <__ssputs_r>
2426: 3001 adds r0, #1
2428: f000 80aa beq.w 2580 <_svfiprintf_r+0x1c8>
242c: 9a09 ldr r2, [sp, #36] ; 0x24
242e: 445a add r2, fp
2430: 9209 str r2, [sp, #36] ; 0x24
2432: f89a 3000 ldrb.w r3, [sl]
2436: 2b00 cmp r3, #0
2438: f000 80a2 beq.w 2580 <_svfiprintf_r+0x1c8>
243c: 2300 movs r3, #0
243e: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
2442: e9cd 2305 strd r2, r3, [sp, #20]
2446: f10a 0a01 add.w sl, sl, #1
244a: 9304 str r3, [sp, #16]
244c: 9307 str r3, [sp, #28]
244e: f88d 3053 strb.w r3, [sp, #83] ; 0x53
2452: 931a str r3, [sp, #104] ; 0x68
2454: 4654 mov r4, sl
2456: 2205 movs r2, #5
2458: f814 1b01 ldrb.w r1, [r4], #1
245c: 4851 ldr r0, [pc, #324] ; (25a4 <_svfiprintf_r+0x1ec>)
245e: f000 fa4f bl 2900 <memchr>
2462: 9a04 ldr r2, [sp, #16]
2464: b9d8 cbnz r0, 249e <_svfiprintf_r+0xe6>
2466: 06d0 lsls r0, r2, #27
2468: bf44 itt mi
246a: 2320 movmi r3, #32
246c: f88d 3053 strbmi.w r3, [sp, #83] ; 0x53
2470: 0711 lsls r1, r2, #28
2472: bf44 itt mi
2474: 232b movmi r3, #43 ; 0x2b
2476: f88d 3053 strbmi.w r3, [sp, #83] ; 0x53
247a: f89a 3000 ldrb.w r3, [sl]
247e: 2b2a cmp r3, #42 ; 0x2a
2480: d015 beq.n 24ae <_svfiprintf_r+0xf6>
2482: 9a07 ldr r2, [sp, #28]
2484: 4654 mov r4, sl
2486: 2000 movs r0, #0
2488: f04f 0c0a mov.w ip, #10
248c: 4621 mov r1, r4
248e: f811 3b01 ldrb.w r3, [r1], #1
2492: 3b30 subs r3, #48 ; 0x30
2494: 2b09 cmp r3, #9
2496: d94e bls.n 2536 <_svfiprintf_r+0x17e>
2498: b1b0 cbz r0, 24c8 <_svfiprintf_r+0x110>
249a: 9207 str r2, [sp, #28]
249c: e014 b.n 24c8 <_svfiprintf_r+0x110>
249e: eba0 0308 sub.w r3, r0, r8
24a2: fa09 f303 lsl.w r3, r9, r3
24a6: 4313 orrs r3, r2
24a8: 9304 str r3, [sp, #16]
24aa: 46a2 mov sl, r4
24ac: e7d2 b.n 2454 <_svfiprintf_r+0x9c>
24ae: 9b03 ldr r3, [sp, #12]
24b0: 1d19 adds r1, r3, #4
24b2: 681b ldr r3, [r3, #0]
24b4: 9103 str r1, [sp, #12]
24b6: 2b00 cmp r3, #0
24b8: bfbb ittet lt
24ba: 425b neglt r3, r3
24bc: f042 0202 orrlt.w r2, r2, #2
24c0: 9307 strge r3, [sp, #28]
24c2: 9307 strlt r3, [sp, #28]
24c4: bfb8 it lt
24c6: 9204 strlt r2, [sp, #16]
24c8: 7823 ldrb r3, [r4, #0]
24ca: 2b2e cmp r3, #46 ; 0x2e
24cc: d10c bne.n 24e8 <_svfiprintf_r+0x130>
24ce: 7863 ldrb r3, [r4, #1]
24d0: 2b2a cmp r3, #42 ; 0x2a
24d2: d135 bne.n 2540 <_svfiprintf_r+0x188>
24d4: 9b03 ldr r3, [sp, #12]
24d6: 1d1a adds r2, r3, #4
24d8: 681b ldr r3, [r3, #0]
24da: 9203 str r2, [sp, #12]
24dc: 2b00 cmp r3, #0
24de: bfb8 it lt
24e0: f04f 33ff movlt.w r3, #4294967295 ; 0xffffffff
24e4: 3402 adds r4, #2
24e6: 9305 str r3, [sp, #20]
24e8: f8df a0c8 ldr.w sl, [pc, #200] ; 25b4 <_svfiprintf_r+0x1fc>
24ec: 7821 ldrb r1, [r4, #0]
24ee: 2203 movs r2, #3
24f0: 4650 mov r0, sl
24f2: f000 fa05 bl 2900 <memchr>
24f6: b140 cbz r0, 250a <_svfiprintf_r+0x152>
24f8: 2340 movs r3, #64 ; 0x40
24fa: eba0 000a sub.w r0, r0, sl
24fe: fa03 f000 lsl.w r0, r3, r0
2502: 9b04 ldr r3, [sp, #16]
2504: 4303 orrs r3, r0
2506: 3401 adds r4, #1
2508: 9304 str r3, [sp, #16]
250a: f814 1b01 ldrb.w r1, [r4], #1
250e: 4826 ldr r0, [pc, #152] ; (25a8 <_svfiprintf_r+0x1f0>)
2510: f88d 1028 strb.w r1, [sp, #40] ; 0x28
2514: 2206 movs r2, #6
2516: f000 f9f3 bl 2900 <memchr>
251a: 2800 cmp r0, #0
251c: d038 beq.n 2590 <_svfiprintf_r+0x1d8>
251e: 4b23 ldr r3, [pc, #140] ; (25ac <_svfiprintf_r+0x1f4>)
2520: bb1b cbnz r3, 256a <_svfiprintf_r+0x1b2>
2522: 9b03 ldr r3, [sp, #12]
2524: 3307 adds r3, #7
2526: f023 0307 bic.w r3, r3, #7
252a: 3308 adds r3, #8
252c: 9303 str r3, [sp, #12]
252e: 9b09 ldr r3, [sp, #36] ; 0x24
2530: 4433 add r3, r6
2532: 9309 str r3, [sp, #36] ; 0x24
2534: e767 b.n 2406 <_svfiprintf_r+0x4e>
2536: fb0c 3202 mla r2, ip, r2, r3
253a: 460c mov r4, r1
253c: 2001 movs r0, #1
253e: e7a5 b.n 248c <_svfiprintf_r+0xd4>
2540: 2300 movs r3, #0
2542: 3401 adds r4, #1
2544: 9305 str r3, [sp, #20]
2546: 4619 mov r1, r3
2548: f04f 0c0a mov.w ip, #10
254c: 4620 mov r0, r4
254e: f810 2b01 ldrb.w r2, [r0], #1
2552: 3a30 subs r2, #48 ; 0x30
2554: 2a09 cmp r2, #9
2556: d903 bls.n 2560 <_svfiprintf_r+0x1a8>
2558: 2b00 cmp r3, #0
255a: d0c5 beq.n 24e8 <_svfiprintf_r+0x130>
255c: 9105 str r1, [sp, #20]
255e: e7c3 b.n 24e8 <_svfiprintf_r+0x130>
2560: fb0c 2101 mla r1, ip, r1, r2
2564: 4604 mov r4, r0
2566: 2301 movs r3, #1
2568: e7f0 b.n 254c <_svfiprintf_r+0x194>
256a: ab03 add r3, sp, #12
256c: 9300 str r3, [sp, #0]
256e: 462a mov r2, r5
2570: 4b0f ldr r3, [pc, #60] ; (25b0 <_svfiprintf_r+0x1f8>)
2572: a904 add r1, sp, #16
2574: 4638 mov r0, r7
2576: f3af 8000 nop.w
257a: 1c42 adds r2, r0, #1
257c: 4606 mov r6, r0
257e: d1d6 bne.n 252e <_svfiprintf_r+0x176>
2580: 89ab ldrh r3, [r5, #12]
2582: 065b lsls r3, r3, #25
2584: f53f af2c bmi.w 23e0 <_svfiprintf_r+0x28>
2588: 9809 ldr r0, [sp, #36] ; 0x24
258a: b01d add sp, #116 ; 0x74
258c: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
2590: ab03 add r3, sp, #12
2592: 9300 str r3, [sp, #0]
2594: 462a mov r2, r5
2596: 4b06 ldr r3, [pc, #24] ; (25b0 <_svfiprintf_r+0x1f8>)
2598: a904 add r1, sp, #16
259a: 4638 mov r0, r7
259c: f000 f87a bl 2694 <_printf_i>
25a0: e7eb b.n 257a <_svfiprintf_r+0x1c2>
25a2: bf00 nop
25a4: 0000316c .word 0x0000316c
25a8: 00003176 .word 0x00003176
25ac: 00000000 .word 0x00000000
25b0: 00002301 .word 0x00002301
25b4: 00003172 .word 0x00003172
000025b8 <_printf_common>:
25b8: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
25bc: 4616 mov r6, r2
25be: 4699 mov r9, r3
25c0: 688a ldr r2, [r1, #8]
25c2: 690b ldr r3, [r1, #16]
25c4: f8dd 8020 ldr.w r8, [sp, #32]
25c8: 4293 cmp r3, r2
25ca: bfb8 it lt
25cc: 4613 movlt r3, r2
25ce: 6033 str r3, [r6, #0]
25d0: f891 2043 ldrb.w r2, [r1, #67] ; 0x43
25d4: 4607 mov r7, r0
25d6: 460c mov r4, r1
25d8: b10a cbz r2, 25de <_printf_common+0x26>
25da: 3301 adds r3, #1
25dc: 6033 str r3, [r6, #0]
25de: 6823 ldr r3, [r4, #0]
25e0: 0699 lsls r1, r3, #26
25e2: bf42 ittt mi
25e4: 6833 ldrmi r3, [r6, #0]
25e6: 3302 addmi r3, #2
25e8: 6033 strmi r3, [r6, #0]
25ea: 6825 ldr r5, [r4, #0]
25ec: f015 0506 ands.w r5, r5, #6
25f0: d106 bne.n 2600 <_printf_common+0x48>
25f2: f104 0a19 add.w sl, r4, #25
25f6: 68e3 ldr r3, [r4, #12]
25f8: 6832 ldr r2, [r6, #0]
25fa: 1a9b subs r3, r3, r2
25fc: 42ab cmp r3, r5
25fe: dc26 bgt.n 264e <_printf_common+0x96>
2600: f894 2043 ldrb.w r2, [r4, #67] ; 0x43
2604: 1e13 subs r3, r2, #0
2606: 6822 ldr r2, [r4, #0]
2608: bf18 it ne
260a: 2301 movne r3, #1
260c: 0692 lsls r2, r2, #26
260e: d42b bmi.n 2668 <_printf_common+0xb0>
2610: f104 0243 add.w r2, r4, #67 ; 0x43
2614: 4649 mov r1, r9
2616: 4638 mov r0, r7
2618: 47c0 blx r8
261a: 3001 adds r0, #1
261c: d01e beq.n 265c <_printf_common+0xa4>
261e: 6823 ldr r3, [r4, #0]
2620: 68e5 ldr r5, [r4, #12]
2622: 6832 ldr r2, [r6, #0]
2624: f003 0306 and.w r3, r3, #6
2628: 2b04 cmp r3, #4
262a: bf08 it eq
262c: 1aad subeq r5, r5, r2
262e: 68a3 ldr r3, [r4, #8]
2630: 6922 ldr r2, [r4, #16]
2632: bf0c ite eq
2634: ea25 75e5 biceq.w r5, r5, r5, asr #31
2638: 2500 movne r5, #0
263a: 4293 cmp r3, r2
263c: bfc4 itt gt
263e: 1a9b subgt r3, r3, r2
2640: 18ed addgt r5, r5, r3
2642: 2600 movs r6, #0
2644: 341a adds r4, #26
2646: 42b5 cmp r5, r6
2648: d11a bne.n 2680 <_printf_common+0xc8>
264a: 2000 movs r0, #0
264c: e008 b.n 2660 <_printf_common+0xa8>
264e: 2301 movs r3, #1
2650: 4652 mov r2, sl
2652: 4649 mov r1, r9
2654: 4638 mov r0, r7
2656: 47c0 blx r8
2658: 3001 adds r0, #1
265a: d103 bne.n 2664 <_printf_common+0xac>
265c: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff
2660: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
2664: 3501 adds r5, #1
2666: e7c6 b.n 25f6 <_printf_common+0x3e>
2668: 18e1 adds r1, r4, r3
266a: 1c5a adds r2, r3, #1
266c: 2030 movs r0, #48 ; 0x30
266e: f881 0043 strb.w r0, [r1, #67] ; 0x43
2672: 4422 add r2, r4
2674: f894 1045 ldrb.w r1, [r4, #69] ; 0x45
2678: f882 1043 strb.w r1, [r2, #67] ; 0x43
267c: 3302 adds r3, #2
267e: e7c7 b.n 2610 <_printf_common+0x58>
2680: 2301 movs r3, #1
2682: 4622 mov r2, r4
2684: 4649 mov r1, r9
2686: 4638 mov r0, r7
2688: 47c0 blx r8
268a: 3001 adds r0, #1
268c: d0e6 beq.n 265c <_printf_common+0xa4>
268e: 3601 adds r6, #1
2690: e7d9 b.n 2646 <_printf_common+0x8e>
...
00002694 <_printf_i>:
2694: e92d 47ff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
2698: 460c mov r4, r1
269a: 4691 mov r9, r2
269c: 7e27 ldrb r7, [r4, #24]
269e: 990c ldr r1, [sp, #48] ; 0x30
26a0: 2f78 cmp r7, #120 ; 0x78
26a2: 4680 mov r8, r0
26a4: 469a mov sl, r3
26a6: f104 0243 add.w r2, r4, #67 ; 0x43
26aa: d807 bhi.n 26bc <_printf_i+0x28>
26ac: 2f62 cmp r7, #98 ; 0x62
26ae: d80a bhi.n 26c6 <_printf_i+0x32>
26b0: 2f00 cmp r7, #0
26b2: f000 80d8 beq.w 2866 <_printf_i+0x1d2>
26b6: 2f58 cmp r7, #88 ; 0x58
26b8: f000 80a3 beq.w 2802 <_printf_i+0x16e>
26bc: f104 0642 add.w r6, r4, #66 ; 0x42
26c0: f884 7042 strb.w r7, [r4, #66] ; 0x42
26c4: e03a b.n 273c <_printf_i+0xa8>
26c6: f1a7 0363 sub.w r3, r7, #99 ; 0x63
26ca: 2b15 cmp r3, #21
26cc: d8f6 bhi.n 26bc <_printf_i+0x28>
26ce: a001 add r0, pc, #4 ; (adr r0, 26d4 <_printf_i+0x40>)
26d0: f850 f023 ldr.w pc, [r0, r3, lsl #2]
26d4: 0000272d .word 0x0000272d
26d8: 00002741 .word 0x00002741
26dc: 000026bd .word 0x000026bd
26e0: 000026bd .word 0x000026bd
26e4: 000026bd .word 0x000026bd
26e8: 000026bd .word 0x000026bd
26ec: 00002741 .word 0x00002741
26f0: 000026bd .word 0x000026bd
26f4: 000026bd .word 0x000026bd
26f8: 000026bd .word 0x000026bd
26fc: 000026bd .word 0x000026bd
2700: 0000284d .word 0x0000284d
2704: 00002771 .word 0x00002771
2708: 0000282f .word 0x0000282f
270c: 000026bd .word 0x000026bd
2710: 000026bd .word 0x000026bd
2714: 0000286f .word 0x0000286f
2718: 000026bd .word 0x000026bd
271c: 00002771 .word 0x00002771
2720: 000026bd .word 0x000026bd
2724: 000026bd .word 0x000026bd
2728: 00002837 .word 0x00002837
272c: 680b ldr r3, [r1, #0]
272e: 1d1a adds r2, r3, #4
2730: 681b ldr r3, [r3, #0]
2732: 600a str r2, [r1, #0]
2734: f104 0642 add.w r6, r4, #66 ; 0x42
2738: f884 3042 strb.w r3, [r4, #66] ; 0x42
273c: 2301 movs r3, #1
273e: e0a3 b.n 2888 <_printf_i+0x1f4>
2740: 6825 ldr r5, [r4, #0]
2742: 6808 ldr r0, [r1, #0]
2744: 062e lsls r6, r5, #24
2746: f100 0304 add.w r3, r0, #4
274a: d50a bpl.n 2762 <_printf_i+0xce>
274c: 6805 ldr r5, [r0, #0]
274e: 600b str r3, [r1, #0]
2750: 2d00 cmp r5, #0
2752: da03 bge.n 275c <_printf_i+0xc8>
2754: 232d movs r3, #45 ; 0x2d
2756: 426d negs r5, r5
2758: f884 3043 strb.w r3, [r4, #67] ; 0x43
275c: 485e ldr r0, [pc, #376] ; (28d8 <_printf_i+0x244>)
275e: 230a movs r3, #10
2760: e019 b.n 2796 <_printf_i+0x102>
2762: f015 0f40 tst.w r5, #64 ; 0x40
2766: 6805 ldr r5, [r0, #0]
2768: 600b str r3, [r1, #0]
276a: bf18 it ne
276c: b22d sxthne r5, r5
276e: e7ef b.n 2750 <_printf_i+0xbc>
2770: 680b ldr r3, [r1, #0]
2772: 6825 ldr r5, [r4, #0]
2774: 1d18 adds r0, r3, #4
2776: 6008 str r0, [r1, #0]
2778: 0628 lsls r0, r5, #24
277a: d501 bpl.n 2780 <_printf_i+0xec>
277c: 681d ldr r5, [r3, #0]
277e: e002 b.n 2786 <_printf_i+0xf2>
2780: 0669 lsls r1, r5, #25
2782: d5fb bpl.n 277c <_printf_i+0xe8>
2784: 881d ldrh r5, [r3, #0]
2786: 4854 ldr r0, [pc, #336] ; (28d8 <_printf_i+0x244>)
2788: 2f6f cmp r7, #111 ; 0x6f
278a: bf0c ite eq
278c: 2308 moveq r3, #8
278e: 230a movne r3, #10
2790: 2100 movs r1, #0
2792: f884 1043 strb.w r1, [r4, #67] ; 0x43
2796: 6866 ldr r6, [r4, #4]
2798: 60a6 str r6, [r4, #8]
279a: 2e00 cmp r6, #0
279c: bfa2 ittt ge
279e: 6821 ldrge r1, [r4, #0]
27a0: f021 0104 bicge.w r1, r1, #4
27a4: 6021 strge r1, [r4, #0]
27a6: b90d cbnz r5, 27ac <_printf_i+0x118>
27a8: 2e00 cmp r6, #0
27aa: d04d beq.n 2848 <_printf_i+0x1b4>
27ac: 4616 mov r6, r2
27ae: fbb5 f1f3 udiv r1, r5, r3
27b2: fb03 5711 mls r7, r3, r1, r5
27b6: 5dc7 ldrb r7, [r0, r7]
27b8: f806 7d01 strb.w r7, [r6, #-1]!
27bc: 462f mov r7, r5
27be: 42bb cmp r3, r7
27c0: 460d mov r5, r1
27c2: d9f4 bls.n 27ae <_printf_i+0x11a>
27c4: 2b08 cmp r3, #8
27c6: d10b bne.n 27e0 <_printf_i+0x14c>
27c8: 6823 ldr r3, [r4, #0]
27ca: 07df lsls r7, r3, #31
27cc: d508 bpl.n 27e0 <_printf_i+0x14c>
27ce: 6923 ldr r3, [r4, #16]
27d0: 6861 ldr r1, [r4, #4]
27d2: 4299 cmp r1, r3
27d4: bfde ittt le
27d6: 2330 movle r3, #48 ; 0x30
27d8: f806 3c01 strble.w r3, [r6, #-1]
27dc: f106 36ff addle.w r6, r6, #4294967295 ; 0xffffffff
27e0: 1b92 subs r2, r2, r6
27e2: 6122 str r2, [r4, #16]
27e4: f8cd a000 str.w sl, [sp]
27e8: 464b mov r3, r9
27ea: aa03 add r2, sp, #12
27ec: 4621 mov r1, r4
27ee: 4640 mov r0, r8
27f0: f7ff fee2 bl 25b8 <_printf_common>
27f4: 3001 adds r0, #1
27f6: d14c bne.n 2892 <_printf_i+0x1fe>
27f8: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff
27fc: b004 add sp, #16
27fe: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc}
2802: 4835 ldr r0, [pc, #212] ; (28d8 <_printf_i+0x244>)
2804: f884 7045 strb.w r7, [r4, #69] ; 0x45
2808: 6823 ldr r3, [r4, #0]
280a: 680e ldr r6, [r1, #0]
280c: 061f lsls r7, r3, #24
280e: f856 5b04 ldr.w r5, [r6], #4
2812: 600e str r6, [r1, #0]
2814: d514 bpl.n 2840 <_printf_i+0x1ac>
2816: 07d9 lsls r1, r3, #31
2818: bf44 itt mi
281a: f043 0320 orrmi.w r3, r3, #32
281e: 6023 strmi r3, [r4, #0]
2820: b91d cbnz r5, 282a <_printf_i+0x196>
2822: 6823 ldr r3, [r4, #0]
2824: f023 0320 bic.w r3, r3, #32
2828: 6023 str r3, [r4, #0]
282a: 2310 movs r3, #16
282c: e7b0 b.n 2790 <_printf_i+0xfc>
282e: 6823 ldr r3, [r4, #0]
2830: f043 0320 orr.w r3, r3, #32
2834: 6023 str r3, [r4, #0]
2836: 2378 movs r3, #120 ; 0x78
2838: 4828 ldr r0, [pc, #160] ; (28dc <_printf_i+0x248>)
283a: f884 3045 strb.w r3, [r4, #69] ; 0x45
283e: e7e3 b.n 2808 <_printf_i+0x174>
2840: 065e lsls r6, r3, #25
2842: bf48 it mi
2844: b2ad uxthmi r5, r5
2846: e7e6 b.n 2816 <_printf_i+0x182>
2848: 4616 mov r6, r2
284a: e7bb b.n 27c4 <_printf_i+0x130>
284c: 680b ldr r3, [r1, #0]
284e: 6826 ldr r6, [r4, #0]
2850: 6960 ldr r0, [r4, #20]
2852: 1d1d adds r5, r3, #4
2854: 600d str r5, [r1, #0]
2856: 0635 lsls r5, r6, #24
2858: 681b ldr r3, [r3, #0]
285a: d501 bpl.n 2860 <_printf_i+0x1cc>
285c: 6018 str r0, [r3, #0]
285e: e002 b.n 2866 <_printf_i+0x1d2>
2860: 0671 lsls r1, r6, #25
2862: d5fb bpl.n 285c <_printf_i+0x1c8>
2864: 8018 strh r0, [r3, #0]
2866: 2300 movs r3, #0
2868: 6123 str r3, [r4, #16]
286a: 4616 mov r6, r2
286c: e7ba b.n 27e4 <_printf_i+0x150>
286e: 680b ldr r3, [r1, #0]
2870: 1d1a adds r2, r3, #4
2872: 600a str r2, [r1, #0]
2874: 681e ldr r6, [r3, #0]
2876: 6862 ldr r2, [r4, #4]
2878: 2100 movs r1, #0
287a: 4630 mov r0, r6
287c: f000 f840 bl 2900 <memchr>
2880: b108 cbz r0, 2886 <_printf_i+0x1f2>
2882: 1b80 subs r0, r0, r6
2884: 6060 str r0, [r4, #4]
2886: 6863 ldr r3, [r4, #4]
2888: 6123 str r3, [r4, #16]
288a: 2300 movs r3, #0
288c: f884 3043 strb.w r3, [r4, #67] ; 0x43
2890: e7a8 b.n 27e4 <_printf_i+0x150>
2892: 6923 ldr r3, [r4, #16]
2894: 4632 mov r2, r6
2896: 4649 mov r1, r9
2898: 4640 mov r0, r8
289a: 47d0 blx sl
289c: 3001 adds r0, #1
289e: d0ab beq.n 27f8 <_printf_i+0x164>
28a0: 6823 ldr r3, [r4, #0]
28a2: 079b lsls r3, r3, #30
28a4: d413 bmi.n 28ce <_printf_i+0x23a>
28a6: 68e0 ldr r0, [r4, #12]
28a8: 9b03 ldr r3, [sp, #12]
28aa: 4298 cmp r0, r3
28ac: bfb8 it lt
28ae: 4618 movlt r0, r3
28b0: e7a4 b.n 27fc <_printf_i+0x168>
28b2: 2301 movs r3, #1
28b4: 4632 mov r2, r6
28b6: 4649 mov r1, r9
28b8: 4640 mov r0, r8
28ba: 47d0 blx sl
28bc: 3001 adds r0, #1
28be: d09b beq.n 27f8 <_printf_i+0x164>
28c0: 3501 adds r5, #1
28c2: 68e3 ldr r3, [r4, #12]
28c4: 9903 ldr r1, [sp, #12]
28c6: 1a5b subs r3, r3, r1
28c8: 42ab cmp r3, r5
28ca: dcf2 bgt.n 28b2 <_printf_i+0x21e>
28cc: e7eb b.n 28a6 <_printf_i+0x212>
28ce: 2500 movs r5, #0
28d0: f104 0619 add.w r6, r4, #25
28d4: e7f5 b.n 28c2 <_printf_i+0x22e>
28d6: bf00 nop
28d8: 0000317d .word 0x0000317d
28dc: 0000318e .word 0x0000318e
000028e0 <_sbrk_r>:
28e0: b538 push {r3, r4, r5, lr}
28e2: 4d06 ldr r5, [pc, #24] ; (28fc <_sbrk_r+0x1c>)
28e4: 2300 movs r3, #0
28e6: 4604 mov r4, r0
28e8: 4608 mov r0, r1
28ea: 602b str r3, [r5, #0]
28ec: f7fd fd76 bl 3dc <_sbrk>
28f0: 1c43 adds r3, r0, #1
28f2: d102 bne.n 28fa <_sbrk_r+0x1a>
28f4: 682b ldr r3, [r5, #0]
28f6: b103 cbz r3, 28fa <_sbrk_r+0x1a>
28f8: 6023 str r3, [r4, #0]
28fa: bd38 pop {r3, r4, r5, pc}
28fc: 20000368 .word 0x20000368
00002900 <memchr>:
2900: f001 01ff and.w r1, r1, #255 ; 0xff
2904: 2a10 cmp r2, #16
2906: db2b blt.n 2960 <memchr+0x60>
2908: f010 0f07 tst.w r0, #7
290c: d008 beq.n 2920 <memchr+0x20>
290e: f810 3b01 ldrb.w r3, [r0], #1
2912: 3a01 subs r2, #1
2914: 428b cmp r3, r1
2916: d02d beq.n 2974 <memchr+0x74>
2918: f010 0f07 tst.w r0, #7
291c: b342 cbz r2, 2970 <memchr+0x70>
291e: d1f6 bne.n 290e <memchr+0xe>
2920: b4f0 push {r4, r5, r6, r7}
2922: ea41 2101 orr.w r1, r1, r1, lsl #8
2926: ea41 4101 orr.w r1, r1, r1, lsl #16
292a: f022 0407 bic.w r4, r2, #7
292e: f07f 0700 mvns.w r7, #0
2932: 2300 movs r3, #0
2934: e8f0 5602 ldrd r5, r6, [r0], #8
2938: 3c08 subs r4, #8
293a: ea85 0501 eor.w r5, r5, r1
293e: ea86 0601 eor.w r6, r6, r1
2942: fa85 f547 uadd8 r5, r5, r7
2946: faa3 f587 sel r5, r3, r7
294a: fa86 f647 uadd8 r6, r6, r7
294e: faa5 f687 sel r6, r5, r7
2952: b98e cbnz r6, 2978 <memchr+0x78>
2954: d1ee bne.n 2934 <memchr+0x34>
2956: bcf0 pop {r4, r5, r6, r7}
2958: f001 01ff and.w r1, r1, #255 ; 0xff
295c: f002 0207 and.w r2, r2, #7
2960: b132 cbz r2, 2970 <memchr+0x70>
2962: f810 3b01 ldrb.w r3, [r0], #1
2966: 3a01 subs r2, #1
2968: ea83 0301 eor.w r3, r3, r1
296c: b113 cbz r3, 2974 <memchr+0x74>
296e: d1f8 bne.n 2962 <memchr+0x62>
2970: 2000 movs r0, #0
2972: 4770 bx lr
2974: 3801 subs r0, #1
2976: 4770 bx lr
2978: 2d00 cmp r5, #0
297a: bf06 itte eq
297c: 4635 moveq r5, r6
297e: 3803 subeq r0, #3
2980: 3807 subne r0, #7
2982: f015 0f01 tst.w r5, #1
2986: d107 bne.n 2998 <memchr+0x98>
2988: 3001 adds r0, #1
298a: f415 7f80 tst.w r5, #256 ; 0x100
298e: bf02 ittt eq
2990: 3001 addeq r0, #1
2992: f415 3fc0 tsteq.w r5, #98304 ; 0x18000
2996: 3001 addeq r0, #1
2998: bcf0 pop {r4, r5, r6, r7}
299a: 3801 subs r0, #1
299c: 4770 bx lr
299e: bf00 nop
000029a0 <memmove>:
29a0: 4288 cmp r0, r1
29a2: b510 push {r4, lr}
29a4: eb01 0402 add.w r4, r1, r2
29a8: d902 bls.n 29b0 <memmove+0x10>
29aa: 4284 cmp r4, r0
29ac: 4623 mov r3, r4
29ae: d807 bhi.n 29c0 <memmove+0x20>
29b0: 1e43 subs r3, r0, #1
29b2: 42a1 cmp r1, r4
29b4: d008 beq.n 29c8 <memmove+0x28>
29b6: f811 2b01 ldrb.w r2, [r1], #1
29ba: f803 2f01 strb.w r2, [r3, #1]!
29be: e7f8 b.n 29b2 <memmove+0x12>
29c0: 4402 add r2, r0
29c2: 4601 mov r1, r0
29c4: 428a cmp r2, r1
29c6: d100 bne.n 29ca <memmove+0x2a>
29c8: bd10 pop {r4, pc}
29ca: f813 4d01 ldrb.w r4, [r3, #-1]!
29ce: f802 4d01 strb.w r4, [r2, #-1]!
29d2: e7f7 b.n 29c4 <memmove+0x24>
000029d4 <__malloc_lock>:
29d4: 4801 ldr r0, [pc, #4] ; (29dc <__malloc_lock+0x8>)
29d6: f7ff bc37 b.w 2248 <__retarget_lock_acquire_recursive>
29da: bf00 nop
29dc: 20000360 .word 0x20000360
000029e0 <__malloc_unlock>:
29e0: 4801 ldr r0, [pc, #4] ; (29e8 <__malloc_unlock+0x8>)
29e2: f7ff bc32 b.w 224a <__retarget_lock_release_recursive>
29e6: bf00 nop
29e8: 20000360 .word 0x20000360
000029ec <_free_r>:
29ec: b538 push {r3, r4, r5, lr}
29ee: 4605 mov r5, r0
29f0: 2900 cmp r1, #0
29f2: d045 beq.n 2a80 <_free_r+0x94>
29f4: f851 3c04 ldr.w r3, [r1, #-4]
29f8: 1f0c subs r4, r1, #4
29fa: 2b00 cmp r3, #0
29fc: bfb8 it lt
29fe: 18e4 addlt r4, r4, r3
2a00: f7ff ffe8 bl 29d4 <__malloc_lock>
2a04: 4a1f ldr r2, [pc, #124] ; (2a84 <_free_r+0x98>)
2a06: 6813 ldr r3, [r2, #0]
2a08: 4610 mov r0, r2
2a0a: b933 cbnz r3, 2a1a <_free_r+0x2e>
2a0c: 6063 str r3, [r4, #4]
2a0e: 6014 str r4, [r2, #0]
2a10: 4628 mov r0, r5
2a12: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
2a16: f7ff bfe3 b.w 29e0 <__malloc_unlock>
2a1a: 42a3 cmp r3, r4
2a1c: d90b bls.n 2a36 <_free_r+0x4a>
2a1e: 6821 ldr r1, [r4, #0]
2a20: 1862 adds r2, r4, r1
2a22: 4293 cmp r3, r2
2a24: bf04 itt eq
2a26: 681a ldreq r2, [r3, #0]
2a28: 685b ldreq r3, [r3, #4]
2a2a: 6063 str r3, [r4, #4]
2a2c: bf04 itt eq
2a2e: 1852 addeq r2, r2, r1
2a30: 6022 streq r2, [r4, #0]
2a32: 6004 str r4, [r0, #0]
2a34: e7ec b.n 2a10 <_free_r+0x24>
2a36: 461a mov r2, r3
2a38: 685b ldr r3, [r3, #4]
2a3a: b10b cbz r3, 2a40 <_free_r+0x54>
2a3c: 42a3 cmp r3, r4
2a3e: d9fa bls.n 2a36 <_free_r+0x4a>
2a40: 6811 ldr r1, [r2, #0]
2a42: 1850 adds r0, r2, r1
2a44: 42a0 cmp r0, r4
2a46: d10b bne.n 2a60 <_free_r+0x74>
2a48: 6820 ldr r0, [r4, #0]
2a4a: 4401 add r1, r0
2a4c: 1850 adds r0, r2, r1
2a4e: 4283 cmp r3, r0
2a50: 6011 str r1, [r2, #0]
2a52: d1dd bne.n 2a10 <_free_r+0x24>
2a54: 6818 ldr r0, [r3, #0]
2a56: 685b ldr r3, [r3, #4]
2a58: 6053 str r3, [r2, #4]
2a5a: 4401 add r1, r0
2a5c: 6011 str r1, [r2, #0]
2a5e: e7d7 b.n 2a10 <_free_r+0x24>
2a60: d902 bls.n 2a68 <_free_r+0x7c>
2a62: 230c movs r3, #12
2a64: 602b str r3, [r5, #0]
2a66: e7d3 b.n 2a10 <_free_r+0x24>
2a68: 6820 ldr r0, [r4, #0]
2a6a: 1821 adds r1, r4, r0
2a6c: 428b cmp r3, r1
2a6e: bf04 itt eq
2a70: 6819 ldreq r1, [r3, #0]
2a72: 685b ldreq r3, [r3, #4]
2a74: 6063 str r3, [r4, #4]
2a76: bf04 itt eq
2a78: 1809 addeq r1, r1, r0
2a7a: 6021 streq r1, [r4, #0]
2a7c: 6054 str r4, [r2, #4]
2a7e: e7c7 b.n 2a10 <_free_r+0x24>
2a80: bd38 pop {r3, r4, r5, pc}
2a82: bf00 nop
2a84: 20000354 .word 0x20000354
00002a88 <_realloc_r>:
2a88: b5f8 push {r3, r4, r5, r6, r7, lr}
2a8a: 4607 mov r7, r0
2a8c: 4614 mov r4, r2
2a8e: 460e mov r6, r1
2a90: b921 cbnz r1, 2a9c <_realloc_r+0x14>
2a92: e8bd 40f8 ldmia.w sp!, {r3, r4, r5, r6, r7, lr}
2a96: 4611 mov r1, r2
2a98: f7ff bbd8 b.w 224c <_malloc_r>
2a9c: b922 cbnz r2, 2aa8 <_realloc_r+0x20>
2a9e: f7ff ffa5 bl 29ec <_free_r>
2aa2: 4625 mov r5, r4
2aa4: 4628 mov r0, r5
2aa6: bdf8 pop {r3, r4, r5, r6, r7, pc}
2aa8: f000 f814 bl 2ad4 <_malloc_usable_size_r>
2aac: 42a0 cmp r0, r4
2aae: d20f bcs.n 2ad0 <_realloc_r+0x48>
2ab0: 4621 mov r1, r4
2ab2: 4638 mov r0, r7
2ab4: f7ff fbca bl 224c <_malloc_r>
2ab8: 4605 mov r5, r0
2aba: 2800 cmp r0, #0
2abc: d0f2 beq.n 2aa4 <_realloc_r+0x1c>
2abe: 4631 mov r1, r6
2ac0: 4622 mov r2, r4
2ac2: f7ff fb83 bl 21cc <memcpy>
2ac6: 4631 mov r1, r6
2ac8: 4638 mov r0, r7
2aca: f7ff ff8f bl 29ec <_free_r>
2ace: e7e9 b.n 2aa4 <_realloc_r+0x1c>
2ad0: 4635 mov r5, r6
2ad2: e7e7 b.n 2aa4 <_realloc_r+0x1c>
00002ad4 <_malloc_usable_size_r>:
2ad4: f851 3c04 ldr.w r3, [r1, #-4]
2ad8: 1f18 subs r0, r3, #4
2ada: 2b00 cmp r3, #0
2adc: bfbc itt lt
2ade: 580b ldrlt r3, [r1, r0]
2ae0: 18c0 addlt r0, r0, r3
2ae2: 4770 bx lr
2ae4: 682f2e2e .word 0x682f2e2e
2ae8: 732f6c61 .word 0x732f6c61
2aec: 682f6372 .word 0x682f6372
2af0: 695f6c61 .word 0x695f6c61
2af4: 00632e6f .word 0x00632e6f
2af8: 682f2e2e .word 0x682f2e2e
2afc: 732f6c61 .word 0x732f6c61
2b00: 682f6372 .word 0x682f6372
2b04: 635f6c61 .word 0x635f6c61
2b08: 6e656c61 .word 0x6e656c61
2b0c: 2e726164 .word 0x2e726164
2b10: 0063 .short 0x0063
2b12: 2e2e .short 0x2e2e
2b14: 5f64732f .word 0x5f64732f
2b18: 2f636d6d .word 0x2f636d6d
2b1c: 6d5f6473 .word 0x6d5f6473
2b20: 632e636d .word 0x632e636d
2b24: 3e3e3e00 .word 0x3e3e3e00
2b28: 61745300 .word 0x61745300
2b2c: 53207472 .word 0x53207472
2b30: 61632044 .word 0x61632044
2b34: 69206472 .word 0x69206472
2b38: 6174736e .word 0x6174736e
2b3c: 0d0a6c6c .word 0x0d0a6c6c
2b40: 3a732500 .word 0x3a732500
2b44: 444d4320 .word 0x444d4320
2b48: 46203535 .word 0x46203535
2b4c: 0a6c6961 .word 0x0a6c6961
2b50: 7325000d .word 0x7325000d
2b54: 4341203a .word 0x4341203a
2b58: 3134444d .word 0x3134444d
2b5c: 69614620 .word 0x69614620
2b60: 000d0a6c .word 0x000d0a6c
2b64: 203a7325 .word 0x203a7325
2b68: 444d4341 .word 0x444d4341
2b6c: 54203134 .word 0x54203134
2b70: 6f656d69 .word 0x6f656d69
2b74: 6f207475 .word 0x6f207475
2b78: 7562206e .word 0x7562206e
2b7c: 202c7973 .word 0x202c7973
2b80: 70736572 .word 0x70736572
2b84: 30203233 .word 0x30203233
2b88: 38302578 .word 0x38302578
2b8c: 0d0a2078 .word 0x0d0a2078
2b90: 3a732500 .word 0x3a732500
2b94: 444d4320 .word 0x444d4320
2b98: 46203835 .word 0x46203835
2b9c: 0a6c6961 .word 0x0a6c6961
2ba0: 7453000d .word 0x7453000d
2ba4: 20747261 .word 0x20747261
2ba8: 20434d4d .word 0x20434d4d
2bac: 74736e49 .word 0x74736e49
2bb0: 0a6c6c61 .word 0x0a6c6c61
2bb4: 7325000d .word 0x7325000d
2bb8: 4d43203a .word 0x4d43203a
2bbc: 53203144 .word 0x53203144
2bc0: 46204950 .word 0x46204950
2bc4: 206c6961 .word 0x206c6961
2bc8: 7542202d .word 0x7542202d
2bcc: 72207973 .word 0x72207973
2bd0: 79727465 .word 0x79727465
2bd4: 0a642520 .word 0x0a642520
2bd8: 7325000d .word 0x7325000d
2bdc: 4d43203a .word 0x4d43203a
2be0: 54203144 .word 0x54203144
2be4: 6f656d69 .word 0x6f656d69
2be8: 6f207475 .word 0x6f207475
2bec: 7562206e .word 0x7562206e
2bf0: 0d0a7973 .word 0x0d0a7973
2bf4: 2f445300 .word 0x2f445300
2bf8: 20434d4d .word 0x20434d4d
2bfc: 64726163 .word 0x64726163
2c00: 61657220 .word 0x61657220
2c04: 0d0a7964 .word 0x0d0a7964
2c08: 00000000 .word 0x00000000
00002c0c <__func__.1>:
2c0c: 735f6473 6f5f6970 6f635f70 sd_spi_op_cond.
00002c1b <__func__.0>:
2c1b: 5f636d6d 5f697073 635f706f 00646e6f mmc_spi_op_cond.
...
00002c2c <mmc_trans_multipliers>:
2c2c: 00000000 0000000a 0000000c 0000000d ................
2c3c: 0000000f 00000014 0000001a 0000001e ................
2c4c: 00000023 00000028 0000002d 00000034 #...(...-...4...
2c5c: 00000037 0000003c 00000046 00000050 7...<...F...P...
00002c6c <sd_mmc_trans_units>:
2c6c: 0000000a 00000064 000003e8 00002710 ....d........'..
...
00002c88 <sd_trans_multipliers>:
2c88: 00000000 0000000a 0000000c 0000000d ................
2c98: 0000000f 00000014 00000019 0000001e ................
2ca8: 00000023 00000028 0000002d 00000032 #...(...-...2...
2cb8: 00000037 0000003c 00000046 00000050 7...<...F...P...
2cc8: 732f2e2e 6d6d5f64 64732f63 636d6d5f ../sd_mmc/sd_mmc
2cd8: 6970735f 2500632e 52203a73 20646165 _spi.c.%s: Read
2ce8: 636f6c62 7420736b 6f656d69 0d0a7475 blocks timeout..
2cf8: 3a732500 43524320 74616420 72652061 .%s: CRC data er
2d08: 20726f72 656b6f74 000d0a6e 203a7325 ror token...%s:
2d18: 2074754f 7220666f 65676e61 74616420 Out of range dat
2d28: 72652061 20726f72 656b6f74 000d0a6e a error token...
2d38: 203a7325 61766e49 2064696c 61746144 %s: Invalid Data
2d48: 73655220 736e6f70 6f542065 206e656b Response Token
2d58: 78257830 25000d0a 57203a73 65746972 0x%x...%s: Write
2d68: 6f6c6220 2c736b63 5f445320 5f434d4d blocks, SD_MMC_
2d78: 5f495053 5f525245 2c435243 73657220 SPI_ERR_CRC, res
2d88: 78302070 0d0a7825 3a732500 69725720 p 0x%x...%s: Wri
2d98: 62206574 6b636f6c 44532073 434d4d5f te blocks SD_MMC
2da8: 4950535f 5252455f 2c52575f 73657220 _SPI_ERR_WR, res
2db8: 78302070 0d0a7825 3a732500 6f745320 p 0x%x...%s: Sto
2dc8: 72772070 20657469 636f6c62 7420736b p write blocks t
2dd8: 6f656d69 0d0a7475 206f4e00 43204453 imeout...No SD C
2de8: 20647261 70736572 65736e6f 73617720 ard response was
2df8: 65727020 746e6573 002e2e2e 203a7325 present....%s:
2e08: 20646d63 64323025 7261202c 78302067 cmd %02d, arg 0x
2e18: 6c383025 52202c58 69742031 756f656d %08lX, R1 timeou
2e28: 000a0d74 203a7325 20646d63 64323025 t...%s: cmd %02d
2e38: 7261202c 78302067 6c383025 72202c78 , arg 0x%08lx, r
2e48: 78302031 78323025 3152202c 4950535f 1 0x%02x, R1_SPI
2e58: 4d4f435f 4352435f 25000d0a 63203a73 _COM_CRC...%s: c
2e68: 2520646d 2c643230 67726120 25783020 md %02d, arg 0x%
2e78: 786c3830 3172202c 25783020 52202c78 08lx, r1 0x%x, R
2e88: 4c492031 4147454c 4f435f4c 4e414d4d 1 ILLEGAL_COMMAN
2e98: 000d0a44 203a7325 20646d63 64323025 D...%s: cmd %02d
2ea8: 7261202c 78302067 6c383025 72202c78 , arg 0x%08lx, r
2eb8: 78302031 202c7825 65203152 726f7272 1 0x%x, R1 error
2ec8: 25000d0a 63203a73 2520646d 2c643230 ...%s: cmd %02d,
2ed8: 67726120 25783020 786c3830 7542202c arg 0x%08lx, Bu
2ee8: 73207973 616e6769 6c61206c 73796177 sy signal always
2ef8: 67696820 000d0a68 203a7325 74697257 high...%s: Writ
2f08: 6c622065 736b636f 6d697420 74756f65 e blocks timeout
2f18: 3c000d0a ...<<<.
00002f1f <__func__.5>:
2f1f: 5f697073 79735f6d 735f636e 74726174 spi_m_sync_start
2f2f: 6165725f 6c625f64 006b636f _read_block.
00002f3b <__func__.3>:
2f3b: 5f697073 79735f6d 735f636e 5f706f74 spi_m_sync_stop_
2f4b: 74697277 6c625f65 006b636f write_block.
00002f57 <__func__.1>:
2f57: 5f697073 79735f6d 735f636e 5f706f74 spi_m_sync_stop_
2f67: 746c756d 69727769 625f6574 6b636f6c multiwrite_block
...
00002f78 <__func__.6>:
2f78: 5f697073 79735f6d 615f636e 5f637464 spi_m_sync_adtc_
2f88: 72617473 start.
00002f8e <__func__.4>:
2f8e: 5f697073 79735f6d 735f636e 74726174 spi_m_sync_start
2f9e: 6972775f 625f6574 6b636f6c _write_blocks.
00002fac <__func__.2>:
2fac: 5f697073 79735f6d 775f636e 5f746961 spi_m_sync_wait_
2fbc: 5f646e65 775f666f 65746972 6f6c625f end_of_write_blo
2fcc: 00736b63 cks.
00002fd0 <__func__.0>:
2fd0: 5f697073 79735f6d 775f636e 65746972 spi_m_sync_write
2fe0: 726f775f 2e2e0064 6c61682f 6372732f _word.../hal/src
2ff0: 6c61682f 6970735f 735f6d5f 2e636e79 /hal_spi_m_sync.
3000: 2e2e0063 6c61682f 6372732f 6c61682f c.../hal/src/hal
3010: 69636d5f 6e79735f 00632e63 682f2e2e _mci_sync.c.../h
3020: 732f6c70 2f636864 5f6c7068 63686473 pl/sdhc/hpl_sdhc
3030: 2e00632e 61682f2e 72732f6c 61682f63 .c.../hal/src/ha
3040: 73755f6c 5f747261 636e7973 4800632e l_usart_sync.c.H
3050: 6f6c6c65 726f7720 000a646c 682f2e2e ello world..../h
3060: 722f6c70 682f6374 725f6c70 632e6374 pl/rtc/hpl_rtc.c
3070: 2f2e2e00 2f6c7068 63726573 682f6d6f .../hpl/sercom/h
3080: 735f6c70 6f637265 00632e6d 40003000 pl_sercom.c..0.@
3090: 40003400 41012000 41014000 43000000 .4.@. .A.@.A...C
30a0: 43000400 43000800 43000c00 ...C...C...C
000030ac <_i2cms>:
...
000030c4 <sercomspi_regs>:
30c4: 0030000c 00020000 00000000 01ff00fe ..0.............
30d4: 62654404 49206775 6974696e 7a696c61 .Debug Initializ
30e4: 000a6465 65737341 46207472 756c6961 ed..Assert Failu
30f4: 61206572 696c2074 2520656e 25202c64 re at line %d, %
3104: 25203a73 00000a73 s: %s...
0000310c <__sf_fake_stderr>:
...
0000312c <__sf_fake_stdin>:
...
0000314c <__sf_fake_stdout>:
...
316c: 2b302d23 6c680020 6665004c 47464567 #-0+ .hlL.efgEFG
317c: 32313000 36353433 41393837 45444342 .0123456789ABCDE
318c: 31300046 35343332 39383736 64636261 F.0123456789abcd
319c: 00006665 ef..
000031a0 <_init>:
31a0: b5f8 push {r3, r4, r5, r6, r7, lr}
31a2: bf00 nop
31a4: bcf8 pop {r3, r4, r5, r6, r7}
31a6: bc08 pop {r3}
31a8: 469e mov lr, r3
31aa: 4770 bx lr
000031ac <__frame_dummy_init_array_entry>:
31ac: 0289 0000 ....
000031b0 <_fini>:
31b0: b5f8 push {r3, r4, r5, r6, r7, lr}
31b2: bf00 nop
31b4: bcf8 pop {r3, r4, r5, r6, r7}
31b6: bc08 pop {r3}
31b8: 469e mov lr, r3
31ba: 4770 bx lr
000031bc <__do_global_dtors_aux_fini_array_entry>:
31bc: 0265 0000 e...