5932 lines
220 KiB
Plaintext
5932 lines
220 KiB
Plaintext
|
|
My Project.elf: file format elf32-littlearm
|
|
|
|
Sections:
|
|
Idx Name Size VMA LMA File off Algn
|
|
0 .text 00002140 00000000 00000000 00010000 2**2
|
|
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
|
1 .relocate 00000038 20000000 00002140 00020000 2**2
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
2 .bss 000000e4 20000038 00002178 00020038 2**2
|
|
ALLOC
|
|
3 .stack 00002004 2000011c 0000225c 00020038 2**0
|
|
ALLOC
|
|
4 .ARM.attributes 00000028 00000000 00000000 00020038 2**0
|
|
CONTENTS, READONLY
|
|
5 .comment 00000059 00000000 00000000 00020060 2**0
|
|
CONTENTS, READONLY
|
|
6 .debug_info 000315e1 00000000 00000000 000200b9 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
7 .debug_abbrev 00004084 00000000 00000000 0005169a 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
8 .debug_loc 00011a80 00000000 00000000 0005571e 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
9 .debug_aranges 00000d00 00000000 00000000 0006719e 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
10 .debug_ranges 00000d80 00000000 00000000 00067e9e 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
11 .debug_macro 0001de3f 00000000 00000000 00068c1e 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
12 .debug_line 00015702 00000000 00000000 00086a5d 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
13 .debug_str 000912d9 00000000 00000000 0009c15f 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
14 .debug_frame 000020dc 00000000 00000000 0012d438 2**2
|
|
CONTENTS, READONLY, DEBUGGING
|
|
|
|
Disassembly of section .text:
|
|
|
|
00000000 <exception_table>:
|
|
0: 20 21 00 20 21 01 00 00 1d 01 00 00 1d 01 00 00 !. !...........
|
|
...
|
|
2c: 1d 01 00 00 00 00 00 00 00 00 00 00 1d 01 00 00 ................
|
|
3c: 1d 01 00 00 1d 01 00 00 1d 01 00 00 89 0e 00 00 ................
|
|
4c: 35 0c 00 00 1d 01 00 00 1d 01 00 00 1d 01 00 00 5...............
|
|
5c: 1d 01 00 00 1d 01 00 00 1d 01 00 00 1d 01 00 00 ................
|
|
6c: 1d 01 00 00 1d 01 00 00 00 00 00 00 00 00 00 00 ................
|
|
7c: ad 15 00 00 1d 01 00 00 1d 01 00 00 1d 01 00 00 ................
|
|
8c: e5 19 00 00 1d 01 00 00 1d 01 00 00 1d 01 00 00 ................
|
|
9c: 1d 01 00 00 1d 01 00 00 1d 01 00 00 ............
|
|
|
|
000000a8 <__do_global_dtors_aux>:
|
|
a8: b510 push {r4, lr}
|
|
aa: 4c06 ldr r4, [pc, #24] ; (c4 <__do_global_dtors_aux+0x1c>)
|
|
ac: 7823 ldrb r3, [r4, #0]
|
|
ae: 2b00 cmp r3, #0
|
|
b0: d107 bne.n c2 <__do_global_dtors_aux+0x1a>
|
|
b2: 4b05 ldr r3, [pc, #20] ; (c8 <__do_global_dtors_aux+0x20>)
|
|
b4: 2b00 cmp r3, #0
|
|
b6: d002 beq.n be <__do_global_dtors_aux+0x16>
|
|
b8: 4804 ldr r0, [pc, #16] ; (cc <__do_global_dtors_aux+0x24>)
|
|
ba: e000 b.n be <__do_global_dtors_aux+0x16>
|
|
bc: bf00 nop
|
|
be: 2301 movs r3, #1
|
|
c0: 7023 strb r3, [r4, #0]
|
|
c2: bd10 pop {r4, pc}
|
|
c4: 20000038 .word 0x20000038
|
|
c8: 00000000 .word 0x00000000
|
|
cc: 00002140 .word 0x00002140
|
|
|
|
000000d0 <frame_dummy>:
|
|
d0: 4b08 ldr r3, [pc, #32] ; (f4 <frame_dummy+0x24>)
|
|
d2: b510 push {r4, lr}
|
|
d4: 2b00 cmp r3, #0
|
|
d6: d003 beq.n e0 <frame_dummy+0x10>
|
|
d8: 4907 ldr r1, [pc, #28] ; (f8 <frame_dummy+0x28>)
|
|
da: 4808 ldr r0, [pc, #32] ; (fc <frame_dummy+0x2c>)
|
|
dc: e000 b.n e0 <frame_dummy+0x10>
|
|
de: bf00 nop
|
|
e0: 4807 ldr r0, [pc, #28] ; (100 <frame_dummy+0x30>)
|
|
e2: 6803 ldr r3, [r0, #0]
|
|
e4: 2b00 cmp r3, #0
|
|
e6: d100 bne.n ea <frame_dummy+0x1a>
|
|
e8: bd10 pop {r4, pc}
|
|
ea: 4b06 ldr r3, [pc, #24] ; (104 <frame_dummy+0x34>)
|
|
ec: 2b00 cmp r3, #0
|
|
ee: d0fb beq.n e8 <frame_dummy+0x18>
|
|
f0: 4798 blx r3
|
|
f2: e7f9 b.n e8 <frame_dummy+0x18>
|
|
f4: 00000000 .word 0x00000000
|
|
f8: 2000003c .word 0x2000003c
|
|
fc: 00002140 .word 0x00002140
|
|
100: 00002140 .word 0x00002140
|
|
104: 00000000 .word 0x00000000
|
|
|
|
00000108 <atmel_start_init>:
|
|
|
|
/**
|
|
* Initializes MCU, drivers and middleware in the project
|
|
**/
|
|
void atmel_start_init(void)
|
|
{
|
|
108: b510 push {r4, lr}
|
|
system_init();
|
|
10a: 4b02 ldr r3, [pc, #8] ; (114 <atmel_start_init+0xc>)
|
|
10c: 4798 blx r3
|
|
sleep_manager_init();
|
|
10e: 4b02 ldr r3, [pc, #8] ; (118 <atmel_start_init+0x10>)
|
|
110: 4798 blx r3
|
|
}
|
|
112: bd10 pop {r4, pc}
|
|
114: 00000309 .word 0x00000309
|
|
118: 00001b8d .word 0x00001b8d
|
|
|
|
0000011c <Dummy_Handler>:
|
|
|
|
/**
|
|
* \brief Default interrupt handler for unused IRQs.
|
|
*/
|
|
void Dummy_Handler(void)
|
|
{
|
|
11c: e7fe b.n 11c <Dummy_Handler>
|
|
...
|
|
|
|
00000120 <Reset_Handler>:
|
|
{
|
|
120: b510 push {r4, lr}
|
|
if (pSrc != pDest) {
|
|
122: 4a10 ldr r2, [pc, #64] ; (164 <Reset_Handler+0x44>)
|
|
124: 4b10 ldr r3, [pc, #64] ; (168 <Reset_Handler+0x48>)
|
|
126: 429a cmp r2, r3
|
|
128: d009 beq.n 13e <Reset_Handler+0x1e>
|
|
12a: 4b0f ldr r3, [pc, #60] ; (168 <Reset_Handler+0x48>)
|
|
12c: 4a0d ldr r2, [pc, #52] ; (164 <Reset_Handler+0x44>)
|
|
12e: e003 b.n 138 <Reset_Handler+0x18>
|
|
*pDest++ = *pSrc++;
|
|
130: 6811 ldr r1, [r2, #0]
|
|
132: 6019 str r1, [r3, #0]
|
|
134: 3304 adds r3, #4
|
|
136: 3204 adds r2, #4
|
|
for (; pDest < &_erelocate;) {
|
|
138: 490c ldr r1, [pc, #48] ; (16c <Reset_Handler+0x4c>)
|
|
13a: 428b cmp r3, r1
|
|
13c: d3f8 bcc.n 130 <Reset_Handler+0x10>
|
|
*pDest++ = *pSrc++;
|
|
13e: 4b0c ldr r3, [pc, #48] ; (170 <Reset_Handler+0x50>)
|
|
140: e002 b.n 148 <Reset_Handler+0x28>
|
|
*pDest++ = 0;
|
|
142: 2200 movs r2, #0
|
|
144: 601a str r2, [r3, #0]
|
|
146: 3304 adds r3, #4
|
|
for (pDest = &_szero; pDest < &_ezero;) {
|
|
148: 4a0a ldr r2, [pc, #40] ; (174 <Reset_Handler+0x54>)
|
|
14a: 4293 cmp r3, r2
|
|
14c: d3f9 bcc.n 142 <Reset_Handler+0x22>
|
|
SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);
|
|
14e: 4a0a ldr r2, [pc, #40] ; (178 <Reset_Handler+0x58>)
|
|
150: 21ff movs r1, #255 ; 0xff
|
|
152: 4b0a ldr r3, [pc, #40] ; (17c <Reset_Handler+0x5c>)
|
|
154: 438b bics r3, r1
|
|
156: 6093 str r3, [r2, #8]
|
|
__libc_init_array();
|
|
158: 4b09 ldr r3, [pc, #36] ; (180 <Reset_Handler+0x60>)
|
|
15a: 4798 blx r3
|
|
main();
|
|
15c: 4b09 ldr r3, [pc, #36] ; (184 <Reset_Handler+0x64>)
|
|
15e: 4798 blx r3
|
|
160: e7fe b.n 160 <Reset_Handler+0x40>
|
|
162: 46c0 nop ; (mov r8, r8)
|
|
164: 00002140 .word 0x00002140
|
|
168: 20000000 .word 0x20000000
|
|
16c: 20000038 .word 0x20000038
|
|
170: 20000038 .word 0x20000038
|
|
174: 2000011c .word 0x2000011c
|
|
178: e000ed00 .word 0xe000ed00
|
|
17c: 00000000 .word 0x00000000
|
|
180: 00001eb1 .word 0x00001eb1
|
|
184: 000019f9 .word 0x000019f9
|
|
|
|
00000188 <CALENDAR_0_CLOCK_init>:
|
|
uint8_t tmp;
|
|
PORT_CRITICAL_SECTION_ENTER();
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
188: 4a03 ldr r2, [pc, #12] ; (198 <CALENDAR_0_CLOCK_init+0x10>)
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
18a: 6951 ldr r1, [r2, #20]
|
|
18c: 2380 movs r3, #128 ; 0x80
|
|
tmp &= ~PORT_PMUX_PMUXE_Msk;
|
|
18e: 009b lsls r3, r3, #2
|
|
190: 430b orrs r3, r1
|
|
tmp |= PORT_PMUX_PMUXE(data);
|
|
192: 6153 str r3, [r2, #20]
|
|
194: 4770 bx lr
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
196: 46c0 nop ; (mov r8, r8)
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
198: 40000800 .word 0x40000800
|
|
|
|
0000019c <CALENDAR_0_init>:
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
19c: b510 push {r4, lr}
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
19e: 4b03 ldr r3, [pc, #12] ; (1ac <CALENDAR_0_init+0x10>)
|
|
1a0: 4798 blx r3
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
1a2: 4903 ldr r1, [pc, #12] ; (1b0 <CALENDAR_0_init+0x14>)
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
1a4: 4803 ldr r0, [pc, #12] ; (1b4 <CALENDAR_0_init+0x18>)
|
|
tmp &= ~PORT_PMUX_PMUXO_Msk;
|
|
1a6: 4b04 ldr r3, [pc, #16] ; (1b8 <CALENDAR_0_init+0x1c>)
|
|
tmp |= PORT_PMUX_PMUXO(data);
|
|
1a8: 4798 blx r3
|
|
1aa: bd10 pop {r4, pc}
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
1ac: 00000189 .word 0x00000189
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
1b0: 40002400 .word 0x40002400
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
1b4: 200000b4 .word 0x200000b4
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
1b8: 000006b5 .word 0x000006b5
|
|
|
|
000001bc <I2C_0_PORT_init>:
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
1bc: b570 push {r4, r5, r6, lr}
|
|
tmp &= ~PORT_PMUX_PMUXE_Msk;
|
|
1be: 4b13 ldr r3, [pc, #76] ; (20c <I2C_0_PORT_init+0x50>)
|
|
1c0: 20de movs r0, #222 ; 0xde
|
|
tmp |= PORT_PMUX_PMUXE(data);
|
|
1c2: 5c19 ldrb r1, [r3, r0]
|
|
1c4: 2204 movs r2, #4
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
1c6: 4391 bics r1, r2
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
1c8: 5419 strb r1, [r3, r0]
|
|
1ca: 5c19 ldrb r1, [r3, r0]
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
1cc: 2501 movs r5, #1
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
1ce: 43a9 bics r1, r5
|
|
1d0: 2401 movs r4, #1
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
1d2: 4321 orrs r1, r4
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
1d4: b2c9 uxtb r1, r1
|
|
tmp &= ~PORT_PMUX_PMUXO_Msk;
|
|
1d6: 5419 strb r1, [r3, r0]
|
|
tmp |= PORT_PMUX_PMUXO(data);
|
|
1d8: 381f subs r0, #31
|
|
1da: 5c19 ldrb r1, [r3, r0]
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
1dc: 260f movs r6, #15
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
1de: 43b1 bics r1, r6
|
|
1e0: 2602 movs r6, #2
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
1e2: 4331 orrs r1, r6
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
1e4: b2c9 uxtb r1, r1
|
|
1e6: 5419 strb r1, [r3, r0]
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
1e8: 21df movs r1, #223 ; 0xdf
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
1ea: 5c5e ldrb r6, [r3, r1]
|
|
1ec: 4396 bics r6, r2
|
|
tmp &= ~PORT_PMUX_PMUXE_Msk;
|
|
1ee: 545e strb r6, [r3, r1]
|
|
1f0: 5c5a ldrb r2, [r3, r1]
|
|
tmp |= PORT_PMUX_PMUXE(data);
|
|
1f2: 43aa bics r2, r5
|
|
1f4: 4322 orrs r2, r4
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
1f6: b2d2 uxtb r2, r2
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
1f8: 545a strb r2, [r3, r1]
|
|
1fa: 5c1a ldrb r2, [r3, r0]
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
1fc: 39d0 subs r1, #208 ; 0xd0
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
1fe: 400a ands r2, r1
|
|
200: 2120 movs r1, #32
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
202: 430a orrs r2, r1
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
204: b2d2 uxtb r2, r2
|
|
tmp &= ~PORT_PMUX_PMUXO_Msk;
|
|
206: 541a strb r2, [r3, r0]
|
|
tmp |= PORT_PMUX_PMUXO(data);
|
|
208: bd70 pop {r4, r5, r6, pc}
|
|
20a: 46c0 nop ; (mov r8, r8)
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
20c: 41006000 .word 0x41006000
|
|
|
|
00000210 <I2C_0_CLOCK_init>:
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
210: 4b06 ldr r3, [pc, #24] ; (22c <I2C_0_CLOCK_init+0x1c>)
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
212: 2140 movs r1, #64 ; 0x40
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
214: 22c4 movs r2, #196 ; 0xc4
|
|
216: 5099 str r1, [r3, r2]
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
218: 3103 adds r1, #3
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
21a: 3a08 subs r2, #8
|
|
21c: 5099 str r1, [r3, r2]
|
|
tmp &= ~PORT_PMUX_PMUXE_Msk;
|
|
21e: 4a04 ldr r2, [pc, #16] ; (230 <I2C_0_CLOCK_init+0x20>)
|
|
220: 69d3 ldr r3, [r2, #28]
|
|
tmp |= PORT_PMUX_PMUXE(data);
|
|
222: 393f subs r1, #63 ; 0x3f
|
|
224: 430b orrs r3, r1
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
226: 61d3 str r3, [r2, #28]
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
228: 4770 bx lr
|
|
22a: 46c0 nop ; (mov r8, r8)
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
22c: 40001c00 .word 0x40001c00
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
230: 40000800 .word 0x40000800
|
|
|
|
00000234 <I2C_0_init>:
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
234: b510 push {r4, lr}
|
|
tmp &= ~PORT_PMUX_PMUXO_Msk;
|
|
236: 4b04 ldr r3, [pc, #16] ; (248 <I2C_0_init+0x14>)
|
|
tmp |= PORT_PMUX_PMUXO(data);
|
|
238: 4798 blx r3
|
|
23a: 4904 ldr r1, [pc, #16] ; (24c <I2C_0_init+0x18>)
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
23c: 4804 ldr r0, [pc, #16] ; (250 <I2C_0_init+0x1c>)
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
23e: 4b05 ldr r3, [pc, #20] ; (254 <I2C_0_init+0x20>)
|
|
240: 4798 blx r3
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
242: 4b05 ldr r3, [pc, #20] ; (258 <I2C_0_init+0x24>)
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
244: 4798 blx r3
|
|
246: bd10 pop {r4, pc}
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
248: 00000211 .word 0x00000211
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
24c: 42000800 .word 0x42000800
|
|
tmp &= ~PORT_PMUX_PMUXE_Msk;
|
|
250: 200000f8 .word 0x200000f8
|
|
tmp |= PORT_PMUX_PMUXE(data);
|
|
254: 000008a9 .word 0x000008a9
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
258: 000001bd .word 0x000001bd
|
|
|
|
0000025c <delay_driver_init>:
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
25c: b510 push {r4, lr}
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
25e: 4802 ldr r0, [pc, #8] ; (268 <delay_driver_init+0xc>)
|
|
260: 4b02 ldr r3, [pc, #8] ; (26c <delay_driver_init+0x10>)
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
262: 4798 blx r3
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
264: bd10 pop {r4, pc}
|
|
tmp &= ~PORT_PMUX_PMUXO_Msk;
|
|
266: 46c0 nop ; (mov r8, r8)
|
|
tmp |= PORT_PMUX_PMUXO(data);
|
|
268: e000e010 .word 0xe000e010
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
26c: 0000082d .word 0x0000082d
|
|
|
|
00000270 <PWM_0_PORT_init>:
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
270: b530 push {r4, r5, lr}
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
272: 4b0f ldr r3, [pc, #60] ; (2b0 <PWM_0_PORT_init+0x40>)
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
274: 2254 movs r2, #84 ; 0x54
|
|
276: 5c99 ldrb r1, [r3, r2]
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
278: 2501 movs r5, #1
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
27a: 43a9 bics r1, r5
|
|
27c: 2401 movs r4, #1
|
|
tmp &= ~PORT_PMUX_PMUXE_Msk;
|
|
27e: 4321 orrs r1, r4
|
|
280: b2c9 uxtb r1, r1
|
|
282: 5499 strb r1, [r3, r2]
|
|
tmp |= PORT_PMUX_PMUXE(data);
|
|
284: 203a movs r0, #58 ; 0x3a
|
|
286: 5c19 ldrb r1, [r3, r0]
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
288: 3a45 subs r2, #69 ; 0x45
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
28a: 4391 bics r1, r2
|
|
28c: 2204 movs r2, #4
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
28e: 4311 orrs r1, r2
|
|
tmp |= value << PORT_PINCFG_PMUXEN_Pos;
|
|
290: b2c9 uxtb r1, r1
|
|
292: 5419 strb r1, [r3, r0]
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
294: 2155 movs r1, #85 ; 0x55
|
|
tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg;
|
|
296: 5c5a ldrb r2, [r3, r1]
|
|
tmp &= ~PORT_PMUX_PMUXO_Msk;
|
|
298: 43aa bics r2, r5
|
|
tmp |= PORT_PMUX_PMUXO(data);
|
|
29a: 4322 orrs r2, r4
|
|
29c: b2d2 uxtb r2, r2
|
|
((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp;
|
|
29e: 545a strb r2, [r3, r1]
|
|
gpio_set_pin_function(SEG21, PINMUX_PA19B_SLCD_LP35);
|
|
|
|
gpio_set_pin_function(SEG22, PINMUX_PB16B_SLCD_LP42);
|
|
|
|
gpio_set_pin_function(SEG23, PINMUX_PB17B_SLCD_LP43);
|
|
}
|
|
2a0: 5c1a ldrb r2, [r3, r0]
|
|
2a2: 3946 subs r1, #70 ; 0x46
|
|
2a4: 400a ands r2, r1
|
|
2a6: 2140 movs r1, #64 ; 0x40
|
|
2a8: 430a orrs r2, r1
|
|
2aa: b2d2 uxtb r2, r2
|
|
2ac: 541a strb r2, [r3, r0]
|
|
}
|
|
2ae: bd30 pop {r4, r5, pc}
|
|
2b0: 41006000 .word 0x41006000
|
|
|
|
000002b4 <PWM_0_CLOCK_init>:
|
|
}
|
|
|
|
static inline void hri_mclk_set_APBCMASK_TC3_bit(const void *const hw)
|
|
{
|
|
MCLK_CRITICAL_SECTION_ENTER();
|
|
((Mclk *)hw)->APBCMASK.reg |= MCLK_APBCMASK_TC3;
|
|
2b4: 4a05 ldr r2, [pc, #20] ; (2cc <PWM_0_CLOCK_init+0x18>)
|
|
2b6: 69d1 ldr r1, [r2, #28]
|
|
2b8: 2380 movs r3, #128 ; 0x80
|
|
2ba: 011b lsls r3, r3, #4
|
|
2bc: 430b orrs r3, r1
|
|
2be: 61d3 str r3, [r2, #28]
|
|
}
|
|
|
|
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;
|
|
2c0: 2140 movs r1, #64 ; 0x40
|
|
2c2: 23e0 movs r3, #224 ; 0xe0
|
|
2c4: 4a02 ldr r2, [pc, #8] ; (2d0 <PWM_0_CLOCK_init+0x1c>)
|
|
2c6: 50d1 str r1, [r2, r3]
|
|
}
|
|
2c8: 4770 bx lr
|
|
2ca: 46c0 nop ; (mov r8, r8)
|
|
2cc: 40000800 .word 0x40000800
|
|
2d0: 40001c00 .word 0x40001c00
|
|
|
|
000002d4 <PWM_0_init>:
|
|
{
|
|
2d4: b510 push {r4, lr}
|
|
PWM_0_CLOCK_init();
|
|
2d6: 4b06 ldr r3, [pc, #24] ; (2f0 <PWM_0_init+0x1c>)
|
|
2d8: 4798 blx r3
|
|
PWM_0_PORT_init();
|
|
2da: 4b06 ldr r3, [pc, #24] ; (2f4 <PWM_0_init+0x20>)
|
|
2dc: 4798 blx r3
|
|
pwm_init(&PWM_0, TC3, _tc_get_pwm());
|
|
2de: 4b06 ldr r3, [pc, #24] ; (2f8 <PWM_0_init+0x24>)
|
|
2e0: 4798 blx r3
|
|
2e2: 0002 movs r2, r0
|
|
2e4: 4905 ldr r1, [pc, #20] ; (2fc <PWM_0_init+0x28>)
|
|
2e6: 4806 ldr r0, [pc, #24] ; (300 <PWM_0_init+0x2c>)
|
|
2e8: 4b06 ldr r3, [pc, #24] ; (304 <PWM_0_init+0x30>)
|
|
2ea: 4798 blx r3
|
|
}
|
|
2ec: bd10 pop {r4, pc}
|
|
2ee: 46c0 nop ; (mov r8, r8)
|
|
2f0: 000002b5 .word 0x000002b5
|
|
2f4: 00000271 .word 0x00000271
|
|
2f8: 000019d9 .word 0x000019d9
|
|
2fc: 42002c00 .word 0x42002c00
|
|
300: 20000090 .word 0x20000090
|
|
304: 00000999 .word 0x00000999
|
|
|
|
00000308 <system_init>:
|
|
slcd_sync_init(&SEGMENT_LCD_0, SLCD);
|
|
SEGMENT_LCD_0_PORT_init();
|
|
}
|
|
|
|
void system_init(void)
|
|
{
|
|
308: b5f0 push {r4, r5, r6, r7, lr}
|
|
30a: 46c6 mov lr, r8
|
|
30c: b500 push {lr}
|
|
* Currently the following initialization functions are supported:
|
|
* - System clock initialization
|
|
*/
|
|
static inline void init_mcu(void)
|
|
{
|
|
_init_chip();
|
|
30e: 4b1c ldr r3, [pc, #112] ; (380 <system_init+0x78>)
|
|
310: 4798 blx r3
|
|
((Port *)hw)->Group[submodule_index].DIRCLR.reg = mask;
|
|
312: 22c0 movs r2, #192 ; 0xc0
|
|
314: 05d2 lsls r2, r2, #23
|
|
316: 2404 movs r4, #4
|
|
318: 6054 str r4, [r2, #4]
|
|
|
|
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;
|
|
31a: 4b1a ldr r3, [pc, #104] ; (384 <system_init+0x7c>)
|
|
31c: 491a ldr r1, [pc, #104] ; (388 <system_init+0x80>)
|
|
31e: 6299 str r1, [r3, #40] ; 0x28
|
|
320: 491a ldr r1, [pc, #104] ; (38c <system_init+0x84>)
|
|
322: 6299 str r1, [r3, #40] ; 0x28
|
|
((Port *)hw)->Group[submodule_index].DIRCLR.reg = mask;
|
|
324: 6054 str r4, [r2, #4]
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg |= PORT_PINCFG_PULLEN;
|
|
326: 2042 movs r0, #66 ; 0x42
|
|
328: 5c19 ldrb r1, [r3, r0]
|
|
32a: 2504 movs r5, #4
|
|
32c: 4329 orrs r1, r5
|
|
32e: b2c9 uxtb r1, r1
|
|
330: 5419 strb r1, [r3, r0]
|
|
((Port *)hw)->Group[submodule_index].OUTCLR.reg = mask;
|
|
332: 6154 str r4, [r2, #20]
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
334: 5c1c ldrb r4, [r3, r0]
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
336: 2101 movs r1, #1
|
|
338: 438c bics r4, r1
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
33a: 541c strb r4, [r3, r0]
|
|
((Port *)hw)->Group[submodule_index].OUTCLR.reg = mask;
|
|
33c: 2794 movs r7, #148 ; 0x94
|
|
33e: 51d1 str r1, [r2, r7]
|
|
((Port *)hw)->Group[submodule_index].DIRSET.reg = mask;
|
|
340: 2688 movs r6, #136 ; 0x88
|
|
342: 5191 str r1, [r2, r6]
|
|
((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data;
|
|
344: 3066 adds r0, #102 ; 0x66
|
|
346: 4c12 ldr r4, [pc, #72] ; (390 <system_init+0x88>)
|
|
348: 501c str r4, [r3, r0]
|
|
34a: 24c0 movs r4, #192 ; 0xc0
|
|
34c: 0624 lsls r4, r4, #24
|
|
34e: 46a0 mov r8, r4
|
|
350: 501c str r4, [r3, r0]
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
352: 24c0 movs r4, #192 ; 0xc0
|
|
354: 46a4 mov ip, r4
|
|
356: 5d1c ldrb r4, [r3, r4]
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
358: 438c bics r4, r1
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
35a: 4665 mov r5, ip
|
|
35c: 555c strb r4, [r3, r5]
|
|
((Port *)hw)->Group[submodule_index].OUTCLR.reg = mask;
|
|
35e: 2408 movs r4, #8
|
|
360: 51d4 str r4, [r2, r7]
|
|
((Port *)hw)->Group[submodule_index].DIRSET.reg = mask;
|
|
362: 5194 str r4, [r2, r6]
|
|
((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data;
|
|
364: 4a0b ldr r2, [pc, #44] ; (394 <system_init+0x8c>)
|
|
366: 501a str r2, [r3, r0]
|
|
368: 4642 mov r2, r8
|
|
36a: 501a str r2, [r3, r0]
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
36c: 301b adds r0, #27
|
|
36e: 5c1a ldrb r2, [r3, r0]
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
370: 438a bics r2, r1
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
372: 541a strb r2, [r3, r0]
|
|
// Set pin direction to output
|
|
gpio_set_pin_direction(D0, GPIO_DIRECTION_OUT);
|
|
|
|
gpio_set_pin_function(D0, GPIO_PIN_FUNCTION_OFF);
|
|
|
|
delay_driver_init();
|
|
374: 4b08 ldr r3, [pc, #32] ; (398 <system_init+0x90>)
|
|
376: 4798 blx r3
|
|
PWM_0_init();
|
|
|
|
PWM_1_init();
|
|
SEGMENT_LCD_0_init();
|
|
*/
|
|
}
|
|
378: bc04 pop {r2}
|
|
37a: 4690 mov r8, r2
|
|
37c: bdf0 pop {r4, r5, r6, r7, pc}
|
|
37e: 46c0 nop ; (mov r8, r8)
|
|
380: 00000b3d .word 0x00000b3d
|
|
384: 41006000 .word 0x41006000
|
|
388: 40020004 .word 0x40020004
|
|
38c: c0020000 .word 0xc0020000
|
|
390: 40000001 .word 0x40000001
|
|
394: 40000008 .word 0x40000008
|
|
398: 0000025d .word 0x0000025d
|
|
|
|
0000039c <leap_year>:
|
|
* \retval false not leap year.
|
|
* \retval true leap year.
|
|
*/
|
|
static bool leap_year(uint16_t year)
|
|
{
|
|
if (year & 3) {
|
|
39c: 0783 lsls r3, r0, #30
|
|
39e: d101 bne.n 3a4 <leap_year+0x8>
|
|
return false;
|
|
} else {
|
|
return true;
|
|
3a0: 2001 movs r0, #1
|
|
}
|
|
}
|
|
3a2: 4770 bx lr
|
|
return false;
|
|
3a4: 2000 movs r0, #0
|
|
3a6: e7fc b.n 3a2 <leap_year+0x6>
|
|
|
|
000003a8 <get_secs_in_month>:
|
|
|
|
/** \brief calculate the seconds in specified year/month
|
|
* \retval 0 month error.
|
|
*/
|
|
static uint32_t get_secs_in_month(uint32_t year, uint8_t month)
|
|
{
|
|
3a8: b510 push {r4, lr}
|
|
3aa: 000c movs r4, r1
|
|
uint32_t sec_in_month = 0;
|
|
|
|
if (leap_year(year)) {
|
|
3ac: b280 uxth r0, r0
|
|
3ae: 4b10 ldr r3, [pc, #64] ; (3f0 <get_secs_in_month+0x48>)
|
|
3b0: 4798 blx r3
|
|
3b2: 2800 cmp r0, #0
|
|
3b4: d00b beq.n 3ce <get_secs_in_month+0x26>
|
|
switch (month) {
|
|
3b6: 2c0c cmp r4, #12
|
|
3b8: d803 bhi.n 3c2 <get_secs_in_month+0x1a>
|
|
3ba: 00a4 lsls r4, r4, #2
|
|
3bc: 4b0d ldr r3, [pc, #52] ; (3f4 <get_secs_in_month+0x4c>)
|
|
3be: 591b ldr r3, [r3, r4]
|
|
3c0: 469f mov pc, r3
|
|
uint32_t sec_in_month = 0;
|
|
3c2: 2000 movs r0, #0
|
|
3c4: e010 b.n 3e8 <get_secs_in_month+0x40>
|
|
case 10:
|
|
case 12:
|
|
sec_in_month = SECS_IN_31DAYS;
|
|
break;
|
|
case 2:
|
|
sec_in_month = SECS_IN_29DAYS;
|
|
3c6: 480c ldr r0, [pc, #48] ; (3f8 <get_secs_in_month+0x50>)
|
|
break;
|
|
3c8: e00e b.n 3e8 <get_secs_in_month+0x40>
|
|
case 4:
|
|
case 6:
|
|
case 9:
|
|
case 11:
|
|
sec_in_month = SECS_IN_30DAYS;
|
|
3ca: 480c ldr r0, [pc, #48] ; (3fc <get_secs_in_month+0x54>)
|
|
break;
|
|
3cc: e00c b.n 3e8 <get_secs_in_month+0x40>
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
switch (month) {
|
|
3ce: 2c0c cmp r4, #12
|
|
3d0: d803 bhi.n 3da <get_secs_in_month+0x32>
|
|
3d2: 00a4 lsls r4, r4, #2
|
|
3d4: 4b0a ldr r3, [pc, #40] ; (400 <get_secs_in_month+0x58>)
|
|
3d6: 591b ldr r3, [r3, r4]
|
|
3d8: 469f mov pc, r3
|
|
uint32_t sec_in_month = 0;
|
|
3da: 2000 movs r0, #0
|
|
3dc: e004 b.n 3e8 <get_secs_in_month+0x40>
|
|
case 10:
|
|
case 12:
|
|
sec_in_month = SECS_IN_31DAYS;
|
|
break;
|
|
case 2:
|
|
sec_in_month = SECS_IN_28DAYS;
|
|
3de: 4809 ldr r0, [pc, #36] ; (404 <get_secs_in_month+0x5c>)
|
|
break;
|
|
3e0: e002 b.n 3e8 <get_secs_in_month+0x40>
|
|
case 4:
|
|
case 6:
|
|
case 9:
|
|
case 11:
|
|
sec_in_month = SECS_IN_30DAYS;
|
|
3e2: 4806 ldr r0, [pc, #24] ; (3fc <get_secs_in_month+0x54>)
|
|
break;
|
|
3e4: e000 b.n 3e8 <get_secs_in_month+0x40>
|
|
sec_in_month = SECS_IN_31DAYS;
|
|
3e6: 4808 ldr r0, [pc, #32] ; (408 <get_secs_in_month+0x60>)
|
|
break;
|
|
}
|
|
}
|
|
|
|
return sec_in_month;
|
|
}
|
|
3e8: bd10 pop {r4, pc}
|
|
sec_in_month = SECS_IN_31DAYS;
|
|
3ea: 4807 ldr r0, [pc, #28] ; (408 <get_secs_in_month+0x60>)
|
|
return sec_in_month;
|
|
3ec: e7fc b.n 3e8 <get_secs_in_month+0x40>
|
|
3ee: 46c0 nop ; (mov r8, r8)
|
|
3f0: 0000039d .word 0x0000039d
|
|
3f4: 00001ef8 .word 0x00001ef8
|
|
3f8: 00263b80 .word 0x00263b80
|
|
3fc: 00278d00 .word 0x00278d00
|
|
400: 00001f2c .word 0x00001f2c
|
|
404: 0024ea00 .word 0x0024ea00
|
|
408: 0028de80 .word 0x0028de80
|
|
|
|
0000040c <convert_timestamp_to_datetime>:
|
|
|
|
/** \brief convert timestamp to date/time
|
|
*/
|
|
static int32_t convert_timestamp_to_datetime(struct calendar_descriptor *const calendar, uint32_t ts,
|
|
struct calendar_date_time *dt)
|
|
{
|
|
40c: b5f0 push {r4, r5, r6, r7, lr}
|
|
40e: 46c6 mov lr, r8
|
|
410: b500 push {lr}
|
|
412: 000c movs r4, r1
|
|
414: 4690 mov r8, r2
|
|
uint32_t tmp, sec_in_year, sec_in_month;
|
|
uint32_t tmp_year = calendar->base_year;
|
|
416: 6986 ldr r6, [r0, #24]
|
|
418: e004 b.n 424 <convert_timestamp_to_datetime+0x18>
|
|
|
|
tmp = ts;
|
|
|
|
/* Find year */
|
|
while (true) {
|
|
sec_in_year = leap_year(tmp_year) ? SECS_IN_LEAP_YEAR : SECS_IN_NON_LEAP_YEAR;
|
|
41a: 4b1f ldr r3, [pc, #124] ; (498 <convert_timestamp_to_datetime+0x8c>)
|
|
|
|
if (tmp >= sec_in_year) {
|
|
41c: 429c cmp r4, r3
|
|
41e: d309 bcc.n 434 <convert_timestamp_to_datetime+0x28>
|
|
tmp -= sec_in_year;
|
|
420: 1ae4 subs r4, r4, r3
|
|
tmp_year++;
|
|
422: 3601 adds r6, #1
|
|
sec_in_year = leap_year(tmp_year) ? SECS_IN_LEAP_YEAR : SECS_IN_NON_LEAP_YEAR;
|
|
424: b2b7 uxth r7, r6
|
|
426: 0038 movs r0, r7
|
|
428: 4b1c ldr r3, [pc, #112] ; (49c <convert_timestamp_to_datetime+0x90>)
|
|
42a: 4798 blx r3
|
|
42c: 2800 cmp r0, #0
|
|
42e: d0f4 beq.n 41a <convert_timestamp_to_datetime+0xe>
|
|
430: 4b1b ldr r3, [pc, #108] ; (4a0 <convert_timestamp_to_datetime+0x94>)
|
|
432: e7f3 b.n 41c <convert_timestamp_to_datetime+0x10>
|
|
434: 2501 movs r5, #1
|
|
break;
|
|
}
|
|
}
|
|
/* Find month of year */
|
|
while (true) {
|
|
sec_in_month = get_secs_in_month(tmp_year, tmp_month);
|
|
436: 0029 movs r1, r5
|
|
438: 0030 movs r0, r6
|
|
43a: 4b1a ldr r3, [pc, #104] ; (4a4 <convert_timestamp_to_datetime+0x98>)
|
|
43c: 4798 blx r3
|
|
|
|
if (tmp >= sec_in_month) {
|
|
43e: 4284 cmp r4, r0
|
|
440: d303 bcc.n 44a <convert_timestamp_to_datetime+0x3e>
|
|
tmp -= sec_in_month;
|
|
442: 1a24 subs r4, r4, r0
|
|
tmp_month++;
|
|
444: 3501 adds r5, #1
|
|
446: b2ed uxtb r5, r5
|
|
sec_in_month = get_secs_in_month(tmp_year, tmp_month);
|
|
448: e7f5 b.n 436 <convert_timestamp_to_datetime+0x2a>
|
|
44a: 2101 movs r1, #1
|
|
break;
|
|
}
|
|
}
|
|
/* Find day of month */
|
|
while (true) {
|
|
if (tmp >= SECS_IN_DAY) {
|
|
44c: 4b16 ldr r3, [pc, #88] ; (4a8 <convert_timestamp_to_datetime+0x9c>)
|
|
44e: 429c cmp r4, r3
|
|
450: d905 bls.n 45e <convert_timestamp_to_datetime+0x52>
|
|
tmp -= SECS_IN_DAY;
|
|
452: 4b16 ldr r3, [pc, #88] ; (4ac <convert_timestamp_to_datetime+0xa0>)
|
|
454: 469c mov ip, r3
|
|
456: 4464 add r4, ip
|
|
tmp_day++;
|
|
458: 3101 adds r1, #1
|
|
45a: b2c9 uxtb r1, r1
|
|
if (tmp >= SECS_IN_DAY) {
|
|
45c: e7f6 b.n 44c <convert_timestamp_to_datetime+0x40>
|
|
45e: 2200 movs r2, #0
|
|
break;
|
|
}
|
|
}
|
|
/* Find hour of day */
|
|
while (true) {
|
|
if (tmp >= SECS_IN_HOUR) {
|
|
460: 4b13 ldr r3, [pc, #76] ; (4b0 <convert_timestamp_to_datetime+0xa4>)
|
|
462: 429c cmp r4, r3
|
|
464: d905 bls.n 472 <convert_timestamp_to_datetime+0x66>
|
|
tmp -= SECS_IN_HOUR;
|
|
466: 4b13 ldr r3, [pc, #76] ; (4b4 <convert_timestamp_to_datetime+0xa8>)
|
|
468: 469c mov ip, r3
|
|
46a: 4464 add r4, ip
|
|
tmp_hour++;
|
|
46c: 3201 adds r2, #1
|
|
46e: b2d2 uxtb r2, r2
|
|
if (tmp >= SECS_IN_HOUR) {
|
|
470: e7f6 b.n 460 <convert_timestamp_to_datetime+0x54>
|
|
472: 2300 movs r3, #0
|
|
break;
|
|
}
|
|
}
|
|
/* Find minute in hour */
|
|
while (true) {
|
|
if (tmp >= SECS_IN_MINUTE) {
|
|
474: 2c3b cmp r4, #59 ; 0x3b
|
|
476: d903 bls.n 480 <convert_timestamp_to_datetime+0x74>
|
|
tmp -= SECS_IN_MINUTE;
|
|
478: 3c3c subs r4, #60 ; 0x3c
|
|
tmp_minutes++;
|
|
47a: 3301 adds r3, #1
|
|
47c: b2db uxtb r3, r3
|
|
if (tmp >= SECS_IN_MINUTE) {
|
|
47e: e7f9 b.n 474 <convert_timestamp_to_datetime+0x68>
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
dt->date.year = tmp_year;
|
|
480: 4640 mov r0, r8
|
|
482: 80c7 strh r7, [r0, #6]
|
|
dt->date.month = tmp_month;
|
|
484: 7145 strb r5, [r0, #5]
|
|
dt->date.day = tmp_day;
|
|
486: 7101 strb r1, [r0, #4]
|
|
dt->time.hour = tmp_hour;
|
|
488: 7082 strb r2, [r0, #2]
|
|
dt->time.min = tmp_minutes;
|
|
48a: 7043 strb r3, [r0, #1]
|
|
dt->time.sec = tmp;
|
|
48c: 7004 strb r4, [r0, #0]
|
|
|
|
return ERR_NONE;
|
|
}
|
|
48e: 2000 movs r0, #0
|
|
490: bc04 pop {r2}
|
|
492: 4690 mov r8, r2
|
|
494: bdf0 pop {r4, r5, r6, r7, pc}
|
|
496: 46c0 nop ; (mov r8, r8)
|
|
498: 01e13380 .word 0x01e13380
|
|
49c: 0000039d .word 0x0000039d
|
|
4a0: 01e28500 .word 0x01e28500
|
|
4a4: 000003a9 .word 0x000003a9
|
|
4a8: 0001517f .word 0x0001517f
|
|
4ac: fffeae80 .word 0xfffeae80
|
|
4b0: 00000e0f .word 0x00000e0f
|
|
4b4: fffff1f0 .word 0xfffff1f0
|
|
|
|
000004b8 <convert_datetime_to_timestamp>:
|
|
|
|
/** \brief convert date/time to timestamp
|
|
* \return timestamp
|
|
*/
|
|
static uint32_t convert_datetime_to_timestamp(struct calendar_descriptor *const calendar, struct calendar_date_time *dt)
|
|
{
|
|
4b8: b5f0 push {r4, r5, r6, r7, lr}
|
|
4ba: 46de mov lr, fp
|
|
4bc: 4657 mov r7, sl
|
|
4be: 464e mov r6, r9
|
|
4c0: 4645 mov r5, r8
|
|
4c2: b5e0 push {r5, r6, r7, lr}
|
|
4c4: b083 sub sp, #12
|
|
uint32_t tmp = 0;
|
|
uint32_t i = 0;
|
|
uint8_t year, month, day, hour, minutes, seconds;
|
|
|
|
year = dt->date.year - calendar->base_year;
|
|
4c6: 88cb ldrh r3, [r1, #6]
|
|
4c8: 9300 str r3, [sp, #0]
|
|
4ca: b2de uxtb r6, r3
|
|
4cc: 6983 ldr r3, [r0, #24]
|
|
4ce: 4699 mov r9, r3
|
|
4d0: 466a mov r2, sp
|
|
4d2: 7113 strb r3, [r2, #4]
|
|
4d4: 7913 ldrb r3, [r2, #4]
|
|
4d6: 1af6 subs r6, r6, r3
|
|
4d8: b2f6 uxtb r6, r6
|
|
month = dt->date.month;
|
|
4da: 794f ldrb r7, [r1, #5]
|
|
day = dt->date.day;
|
|
4dc: 790b ldrb r3, [r1, #4]
|
|
4de: 469a mov sl, r3
|
|
hour = dt->time.hour;
|
|
4e0: 788b ldrb r3, [r1, #2]
|
|
4e2: 4698 mov r8, r3
|
|
minutes = dt->time.min;
|
|
4e4: 784b ldrb r3, [r1, #1]
|
|
4e6: 469b mov fp, r3
|
|
seconds = dt->time.sec;
|
|
4e8: 780b ldrb r3, [r1, #0]
|
|
4ea: 9301 str r3, [sp, #4]
|
|
|
|
/* tot up year field */
|
|
for (i = 0; i < year; ++i) {
|
|
4ec: 2500 movs r5, #0
|
|
uint32_t tmp = 0;
|
|
4ee: 2400 movs r4, #0
|
|
for (i = 0; i < year; ++i) {
|
|
4f0: e003 b.n 4fa <convert_datetime_to_timestamp+0x42>
|
|
if (leap_year(calendar->base_year + i)) {
|
|
tmp += SECS_IN_LEAP_YEAR;
|
|
} else {
|
|
tmp += SECS_IN_NON_LEAP_YEAR;
|
|
4f2: 4b1a ldr r3, [pc, #104] ; (55c <convert_datetime_to_timestamp+0xa4>)
|
|
4f4: 469c mov ip, r3
|
|
4f6: 4464 add r4, ip
|
|
for (i = 0; i < year; ++i) {
|
|
4f8: 3501 adds r5, #1
|
|
4fa: 42b5 cmp r5, r6
|
|
4fc: d20a bcs.n 514 <convert_datetime_to_timestamp+0x5c>
|
|
if (leap_year(calendar->base_year + i)) {
|
|
4fe: 464b mov r3, r9
|
|
500: 1958 adds r0, r3, r5
|
|
502: b280 uxth r0, r0
|
|
504: 4b16 ldr r3, [pc, #88] ; (560 <convert_datetime_to_timestamp+0xa8>)
|
|
506: 4798 blx r3
|
|
508: 2800 cmp r0, #0
|
|
50a: d0f2 beq.n 4f2 <convert_datetime_to_timestamp+0x3a>
|
|
tmp += SECS_IN_LEAP_YEAR;
|
|
50c: 4b15 ldr r3, [pc, #84] ; (564 <convert_datetime_to_timestamp+0xac>)
|
|
50e: 469c mov ip, r3
|
|
510: 4464 add r4, ip
|
|
512: e7f1 b.n 4f8 <convert_datetime_to_timestamp+0x40>
|
|
514: 2501 movs r5, #1
|
|
516: e005 b.n 524 <convert_datetime_to_timestamp+0x6c>
|
|
}
|
|
}
|
|
|
|
/* tot up month field */
|
|
for (i = 1; i < month; ++i) {
|
|
tmp += get_secs_in_month(dt->date.year, i);
|
|
518: b2e9 uxtb r1, r5
|
|
51a: 9800 ldr r0, [sp, #0]
|
|
51c: 4b12 ldr r3, [pc, #72] ; (568 <convert_datetime_to_timestamp+0xb0>)
|
|
51e: 4798 blx r3
|
|
520: 1824 adds r4, r4, r0
|
|
for (i = 1; i < month; ++i) {
|
|
522: 3501 adds r5, #1
|
|
524: 42bd cmp r5, r7
|
|
526: d3f7 bcc.n 518 <convert_datetime_to_timestamp+0x60>
|
|
}
|
|
|
|
/* tot up day/hour/minute/second fields */
|
|
tmp += (day - 1) * SECS_IN_DAY;
|
|
528: 4653 mov r3, sl
|
|
52a: 3b01 subs r3, #1
|
|
52c: 480f ldr r0, [pc, #60] ; (56c <convert_datetime_to_timestamp+0xb4>)
|
|
52e: 4358 muls r0, r3
|
|
530: 1824 adds r4, r4, r0
|
|
tmp += hour * SECS_IN_HOUR;
|
|
532: 20e1 movs r0, #225 ; 0xe1
|
|
534: 0100 lsls r0, r0, #4
|
|
536: 4643 mov r3, r8
|
|
538: 4358 muls r0, r3
|
|
53a: 1820 adds r0, r4, r0
|
|
tmp += minutes * SECS_IN_MINUTE;
|
|
53c: 465b mov r3, fp
|
|
53e: 011b lsls r3, r3, #4
|
|
540: 465a mov r2, fp
|
|
542: 1a9b subs r3, r3, r2
|
|
544: 009c lsls r4, r3, #2
|
|
546: 1900 adds r0, r0, r4
|
|
tmp += seconds;
|
|
548: 9b01 ldr r3, [sp, #4]
|
|
54a: 469c mov ip, r3
|
|
54c: 4460 add r0, ip
|
|
|
|
return tmp;
|
|
}
|
|
54e: b003 add sp, #12
|
|
550: bc3c pop {r2, r3, r4, r5}
|
|
552: 4690 mov r8, r2
|
|
554: 4699 mov r9, r3
|
|
556: 46a2 mov sl, r4
|
|
558: 46ab mov fp, r5
|
|
55a: bdf0 pop {r4, r5, r6, r7, pc}
|
|
55c: 01e13380 .word 0x01e13380
|
|
560: 0000039d .word 0x0000039d
|
|
564: 01e28500 .word 0x01e28500
|
|
568: 000003a9 .word 0x000003a9
|
|
56c: 00015180 .word 0x00015180
|
|
|
|
00000570 <calibrate_timestamp>:
|
|
|
|
/** \brief calibrate timestamp to make desired timestamp ahead of current timestamp
|
|
*/
|
|
static void calibrate_timestamp(struct calendar_descriptor *const calendar, struct calendar_alarm *alarm,
|
|
struct calendar_alarm *current_dt)
|
|
{
|
|
570: b570 push {r4, r5, r6, lr}
|
|
572: 000c movs r4, r1
|
|
uint32_t alarm_ts;
|
|
uint32_t current_ts = current_dt->cal_alarm.timestamp;
|
|
574: 68d0 ldr r0, [r2, #12]
|
|
|
|
alarm_ts = alarm->cal_alarm.timestamp;
|
|
576: 68cd ldr r5, [r1, #12]
|
|
|
|
/* calibrate timestamp */
|
|
switch (alarm->cal_alarm.option) {
|
|
578: 7c0b ldrb r3, [r1, #16]
|
|
57a: 2b05 cmp r3, #5
|
|
57c: d806 bhi.n 58c <calibrate_timestamp+0x1c>
|
|
57e: 009b lsls r3, r3, #2
|
|
580: 4915 ldr r1, [pc, #84] ; (5d8 <calibrate_timestamp+0x68>)
|
|
582: 58cb ldr r3, [r1, r3]
|
|
584: 469f mov pc, r3
|
|
case CALENDAR_ALARM_MATCH_SEC:
|
|
|
|
if (alarm_ts <= current_ts) {
|
|
586: 42a8 cmp r0, r5
|
|
588: d300 bcc.n 58c <calibrate_timestamp+0x1c>
|
|
alarm_ts += SECS_IN_MINUTE;
|
|
58a: 353c adds r5, #60 ; 0x3c
|
|
default:
|
|
break;
|
|
}
|
|
|
|
/* desired timestamp after calibration */
|
|
alarm->cal_alarm.timestamp = alarm_ts;
|
|
58c: 60e5 str r5, [r4, #12]
|
|
}
|
|
58e: bd70 pop {r4, r5, r6, pc}
|
|
if (alarm_ts <= current_ts) {
|
|
590: 42a8 cmp r0, r5
|
|
592: d3fb bcc.n 58c <calibrate_timestamp+0x1c>
|
|
alarm_ts += SECS_IN_HOUR;
|
|
594: 23e1 movs r3, #225 ; 0xe1
|
|
596: 011b lsls r3, r3, #4
|
|
598: 469c mov ip, r3
|
|
59a: 4465 add r5, ip
|
|
59c: e7f6 b.n 58c <calibrate_timestamp+0x1c>
|
|
if (alarm_ts <= current_ts) {
|
|
59e: 42a8 cmp r0, r5
|
|
5a0: d3f4 bcc.n 58c <calibrate_timestamp+0x1c>
|
|
alarm_ts += SECS_IN_DAY;
|
|
5a2: 4b0e ldr r3, [pc, #56] ; (5dc <calibrate_timestamp+0x6c>)
|
|
5a4: 469c mov ip, r3
|
|
5a6: 4465 add r5, ip
|
|
5a8: e7f0 b.n 58c <calibrate_timestamp+0x1c>
|
|
if (alarm_ts <= current_ts) {
|
|
5aa: 42a8 cmp r0, r5
|
|
5ac: d3ee bcc.n 58c <calibrate_timestamp+0x1c>
|
|
alarm_ts += get_secs_in_month(current_dt->cal_alarm.datetime.date.year,
|
|
5ae: 8950 ldrh r0, [r2, #10]
|
|
5b0: 7a51 ldrb r1, [r2, #9]
|
|
5b2: 4b0b ldr r3, [pc, #44] ; (5e0 <calibrate_timestamp+0x70>)
|
|
5b4: 4798 blx r3
|
|
5b6: 182d adds r5, r5, r0
|
|
5b8: e7e8 b.n 58c <calibrate_timestamp+0x1c>
|
|
if (alarm_ts <= current_ts) {
|
|
5ba: 42a8 cmp r0, r5
|
|
5bc: d3e6 bcc.n 58c <calibrate_timestamp+0x1c>
|
|
if (leap_year(current_dt->cal_alarm.datetime.date.year)) {
|
|
5be: 8950 ldrh r0, [r2, #10]
|
|
5c0: 4b08 ldr r3, [pc, #32] ; (5e4 <calibrate_timestamp+0x74>)
|
|
5c2: 4798 blx r3
|
|
5c4: 2800 cmp r0, #0
|
|
5c6: d103 bne.n 5d0 <calibrate_timestamp+0x60>
|
|
alarm_ts += SECS_IN_NON_LEAP_YEAR;
|
|
5c8: 4b07 ldr r3, [pc, #28] ; (5e8 <calibrate_timestamp+0x78>)
|
|
5ca: 469c mov ip, r3
|
|
5cc: 4465 add r5, ip
|
|
5ce: e7dd b.n 58c <calibrate_timestamp+0x1c>
|
|
alarm_ts += SECS_IN_LEAP_YEAR;
|
|
5d0: 4b06 ldr r3, [pc, #24] ; (5ec <calibrate_timestamp+0x7c>)
|
|
5d2: 469c mov ip, r3
|
|
5d4: 4465 add r5, ip
|
|
5d6: e7d9 b.n 58c <calibrate_timestamp+0x1c>
|
|
5d8: 00001f60 .word 0x00001f60
|
|
5dc: 00015180 .word 0x00015180
|
|
5e0: 000003a9 .word 0x000003a9
|
|
5e4: 0000039d .word 0x0000039d
|
|
5e8: 01e13380 .word 0x01e13380
|
|
5ec: 01e28500 .word 0x01e28500
|
|
|
|
000005f0 <fill_alarm>:
|
|
|
|
/** \brief complete alarm to absolute date/time, then fill up the timestamp
|
|
*/
|
|
static void fill_alarm(struct calendar_descriptor *const calendar, struct calendar_alarm *alarm)
|
|
{
|
|
5f0: b570 push {r4, r5, r6, lr}
|
|
5f2: b086 sub sp, #24
|
|
5f4: 0005 movs r5, r0
|
|
5f6: 000c movs r4, r1
|
|
struct calendar_alarm current_dt;
|
|
uint32_t tmp, current_ts;
|
|
|
|
/* get current date/time */
|
|
current_ts = _calendar_get_counter(&calendar->device);
|
|
5f8: 4b29 ldr r3, [pc, #164] ; (6a0 <fill_alarm+0xb0>)
|
|
5fa: 4798 blx r3
|
|
5fc: 0006 movs r6, r0
|
|
convert_timestamp_to_datetime(calendar, current_ts, ¤t_dt.cal_alarm.datetime);
|
|
5fe: aa01 add r2, sp, #4
|
|
600: 0001 movs r1, r0
|
|
602: 0028 movs r0, r5
|
|
604: 4b27 ldr r3, [pc, #156] ; (6a4 <fill_alarm+0xb4>)
|
|
606: 4798 blx r3
|
|
|
|
current_dt.cal_alarm.timestamp = current_ts;
|
|
608: 9603 str r6, [sp, #12]
|
|
|
|
/* complete alarm */
|
|
switch (alarm->cal_alarm.option) {
|
|
60a: 7c23 ldrb r3, [r4, #16]
|
|
60c: 2b05 cmp r3, #5
|
|
60e: d812 bhi.n 636 <fill_alarm+0x46>
|
|
610: 009b lsls r3, r3, #2
|
|
612: 4a25 ldr r2, [pc, #148] ; (6a8 <fill_alarm+0xb8>)
|
|
614: 58d3 ldr r3, [r2, r3]
|
|
616: 469f mov pc, r3
|
|
case CALENDAR_ALARM_MATCH_SEC:
|
|
alarm->cal_alarm.datetime.date.year = current_dt.cal_alarm.datetime.date.year;
|
|
618: 466b mov r3, sp
|
|
61a: 895b ldrh r3, [r3, #10]
|
|
61c: 8163 strh r3, [r4, #10]
|
|
alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month;
|
|
61e: 466b mov r3, sp
|
|
620: 7a5b ldrb r3, [r3, #9]
|
|
622: 7263 strb r3, [r4, #9]
|
|
alarm->cal_alarm.datetime.date.day = current_dt.cal_alarm.datetime.date.day;
|
|
624: 466b mov r3, sp
|
|
626: 7a1b ldrb r3, [r3, #8]
|
|
628: 7223 strb r3, [r4, #8]
|
|
alarm->cal_alarm.datetime.time.hour = current_dt.cal_alarm.datetime.time.hour;
|
|
62a: 466b mov r3, sp
|
|
62c: 799b ldrb r3, [r3, #6]
|
|
62e: 71a3 strb r3, [r4, #6]
|
|
alarm->cal_alarm.datetime.time.min = current_dt.cal_alarm.datetime.time.min;
|
|
630: 466b mov r3, sp
|
|
632: 795b ldrb r3, [r3, #5]
|
|
634: 7163 strb r3, [r4, #5]
|
|
default:
|
|
break;
|
|
}
|
|
|
|
/* fill up the timestamp */
|
|
tmp = convert_datetime_to_timestamp(calendar, &alarm->cal_alarm.datetime);
|
|
636: 1d26 adds r6, r4, #4
|
|
638: 0031 movs r1, r6
|
|
63a: 0028 movs r0, r5
|
|
63c: 4b1b ldr r3, [pc, #108] ; (6ac <fill_alarm+0xbc>)
|
|
63e: 4798 blx r3
|
|
alarm->cal_alarm.timestamp = tmp;
|
|
640: 60e0 str r0, [r4, #12]
|
|
|
|
/* calibrate the timestamp */
|
|
calibrate_timestamp(calendar, alarm, ¤t_dt);
|
|
642: 466a mov r2, sp
|
|
644: 0021 movs r1, r4
|
|
646: 0028 movs r0, r5
|
|
648: 4b19 ldr r3, [pc, #100] ; (6b0 <fill_alarm+0xc0>)
|
|
64a: 4798 blx r3
|
|
convert_timestamp_to_datetime(calendar, alarm->cal_alarm.timestamp, &alarm->cal_alarm.datetime);
|
|
64c: 68e1 ldr r1, [r4, #12]
|
|
64e: 0032 movs r2, r6
|
|
650: 0028 movs r0, r5
|
|
652: 4b14 ldr r3, [pc, #80] ; (6a4 <fill_alarm+0xb4>)
|
|
654: 4798 blx r3
|
|
}
|
|
656: b006 add sp, #24
|
|
658: bd70 pop {r4, r5, r6, pc}
|
|
alarm->cal_alarm.datetime.date.year = current_dt.cal_alarm.datetime.date.year;
|
|
65a: 466b mov r3, sp
|
|
65c: 895b ldrh r3, [r3, #10]
|
|
65e: 8163 strh r3, [r4, #10]
|
|
alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month;
|
|
660: 466b mov r3, sp
|
|
662: 7a5b ldrb r3, [r3, #9]
|
|
664: 7263 strb r3, [r4, #9]
|
|
alarm->cal_alarm.datetime.date.day = current_dt.cal_alarm.datetime.date.day;
|
|
666: 466b mov r3, sp
|
|
668: 7a1b ldrb r3, [r3, #8]
|
|
66a: 7223 strb r3, [r4, #8]
|
|
alarm->cal_alarm.datetime.time.hour = current_dt.cal_alarm.datetime.time.hour;
|
|
66c: 466b mov r3, sp
|
|
66e: 799b ldrb r3, [r3, #6]
|
|
670: 71a3 strb r3, [r4, #6]
|
|
break;
|
|
672: e7e0 b.n 636 <fill_alarm+0x46>
|
|
alarm->cal_alarm.datetime.date.year = current_dt.cal_alarm.datetime.date.year;
|
|
674: 466b mov r3, sp
|
|
676: 895b ldrh r3, [r3, #10]
|
|
678: 8163 strh r3, [r4, #10]
|
|
alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month;
|
|
67a: 466b mov r3, sp
|
|
67c: 7a5b ldrb r3, [r3, #9]
|
|
67e: 7263 strb r3, [r4, #9]
|
|
alarm->cal_alarm.datetime.date.day = current_dt.cal_alarm.datetime.date.day;
|
|
680: 466b mov r3, sp
|
|
682: 7a1b ldrb r3, [r3, #8]
|
|
684: 7223 strb r3, [r4, #8]
|
|
break;
|
|
686: e7d6 b.n 636 <fill_alarm+0x46>
|
|
alarm->cal_alarm.datetime.date.year = current_dt.cal_alarm.datetime.date.year;
|
|
688: 466b mov r3, sp
|
|
68a: 895b ldrh r3, [r3, #10]
|
|
68c: 8163 strh r3, [r4, #10]
|
|
alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month;
|
|
68e: 466b mov r3, sp
|
|
690: 7a5b ldrb r3, [r3, #9]
|
|
692: 7263 strb r3, [r4, #9]
|
|
break;
|
|
694: e7cf b.n 636 <fill_alarm+0x46>
|
|
alarm->cal_alarm.datetime.date.year = current_dt.cal_alarm.datetime.date.year;
|
|
696: 466b mov r3, sp
|
|
698: 895b ldrh r3, [r3, #10]
|
|
69a: 8163 strh r3, [r4, #10]
|
|
break;
|
|
69c: e7cb b.n 636 <fill_alarm+0x46>
|
|
69e: 46c0 nop ; (mov r8, r8)
|
|
6a0: 00000e55 .word 0x00000e55
|
|
6a4: 0000040d .word 0x0000040d
|
|
6a8: 00001f78 .word 0x00001f78
|
|
6ac: 000004b9 .word 0x000004b9
|
|
6b0: 00000571 .word 0x00000571
|
|
|
|
000006b4 <calendar_init>:
|
|
}
|
|
|
|
/** \brief Initialize Calendar
|
|
*/
|
|
int32_t calendar_init(struct calendar_descriptor *const calendar, const void *hw)
|
|
{
|
|
6b4: b570 push {r4, r5, r6, lr}
|
|
6b6: 0004 movs r4, r0
|
|
6b8: 000d movs r5, r1
|
|
int32_t ret = 0;
|
|
|
|
/* Sanity check arguments */
|
|
ASSERT(calendar);
|
|
6ba: 1e43 subs r3, r0, #1
|
|
6bc: 4198 sbcs r0, r3
|
|
6be: b2c0 uxtb r0, r0
|
|
6c0: 22e0 movs r2, #224 ; 0xe0
|
|
6c2: 0052 lsls r2, r2, #1
|
|
6c4: 4909 ldr r1, [pc, #36] ; (6ec <calendar_init+0x38>)
|
|
6c6: 4b0a ldr r3, [pc, #40] ; (6f0 <calendar_init+0x3c>)
|
|
6c8: 4798 blx r3
|
|
|
|
if (calendar->device.hw == hw) {
|
|
6ca: 6823 ldr r3, [r4, #0]
|
|
6cc: 42ab cmp r3, r5
|
|
6ce: d008 beq.n 6e2 <calendar_init+0x2e>
|
|
/* Already initialized with current configuration */
|
|
return ERR_NONE;
|
|
} else if (calendar->device.hw != NULL) {
|
|
6d0: 2b00 cmp r3, #0
|
|
6d2: d108 bne.n 6e6 <calendar_init+0x32>
|
|
/* Initialized with another configuration */
|
|
return ERR_ALREADY_INITIALIZED;
|
|
}
|
|
calendar->device.hw = (void *)hw;
|
|
6d4: 6025 str r5, [r4, #0]
|
|
ret = _calendar_init(&calendar->device);
|
|
6d6: 0020 movs r0, r4
|
|
6d8: 4b06 ldr r3, [pc, #24] ; (6f4 <calendar_init+0x40>)
|
|
6da: 4798 blx r3
|
|
calendar->base_year = DEFAULT_BASE_YEAR;
|
|
6dc: 4b06 ldr r3, [pc, #24] ; (6f8 <calendar_init+0x44>)
|
|
6de: 61a3 str r3, [r4, #24]
|
|
|
|
return ret;
|
|
}
|
|
6e0: bd70 pop {r4, r5, r6, pc}
|
|
return ERR_NONE;
|
|
6e2: 2000 movs r0, #0
|
|
6e4: e7fc b.n 6e0 <calendar_init+0x2c>
|
|
return ERR_ALREADY_INITIALIZED;
|
|
6e6: 2012 movs r0, #18
|
|
6e8: 4240 negs r0, r0
|
|
6ea: e7f9 b.n 6e0 <calendar_init+0x2c>
|
|
6ec: 00001f90 .word 0x00001f90
|
|
6f0: 00000a69 .word 0x00000a69
|
|
6f4: 00000d49 .word 0x00000d49
|
|
6f8: 000007b2 .word 0x000007b2
|
|
|
|
000006fc <calendar_enable>:
|
|
}
|
|
|
|
/** \brief Enable the Calendar
|
|
*/
|
|
int32_t calendar_enable(struct calendar_descriptor *const calendar)
|
|
{
|
|
6fc: b510 push {r4, lr}
|
|
6fe: 0004 movs r4, r0
|
|
/* Sanity check arguments */
|
|
ASSERT(calendar);
|
|
700: 1e43 subs r3, r0, #1
|
|
702: 4198 sbcs r0, r3
|
|
704: b2c0 uxtb r0, r0
|
|
706: 22e6 movs r2, #230 ; 0xe6
|
|
708: 32ff adds r2, #255 ; 0xff
|
|
70a: 4904 ldr r1, [pc, #16] ; (71c <calendar_enable+0x20>)
|
|
70c: 4b04 ldr r3, [pc, #16] ; (720 <calendar_enable+0x24>)
|
|
70e: 4798 blx r3
|
|
|
|
_calendar_enable(&calendar->device);
|
|
710: 0020 movs r0, r4
|
|
712: 4b04 ldr r3, [pc, #16] ; (724 <calendar_enable+0x28>)
|
|
714: 4798 blx r3
|
|
|
|
return ERR_NONE;
|
|
}
|
|
716: 2000 movs r0, #0
|
|
718: bd10 pop {r4, pc}
|
|
71a: 46c0 nop ; (mov r8, r8)
|
|
71c: 00001f90 .word 0x00001f90
|
|
720: 00000a69 .word 0x00000a69
|
|
724: 00000dd9 .word 0x00000dd9
|
|
|
|
00000728 <calendar_set_time>:
|
|
}
|
|
|
|
/** \brief Set time for calendar
|
|
*/
|
|
int32_t calendar_set_time(struct calendar_descriptor *const calendar, struct calendar_time *const p_calendar_time)
|
|
{
|
|
728: b530 push {r4, r5, lr}
|
|
72a: b083 sub sp, #12
|
|
72c: 0004 movs r4, r0
|
|
72e: 000d movs r5, r1
|
|
struct calendar_date_time dt;
|
|
uint32_t current_ts, new_ts;
|
|
|
|
/* Sanity check arguments */
|
|
ASSERT(calendar);
|
|
730: 1e43 subs r3, r0, #1
|
|
732: 4198 sbcs r0, r3
|
|
734: b2c0 uxtb r0, r0
|
|
736: 2283 movs r2, #131 ; 0x83
|
|
738: 0092 lsls r2, r2, #2
|
|
73a: 490e ldr r1, [pc, #56] ; (774 <calendar_set_time+0x4c>)
|
|
73c: 4b0e ldr r3, [pc, #56] ; (778 <calendar_set_time+0x50>)
|
|
73e: 4798 blx r3
|
|
|
|
/* convert time to timestamp */
|
|
current_ts = _calendar_get_counter(&calendar->device);
|
|
740: 0020 movs r0, r4
|
|
742: 4b0e ldr r3, [pc, #56] ; (77c <calendar_set_time+0x54>)
|
|
744: 4798 blx r3
|
|
746: 0001 movs r1, r0
|
|
convert_timestamp_to_datetime(calendar, current_ts, &dt);
|
|
748: 466a mov r2, sp
|
|
74a: 0020 movs r0, r4
|
|
74c: 4b0c ldr r3, [pc, #48] ; (780 <calendar_set_time+0x58>)
|
|
74e: 4798 blx r3
|
|
dt.time.sec = p_calendar_time->sec;
|
|
750: 782b ldrb r3, [r5, #0]
|
|
752: 466a mov r2, sp
|
|
754: 7013 strb r3, [r2, #0]
|
|
dt.time.min = p_calendar_time->min;
|
|
756: 786b ldrb r3, [r5, #1]
|
|
758: 7053 strb r3, [r2, #1]
|
|
dt.time.hour = p_calendar_time->hour;
|
|
75a: 78ab ldrb r3, [r5, #2]
|
|
75c: 7093 strb r3, [r2, #2]
|
|
|
|
new_ts = convert_datetime_to_timestamp(calendar, &dt);
|
|
75e: 4669 mov r1, sp
|
|
760: 0020 movs r0, r4
|
|
762: 4b08 ldr r3, [pc, #32] ; (784 <calendar_set_time+0x5c>)
|
|
764: 4798 blx r3
|
|
766: 0001 movs r1, r0
|
|
|
|
_calendar_set_counter(&calendar->device, new_ts);
|
|
768: 0020 movs r0, r4
|
|
76a: 4b07 ldr r3, [pc, #28] ; (788 <calendar_set_time+0x60>)
|
|
76c: 4798 blx r3
|
|
|
|
return ERR_NONE;
|
|
}
|
|
76e: 2000 movs r0, #0
|
|
770: b003 add sp, #12
|
|
772: bd30 pop {r4, r5, pc}
|
|
774: 00001f90 .word 0x00001f90
|
|
778: 00000a69 .word 0x00000a69
|
|
77c: 00000e55 .word 0x00000e55
|
|
780: 0000040d .word 0x0000040d
|
|
784: 000004b9 .word 0x000004b9
|
|
788: 00000e1d .word 0x00000e1d
|
|
|
|
0000078c <calendar_set_date>:
|
|
|
|
/** \brief Set date for calendar
|
|
*/
|
|
int32_t calendar_set_date(struct calendar_descriptor *const calendar, struct calendar_date *const p_calendar_date)
|
|
{
|
|
78c: b530 push {r4, r5, lr}
|
|
78e: b083 sub sp, #12
|
|
790: 0004 movs r4, r0
|
|
792: 000d movs r5, r1
|
|
struct calendar_date_time dt;
|
|
uint32_t current_ts, new_ts;
|
|
|
|
/* Sanity check arguments */
|
|
ASSERT(calendar);
|
|
794: 1e43 subs r3, r0, #1
|
|
796: 4198 sbcs r0, r3
|
|
798: b2c0 uxtb r0, r0
|
|
79a: 2289 movs r2, #137 ; 0x89
|
|
79c: 0092 lsls r2, r2, #2
|
|
79e: 490e ldr r1, [pc, #56] ; (7d8 <calendar_set_date+0x4c>)
|
|
7a0: 4b0e ldr r3, [pc, #56] ; (7dc <calendar_set_date+0x50>)
|
|
7a2: 4798 blx r3
|
|
|
|
/* convert date to timestamp */
|
|
current_ts = _calendar_get_counter(&calendar->device);
|
|
7a4: 0020 movs r0, r4
|
|
7a6: 4b0e ldr r3, [pc, #56] ; (7e0 <calendar_set_date+0x54>)
|
|
7a8: 4798 blx r3
|
|
7aa: 0001 movs r1, r0
|
|
convert_timestamp_to_datetime(calendar, current_ts, &dt);
|
|
7ac: 466a mov r2, sp
|
|
7ae: 0020 movs r0, r4
|
|
7b0: 4b0c ldr r3, [pc, #48] ; (7e4 <calendar_set_date+0x58>)
|
|
7b2: 4798 blx r3
|
|
dt.date.day = p_calendar_date->day;
|
|
7b4: 782b ldrb r3, [r5, #0]
|
|
7b6: 466a mov r2, sp
|
|
7b8: 7113 strb r3, [r2, #4]
|
|
dt.date.month = p_calendar_date->month;
|
|
7ba: 786b ldrb r3, [r5, #1]
|
|
7bc: 7153 strb r3, [r2, #5]
|
|
dt.date.year = p_calendar_date->year;
|
|
7be: 886b ldrh r3, [r5, #2]
|
|
7c0: 80d3 strh r3, [r2, #6]
|
|
|
|
new_ts = convert_datetime_to_timestamp(calendar, &dt);
|
|
7c2: 4669 mov r1, sp
|
|
7c4: 0020 movs r0, r4
|
|
7c6: 4b08 ldr r3, [pc, #32] ; (7e8 <calendar_set_date+0x5c>)
|
|
7c8: 4798 blx r3
|
|
7ca: 0001 movs r1, r0
|
|
|
|
_calendar_set_counter(&calendar->device, new_ts);
|
|
7cc: 0020 movs r0, r4
|
|
7ce: 4b07 ldr r3, [pc, #28] ; (7ec <calendar_set_date+0x60>)
|
|
7d0: 4798 blx r3
|
|
|
|
return ERR_NONE;
|
|
}
|
|
7d2: 2000 movs r0, #0
|
|
7d4: b003 add sp, #12
|
|
7d6: bd30 pop {r4, r5, pc}
|
|
7d8: 00001f90 .word 0x00001f90
|
|
7dc: 00000a69 .word 0x00000a69
|
|
7e0: 00000e55 .word 0x00000e55
|
|
7e4: 0000040d .word 0x0000040d
|
|
7e8: 000004b9 .word 0x000004b9
|
|
7ec: 00000e1d .word 0x00000e1d
|
|
|
|
000007f0 <calendar_get_date_time>:
|
|
|
|
/** \brief Get date/time for calendar
|
|
*/
|
|
int32_t calendar_get_date_time(struct calendar_descriptor *const calendar, struct calendar_date_time *const date_time)
|
|
{
|
|
7f0: b570 push {r4, r5, r6, lr}
|
|
7f2: 0004 movs r4, r0
|
|
7f4: 000d movs r5, r1
|
|
uint32_t current_ts;
|
|
|
|
/* Sanity check arguments */
|
|
ASSERT(calendar);
|
|
7f6: 1e43 subs r3, r0, #1
|
|
7f8: 4198 sbcs r0, r3
|
|
7fa: b2c0 uxtb r0, r0
|
|
7fc: 4a06 ldr r2, [pc, #24] ; (818 <calendar_get_date_time+0x28>)
|
|
7fe: 4907 ldr r1, [pc, #28] ; (81c <calendar_get_date_time+0x2c>)
|
|
800: 4b07 ldr r3, [pc, #28] ; (820 <calendar_get_date_time+0x30>)
|
|
802: 4798 blx r3
|
|
|
|
/* convert current timestamp to date/time */
|
|
current_ts = _calendar_get_counter(&calendar->device);
|
|
804: 0020 movs r0, r4
|
|
806: 4b07 ldr r3, [pc, #28] ; (824 <calendar_get_date_time+0x34>)
|
|
808: 4798 blx r3
|
|
80a: 0001 movs r1, r0
|
|
convert_timestamp_to_datetime(calendar, current_ts, date_time);
|
|
80c: 002a movs r2, r5
|
|
80e: 0020 movs r0, r4
|
|
810: 4b05 ldr r3, [pc, #20] ; (828 <calendar_get_date_time+0x38>)
|
|
812: 4798 blx r3
|
|
|
|
return ERR_NONE;
|
|
}
|
|
814: 2000 movs r0, #0
|
|
816: bd70 pop {r4, r5, r6, pc}
|
|
818: 0000023b .word 0x0000023b
|
|
81c: 00001f90 .word 0x00001f90
|
|
820: 00000a69 .word 0x00000a69
|
|
824: 00000e55 .word 0x00000e55
|
|
828: 0000040d .word 0x0000040d
|
|
|
|
0000082c <delay_init>:
|
|
|
|
/**
|
|
* \brief Initialize Delay driver
|
|
*/
|
|
void delay_init(void *const hw)
|
|
{
|
|
82c: b510 push {r4, lr}
|
|
_delay_init(hardware = hw);
|
|
82e: 4b02 ldr r3, [pc, #8] ; (838 <delay_init+0xc>)
|
|
830: 6018 str r0, [r3, #0]
|
|
832: 4b02 ldr r3, [pc, #8] ; (83c <delay_init+0x10>)
|
|
834: 4798 blx r3
|
|
}
|
|
836: bd10 pop {r4, pc}
|
|
838: 20000054 .word 0x20000054
|
|
83c: 00001571 .word 0x00001571
|
|
|
|
00000840 <i2c_m_sync_write>:
|
|
|
|
/**
|
|
* \brief Sync version of I2C I/O write
|
|
*/
|
|
static int32_t i2c_m_sync_write(struct io_descriptor *io, const uint8_t *buf, const uint16_t n)
|
|
{
|
|
840: b510 push {r4, lr}
|
|
842: b084 sub sp, #16
|
|
struct i2c_m_sync_desc *i2c = CONTAINER_OF(io, struct i2c_m_sync_desc, io);
|
|
struct _i2c_m_msg msg;
|
|
int32_t ret;
|
|
|
|
msg.addr = i2c->slave_addr;
|
|
844: 3814 subs r0, #20
|
|
846: 8b84 ldrh r4, [r0, #28]
|
|
848: ab01 add r3, sp, #4
|
|
84a: 801c strh r4, [r3, #0]
|
|
msg.len = n;
|
|
84c: 0014 movs r4, r2
|
|
84e: 9202 str r2, [sp, #8]
|
|
msg.flags = I2C_M_STOP;
|
|
850: 4a06 ldr r2, [pc, #24] ; (86c <i2c_m_sync_write+0x2c>)
|
|
852: 805a strh r2, [r3, #2]
|
|
msg.buffer = (uint8_t *)buf;
|
|
854: 9103 str r1, [sp, #12]
|
|
|
|
ret = _i2c_m_sync_transfer(&i2c->device, &msg);
|
|
856: 0019 movs r1, r3
|
|
858: 4b05 ldr r3, [pc, #20] ; (870 <i2c_m_sync_write+0x30>)
|
|
85a: 4798 blx r3
|
|
|
|
if (ret) {
|
|
85c: 2800 cmp r0, #0
|
|
85e: d102 bne.n 866 <i2c_m_sync_write+0x26>
|
|
return ret;
|
|
}
|
|
|
|
return n;
|
|
}
|
|
860: 0020 movs r0, r4
|
|
862: b004 add sp, #16
|
|
864: bd10 pop {r4, pc}
|
|
return ret;
|
|
866: 0004 movs r4, r0
|
|
868: e7fa b.n 860 <i2c_m_sync_write+0x20>
|
|
86a: 46c0 nop ; (mov r8, r8)
|
|
86c: ffff8000 .word 0xffff8000
|
|
870: 000012e1 .word 0x000012e1
|
|
|
|
00000874 <i2c_m_sync_read>:
|
|
{
|
|
874: b510 push {r4, lr}
|
|
876: b084 sub sp, #16
|
|
msg.addr = i2c->slave_addr;
|
|
878: 3814 subs r0, #20
|
|
87a: 8b84 ldrh r4, [r0, #28]
|
|
87c: ab01 add r3, sp, #4
|
|
87e: 801c strh r4, [r3, #0]
|
|
msg.len = n;
|
|
880: 0014 movs r4, r2
|
|
882: 9202 str r2, [sp, #8]
|
|
msg.flags = I2C_M_STOP | I2C_M_RD;
|
|
884: 4a06 ldr r2, [pc, #24] ; (8a0 <i2c_m_sync_read+0x2c>)
|
|
886: 805a strh r2, [r3, #2]
|
|
msg.buffer = buf;
|
|
888: 9103 str r1, [sp, #12]
|
|
ret = _i2c_m_sync_transfer(&i2c->device, &msg);
|
|
88a: 0019 movs r1, r3
|
|
88c: 4b05 ldr r3, [pc, #20] ; (8a4 <i2c_m_sync_read+0x30>)
|
|
88e: 4798 blx r3
|
|
if (ret) {
|
|
890: 2800 cmp r0, #0
|
|
892: d102 bne.n 89a <i2c_m_sync_read+0x26>
|
|
}
|
|
894: 0020 movs r0, r4
|
|
896: b004 add sp, #16
|
|
898: bd10 pop {r4, pc}
|
|
return ret;
|
|
89a: 0004 movs r4, r0
|
|
89c: e7fa b.n 894 <i2c_m_sync_read+0x20>
|
|
89e: 46c0 nop ; (mov r8, r8)
|
|
8a0: ffff8001 .word 0xffff8001
|
|
8a4: 000012e1 .word 0x000012e1
|
|
|
|
000008a8 <i2c_m_sync_init>:
|
|
|
|
/**
|
|
* \brief Sync version of i2c initialize
|
|
*/
|
|
int32_t i2c_m_sync_init(struct i2c_m_sync_desc *i2c, void *hw)
|
|
{
|
|
8a8: b570 push {r4, r5, r6, lr}
|
|
8aa: 0004 movs r4, r0
|
|
8ac: 000d movs r5, r1
|
|
int32_t init_status;
|
|
ASSERT(i2c);
|
|
8ae: 1e43 subs r3, r0, #1
|
|
8b0: 4198 sbcs r0, r3
|
|
8b2: b2c0 uxtb r0, r0
|
|
8b4: 225e movs r2, #94 ; 0x5e
|
|
8b6: 4907 ldr r1, [pc, #28] ; (8d4 <i2c_m_sync_init+0x2c>)
|
|
8b8: 4b07 ldr r3, [pc, #28] ; (8d8 <i2c_m_sync_init+0x30>)
|
|
8ba: 4798 blx r3
|
|
|
|
init_status = _i2c_m_sync_init(&i2c->device, hw);
|
|
8bc: 0029 movs r1, r5
|
|
8be: 0020 movs r0, r4
|
|
8c0: 4b06 ldr r3, [pc, #24] ; (8dc <i2c_m_sync_init+0x34>)
|
|
8c2: 4798 blx r3
|
|
if (init_status) {
|
|
8c4: 2800 cmp r0, #0
|
|
8c6: d103 bne.n 8d0 <i2c_m_sync_init+0x28>
|
|
return init_status;
|
|
}
|
|
|
|
/* Init I/O */
|
|
i2c->io.read = i2c_m_sync_read;
|
|
8c8: 4b05 ldr r3, [pc, #20] ; (8e0 <i2c_m_sync_init+0x38>)
|
|
8ca: 61a3 str r3, [r4, #24]
|
|
i2c->io.write = i2c_m_sync_write;
|
|
8cc: 4b05 ldr r3, [pc, #20] ; (8e4 <i2c_m_sync_init+0x3c>)
|
|
8ce: 6163 str r3, [r4, #20]
|
|
|
|
return ERR_NONE;
|
|
}
|
|
8d0: bd70 pop {r4, r5, r6, pc}
|
|
8d2: 46c0 nop ; (mov r8, r8)
|
|
8d4: 00001fac .word 0x00001fac
|
|
8d8: 00000a69 .word 0x00000a69
|
|
8dc: 00001231 .word 0x00001231
|
|
8e0: 00000875 .word 0x00000875
|
|
8e4: 00000841 .word 0x00000841
|
|
|
|
000008e8 <i2c_m_sync_enable>:
|
|
|
|
/**
|
|
* \brief Sync version of i2c enable
|
|
*/
|
|
int32_t i2c_m_sync_enable(struct i2c_m_sync_desc *i2c)
|
|
{
|
|
8e8: b510 push {r4, lr}
|
|
return _i2c_m_sync_enable(&i2c->device);
|
|
8ea: 4b01 ldr r3, [pc, #4] ; (8f0 <i2c_m_sync_enable+0x8>)
|
|
8ec: 4798 blx r3
|
|
}
|
|
8ee: bd10 pop {r4, pc}
|
|
8f0: 00001261 .word 0x00001261
|
|
|
|
000008f4 <i2c_m_sync_set_slaveaddr>:
|
|
/**
|
|
* \brief Sync version of i2c set slave address
|
|
*/
|
|
int32_t i2c_m_sync_set_slaveaddr(struct i2c_m_sync_desc *i2c, int16_t addr, int32_t addr_len)
|
|
{
|
|
return i2c->slave_addr = (addr & 0x3ff) | (addr_len & I2C_M_TEN);
|
|
8f4: 0589 lsls r1, r1, #22
|
|
8f6: 0d89 lsrs r1, r1, #22
|
|
8f8: 2380 movs r3, #128 ; 0x80
|
|
8fa: 00db lsls r3, r3, #3
|
|
8fc: 401a ands r2, r3
|
|
8fe: 430a orrs r2, r1
|
|
900: 8382 strh r2, [r0, #28]
|
|
}
|
|
902: 0010 movs r0, r2
|
|
904: 4770 bx lr
|
|
|
|
00000906 <i2c_m_sync_get_io_descriptor>:
|
|
/**
|
|
* \brief Retrieve I/O descriptor
|
|
*/
|
|
int32_t i2c_m_sync_get_io_descriptor(struct i2c_m_sync_desc *const i2c, struct io_descriptor **io)
|
|
{
|
|
*io = &i2c->io;
|
|
906: 3014 adds r0, #20
|
|
908: 6008 str r0, [r1, #0]
|
|
return ERR_NONE;
|
|
}
|
|
90a: 2000 movs r0, #0
|
|
90c: 4770 bx lr
|
|
...
|
|
|
|
00000910 <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)
|
|
{
|
|
910: b570 push {r4, r5, r6, lr}
|
|
912: 0004 movs r4, r0
|
|
914: 000d movs r5, r1
|
|
916: 0016 movs r6, r2
|
|
ASSERT(io_descr && buf);
|
|
918: 2800 cmp r0, #0
|
|
91a: d00e beq.n 93a <io_write+0x2a>
|
|
91c: 2900 cmp r1, #0
|
|
91e: d00a beq.n 936 <io_write+0x26>
|
|
920: 2001 movs r0, #1
|
|
922: 2234 movs r2, #52 ; 0x34
|
|
924: 4906 ldr r1, [pc, #24] ; (940 <io_write+0x30>)
|
|
926: 4b07 ldr r3, [pc, #28] ; (944 <io_write+0x34>)
|
|
928: 4798 blx r3
|
|
return io_descr->write(io_descr, buf, length);
|
|
92a: 6823 ldr r3, [r4, #0]
|
|
92c: 0032 movs r2, r6
|
|
92e: 0029 movs r1, r5
|
|
930: 0020 movs r0, r4
|
|
932: 4798 blx r3
|
|
}
|
|
934: bd70 pop {r4, r5, r6, pc}
|
|
ASSERT(io_descr && buf);
|
|
936: 2000 movs r0, #0
|
|
938: e7f3 b.n 922 <io_write+0x12>
|
|
93a: 2000 movs r0, #0
|
|
93c: e7f1 b.n 922 <io_write+0x12>
|
|
93e: 46c0 nop ; (mov r8, r8)
|
|
940: 00001fc8 .word 0x00001fc8
|
|
944: 00000a69 .word 0x00000a69
|
|
|
|
00000948 <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)
|
|
{
|
|
948: b570 push {r4, r5, r6, lr}
|
|
94a: 0004 movs r4, r0
|
|
94c: 000d movs r5, r1
|
|
94e: 0016 movs r6, r2
|
|
ASSERT(io_descr && buf);
|
|
950: 2800 cmp r0, #0
|
|
952: d00e beq.n 972 <io_read+0x2a>
|
|
954: 2900 cmp r1, #0
|
|
956: d00a beq.n 96e <io_read+0x26>
|
|
958: 2001 movs r0, #1
|
|
95a: 223d movs r2, #61 ; 0x3d
|
|
95c: 4906 ldr r1, [pc, #24] ; (978 <io_read+0x30>)
|
|
95e: 4b07 ldr r3, [pc, #28] ; (97c <io_read+0x34>)
|
|
960: 4798 blx r3
|
|
return io_descr->read(io_descr, buf, length);
|
|
962: 6863 ldr r3, [r4, #4]
|
|
964: 0032 movs r2, r6
|
|
966: 0029 movs r1, r5
|
|
968: 0020 movs r0, r4
|
|
96a: 4798 blx r3
|
|
}
|
|
96c: bd70 pop {r4, r5, r6, pc}
|
|
ASSERT(io_descr && buf);
|
|
96e: 2000 movs r0, #0
|
|
970: e7f3 b.n 95a <io_read+0x12>
|
|
972: 2000 movs r0, #0
|
|
974: e7f1 b.n 95a <io_read+0x12>
|
|
976: 46c0 nop ; (mov r8, r8)
|
|
978: 00001fc8 .word 0x00001fc8
|
|
97c: 00000a69 .word 0x00000a69
|
|
|
|
00000980 <pwm_period_expired>:
|
|
|
|
/**
|
|
* \internal Process interrupts caused by period experied
|
|
*/
|
|
static void pwm_period_expired(struct _pwm_device *device)
|
|
{
|
|
980: b510 push {r4, lr}
|
|
struct pwm_descriptor *const descr = CONTAINER_OF(device, struct pwm_descriptor, device);
|
|
|
|
if (descr->pwm_cb.period) {
|
|
982: 6943 ldr r3, [r0, #20]
|
|
984: 2b00 cmp r3, #0
|
|
986: d000 beq.n 98a <pwm_period_expired+0xa>
|
|
descr->pwm_cb.period(descr);
|
|
988: 4798 blx r3
|
|
}
|
|
}
|
|
98a: bd10 pop {r4, pc}
|
|
|
|
0000098c <pwm_detect_fault>:
|
|
|
|
/**
|
|
* \internal Process interrupts caused by pwm fault
|
|
*/
|
|
static void pwm_detect_fault(struct _pwm_device *device)
|
|
{
|
|
98c: b510 push {r4, lr}
|
|
struct pwm_descriptor *const descr = CONTAINER_OF(device, struct pwm_descriptor, device);
|
|
|
|
if (descr->pwm_cb.error) {
|
|
98e: 6983 ldr r3, [r0, #24]
|
|
990: 2b00 cmp r3, #0
|
|
992: d000 beq.n 996 <pwm_detect_fault+0xa>
|
|
descr->pwm_cb.error(descr);
|
|
994: 4798 blx r3
|
|
}
|
|
}
|
|
996: bd10 pop {r4, pc}
|
|
|
|
00000998 <pwm_init>:
|
|
{
|
|
998: b570 push {r4, r5, r6, lr}
|
|
99a: 0004 movs r4, r0
|
|
99c: 000d movs r5, r1
|
|
99e: 0016 movs r6, r2
|
|
ASSERT(descr && hw && func);
|
|
9a0: 2800 cmp r0, #0
|
|
9a2: d015 beq.n 9d0 <pwm_init+0x38>
|
|
9a4: 2900 cmp r1, #0
|
|
9a6: d015 beq.n 9d4 <pwm_init+0x3c>
|
|
9a8: 2a00 cmp r2, #0
|
|
9aa: d00f beq.n 9cc <pwm_init+0x34>
|
|
9ac: 2001 movs r0, #1
|
|
9ae: 2233 movs r2, #51 ; 0x33
|
|
9b0: 4909 ldr r1, [pc, #36] ; (9d8 <pwm_init+0x40>)
|
|
9b2: 4b0a ldr r3, [pc, #40] ; (9dc <pwm_init+0x44>)
|
|
9b4: 4798 blx r3
|
|
descr->func = func;
|
|
9b6: 61e6 str r6, [r4, #28]
|
|
descr->func->init(&descr->device, hw);
|
|
9b8: 6833 ldr r3, [r6, #0]
|
|
9ba: 0029 movs r1, r5
|
|
9bc: 0020 movs r0, r4
|
|
9be: 4798 blx r3
|
|
descr->device.callback.pwm_period_cb = pwm_period_expired;
|
|
9c0: 4b07 ldr r3, [pc, #28] ; (9e0 <pwm_init+0x48>)
|
|
9c2: 6023 str r3, [r4, #0]
|
|
descr->device.callback.pwm_error_cb = pwm_detect_fault;
|
|
9c4: 4b07 ldr r3, [pc, #28] ; (9e4 <pwm_init+0x4c>)
|
|
9c6: 6063 str r3, [r4, #4]
|
|
}
|
|
9c8: 2000 movs r0, #0
|
|
9ca: bd70 pop {r4, r5, r6, pc}
|
|
ASSERT(descr && hw && func);
|
|
9cc: 2000 movs r0, #0
|
|
9ce: e7ee b.n 9ae <pwm_init+0x16>
|
|
9d0: 2000 movs r0, #0
|
|
9d2: e7ec b.n 9ae <pwm_init+0x16>
|
|
9d4: 2000 movs r0, #0
|
|
9d6: e7ea b.n 9ae <pwm_init+0x16>
|
|
9d8: 00001fdc .word 0x00001fdc
|
|
9dc: 00000a69 .word 0x00000a69
|
|
9e0: 00000981 .word 0x00000981
|
|
9e4: 0000098d .word 0x0000098d
|
|
|
|
000009e8 <pwm_enable>:
|
|
{
|
|
9e8: b510 push {r4, lr}
|
|
9ea: 1e04 subs r4, r0, #0
|
|
ASSERT(descr && descr->func);
|
|
9ec: d015 beq.n a1a <pwm_enable+0x32>
|
|
9ee: 69c3 ldr r3, [r0, #28]
|
|
9f0: 2b00 cmp r3, #0
|
|
9f2: d010 beq.n a16 <pwm_enable+0x2e>
|
|
9f4: 2001 movs r0, #1
|
|
9f6: 224b movs r2, #75 ; 0x4b
|
|
9f8: 490a ldr r1, [pc, #40] ; (a24 <pwm_enable+0x3c>)
|
|
9fa: 4b0b ldr r3, [pc, #44] ; (a28 <pwm_enable+0x40>)
|
|
9fc: 4798 blx r3
|
|
if (descr->func->is_pwm_enabled(&descr->device)) {
|
|
9fe: 69e3 ldr r3, [r4, #28]
|
|
a00: 695b ldr r3, [r3, #20]
|
|
a02: 0020 movs r0, r4
|
|
a04: 4798 blx r3
|
|
a06: 2800 cmp r0, #0
|
|
a08: d109 bne.n a1e <pwm_enable+0x36>
|
|
descr->func->start_pwm(&descr->device);
|
|
a0a: 69e3 ldr r3, [r4, #28]
|
|
a0c: 689b ldr r3, [r3, #8]
|
|
a0e: 0020 movs r0, r4
|
|
a10: 4798 blx r3
|
|
return ERR_NONE;
|
|
a12: 2000 movs r0, #0
|
|
}
|
|
a14: bd10 pop {r4, pc}
|
|
ASSERT(descr && descr->func);
|
|
a16: 2000 movs r0, #0
|
|
a18: e7ed b.n 9f6 <pwm_enable+0xe>
|
|
a1a: 2000 movs r0, #0
|
|
a1c: e7eb b.n 9f6 <pwm_enable+0xe>
|
|
return ERR_DENIED;
|
|
a1e: 2011 movs r0, #17
|
|
a20: 4240 negs r0, r0
|
|
a22: e7f7 b.n a14 <pwm_enable+0x2c>
|
|
a24: 00001fdc .word 0x00001fdc
|
|
a28: 00000a69 .word 0x00000a69
|
|
|
|
00000a2c <pwm_set_parameters>:
|
|
{
|
|
a2c: b570 push {r4, r5, r6, lr}
|
|
a2e: 0004 movs r4, r0
|
|
a30: 000d movs r5, r1
|
|
a32: 0016 movs r6, r2
|
|
ASSERT(descr && descr->func);
|
|
a34: 2800 cmp r0, #0
|
|
a36: d011 beq.n a5c <pwm_set_parameters+0x30>
|
|
a38: 69c3 ldr r3, [r0, #28]
|
|
a3a: 2b00 cmp r3, #0
|
|
a3c: d00c beq.n a58 <pwm_set_parameters+0x2c>
|
|
a3e: 2001 movs r0, #1
|
|
a40: 227d movs r2, #125 ; 0x7d
|
|
a42: 4907 ldr r1, [pc, #28] ; (a60 <pwm_set_parameters+0x34>)
|
|
a44: 4b07 ldr r3, [pc, #28] ; (a64 <pwm_set_parameters+0x38>)
|
|
a46: 4798 blx r3
|
|
descr->func->set_pwm_param(&descr->device, period, duty_cycle);
|
|
a48: 69e3 ldr r3, [r4, #28]
|
|
a4a: 691b ldr r3, [r3, #16]
|
|
a4c: 0032 movs r2, r6
|
|
a4e: 0029 movs r1, r5
|
|
a50: 0020 movs r0, r4
|
|
a52: 4798 blx r3
|
|
}
|
|
a54: 2000 movs r0, #0
|
|
a56: bd70 pop {r4, r5, r6, pc}
|
|
ASSERT(descr && descr->func);
|
|
a58: 2000 movs r0, #0
|
|
a5a: e7f1 b.n a40 <pwm_set_parameters+0x14>
|
|
a5c: 2000 movs r0, #0
|
|
a5e: e7ef b.n a40 <pwm_set_parameters+0x14>
|
|
a60: 00001fdc .word 0x00001fdc
|
|
a64: 00000a69 .word 0x00000a69
|
|
|
|
00000a68 <assert>:
|
|
/**
|
|
* \brief Assert function
|
|
*/
|
|
void assert(const bool condition, const char *const file, const int line)
|
|
{
|
|
if (!(condition)) {
|
|
a68: 2800 cmp r0, #0
|
|
a6a: d100 bne.n a6e <assert+0x6>
|
|
__asm("BKPT #0");
|
|
a6c: be00 bkpt 0x0000
|
|
}
|
|
(void)file;
|
|
(void)line;
|
|
}
|
|
a6e: 4770 bx lr
|
|
|
|
00000a70 <event_subscribe>:
|
|
|
|
static struct list_descriptor events;
|
|
static uint8_t subscribed[EVENT_MASK_SIZE];
|
|
|
|
int32_t event_subscribe(struct event *const event, const event_id_t id, event_cb_t cb)
|
|
{
|
|
a70: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
a72: 0005 movs r5, r0
|
|
a74: 0017 movs r7, r2
|
|
/* get byte and bit number of the given event in the event mask */
|
|
const uint8_t position = id >> 3;
|
|
a76: 08ce lsrs r6, r1, #3
|
|
const uint8_t mask = 1 << (id & 0x7);
|
|
a78: 2307 movs r3, #7
|
|
a7a: 400b ands r3, r1
|
|
a7c: 2401 movs r4, #1
|
|
a7e: 409c lsls r4, r3
|
|
a80: b2e4 uxtb r4, r4
|
|
|
|
ASSERT(event && cb && (id < EVENT_MAX_AMOUNT));
|
|
a82: 2800 cmp r0, #0
|
|
a84: d01e beq.n ac4 <event_subscribe+0x54>
|
|
a86: 2a00 cmp r2, #0
|
|
a88: d01e beq.n ac8 <event_subscribe+0x58>
|
|
a8a: 2907 cmp r1, #7
|
|
a8c: d91e bls.n acc <event_subscribe+0x5c>
|
|
a8e: 2000 movs r0, #0
|
|
a90: 2231 movs r2, #49 ; 0x31
|
|
a92: 4914 ldr r1, [pc, #80] ; (ae4 <event_subscribe+0x74>)
|
|
a94: 4b14 ldr r3, [pc, #80] ; (ae8 <event_subscribe+0x78>)
|
|
a96: 4798 blx r3
|
|
|
|
if (event->mask[position] & mask) {
|
|
a98: 19ab adds r3, r5, r6
|
|
a9a: 791b ldrb r3, [r3, #4]
|
|
a9c: 4223 tst r3, r4
|
|
a9e: d11e bne.n ade <event_subscribe+0x6e>
|
|
return ERR_NO_CHANGE; /* Already subscribed */
|
|
}
|
|
|
|
if (!is_list_element(&events, event)) {
|
|
aa0: 0029 movs r1, r5
|
|
aa2: 4812 ldr r0, [pc, #72] ; (aec <event_subscribe+0x7c>)
|
|
aa4: 4b12 ldr r3, [pc, #72] ; (af0 <event_subscribe+0x80>)
|
|
aa6: 4798 blx r3
|
|
aa8: 2800 cmp r0, #0
|
|
aaa: d011 beq.n ad0 <event_subscribe+0x60>
|
|
memset(event->mask, 0, EVENT_MASK_SIZE);
|
|
list_insert_as_head(&events, event);
|
|
}
|
|
event->cb = cb;
|
|
aac: 60af str r7, [r5, #8]
|
|
event->mask[position] |= mask;
|
|
aae: 19ad adds r5, r5, r6
|
|
ab0: 792b ldrb r3, [r5, #4]
|
|
ab2: 4323 orrs r3, r4
|
|
ab4: 712b strb r3, [r5, #4]
|
|
|
|
subscribed[position] |= mask;
|
|
ab6: 4b0d ldr r3, [pc, #52] ; (aec <event_subscribe+0x7c>)
|
|
ab8: 199b adds r3, r3, r6
|
|
aba: 791a ldrb r2, [r3, #4]
|
|
abc: 4314 orrs r4, r2
|
|
abe: 711c strb r4, [r3, #4]
|
|
|
|
return ERR_NONE;
|
|
ac0: 2000 movs r0, #0
|
|
}
|
|
ac2: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
ASSERT(event && cb && (id < EVENT_MAX_AMOUNT));
|
|
ac4: 2000 movs r0, #0
|
|
ac6: e7e3 b.n a90 <event_subscribe+0x20>
|
|
ac8: 2000 movs r0, #0
|
|
aca: e7e1 b.n a90 <event_subscribe+0x20>
|
|
acc: 2001 movs r0, #1
|
|
ace: e7df b.n a90 <event_subscribe+0x20>
|
|
memset(event->mask, 0, EVENT_MASK_SIZE);
|
|
ad0: 2300 movs r3, #0
|
|
ad2: 712b strb r3, [r5, #4]
|
|
list_insert_as_head(&events, event);
|
|
ad4: 0029 movs r1, r5
|
|
ad6: 4805 ldr r0, [pc, #20] ; (aec <event_subscribe+0x7c>)
|
|
ad8: 4b06 ldr r3, [pc, #24] ; (af4 <event_subscribe+0x84>)
|
|
ada: 4798 blx r3
|
|
adc: e7e6 b.n aac <event_subscribe+0x3c>
|
|
return ERR_NO_CHANGE; /* Already subscribed */
|
|
ade: 2002 movs r0, #2
|
|
ae0: 4240 negs r0, r0
|
|
ae2: e7ee b.n ac2 <event_subscribe+0x52>
|
|
ae4: 00001ff4 .word 0x00001ff4
|
|
ae8: 00000a69 .word 0x00000a69
|
|
aec: 20000058 .word 0x20000058
|
|
af0: 00000af9 .word 0x00000af9
|
|
af4: 00000b11 .word 0x00000b11
|
|
|
|
00000af8 <is_list_element>:
|
|
* \brief Check whether element belongs to list
|
|
*/
|
|
bool is_list_element(const struct list_descriptor *const list, const void *const element)
|
|
{
|
|
struct list_element *it;
|
|
for (it = list->head; it; it = it->next) {
|
|
af8: 6803 ldr r3, [r0, #0]
|
|
afa: 2b00 cmp r3, #0
|
|
afc: d003 beq.n b06 <is_list_element+0xe>
|
|
if (it == element) {
|
|
afe: 428b cmp r3, r1
|
|
b00: d003 beq.n b0a <is_list_element+0x12>
|
|
for (it = list->head; it; it = it->next) {
|
|
b02: 681b ldr r3, [r3, #0]
|
|
b04: e7f9 b.n afa <is_list_element+0x2>
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
b06: 2000 movs r0, #0
|
|
}
|
|
b08: 4770 bx lr
|
|
return true;
|
|
b0a: 2001 movs r0, #1
|
|
b0c: e7fc b.n b08 <is_list_element+0x10>
|
|
...
|
|
|
|
00000b10 <list_insert_as_head>:
|
|
|
|
/**
|
|
* \brief Insert an element as list head
|
|
*/
|
|
void list_insert_as_head(struct list_descriptor *const list, void *const element)
|
|
{
|
|
b10: b570 push {r4, r5, r6, lr}
|
|
b12: 0004 movs r4, r0
|
|
b14: 000d movs r5, r1
|
|
ASSERT(!is_list_element(list, element));
|
|
b16: 4b06 ldr r3, [pc, #24] ; (b30 <list_insert_as_head+0x20>)
|
|
b18: 4798 blx r3
|
|
b1a: 2301 movs r3, #1
|
|
b1c: 4058 eors r0, r3
|
|
b1e: b2c0 uxtb r0, r0
|
|
b20: 2239 movs r2, #57 ; 0x39
|
|
b22: 4904 ldr r1, [pc, #16] ; (b34 <list_insert_as_head+0x24>)
|
|
b24: 4b04 ldr r3, [pc, #16] ; (b38 <list_insert_as_head+0x28>)
|
|
b26: 4798 blx r3
|
|
|
|
((struct list_element *)element)->next = list->head;
|
|
b28: 6823 ldr r3, [r4, #0]
|
|
b2a: 602b str r3, [r5, #0]
|
|
list->head = (struct list_element *)element;
|
|
b2c: 6025 str r5, [r4, #0]
|
|
}
|
|
b2e: bd70 pop {r4, r5, r6, pc}
|
|
b30: 00000af9 .word 0x00000af9
|
|
b34: 00002014 .word 0x00002014
|
|
b38: 00000a69 .word 0x00000a69
|
|
|
|
00000b3c <_init_chip>:
|
|
|
|
/**
|
|
* \brief Initialize the hardware abstraction layer
|
|
*/
|
|
void _init_chip(void)
|
|
{
|
|
b3c: b510 push {r4, lr}
|
|
}
|
|
|
|
static inline void hri_nvmctrl_set_CTRLB_RWS_bf(const void *const hw, hri_nvmctrl_ctrlb_reg_t mask)
|
|
{
|
|
NVMCTRL_CRITICAL_SECTION_ENTER();
|
|
((Nvmctrl *)hw)->CTRLB.reg |= NVMCTRL_CTRLB_RWS(mask);
|
|
b3e: 4b09 ldr r3, [pc, #36] ; (b64 <_init_chip+0x28>)
|
|
b40: 685a ldr r2, [r3, #4]
|
|
b42: 605a str r2, [r3, #4]
|
|
hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, CONF_NVM_WAIT_STATE);
|
|
|
|
_set_performance_level(2);
|
|
b44: 2002 movs r0, #2
|
|
b46: 4b08 ldr r3, [pc, #32] ; (b68 <_init_chip+0x2c>)
|
|
b48: 4798 blx r3
|
|
|
|
_osc32kctrl_init_sources();
|
|
b4a: 4b08 ldr r3, [pc, #32] ; (b6c <_init_chip+0x30>)
|
|
b4c: 4798 blx r3
|
|
_oscctrl_init_sources();
|
|
b4e: 4b08 ldr r3, [pc, #32] ; (b70 <_init_chip+0x34>)
|
|
b50: 4798 blx r3
|
|
_mclk_init();
|
|
b52: 4b08 ldr r3, [pc, #32] ; (b74 <_init_chip+0x38>)
|
|
b54: 4798 blx r3
|
|
#if _GCLK_INIT_1ST
|
|
_gclk_init_generators_by_fref(_GCLK_INIT_1ST);
|
|
#endif
|
|
_oscctrl_init_referenced_generators();
|
|
b56: 4b08 ldr r3, [pc, #32] ; (b78 <_init_chip+0x3c>)
|
|
b58: 4798 blx r3
|
|
_gclk_init_generators_by_fref(_GCLK_INIT_LAST);
|
|
b5a: 201f movs r0, #31
|
|
b5c: 4b07 ldr r3, [pc, #28] ; (b7c <_init_chip+0x40>)
|
|
b5e: 4798 blx r3
|
|
#endif
|
|
|
|
#if (CONF_PORT_EVCTRL_PORT_0 | CONF_PORT_EVCTRL_PORT_1 | CONF_PORT_EVCTRL_PORT_2 | CONF_PORT_EVCTRL_PORT_3)
|
|
_port_event_init();
|
|
#endif
|
|
}
|
|
b60: bd10 pop {r4, pc}
|
|
b62: 46c0 nop ; (mov r8, r8)
|
|
b64: 41004000 .word 0x41004000
|
|
b68: 00000ce9 .word 0x00000ce9
|
|
b6c: 00000c89 .word 0x00000c89
|
|
b70: 00000cad .word 0x00000cad
|
|
b74: 00000c79 .word 0x00000c79
|
|
b78: 00000ce5 .word 0x00000ce5
|
|
b7c: 00000c41 .word 0x00000c41
|
|
|
|
00000b80 <_ext_irq_handler>:
|
|
|
|
/**
|
|
* \brief Inter EIC interrupt handler
|
|
*/
|
|
static void _ext_irq_handler(void)
|
|
{
|
|
b80: b5f0 push {r4, r5, r6, r7, lr}
|
|
b82: b083 sub sp, #12
|
|
return tmp;
|
|
}
|
|
|
|
static inline hri_eic_intflag_reg_t hri_eic_read_INTFLAG_reg(const void *const hw)
|
|
{
|
|
return ((Eic *)hw)->INTFLAG.reg;
|
|
b84: 4b25 ldr r3, [pc, #148] ; (c1c <_ext_irq_handler+0x9c>)
|
|
b86: 695a ldr r2, [r3, #20]
|
|
volatile uint32_t flags = hri_eic_read_INTFLAG_reg(EIC);
|
|
b88: 9201 str r2, [sp, #4]
|
|
int8_t pos;
|
|
uint32_t pin = INVALID_PIN_NUMBER;
|
|
|
|
hri_eic_clear_INTFLAG_reg(EIC, flags);
|
|
b8a: 9a01 ldr r2, [sp, #4]
|
|
}
|
|
|
|
static inline void hri_eic_clear_INTFLAG_reg(const void *const hw, hri_eic_intflag_reg_t mask)
|
|
{
|
|
((Eic *)hw)->INTFLAG.reg = mask;
|
|
b8c: 615a str r2, [r3, #20]
|
|
|
|
ASSERT(callback);
|
|
b8e: 4b24 ldr r3, [pc, #144] ; (c20 <_ext_irq_handler+0xa0>)
|
|
b90: 6818 ldr r0, [r3, #0]
|
|
b92: 1e43 subs r3, r0, #1
|
|
b94: 4198 sbcs r0, r3
|
|
b96: b2c0 uxtb r0, r0
|
|
b98: 22da movs r2, #218 ; 0xda
|
|
b9a: 4922 ldr r1, [pc, #136] ; (c24 <_ext_irq_handler+0xa4>)
|
|
b9c: 4b22 ldr r3, [pc, #136] ; (c28 <_ext_irq_handler+0xa8>)
|
|
b9e: 4798 blx r3
|
|
uint32_t pin = INVALID_PIN_NUMBER;
|
|
ba0: 2501 movs r5, #1
|
|
ba2: 426d negs r5, r5
|
|
|
|
while (flags) {
|
|
ba4: e02f b.n c06 <_ext_irq_handler+0x86>
|
|
uint8_t lower = 0, middle, upper = EXT_IRQ_AMOUNT;
|
|
|
|
while (upper >= lower) {
|
|
middle = (upper + lower) >> 1;
|
|
if (_map[middle].extint == pos) {
|
|
pin = _map[middle].pin;
|
|
ba6: 00db lsls r3, r3, #3
|
|
ba8: 4a20 ldr r2, [pc, #128] ; (c2c <_ext_irq_handler+0xac>)
|
|
baa: 18d3 adds r3, r2, r3
|
|
bac: 685d ldr r5, [r3, #4]
|
|
} else {
|
|
upper = middle - 1;
|
|
}
|
|
}
|
|
|
|
if (INVALID_PIN_NUMBER != pin) {
|
|
bae: 1c6b adds r3, r5, #1
|
|
bb0: d003 beq.n bba <_ext_irq_handler+0x3a>
|
|
callback(pin);
|
|
bb2: 4b1b ldr r3, [pc, #108] ; (c20 <_ext_irq_handler+0xa0>)
|
|
bb4: 681b ldr r3, [r3, #0]
|
|
bb6: 0028 movs r0, r5
|
|
bb8: 4798 blx r3
|
|
}
|
|
flags &= ~(1ul << pos);
|
|
bba: 2201 movs r2, #1
|
|
bbc: 40a2 lsls r2, r4
|
|
bbe: 9b01 ldr r3, [sp, #4]
|
|
bc0: 4393 bics r3, r2
|
|
bc2: 9301 str r3, [sp, #4]
|
|
pos = ffs(flags) - 1;
|
|
bc4: 9801 ldr r0, [sp, #4]
|
|
bc6: 4b1a ldr r3, [pc, #104] ; (c30 <_ext_irq_handler+0xb0>)
|
|
bc8: 4798 blx r3
|
|
bca: 3801 subs r0, #1
|
|
bcc: b244 sxtb r4, r0
|
|
while (-1 != pos) {
|
|
bce: 1c63 adds r3, r4, #1
|
|
bd0: d014 beq.n bfc <_ext_irq_handler+0x7c>
|
|
bd2: 2603 movs r6, #3
|
|
bd4: 2000 movs r0, #0
|
|
bd6: e001 b.n bdc <_ext_irq_handler+0x5c>
|
|
upper = middle - 1;
|
|
bd8: 3901 subs r1, #1
|
|
bda: b2ce uxtb r6, r1
|
|
while (upper >= lower) {
|
|
bdc: 42b0 cmp r0, r6
|
|
bde: d8e6 bhi.n bae <_ext_irq_handler+0x2e>
|
|
middle = (upper + lower) >> 1;
|
|
be0: 1833 adds r3, r6, r0
|
|
be2: 105b asrs r3, r3, #1
|
|
be4: b2d9 uxtb r1, r3
|
|
be6: 22ff movs r2, #255 ; 0xff
|
|
be8: 4013 ands r3, r2
|
|
if (_map[middle].extint == pos) {
|
|
bea: 00df lsls r7, r3, #3
|
|
bec: 4a0f ldr r2, [pc, #60] ; (c2c <_ext_irq_handler+0xac>)
|
|
bee: 5cba ldrb r2, [r7, r2]
|
|
bf0: 42a2 cmp r2, r4
|
|
bf2: d0d8 beq.n ba6 <_ext_irq_handler+0x26>
|
|
if (_map[middle].extint < pos) {
|
|
bf4: daf0 bge.n bd8 <_ext_irq_handler+0x58>
|
|
lower = middle + 1;
|
|
bf6: 3101 adds r1, #1
|
|
bf8: b2c8 uxtb r0, r1
|
|
bfa: e7ef b.n bdc <_ext_irq_handler+0x5c>
|
|
return ((Eic *)hw)->INTFLAG.reg;
|
|
bfc: 4b07 ldr r3, [pc, #28] ; (c1c <_ext_irq_handler+0x9c>)
|
|
bfe: 695a ldr r2, [r3, #20]
|
|
}
|
|
flags = hri_eic_read_INTFLAG_reg(EIC);
|
|
c00: 9201 str r2, [sp, #4]
|
|
hri_eic_clear_INTFLAG_reg(EIC, flags);
|
|
c02: 9a01 ldr r2, [sp, #4]
|
|
((Eic *)hw)->INTFLAG.reg = mask;
|
|
c04: 615a str r2, [r3, #20]
|
|
while (flags) {
|
|
c06: 9b01 ldr r3, [sp, #4]
|
|
c08: 2b00 cmp r3, #0
|
|
c0a: d005 beq.n c18 <_ext_irq_handler+0x98>
|
|
pos = ffs(flags) - 1;
|
|
c0c: 9801 ldr r0, [sp, #4]
|
|
c0e: 4b08 ldr r3, [pc, #32] ; (c30 <_ext_irq_handler+0xb0>)
|
|
c10: 4798 blx r3
|
|
c12: 3801 subs r0, #1
|
|
c14: b244 sxtb r4, r0
|
|
while (-1 != pos) {
|
|
c16: e7da b.n bce <_ext_irq_handler+0x4e>
|
|
}
|
|
}
|
|
c18: b003 add sp, #12
|
|
c1a: bdf0 pop {r4, r5, r6, r7, pc}
|
|
c1c: 40002800 .word 0x40002800
|
|
c20: 20000060 .word 0x20000060
|
|
c24: 0000204c .word 0x0000204c
|
|
c28: 00000a69 .word 0x00000a69
|
|
c2c: 00002034 .word 0x00002034
|
|
c30: 00001e5d .word 0x00001e5d
|
|
|
|
00000c34 <EIC_Handler>:
|
|
|
|
/**
|
|
* \brief EIC interrupt handler
|
|
*/
|
|
void EIC_Handler(void)
|
|
{
|
|
c34: b510 push {r4, lr}
|
|
_ext_irq_handler();
|
|
c36: 4b01 ldr r3, [pc, #4] ; (c3c <EIC_Handler+0x8>)
|
|
c38: 4798 blx r3
|
|
}
|
|
c3a: bd10 pop {r4, pc}
|
|
c3c: 00000b81 .word 0x00000b81
|
|
|
|
00000c40 <_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)) {
|
|
c40: 07c3 lsls r3, r0, #31
|
|
c42: d507 bpl.n c54 <_gclk_init_generators_by_fref+0x14>
|
|
((Gclk *)hw)->GENCTRL[index].reg = data;
|
|
c44: 4a09 ldr r2, [pc, #36] ; (c6c <_gclk_init_generators_by_fref+0x2c>)
|
|
c46: 4b0a ldr r3, [pc, #40] ; (c70 <_gclk_init_generators_by_fref+0x30>)
|
|
c48: 621a str r2, [r3, #32]
|
|
while (((Gclk *)hw)->SYNCBUSY.reg & reg) {
|
|
c4a: 4b09 ldr r3, [pc, #36] ; (c70 <_gclk_init_generators_by_fref+0x30>)
|
|
c4c: 685b ldr r3, [r3, #4]
|
|
c4e: 227d movs r2, #125 ; 0x7d
|
|
c50: 421a tst r2, r3
|
|
c52: d1fa bne.n c4a <_gclk_init_generators_by_fref+0xa>
|
|
| (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)) {
|
|
c54: 0703 lsls r3, r0, #28
|
|
c56: d507 bpl.n c68 <_gclk_init_generators_by_fref+0x28>
|
|
((Gclk *)hw)->GENCTRL[index].reg = data;
|
|
c58: 4a06 ldr r2, [pc, #24] ; (c74 <_gclk_init_generators_by_fref+0x34>)
|
|
c5a: 4b05 ldr r3, [pc, #20] ; (c70 <_gclk_init_generators_by_fref+0x30>)
|
|
c5c: 62da str r2, [r3, #44] ; 0x2c
|
|
while (((Gclk *)hw)->SYNCBUSY.reg & reg) {
|
|
c5e: 4b04 ldr r3, [pc, #16] ; (c70 <_gclk_init_generators_by_fref+0x30>)
|
|
c60: 685b ldr r3, [r3, #4]
|
|
c62: 227d movs r2, #125 ; 0x7d
|
|
c64: 421a tst r2, r3
|
|
c66: d1fa bne.n c5e <_gclk_init_generators_by_fref+0x1e>
|
|
| (CONF_GCLK_GEN_4_DIVSEL << GCLK_GENCTRL_DIVSEL_Pos) | (CONF_GCLK_GEN_4_OE << GCLK_GENCTRL_OE_Pos)
|
|
| (CONF_GCLK_GEN_4_OOV << GCLK_GENCTRL_OOV_Pos) | (CONF_GCLK_GEN_4_IDC << GCLK_GENCTRL_IDC_Pos)
|
|
| (CONF_GCLK_GENERATOR_4_CONFIG << GCLK_GENCTRL_GENEN_Pos) | CONF_GCLK_GEN_4_SOURCE);
|
|
}
|
|
#endif
|
|
}
|
|
c68: 4770 bx lr
|
|
c6a: 46c0 nop ; (mov r8, r8)
|
|
c6c: 00010105 .word 0x00010105
|
|
c70: 40001c00 .word 0x40001c00
|
|
c74: 00012304 .word 0x00012304
|
|
|
|
00000c78 <_mclk_init>:
|
|
((Mclk *)hw)->BUPDIV.reg = data;
|
|
c78: 4b02 ldr r3, [pc, #8] ; (c84 <_mclk_init+0xc>)
|
|
c7a: 2208 movs r2, #8
|
|
c7c: 719a strb r2, [r3, #6]
|
|
((Mclk *)hw)->CPUDIV.reg = data;
|
|
c7e: 3a07 subs r2, #7
|
|
c80: 711a strb r2, [r3, #4]
|
|
void _mclk_init(void)
|
|
{
|
|
void *hw = (void *)MCLK;
|
|
hri_mclk_write_BUPDIV_reg(hw, MCLK_BUPDIV_BUPDIV(CONF_MCLK_BUPDIV));
|
|
hri_mclk_write_CPUDIV_reg(hw, MCLK_CPUDIV_CPUDIV(CONF_MCLK_CPUDIV));
|
|
}
|
|
c82: 4770 bx lr
|
|
c84: 40000800 .word 0x40000800
|
|
|
|
00000c88 <_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;
|
|
c88: 4a07 ldr r2, [pc, #28] ; (ca8 <_osc32kctrl_init_sources+0x20>)
|
|
c8a: 239e movs r3, #158 ; 0x9e
|
|
c8c: 8293 strh r3, [r2, #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;
|
|
c8e: 2300 movs r3, #0
|
|
c90: 7593 strb r3, [r2, #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;
|
|
c92: 75d3 strb r3, [r2, #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;
|
|
c94: 69d3 ldr r3, [r2, #28]
|
|
tmp = (tmp & OSC32KCTRL_OSCULP32K_CALIB_Msk) >> OSC32KCTRL_OSCULP32K_CALIB_Pos;
|
|
c96: 0a1b lsrs r3, r3, #8
|
|
calib = hri_osc32kctrl_read_OSCULP32K_CALIB_bf(hw);
|
|
hri_osc32kctrl_write_OSCULP32K_reg(hw,
|
|
#if CONF_OSC32K_CALIB_ENABLE == 1
|
|
OSC32KCTRL_OSCULP32K_CALIB(CONF_OSC32K_CALIB)
|
|
#else
|
|
OSC32KCTRL_OSCULP32K_CALIB(calib)
|
|
c98: 021b lsls r3, r3, #8
|
|
c9a: 21f8 movs r1, #248 ; 0xf8
|
|
c9c: 0149 lsls r1, r1, #5
|
|
c9e: 400b ands r3, r1
|
|
}
|
|
|
|
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;
|
|
ca0: 61d3 str r3, [r2, #28]
|
|
((Osc32kctrl *)hw)->RTCCTRL.reg = data;
|
|
ca2: 2304 movs r3, #4
|
|
ca4: 7413 strb r3, [r2, #16]
|
|
#endif
|
|
#endif
|
|
|
|
hri_osc32kctrl_write_RTCCTRL_reg(hw, OSC32KCTRL_RTCCTRL_RTCSEL(CONF_RTCCTRL));
|
|
(void)calib;
|
|
}
|
|
ca6: 4770 bx lr
|
|
ca8: 40001400 .word 0x40001400
|
|
|
|
00000cac <_oscctrl_init_sources>:
|
|
}
|
|
|
|
static inline void hri_oscctrl_write_OSC16MCTRL_reg(const void *const hw, hri_oscctrl_osc16mctrl_reg_t data)
|
|
{
|
|
OSCCTRL_CRITICAL_SECTION_ENTER();
|
|
((Oscctrl *)hw)->OSC16MCTRL.reg = data;
|
|
cac: 2282 movs r2, #130 ; 0x82
|
|
cae: 4b0c ldr r3, [pc, #48] ; (ce0 <_oscctrl_init_sources+0x34>)
|
|
cb0: 751a strb r2, [r3, #20]
|
|
while (((Oscctrl *)hw)->DPLLSYNCBUSY.reg & reg) {
|
|
cb2: 2338 movs r3, #56 ; 0x38
|
|
cb4: 4a0a ldr r2, [pc, #40] ; (ce0 <_oscctrl_init_sources+0x34>)
|
|
cb6: 5cd3 ldrb r3, [r2, r3]
|
|
cb8: 079b lsls r3, r3, #30
|
|
cba: d4fa bmi.n cb2 <_oscctrl_init_sources+0x6>
|
|
return (((Oscctrl *)hw)->STATUS.reg & OSCCTRL_STATUS_OSC16MRDY) >> OSCCTRL_STATUS_OSC16MRDY_Pos;
|
|
cbc: 4b08 ldr r3, [pc, #32] ; (ce0 <_oscctrl_init_sources+0x34>)
|
|
cbe: 68db ldr r3, [r3, #12]
|
|
#endif
|
|
#endif
|
|
|
|
#if CONF_OSC16M_CONFIG == 1
|
|
#if CONF_OSC16M_ENABLE == 1
|
|
while (!hri_oscctrl_get_STATUS_OSC16MRDY_bit(hw))
|
|
cc0: 06db lsls r3, r3, #27
|
|
cc2: d5fb bpl.n cbc <_oscctrl_init_sources+0x10>
|
|
((Oscctrl *)hw)->OSC16MCTRL.reg |= OSCCTRL_OSC16MCTRL_ONDEMAND;
|
|
cc4: 4a06 ldr r2, [pc, #24] ; (ce0 <_oscctrl_init_sources+0x34>)
|
|
cc6: 7d13 ldrb r3, [r2, #20]
|
|
cc8: 2180 movs r1, #128 ; 0x80
|
|
cca: 4249 negs r1, r1
|
|
ccc: 430b orrs r3, r1
|
|
cce: b2db uxtb r3, r3
|
|
cd0: 7513 strb r3, [r2, #20]
|
|
while (((Oscctrl *)hw)->DPLLSYNCBUSY.reg & reg) {
|
|
cd2: 2338 movs r3, #56 ; 0x38
|
|
cd4: 4a02 ldr r2, [pc, #8] ; (ce0 <_oscctrl_init_sources+0x34>)
|
|
cd6: 5cd2 ldrb r2, [r2, r3]
|
|
cd8: 3b2a subs r3, #42 ; 0x2a
|
|
cda: 421a tst r2, r3
|
|
cdc: d1f9 bne.n cd2 <_oscctrl_init_sources+0x26>
|
|
#if CONF_OSC16M_ONDEMAND == 1
|
|
hri_oscctrl_set_OSC16MCTRL_ONDEMAND_bit(hw);
|
|
#endif
|
|
#endif
|
|
(void)hw;
|
|
}
|
|
cde: 4770 bx lr
|
|
ce0: 40001000 .word 0x40001000
|
|
|
|
00000ce4 <_oscctrl_init_referenced_generators>:
|
|
#if CONF_DFLL_CONFIG == 1
|
|
while (hri_gclk_read_SYNCBUSY_reg(GCLK))
|
|
;
|
|
#endif
|
|
(void)hw, (void)tmp;
|
|
}
|
|
ce4: 4770 bx lr
|
|
...
|
|
|
|
00000ce8 <_set_performance_level>:
|
|
}
|
|
|
|
static inline hri_pm_plcfg_reg_t hri_pm_get_PLCFG_PLSEL_bf(const void *const hw, hri_pm_plcfg_reg_t mask)
|
|
{
|
|
uint8_t tmp;
|
|
tmp = ((Pm *)hw)->PLCFG.reg;
|
|
ce8: 4b09 ldr r3, [pc, #36] ; (d10 <_set_performance_level+0x28>)
|
|
cea: 789b ldrb r3, [r3, #2]
|
|
tmp = (tmp & PM_PLCFG_PLSEL(mask)) >> PM_PLCFG_PLSEL_Pos;
|
|
cec: 2203 movs r2, #3
|
|
cee: 4013 ands r3, r2
|
|
/**
|
|
* \brief Set performance level
|
|
*/
|
|
void _set_performance_level(const uint8_t level)
|
|
{
|
|
if (hri_pm_get_PLCFG_PLSEL_bf(PM, PM_PLCFG_PLSEL_Msk) != level) {
|
|
cf0: 4298 cmp r0, r3
|
|
cf2: d00c beq.n d0e <_set_performance_level+0x26>
|
|
((Pm *)hw)->INTFLAG.reg = mask;
|
|
cf4: 4a06 ldr r2, [pc, #24] ; (d10 <_set_performance_level+0x28>)
|
|
cf6: 23ff movs r3, #255 ; 0xff
|
|
cf8: 7193 strb r3, [r2, #6]
|
|
|
|
static inline void hri_pm_write_PLCFG_PLSEL_bf(const void *const hw, hri_pm_plcfg_reg_t data)
|
|
{
|
|
uint8_t tmp;
|
|
PM_CRITICAL_SECTION_ENTER();
|
|
tmp = ((Pm *)hw)->PLCFG.reg;
|
|
cfa: 7893 ldrb r3, [r2, #2]
|
|
tmp &= ~PM_PLCFG_PLSEL_Msk;
|
|
cfc: 2103 movs r1, #3
|
|
cfe: 438b bics r3, r1
|
|
tmp |= PM_PLCFG_PLSEL(data);
|
|
d00: 4008 ands r0, r1
|
|
d02: 4318 orrs r0, r3
|
|
((Pm *)hw)->PLCFG.reg = tmp;
|
|
d04: 7090 strb r0, [r2, #2]
|
|
return ((Pm *)hw)->INTFLAG.reg;
|
|
d06: 4b02 ldr r3, [pc, #8] ; (d10 <_set_performance_level+0x28>)
|
|
d08: 799b ldrb r3, [r3, #6]
|
|
hri_pm_clear_INTFLAG_reg(PM, 0xFF);
|
|
hri_pm_write_PLCFG_PLSEL_bf(PM, level);
|
|
while (!hri_pm_read_INTFLAG_reg(PM))
|
|
d0a: 2b00 cmp r3, #0
|
|
d0c: d0fb beq.n d06 <_set_performance_level+0x1e>
|
|
;
|
|
}
|
|
}
|
|
d0e: 4770 bx lr
|
|
d10: 40000400 .word 0x40000400
|
|
|
|
00000d14 <_rtc_interrupt_handler>:
|
|
* \brief RTC interrupt handler
|
|
*
|
|
* \param[in] dev The pointer to calendar device struct
|
|
*/
|
|
static void _rtc_interrupt_handler(struct calendar_dev *dev)
|
|
{
|
|
d14: b510 push {r4, lr}
|
|
d16: 0004 movs r4, r0
|
|
/* Read and mask interrupt flag register */
|
|
uint16_t interrupt_status = hri_rtcmode0_read_INTFLAG_reg(dev->hw);
|
|
d18: 6802 ldr r2, [r0, #0]
|
|
return tmp;
|
|
}
|
|
|
|
static inline hri_rtcmode0_intflag_reg_t hri_rtcmode0_read_INTFLAG_reg(const void *const hw)
|
|
{
|
|
return ((Rtc *)hw)->MODE0.INTFLAG.reg;
|
|
d1a: 8991 ldrh r1, [r2, #12]
|
|
return tmp;
|
|
}
|
|
|
|
static inline hri_rtcmode0_intenset_reg_t hri_rtcmode0_read_INTEN_reg(const void *const hw)
|
|
{
|
|
return ((Rtc *)hw)->MODE0.INTENSET.reg;
|
|
d1c: 8953 ldrh r3, [r2, #10]
|
|
uint16_t interrupt_enabled = hri_rtcmode0_read_INTEN_reg(dev->hw);
|
|
|
|
if ((interrupt_status & interrupt_enabled) & RTC_MODE2_INTFLAG_ALARM0) {
|
|
d1e: 400b ands r3, r1
|
|
d20: 05da lsls r2, r3, #23
|
|
d22: d402 bmi.n d2a <_rtc_interrupt_handler+0x16>
|
|
dev->callback(dev);
|
|
|
|
/* Clear interrupt flag */
|
|
hri_rtcmode0_clear_interrupt_CMP0_bit(dev->hw);
|
|
} else if ((interrupt_status & interrupt_enabled) & RTC_MODE2_INTFLAG_TAMPER) {
|
|
d24: 045b lsls r3, r3, #17
|
|
d26: d407 bmi.n d38 <_rtc_interrupt_handler+0x24>
|
|
dev->callback_tamper(dev);
|
|
|
|
/* Clear interrupt flag */
|
|
hri_rtcmode0_clear_interrupt_TAMPER_bit(dev->hw);
|
|
}
|
|
}
|
|
d28: bd10 pop {r4, pc}
|
|
dev->callback(dev);
|
|
d2a: 6843 ldr r3, [r0, #4]
|
|
d2c: 4798 blx r3
|
|
hri_rtcmode0_clear_interrupt_CMP0_bit(dev->hw);
|
|
d2e: 6823 ldr r3, [r4, #0]
|
|
((Rtc *)hw)->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0;
|
|
d30: 2280 movs r2, #128 ; 0x80
|
|
d32: 0052 lsls r2, r2, #1
|
|
d34: 819a strh r2, [r3, #12]
|
|
d36: e7f7 b.n d28 <_rtc_interrupt_handler+0x14>
|
|
dev->callback_tamper(dev);
|
|
d38: 6883 ldr r3, [r0, #8]
|
|
d3a: 4798 blx r3
|
|
hri_rtcmode0_clear_interrupt_TAMPER_bit(dev->hw);
|
|
d3c: 6823 ldr r3, [r4, #0]
|
|
((Rtc *)hw)->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_TAMPER;
|
|
d3e: 2280 movs r2, #128 ; 0x80
|
|
d40: 01d2 lsls r2, r2, #7
|
|
d42: 819a strh r2, [r3, #12]
|
|
}
|
|
d44: e7f0 b.n d28 <_rtc_interrupt_handler+0x14>
|
|
...
|
|
|
|
00000d48 <_calendar_init>:
|
|
{
|
|
d48: b510 push {r4, lr}
|
|
d4a: 1e04 subs r4, r0, #0
|
|
ASSERT(dev && dev->hw);
|
|
d4c: d037 beq.n dbe <_calendar_init+0x76>
|
|
d4e: 6803 ldr r3, [r0, #0]
|
|
d50: 2b00 cmp r3, #0
|
|
d52: d032 beq.n dba <_calendar_init+0x72>
|
|
d54: 2001 movs r0, #1
|
|
d56: 222f movs r2, #47 ; 0x2f
|
|
d58: 491a ldr r1, [pc, #104] ; (dc4 <_calendar_init+0x7c>)
|
|
d5a: 4b1b ldr r3, [pc, #108] ; (dc8 <_calendar_init+0x80>)
|
|
d5c: 4798 blx r3
|
|
_rtc_dev = dev;
|
|
d5e: 4b1b ldr r3, [pc, #108] ; (dcc <_calendar_init+0x84>)
|
|
d60: 601c str r4, [r3, #0]
|
|
if (hri_rtcmode0_get_CTRLA_ENABLE_bit(dev->hw)) {
|
|
d62: 6821 ldr r1, [r4, #0]
|
|
while (((Rtc *)hw)->MODE0.SYNCBUSY.reg & reg) {
|
|
d64: 690a ldr r2, [r1, #16]
|
|
d66: 4b1a ldr r3, [pc, #104] ; (dd0 <_calendar_init+0x88>)
|
|
d68: 421a tst r2, r3
|
|
d6a: d1fb bne.n d64 <_calendar_init+0x1c>
|
|
|
|
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);
|
|
tmp = ((Rtc *)hw)->MODE0.CTRLA.reg;
|
|
d6c: 880b ldrh r3, [r1, #0]
|
|
d6e: 079b lsls r3, r3, #30
|
|
d70: d50b bpl.n d8a <_calendar_init+0x42>
|
|
}
|
|
|
|
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;
|
|
d72: 880b ldrh r3, [r1, #0]
|
|
d74: 2202 movs r2, #2
|
|
d76: 4393 bics r3, r2
|
|
d78: 800b strh r3, [r1, #0]
|
|
while (((Rtc *)hw)->MODE0.SYNCBUSY.reg & reg) {
|
|
d7a: 690a ldr r2, [r1, #16]
|
|
d7c: 4b14 ldr r3, [pc, #80] ; (dd0 <_calendar_init+0x88>)
|
|
d7e: 421a tst r2, r3
|
|
d80: d1fb bne.n d7a <_calendar_init+0x32>
|
|
hri_rtcmode0_wait_for_sync(dev->hw, RTC_MODE0_SYNCBUSY_ENABLE);
|
|
d82: 6822 ldr r2, [r4, #0]
|
|
d84: 6913 ldr r3, [r2, #16]
|
|
d86: 079b lsls r3, r3, #30
|
|
d88: d4fc bmi.n d84 <_calendar_init+0x3c>
|
|
hri_rtcmode0_set_CTRLA_SWRST_bit(dev->hw);
|
|
d8a: 6822 ldr r2, [r4, #0]
|
|
((Rtc *)hw)->MODE0.CTRLA.reg |= RTC_MODE0_CTRLA_SWRST;
|
|
d8c: 8813 ldrh r3, [r2, #0]
|
|
d8e: 2101 movs r1, #1
|
|
d90: 430b orrs r3, r1
|
|
d92: b29b uxth r3, r3
|
|
d94: 8013 strh r3, [r2, #0]
|
|
while (((Rtc *)hw)->MODE0.SYNCBUSY.reg & reg) {
|
|
d96: 6913 ldr r3, [r2, #16]
|
|
d98: 07db lsls r3, r3, #31
|
|
d9a: d4fc bmi.n d96 <_calendar_init+0x4e>
|
|
hri_rtcmode0_wait_for_sync(dev->hw, RTC_MODE0_SYNCBUSY_SWRST);
|
|
d9c: 6823 ldr r3, [r4, #0]
|
|
d9e: 691a ldr r2, [r3, #16]
|
|
da0: 07d2 lsls r2, r2, #31
|
|
da2: d4fc bmi.n d9e <_calendar_init+0x56>
|
|
}
|
|
|
|
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;
|
|
da4: 4a0b ldr r2, [pc, #44] ; (dd4 <_calendar_init+0x8c>)
|
|
da6: 801a strh r2, [r3, #0]
|
|
while (((Rtc *)hw)->MODE0.SYNCBUSY.reg & reg) {
|
|
da8: 6919 ldr r1, [r3, #16]
|
|
daa: 4a09 ldr r2, [pc, #36] ; (dd0 <_calendar_init+0x88>)
|
|
dac: 4211 tst r1, r2
|
|
dae: d1fb bne.n da8 <_calendar_init+0x60>
|
|
dev->hw,
|
|
db0: 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;
|
|
db2: 2200 movs r2, #0
|
|
db4: 661a str r2, [r3, #96] ; 0x60
|
|
}
|
|
db6: 2000 movs r0, #0
|
|
db8: bd10 pop {r4, pc}
|
|
ASSERT(dev && dev->hw);
|
|
dba: 2000 movs r0, #0
|
|
dbc: e7cb b.n d56 <_calendar_init+0xe>
|
|
dbe: 2000 movs r0, #0
|
|
dc0: e7c9 b.n d56 <_calendar_init+0xe>
|
|
dc2: 46c0 nop ; (mov r8, r8)
|
|
dc4: 00002064 .word 0x00002064
|
|
dc8: 00000a69 .word 0x00000a69
|
|
dcc: 20000064 .word 0x20000064
|
|
dd0: 00008003 .word 0x00008003
|
|
dd4: ffff8b00 .word 0xffff8b00
|
|
|
|
00000dd8 <_calendar_enable>:
|
|
{
|
|
dd8: b510 push {r4, lr}
|
|
dda: 1e04 subs r4, r0, #0
|
|
ASSERT(dev && dev->hw);
|
|
ddc: d015 beq.n e0a <_calendar_enable+0x32>
|
|
dde: 6803 ldr r3, [r0, #0]
|
|
de0: 2b00 cmp r3, #0
|
|
de2: d010 beq.n e06 <_calendar_enable+0x2e>
|
|
de4: 2001 movs r0, #1
|
|
de6: 2273 movs r2, #115 ; 0x73
|
|
de8: 4909 ldr r1, [pc, #36] ; (e10 <_calendar_enable+0x38>)
|
|
dea: 4b0a ldr r3, [pc, #40] ; (e14 <_calendar_enable+0x3c>)
|
|
dec: 4798 blx r3
|
|
hri_rtcmode0_set_CTRLA_ENABLE_bit(dev->hw);
|
|
dee: 6821 ldr r1, [r4, #0]
|
|
((Rtc *)hw)->MODE0.CTRLA.reg |= RTC_MODE0_CTRLA_ENABLE;
|
|
df0: 880b ldrh r3, [r1, #0]
|
|
df2: 2202 movs r2, #2
|
|
df4: 4313 orrs r3, r2
|
|
df6: b29b uxth r3, r3
|
|
df8: 800b strh r3, [r1, #0]
|
|
while (((Rtc *)hw)->MODE0.SYNCBUSY.reg & reg) {
|
|
dfa: 690a ldr r2, [r1, #16]
|
|
dfc: 4b06 ldr r3, [pc, #24] ; (e18 <_calendar_enable+0x40>)
|
|
dfe: 421a tst r2, r3
|
|
e00: d1fb bne.n dfa <_calendar_enable+0x22>
|
|
}
|
|
e02: 2000 movs r0, #0
|
|
e04: bd10 pop {r4, pc}
|
|
ASSERT(dev && dev->hw);
|
|
e06: 2000 movs r0, #0
|
|
e08: e7ed b.n de6 <_calendar_enable+0xe>
|
|
e0a: 2000 movs r0, #0
|
|
e0c: e7eb b.n de6 <_calendar_enable+0xe>
|
|
e0e: 46c0 nop ; (mov r8, r8)
|
|
e10: 00002064 .word 0x00002064
|
|
e14: 00000a69 .word 0x00000a69
|
|
e18: 00008003 .word 0x00008003
|
|
|
|
00000e1c <_calendar_set_counter>:
|
|
{
|
|
e1c: b570 push {r4, r5, r6, lr}
|
|
e1e: 0004 movs r4, r0
|
|
e20: 000d movs r5, r1
|
|
ASSERT(dev && dev->hw);
|
|
e22: 2800 cmp r0, #0
|
|
e24: d010 beq.n e48 <_calendar_set_counter+0x2c>
|
|
e26: 6803 ldr r3, [r0, #0]
|
|
e28: 2b00 cmp r3, #0
|
|
e2a: d00b beq.n e44 <_calendar_set_counter+0x28>
|
|
e2c: 2001 movs r0, #1
|
|
e2e: 228b movs r2, #139 ; 0x8b
|
|
e30: 4906 ldr r1, [pc, #24] ; (e4c <_calendar_set_counter+0x30>)
|
|
e32: 4b07 ldr r3, [pc, #28] ; (e50 <_calendar_set_counter+0x34>)
|
|
e34: 4798 blx r3
|
|
hri_rtcmode0_write_COUNT_reg(dev->hw, counter);
|
|
e36: 6822 ldr r2, [r4, #0]
|
|
((Rtc *)hw)->MODE0.COUNT.reg = data;
|
|
e38: 6195 str r5, [r2, #24]
|
|
while (((Rtc *)hw)->MODE0.SYNCBUSY.reg & reg) {
|
|
e3a: 6913 ldr r3, [r2, #16]
|
|
e3c: 071b lsls r3, r3, #28
|
|
e3e: d4fc bmi.n e3a <_calendar_set_counter+0x1e>
|
|
}
|
|
e40: 2000 movs r0, #0
|
|
e42: bd70 pop {r4, r5, r6, pc}
|
|
ASSERT(dev && dev->hw);
|
|
e44: 2000 movs r0, #0
|
|
e46: e7f2 b.n e2e <_calendar_set_counter+0x12>
|
|
e48: 2000 movs r0, #0
|
|
e4a: e7f0 b.n e2e <_calendar_set_counter+0x12>
|
|
e4c: 00002064 .word 0x00002064
|
|
e50: 00000a69 .word 0x00000a69
|
|
|
|
00000e54 <_calendar_get_counter>:
|
|
{
|
|
e54: b510 push {r4, lr}
|
|
e56: 1e04 subs r4, r0, #0
|
|
ASSERT(dev && dev->hw);
|
|
e58: d00f beq.n e7a <_calendar_get_counter+0x26>
|
|
e5a: 6803 ldr r3, [r0, #0]
|
|
e5c: 2b00 cmp r3, #0
|
|
e5e: d00a beq.n e76 <_calendar_get_counter+0x22>
|
|
e60: 2001 movs r0, #1
|
|
e62: 2297 movs r2, #151 ; 0x97
|
|
e64: 4906 ldr r1, [pc, #24] ; (e80 <_calendar_get_counter+0x2c>)
|
|
e66: 4b07 ldr r3, [pc, #28] ; (e84 <_calendar_get_counter+0x30>)
|
|
e68: 4798 blx r3
|
|
return hri_rtcmode0_read_COUNT_reg(dev->hw);
|
|
e6a: 6822 ldr r2, [r4, #0]
|
|
e6c: 6913 ldr r3, [r2, #16]
|
|
e6e: 071b lsls r3, r3, #28
|
|
e70: d4fc bmi.n e6c <_calendar_get_counter+0x18>
|
|
return ((Rtc *)hw)->MODE0.COUNT.reg;
|
|
e72: 6990 ldr r0, [r2, #24]
|
|
}
|
|
e74: bd10 pop {r4, pc}
|
|
ASSERT(dev && dev->hw);
|
|
e76: 2000 movs r0, #0
|
|
e78: e7f3 b.n e62 <_calendar_get_counter+0xe>
|
|
e7a: 2000 movs r0, #0
|
|
e7c: e7f1 b.n e62 <_calendar_get_counter+0xe>
|
|
e7e: 46c0 nop ; (mov r8, r8)
|
|
e80: 00002064 .word 0x00002064
|
|
e84: 00000a69 .word 0x00000a69
|
|
|
|
00000e88 <RTC_Handler>:
|
|
|
|
/**
|
|
* \brief Rtc interrupt handler
|
|
*/
|
|
void RTC_Handler(void)
|
|
{
|
|
e88: b510 push {r4, lr}
|
|
_rtc_interrupt_handler(_rtc_dev);
|
|
e8a: 4b02 ldr r3, [pc, #8] ; (e94 <RTC_Handler+0xc>)
|
|
e8c: 6818 ldr r0, [r3, #0]
|
|
e8e: 4b02 ldr r3, [pc, #8] ; (e98 <RTC_Handler+0x10>)
|
|
e90: 4798 blx r3
|
|
}
|
|
e92: bd10 pop {r4, pc}
|
|
e94: 20000064 .word 0x20000064
|
|
e98: 00000d15 .word 0x00000d15
|
|
|
|
00000e9c <_sercom_get_hardware_index>:
|
|
{
|
|
#ifdef _UNIT_TEST_
|
|
return ((uint32_t)hw - (uint32_t)SERCOM0) / sizeof(Sercom);
|
|
#endif
|
|
|
|
return ((uint32_t)hw - (uint32_t)SERCOM0) >> 10;
|
|
e9c: 4b02 ldr r3, [pc, #8] ; (ea8 <_sercom_get_hardware_index+0xc>)
|
|
e9e: 469c mov ip, r3
|
|
ea0: 4460 add r0, ip
|
|
ea2: 0a80 lsrs r0, r0, #10
|
|
ea4: b2c0 uxtb r0, r0
|
|
}
|
|
ea6: 4770 bx lr
|
|
ea8: bdfffc00 .word 0xbdfffc00
|
|
|
|
00000eac <_get_i2cm_index>:
|
|
* \param[in] hw The pointer to hardware instance
|
|
|
|
* \return The ordinal number of the given sercom hardware instance
|
|
*/
|
|
static int8_t _get_i2cm_index(const void *const hw)
|
|
{
|
|
eac: b510 push {r4, lr}
|
|
uint8_t sercom_offset = _sercom_get_hardware_index(hw);
|
|
eae: 4b0d ldr r3, [pc, #52] ; (ee4 <_get_i2cm_index+0x38>)
|
|
eb0: 4798 blx r3
|
|
uint8_t i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(_i2cms); i++) {
|
|
eb2: 2300 movs r3, #0
|
|
eb4: 2b00 cmp r3, #0
|
|
eb6: d008 beq.n eca <_get_i2cm_index+0x1e>
|
|
if (_i2cms[i].number == sercom_offset) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
ASSERT(false);
|
|
eb8: 22e6 movs r2, #230 ; 0xe6
|
|
eba: 0092 lsls r2, r2, #2
|
|
ebc: 490a ldr r1, [pc, #40] ; (ee8 <_get_i2cm_index+0x3c>)
|
|
ebe: 2000 movs r0, #0
|
|
ec0: 4b0a ldr r3, [pc, #40] ; (eec <_get_i2cm_index+0x40>)
|
|
ec2: 4798 blx r3
|
|
return -1;
|
|
ec4: 2001 movs r0, #1
|
|
ec6: 4240 negs r0, r0
|
|
}
|
|
ec8: bd10 pop {r4, pc}
|
|
if (_i2cms[i].number == sercom_offset) {
|
|
eca: 005a lsls r2, r3, #1
|
|
ecc: 18d2 adds r2, r2, r3
|
|
ece: 00d1 lsls r1, r2, #3
|
|
ed0: 4a07 ldr r2, [pc, #28] ; (ef0 <_get_i2cm_index+0x44>)
|
|
ed2: 1852 adds r2, r2, r1
|
|
ed4: 7d12 ldrb r2, [r2, #20]
|
|
ed6: 4290 cmp r0, r2
|
|
ed8: d002 beq.n ee0 <_get_i2cm_index+0x34>
|
|
for (i = 0; i < ARRAY_SIZE(_i2cms); i++) {
|
|
eda: 3301 adds r3, #1
|
|
edc: b2db uxtb r3, r3
|
|
ede: e7e9 b.n eb4 <_get_i2cm_index+0x8>
|
|
return i;
|
|
ee0: b258 sxtb r0, r3
|
|
ee2: e7f1 b.n ec8 <_get_i2cm_index+0x1c>
|
|
ee4: 00000e9d .word 0x00000e9d
|
|
ee8: 000020cc .word 0x000020cc
|
|
eec: 00000a69 .word 0x00000a69
|
|
ef0: 0000207c .word 0x0000207c
|
|
|
|
00000ef4 <_i2c_m_sync_init_impl>:
|
|
}
|
|
return ERR_NONE;
|
|
}
|
|
|
|
static int32_t _i2c_m_sync_init_impl(struct _i2c_m_service *const service, void *const hw)
|
|
{
|
|
ef4: b570 push {r4, r5, r6, lr}
|
|
ef6: 0005 movs r5, r0
|
|
ef8: 000c movs r4, r1
|
|
uint8_t i = _get_i2cm_index(hw);
|
|
efa: 0008 movs r0, r1
|
|
efc: 4b2d ldr r3, [pc, #180] ; (fb4 <_i2c_m_sync_init_impl+0xc0>)
|
|
efe: 4798 blx r3
|
|
f00: b2c0 uxtb r0, r0
|
|
};
|
|
}
|
|
|
|
static inline bool hri_sercomi2cm_is_syncing(const void *const hw, hri_sercomi2cm_syncbusy_reg_t reg)
|
|
{
|
|
return ((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg;
|
|
f02: 69e3 ldr r3, [r4, #28]
|
|
|
|
if (!hri_sercomi2cm_is_syncing(hw, SERCOM_I2CM_SYNCBUSY_SWRST)) {
|
|
f04: 07db lsls r3, r3, #31
|
|
f06: d41d bmi.n f44 <_i2c_m_sync_init_impl+0x50>
|
|
uint32_t mode = _i2cms[i].ctrl_a & SERCOM_I2CM_CTRLA_MODE_Msk;
|
|
f08: 0043 lsls r3, r0, #1
|
|
f0a: 181b adds r3, r3, r0
|
|
f0c: 00da lsls r2, r3, #3
|
|
f0e: 4b2a ldr r3, [pc, #168] ; (fb8 <_i2c_m_sync_init_impl+0xc4>)
|
|
f10: 189b adds r3, r3, r2
|
|
f12: 699a ldr r2, [r3, #24]
|
|
f14: 231c movs r3, #28
|
|
f16: 401a ands r2, r3
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
f18: 69e3 ldr r3, [r4, #28]
|
|
f1a: 079b lsls r3, r3, #30
|
|
f1c: d1fc bne.n f18 <_i2c_m_sync_init_impl+0x24>
|
|
static inline hri_sercomi2cm_ctrla_reg_t hri_sercomi2cm_get_CTRLA_reg(const void *const hw,
|
|
hri_sercomi2cm_ctrla_reg_t mask)
|
|
{
|
|
uint32_t tmp;
|
|
hri_sercomi2cm_wait_for_sync(hw, SERCOM_I2CM_SYNCBUSY_SWRST | SERCOM_I2CM_SYNCBUSY_ENABLE);
|
|
tmp = ((Sercom *)hw)->I2CM.CTRLA.reg;
|
|
f1e: 6823 ldr r3, [r4, #0]
|
|
if (hri_sercomi2cm_get_CTRLA_reg(hw, SERCOM_I2CM_CTRLA_ENABLE)) {
|
|
f20: 079b lsls r3, r3, #30
|
|
f22: d509 bpl.n f38 <_i2c_m_sync_init_impl+0x44>
|
|
((Sercom *)hw)->I2CM.CTRLA.reg &= ~SERCOM_I2CM_CTRLA_ENABLE;
|
|
f24: 6823 ldr r3, [r4, #0]
|
|
f26: 2102 movs r1, #2
|
|
f28: 438b bics r3, r1
|
|
f2a: 6023 str r3, [r4, #0]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
f2c: 69e3 ldr r3, [r4, #28]
|
|
f2e: 079b lsls r3, r3, #30
|
|
f30: d1fc bne.n f2c <_i2c_m_sync_init_impl+0x38>
|
|
f32: 69e3 ldr r3, [r4, #28]
|
|
f34: 079b lsls r3, r3, #30
|
|
f36: d4fc bmi.n f32 <_i2c_m_sync_init_impl+0x3e>
|
|
hri_sercomi2cm_clear_CTRLA_ENABLE_bit(hw);
|
|
hri_sercomi2cm_wait_for_sync(hw, SERCOM_I2CM_SYNCBUSY_ENABLE);
|
|
}
|
|
hri_sercomi2cm_write_CTRLA_reg(hw, SERCOM_I2CM_CTRLA_SWRST | mode);
|
|
f38: 2301 movs r3, #1
|
|
f3a: 4313 orrs r3, r2
|
|
}
|
|
|
|
static inline void hri_sercomi2cm_write_CTRLA_reg(const void *const hw, hri_sercomi2cm_ctrla_reg_t data)
|
|
{
|
|
SERCOM_CRITICAL_SECTION_ENTER();
|
|
((Sercom *)hw)->I2CM.CTRLA.reg = data;
|
|
f3c: 6023 str r3, [r4, #0]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
f3e: 69e3 ldr r3, [r4, #28]
|
|
f40: 079b lsls r3, r3, #30
|
|
f42: d1fc bne.n f3e <_i2c_m_sync_init_impl+0x4a>
|
|
f44: 69e3 ldr r3, [r4, #28]
|
|
f46: 07db lsls r3, r3, #31
|
|
f48: d4fc bmi.n f44 <_i2c_m_sync_init_impl+0x50>
|
|
}
|
|
hri_sercomi2cm_wait_for_sync(hw, SERCOM_I2CM_SYNCBUSY_SWRST);
|
|
|
|
hri_sercomi2cm_write_CTRLA_reg(hw, _i2cms[i].ctrl_a);
|
|
f4a: 0043 lsls r3, r0, #1
|
|
f4c: 181b adds r3, r3, r0
|
|
f4e: 00da lsls r2, r3, #3
|
|
f50: 4b19 ldr r3, [pc, #100] ; (fb8 <_i2c_m_sync_init_impl+0xc4>)
|
|
f52: 189b adds r3, r3, r2
|
|
f54: 699b ldr r3, [r3, #24]
|
|
((Sercom *)hw)->I2CM.CTRLA.reg = data;
|
|
f56: 6023 str r3, [r4, #0]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
f58: 69e3 ldr r3, [r4, #28]
|
|
f5a: 079b lsls r3, r3, #30
|
|
f5c: d1fc bne.n f58 <_i2c_m_sync_init_impl+0x64>
|
|
hri_sercomi2cm_write_CTRLB_reg(hw, _i2cms[i].ctrl_b);
|
|
f5e: 0043 lsls r3, r0, #1
|
|
f60: 181b adds r3, r3, r0
|
|
f62: 00da lsls r2, r3, #3
|
|
f64: 4b14 ldr r3, [pc, #80] ; (fb8 <_i2c_m_sync_init_impl+0xc4>)
|
|
f66: 189b adds r3, r3, r2
|
|
f68: 69db ldr r3, [r3, #28]
|
|
}
|
|
|
|
static inline void hri_sercomi2cm_write_CTRLB_reg(const void *const hw, hri_sercomi2cm_ctrlb_reg_t data)
|
|
{
|
|
SERCOM_CRITICAL_SECTION_ENTER();
|
|
((Sercom *)hw)->I2CM.CTRLB.reg = data;
|
|
f6a: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
f6c: 69e3 ldr r3, [r4, #28]
|
|
f6e: 075b lsls r3, r3, #29
|
|
f70: d4fc bmi.n f6c <_i2c_m_sync_init_impl+0x78>
|
|
hri_sercomi2cm_write_BAUD_reg(hw, _i2cms[i].baud);
|
|
f72: 0042 lsls r2, r0, #1
|
|
f74: 1812 adds r2, r2, r0
|
|
f76: 00d1 lsls r1, r2, #3
|
|
f78: 4b0f ldr r3, [pc, #60] ; (fb8 <_i2c_m_sync_init_impl+0xc4>)
|
|
f7a: 185b adds r3, r3, r1
|
|
}
|
|
|
|
static inline void hri_sercomi2cm_write_BAUD_reg(const void *const hw, hri_sercomi2cm_baud_reg_t data)
|
|
{
|
|
SERCOM_CRITICAL_SECTION_ENTER();
|
|
((Sercom *)hw)->I2CM.BAUD.reg = data;
|
|
f7c: 6a1a ldr r2, [r3, #32]
|
|
f7e: 60e2 str r2, [r4, #12]
|
|
|
|
service->mode = (_i2cms[i].ctrl_a & SERCOM_I2CM_CTRLA_SPEED_Msk) >> SERCOM_I2CM_CTRLA_SPEED_Pos;
|
|
f80: 7eda ldrb r2, [r3, #27]
|
|
f82: 2303 movs r3, #3
|
|
f84: 401a ands r2, r3
|
|
f86: 81aa strh r2, [r5, #12]
|
|
hri_sercomi2cm_write_ADDR_HS_bit(hw, service->mode < I2C_HS ? 0 : 1);
|
|
f88: 3b02 subs r3, #2
|
|
f8a: 4293 cmp r3, r2
|
|
f8c: 419b sbcs r3, r3
|
|
f8e: 425b negs r3, r3
|
|
|
|
static inline void hri_sercomi2cm_write_ADDR_HS_bit(const void *const hw, bool value)
|
|
{
|
|
uint32_t tmp;
|
|
SERCOM_CRITICAL_SECTION_ENTER();
|
|
tmp = ((Sercom *)hw)->I2CM.ADDR.reg;
|
|
f90: 6a62 ldr r2, [r4, #36] ; 0x24
|
|
tmp &= ~SERCOM_I2CM_ADDR_HS;
|
|
f92: 490a ldr r1, [pc, #40] ; (fbc <_i2c_m_sync_init_impl+0xc8>)
|
|
f94: 400a ands r2, r1
|
|
tmp |= value << SERCOM_I2CM_ADDR_HS_Pos;
|
|
f96: 039b lsls r3, r3, #14
|
|
f98: 4313 orrs r3, r2
|
|
((Sercom *)hw)->I2CM.ADDR.reg = tmp;
|
|
f9a: 6263 str r3, [r4, #36] ; 0x24
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
f9c: 69e3 ldr r3, [r4, #28]
|
|
f9e: 075b lsls r3, r3, #29
|
|
fa0: d4fc bmi.n f9c <_i2c_m_sync_init_impl+0xa8>
|
|
|
|
service->trise = _i2cms[i].trise;
|
|
fa2: 0043 lsls r3, r0, #1
|
|
fa4: 1818 adds r0, r3, r0
|
|
fa6: 00c2 lsls r2, r0, #3
|
|
fa8: 4b03 ldr r3, [pc, #12] ; (fb8 <_i2c_m_sync_init_impl+0xc4>)
|
|
faa: 189b adds r3, r3, r2
|
|
fac: 8cdb ldrh r3, [r3, #38] ; 0x26
|
|
fae: 81eb strh r3, [r5, #14]
|
|
|
|
return ERR_NONE;
|
|
}
|
|
fb0: 2000 movs r0, #0
|
|
fb2: bd70 pop {r4, r5, r6, pc}
|
|
fb4: 00000ead .word 0x00000ead
|
|
fb8: 0000207c .word 0x0000207c
|
|
fbc: ffffbfff .word 0xffffbfff
|
|
|
|
00000fc0 <_sercom_i2c_sync_send_address>:
|
|
{
|
|
fc0: b570 push {r4, r5, r6, lr}
|
|
fc2: 0005 movs r5, r0
|
|
void * hw = i2c_dev->hw;
|
|
fc4: 6904 ldr r4, [r0, #16]
|
|
tmp = ((Sercom *)hw)->I2CM.CTRLA.reg;
|
|
fc6: 6823 ldr r3, [r4, #0]
|
|
tmp = (tmp & SERCOM_I2CM_CTRLA_SCLSM) >> SERCOM_I2CM_CTRLA_SCLSM_Pos;
|
|
fc8: 0edb lsrs r3, r3, #27
|
|
fca: 2601 movs r6, #1
|
|
fcc: 401e ands r6, r3
|
|
ASSERT(i2c_dev);
|
|
fce: 1e43 subs r3, r0, #1
|
|
fd0: 4198 sbcs r0, r3
|
|
fd2: b2c0 uxtb r0, r0
|
|
fd4: 4a8e ldr r2, [pc, #568] ; (1210 <_sercom_i2c_sync_send_address+0x250>)
|
|
fd6: 498f ldr r1, [pc, #572] ; (1214 <_sercom_i2c_sync_send_address+0x254>)
|
|
fd8: 4b8f ldr r3, [pc, #572] ; (1218 <_sercom_i2c_sync_send_address+0x258>)
|
|
fda: 4798 blx r3
|
|
if (msg->len == 1 && sclsm) {
|
|
fdc: 686b ldr r3, [r5, #4]
|
|
fde: 2b01 cmp r3, #1
|
|
fe0: d04d beq.n 107e <_sercom_i2c_sync_send_address+0xbe>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg &= ~SERCOM_I2CM_CTRLB_ACKACT;
|
|
fe2: 6863 ldr r3, [r4, #4]
|
|
fe4: 4a8d ldr r2, [pc, #564] ; (121c <_sercom_i2c_sync_send_address+0x25c>)
|
|
fe6: 4013 ands r3, r2
|
|
fe8: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
fea: 69e3 ldr r3, [r4, #28]
|
|
fec: 075b lsls r3, r3, #29
|
|
fee: d4fc bmi.n fea <_sercom_i2c_sync_send_address+0x2a>
|
|
if (msg->addr & I2C_M_TEN) {
|
|
ff0: 882b ldrh r3, [r5, #0]
|
|
ff2: 055a lsls r2, r3, #21
|
|
ff4: d54e bpl.n 1094 <_sercom_i2c_sync_send_address+0xd4>
|
|
if (msg->flags & I2C_M_RD) {
|
|
ff6: 886a ldrh r2, [r5, #2]
|
|
ff8: 07d2 lsls r2, r2, #31
|
|
ffa: d504 bpl.n 1006 <_sercom_i2c_sync_send_address+0x46>
|
|
msg->flags |= I2C_M_TEN;
|
|
ffc: 886a ldrh r2, [r5, #2]
|
|
ffe: 2180 movs r1, #128 ; 0x80
|
|
1000: 00c9 lsls r1, r1, #3
|
|
1002: 430a orrs r2, r1
|
|
1004: 806a strh r2, [r5, #2]
|
|
((msg->addr & TEN_ADDR_MASK) << 1) | SERCOM_I2CM_ADDR_TENBITEN
|
|
1006: 005b lsls r3, r3, #1
|
|
| (hri_sercomi2cm_read_ADDR_reg(hw) & SERCOM_I2CM_ADDR_HS));
|
|
1008: 4a85 ldr r2, [pc, #532] ; (1220 <_sercom_i2c_sync_send_address+0x260>)
|
|
100a: 401a ands r2, r3
|
|
100c: 69e3 ldr r3, [r4, #28]
|
|
100e: 075b lsls r3, r3, #29
|
|
1010: d4fc bmi.n 100c <_sercom_i2c_sync_send_address+0x4c>
|
|
}
|
|
|
|
static inline hri_sercomi2cm_addr_reg_t hri_sercomi2cm_read_ADDR_reg(const void *const hw)
|
|
{
|
|
hri_sercomi2cm_wait_for_sync(hw, SERCOM_I2CM_SYNCBUSY_SYSOP);
|
|
return ((Sercom *)hw)->I2CM.ADDR.reg;
|
|
1012: 6a63 ldr r3, [r4, #36] ; 0x24
|
|
1014: 2180 movs r1, #128 ; 0x80
|
|
1016: 01c9 lsls r1, r1, #7
|
|
1018: 400b ands r3, r1
|
|
101a: 4313 orrs r3, r2
|
|
hri_sercomi2cm_write_ADDR_reg(hw,
|
|
101c: 2280 movs r2, #128 ; 0x80
|
|
101e: 0212 lsls r2, r2, #8
|
|
1020: 4313 orrs r3, r2
|
|
((Sercom *)hw)->I2CM.ADDR.reg = data;
|
|
1022: 6263 str r3, [r4, #36] ; 0x24
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1024: 69e3 ldr r3, [r4, #28]
|
|
1026: 075b lsls r3, r3, #29
|
|
1028: d4fc bmi.n 1024 <_sercom_i2c_sync_send_address+0x64>
|
|
void * hw = i2c_dev->hw;
|
|
102a: 692e ldr r6, [r5, #16]
|
|
uint32_t timeout = 65535;
|
|
102c: 4a7d ldr r2, [pc, #500] ; (1224 <_sercom_i2c_sync_send_address+0x264>)
|
|
return ((Sercom *)hw)->I2CM.INTFLAG.reg;
|
|
102e: 7e33 ldrb r3, [r6, #24]
|
|
1030: b2db uxtb r3, r3
|
|
*flags = hri_sercomi2cm_read_INTFLAG_reg(hw);
|
|
1032: 0018 movs r0, r3
|
|
if (timeout-- == 0) {
|
|
1034: 1e51 subs r1, r2, #1
|
|
1036: 2a00 cmp r2, #0
|
|
1038: d002 beq.n 1040 <_sercom_i2c_sync_send_address+0x80>
|
|
103a: 000a movs r2, r1
|
|
} while (!(*flags & MB_FLAG) && !(*flags & SB_FLAG));
|
|
103c: 079b lsls r3, r3, #30
|
|
103e: d0f6 beq.n 102e <_sercom_i2c_sync_send_address+0x6e>
|
|
tmp = ((Sercom *)hw)->I2CM.CTRLA.reg;
|
|
1040: 6823 ldr r3, [r4, #0]
|
|
tmp = (tmp & SERCOM_I2CM_CTRLA_SCLSM) >> SERCOM_I2CM_CTRLA_SCLSM_Pos;
|
|
1042: 0edb lsrs r3, r3, #27
|
|
1044: 2201 movs r2, #1
|
|
1046: 401a ands r2, r3
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1048: 69e3 ldr r3, [r4, #28]
|
|
104a: 075b lsls r3, r3, #29
|
|
104c: d4fc bmi.n 1048 <_sercom_i2c_sync_send_address+0x88>
|
|
}
|
|
|
|
static inline hri_sercomi2cm_status_reg_t hri_sercomi2cm_read_STATUS_reg(const void *const hw)
|
|
{
|
|
hri_sercomi2cm_wait_for_sync(hw, SERCOM_I2CM_SYNCBUSY_SYSOP);
|
|
return ((Sercom *)hw)->I2CM.STATUS.reg;
|
|
104e: 8b63 ldrh r3, [r4, #26]
|
|
1050: b29b uxth r3, r3
|
|
if (flags & MB_FLAG) {
|
|
1052: 07c1 lsls r1, r0, #31
|
|
1054: d400 bmi.n 1058 <_sercom_i2c_sync_send_address+0x98>
|
|
1056: e08f b.n 1178 <_sercom_i2c_sync_send_address+0x1b8>
|
|
if (status & SERCOM_I2CM_STATUS_ARBLOST) {
|
|
1058: 079a lsls r2, r3, #30
|
|
105a: d52f bpl.n 10bc <_sercom_i2c_sync_send_address+0xfc>
|
|
((Sercom *)hw)->I2CM.INTFLAG.reg = SERCOM_I2CM_INTFLAG_MB;
|
|
105c: 2201 movs r2, #1
|
|
105e: 7622 strb r2, [r4, #24]
|
|
msg->flags |= I2C_M_FAIL;
|
|
1060: 886a ldrh r2, [r5, #2]
|
|
1062: 2180 movs r1, #128 ; 0x80
|
|
1064: 0149 lsls r1, r1, #5
|
|
1066: 430a orrs r2, r1
|
|
1068: 806a strh r2, [r5, #2]
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
106a: 886a ldrh r2, [r5, #2]
|
|
106c: 496e ldr r1, [pc, #440] ; (1228 <_sercom_i2c_sync_send_address+0x268>)
|
|
106e: 400a ands r2, r1
|
|
1070: 806a strh r2, [r5, #2]
|
|
if (status & SERCOM_I2CM_STATUS_BUSERR) {
|
|
1072: 07db lsls r3, r3, #31
|
|
1074: d400 bmi.n 1078 <_sercom_i2c_sync_send_address+0xb8>
|
|
1076: e0c6 b.n 1206 <_sercom_i2c_sync_send_address+0x246>
|
|
return I2C_ERR_BUS;
|
|
1078: 2005 movs r0, #5
|
|
107a: 4240 negs r0, r0
|
|
107c: e0a2 b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
if (msg->len == 1 && sclsm) {
|
|
107e: 2e00 cmp r6, #0
|
|
1080: d0af beq.n fe2 <_sercom_i2c_sync_send_address+0x22>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_ACKACT;
|
|
1082: 6862 ldr r2, [r4, #4]
|
|
1084: 2380 movs r3, #128 ; 0x80
|
|
1086: 02db lsls r3, r3, #11
|
|
1088: 4313 orrs r3, r2
|
|
108a: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
108c: 69e3 ldr r3, [r4, #28]
|
|
108e: 075b lsls r3, r3, #29
|
|
1090: d4fc bmi.n 108c <_sercom_i2c_sync_send_address+0xcc>
|
|
1092: e7ad b.n ff0 <_sercom_i2c_sync_send_address+0x30>
|
|
((msg->addr & SEVEN_ADDR_MASK) << 1) | (msg->flags & I2C_M_RD ? I2C_M_RD : 0x0)
|
|
1094: 005b lsls r3, r3, #1
|
|
1096: 22ff movs r2, #255 ; 0xff
|
|
1098: 4013 ands r3, r2
|
|
109a: 886a ldrh r2, [r5, #2]
|
|
109c: 2101 movs r1, #1
|
|
109e: 400a ands r2, r1
|
|
10a0: 431a orrs r2, r3
|
|
10a2: 69e3 ldr r3, [r4, #28]
|
|
10a4: 075b lsls r3, r3, #29
|
|
10a6: d4fc bmi.n 10a2 <_sercom_i2c_sync_send_address+0xe2>
|
|
return ((Sercom *)hw)->I2CM.ADDR.reg;
|
|
10a8: 6a63 ldr r3, [r4, #36] ; 0x24
|
|
| (hri_sercomi2cm_read_ADDR_reg(hw) & SERCOM_I2CM_ADDR_HS));
|
|
10aa: 2180 movs r1, #128 ; 0x80
|
|
10ac: 01c9 lsls r1, r1, #7
|
|
10ae: 400b ands r3, r1
|
|
hri_sercomi2cm_write_ADDR_reg(hw,
|
|
10b0: 4313 orrs r3, r2
|
|
((Sercom *)hw)->I2CM.ADDR.reg = data;
|
|
10b2: 6263 str r3, [r4, #36] ; 0x24
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
10b4: 69e3 ldr r3, [r4, #28]
|
|
10b6: 075b lsls r3, r3, #29
|
|
10b8: d4fc bmi.n 10b4 <_sercom_i2c_sync_send_address+0xf4>
|
|
10ba: e7b6 b.n 102a <_sercom_i2c_sync_send_address+0x6a>
|
|
if (status & SERCOM_I2CM_STATUS_RXNACK) {
|
|
10bc: 075b lsls r3, r3, #29
|
|
10be: d41b bmi.n 10f8 <_sercom_i2c_sync_send_address+0x138>
|
|
if (msg->flags & I2C_M_TEN) {
|
|
10c0: 886b ldrh r3, [r5, #2]
|
|
10c2: 055b lsls r3, r3, #21
|
|
10c4: d534 bpl.n 1130 <_sercom_i2c_sync_send_address+0x170>
|
|
((((msg->addr & TEN_ADDR_MASK) >> 8) | TEN_ADDR_FRAME) << 1) | I2C_M_RD
|
|
10c6: 882a ldrh r2, [r5, #0]
|
|
10c8: 1212 asrs r2, r2, #8
|
|
10ca: 0052 lsls r2, r2, #1
|
|
| (hri_sercomi2cm_read_ADDR_reg(hw) & SERCOM_I2CM_ADDR_HS));
|
|
10cc: 2306 movs r3, #6
|
|
10ce: 401a ands r2, r3
|
|
10d0: 69e3 ldr r3, [r4, #28]
|
|
10d2: 075b lsls r3, r3, #29
|
|
10d4: d4fc bmi.n 10d0 <_sercom_i2c_sync_send_address+0x110>
|
|
return ((Sercom *)hw)->I2CM.ADDR.reg;
|
|
10d6: 6a63 ldr r3, [r4, #36] ; 0x24
|
|
10d8: 2180 movs r1, #128 ; 0x80
|
|
10da: 01c9 lsls r1, r1, #7
|
|
10dc: 400b ands r3, r1
|
|
10de: 4313 orrs r3, r2
|
|
hri_sercomi2cm_write_ADDR_reg(hw,
|
|
10e0: 22f1 movs r2, #241 ; 0xf1
|
|
10e2: 4313 orrs r3, r2
|
|
((Sercom *)hw)->I2CM.ADDR.reg = data;
|
|
10e4: 6263 str r3, [r4, #36] ; 0x24
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
10e6: 69e3 ldr r3, [r4, #28]
|
|
10e8: 075b lsls r3, r3, #29
|
|
10ea: d4fc bmi.n 10e6 <_sercom_i2c_sync_send_address+0x126>
|
|
msg->flags &= ~I2C_M_TEN;
|
|
10ec: 886b ldrh r3, [r5, #2]
|
|
10ee: 4a4f ldr r2, [pc, #316] ; (122c <_sercom_i2c_sync_send_address+0x26c>)
|
|
10f0: 4013 ands r3, r2
|
|
10f2: 806b strh r3, [r5, #2]
|
|
return I2C_OK;
|
|
10f4: 2000 movs r0, #0
|
|
10f6: e065 b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
if (msg->len > 0) {
|
|
10f8: 686b ldr r3, [r5, #4]
|
|
10fa: 2b00 cmp r3, #0
|
|
10fc: dd04 ble.n 1108 <_sercom_i2c_sync_send_address+0x148>
|
|
msg->flags |= I2C_M_FAIL;
|
|
10fe: 886b ldrh r3, [r5, #2]
|
|
1100: 2280 movs r2, #128 ; 0x80
|
|
1102: 0152 lsls r2, r2, #5
|
|
1104: 4313 orrs r3, r2
|
|
1106: 806b strh r3, [r5, #2]
|
|
if (msg->flags & I2C_M_STOP) {
|
|
1108: 886b ldrh r3, [r5, #2]
|
|
110a: b21b sxth r3, r3
|
|
110c: 2b00 cmp r3, #0
|
|
110e: db06 blt.n 111e <_sercom_i2c_sync_send_address+0x15e>
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
1110: 886b ldrh r3, [r5, #2]
|
|
1112: 4a45 ldr r2, [pc, #276] ; (1228 <_sercom_i2c_sync_send_address+0x268>)
|
|
1114: 4013 ands r3, r2
|
|
1116: 806b strh r3, [r5, #2]
|
|
return I2C_NACK;
|
|
1118: 2002 movs r0, #2
|
|
111a: 4240 negs r0, r0
|
|
111c: e052 b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(mask);
|
|
111e: 6862 ldr r2, [r4, #4]
|
|
1120: 23c0 movs r3, #192 ; 0xc0
|
|
1122: 029b lsls r3, r3, #10
|
|
1124: 4313 orrs r3, r2
|
|
1126: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1128: 69e3 ldr r3, [r4, #28]
|
|
112a: 075b lsls r3, r3, #29
|
|
112c: d4fc bmi.n 1128 <_sercom_i2c_sync_send_address+0x168>
|
|
112e: e7ef b.n 1110 <_sercom_i2c_sync_send_address+0x150>
|
|
if (msg->len == 0) {
|
|
1130: 6868 ldr r0, [r5, #4]
|
|
1132: 2800 cmp r0, #0
|
|
1134: d111 bne.n 115a <_sercom_i2c_sync_send_address+0x19a>
|
|
if (msg->flags & I2C_M_STOP) {
|
|
1136: 886b ldrh r3, [r5, #2]
|
|
1138: b21b sxth r3, r3
|
|
113a: 2b00 cmp r3, #0
|
|
113c: db04 blt.n 1148 <_sercom_i2c_sync_send_address+0x188>
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
113e: 886b ldrh r3, [r5, #2]
|
|
1140: 4a39 ldr r2, [pc, #228] ; (1228 <_sercom_i2c_sync_send_address+0x268>)
|
|
1142: 4013 ands r3, r2
|
|
1144: 806b strh r3, [r5, #2]
|
|
1146: e03d b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(mask);
|
|
1148: 6862 ldr r2, [r4, #4]
|
|
114a: 23c0 movs r3, #192 ; 0xc0
|
|
114c: 029b lsls r3, r3, #10
|
|
114e: 4313 orrs r3, r2
|
|
1150: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1152: 69e3 ldr r3, [r4, #28]
|
|
1154: 075b lsls r3, r3, #29
|
|
1156: d4fc bmi.n 1152 <_sercom_i2c_sync_send_address+0x192>
|
|
1158: e7f1 b.n 113e <_sercom_i2c_sync_send_address+0x17e>
|
|
hri_sercomi2cm_write_DATA_reg(hw, *msg->buffer);
|
|
115a: 68ab ldr r3, [r5, #8]
|
|
115c: 781a ldrb r2, [r3, #0]
|
|
((Sercom *)hw)->I2CM.DATA.reg = data;
|
|
115e: 2328 movs r3, #40 ; 0x28
|
|
1160: 54e2 strb r2, [r4, r3]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1162: 69e3 ldr r3, [r4, #28]
|
|
1164: 075b lsls r3, r3, #29
|
|
1166: d4fc bmi.n 1162 <_sercom_i2c_sync_send_address+0x1a2>
|
|
msg->buffer++;
|
|
1168: 68ab ldr r3, [r5, #8]
|
|
116a: 3301 adds r3, #1
|
|
116c: 60ab str r3, [r5, #8]
|
|
msg->len--;
|
|
116e: 686b ldr r3, [r5, #4]
|
|
1170: 3b01 subs r3, #1
|
|
1172: 606b str r3, [r5, #4]
|
|
return I2C_OK;
|
|
1174: 2000 movs r0, #0
|
|
1176: e025 b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
} else if (flags & SB_FLAG) {
|
|
1178: 0781 lsls r1, r0, #30
|
|
117a: d547 bpl.n 120c <_sercom_i2c_sync_send_address+0x24c>
|
|
if ((msg->len) && !(status & SERCOM_I2CM_STATUS_RXNACK)) {
|
|
117c: 6869 ldr r1, [r5, #4]
|
|
117e: 2900 cmp r1, #0
|
|
1180: d03c beq.n 11fc <_sercom_i2c_sync_send_address+0x23c>
|
|
1182: 075b lsls r3, r3, #29
|
|
1184: d43a bmi.n 11fc <_sercom_i2c_sync_send_address+0x23c>
|
|
msg->len--;
|
|
1186: 3901 subs r1, #1
|
|
1188: 6069 str r1, [r5, #4]
|
|
if ((msg->len == 0 && !sclsm) || (msg->len == 1 && sclsm)) {
|
|
118a: 2900 cmp r1, #0
|
|
118c: d101 bne.n 1192 <_sercom_i2c_sync_send_address+0x1d2>
|
|
118e: 2a00 cmp r2, #0
|
|
1190: d01b beq.n 11ca <_sercom_i2c_sync_send_address+0x20a>
|
|
1192: 2901 cmp r1, #1
|
|
1194: d017 beq.n 11c6 <_sercom_i2c_sync_send_address+0x206>
|
|
if (msg->len == 0) {
|
|
1196: 686b ldr r3, [r5, #4]
|
|
1198: 2b00 cmp r3, #0
|
|
119a: d107 bne.n 11ac <_sercom_i2c_sync_send_address+0x1ec>
|
|
if (msg->flags & I2C_M_STOP) {
|
|
119c: 886b ldrh r3, [r5, #2]
|
|
119e: b21b sxth r3, r3
|
|
11a0: 2b00 cmp r3, #0
|
|
11a2: db1b blt.n 11dc <_sercom_i2c_sync_send_address+0x21c>
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
11a4: 886b ldrh r3, [r5, #2]
|
|
11a6: 4a20 ldr r2, [pc, #128] ; (1228 <_sercom_i2c_sync_send_address+0x268>)
|
|
11a8: 4013 ands r3, r2
|
|
11aa: 806b strh r3, [r5, #2]
|
|
*msg->buffer++ = hri_sercomi2cm_read_DATA_reg(hw);
|
|
11ac: 68aa ldr r2, [r5, #8]
|
|
11ae: 1c53 adds r3, r2, #1
|
|
11b0: 60ab str r3, [r5, #8]
|
|
11b2: 69e3 ldr r3, [r4, #28]
|
|
11b4: 075b lsls r3, r3, #29
|
|
11b6: d4fc bmi.n 11b2 <_sercom_i2c_sync_send_address+0x1f2>
|
|
return ((Sercom *)hw)->I2CM.DATA.reg;
|
|
11b8: 2328 movs r3, #40 ; 0x28
|
|
11ba: 5ce3 ldrb r3, [r4, r3]
|
|
11bc: 7013 strb r3, [r2, #0]
|
|
((Sercom *)hw)->I2CM.INTFLAG.reg = SERCOM_I2CM_INTFLAG_SB;
|
|
11be: 2302 movs r3, #2
|
|
11c0: 7623 strb r3, [r4, #24]
|
|
return I2C_OK;
|
|
11c2: 2000 movs r0, #0
|
|
}
|
|
11c4: bd70 pop {r4, r5, r6, pc}
|
|
if ((msg->len == 0 && !sclsm) || (msg->len == 1 && sclsm)) {
|
|
11c6: 2a00 cmp r2, #0
|
|
11c8: d0e5 beq.n 1196 <_sercom_i2c_sync_send_address+0x1d6>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_ACKACT;
|
|
11ca: 6862 ldr r2, [r4, #4]
|
|
11cc: 2380 movs r3, #128 ; 0x80
|
|
11ce: 02db lsls r3, r3, #11
|
|
11d0: 4313 orrs r3, r2
|
|
11d2: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
11d4: 69e3 ldr r3, [r4, #28]
|
|
11d6: 075b lsls r3, r3, #29
|
|
11d8: d4fc bmi.n 11d4 <_sercom_i2c_sync_send_address+0x214>
|
|
11da: e7dc b.n 1196 <_sercom_i2c_sync_send_address+0x1d6>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg &= ~SERCOM_I2CM_CTRLB_SMEN;
|
|
11dc: 6863 ldr r3, [r4, #4]
|
|
11de: 4a12 ldr r2, [pc, #72] ; (1228 <_sercom_i2c_sync_send_address+0x268>)
|
|
11e0: 4013 ands r3, r2
|
|
11e2: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
11e4: 69e3 ldr r3, [r4, #28]
|
|
11e6: 075b lsls r3, r3, #29
|
|
11e8: d4fc bmi.n 11e4 <_sercom_i2c_sync_send_address+0x224>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(mask);
|
|
11ea: 6862 ldr r2, [r4, #4]
|
|
11ec: 23c0 movs r3, #192 ; 0xc0
|
|
11ee: 029b lsls r3, r3, #10
|
|
11f0: 4313 orrs r3, r2
|
|
11f2: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
11f4: 69e3 ldr r3, [r4, #28]
|
|
11f6: 075b lsls r3, r3, #29
|
|
11f8: d4fc bmi.n 11f4 <_sercom_i2c_sync_send_address+0x234>
|
|
11fa: e7d3 b.n 11a4 <_sercom_i2c_sync_send_address+0x1e4>
|
|
((Sercom *)hw)->I2CM.INTFLAG.reg = SERCOM_I2CM_INTFLAG_SB;
|
|
11fc: 2302 movs r3, #2
|
|
11fe: 7623 strb r3, [r4, #24]
|
|
return I2C_NACK;
|
|
1200: 2002 movs r0, #2
|
|
1202: 4240 negs r0, r0
|
|
1204: e7de b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
return I2C_ERR_BAD_ADDRESS;
|
|
1206: 2004 movs r0, #4
|
|
1208: 4240 negs r0, r0
|
|
120a: e7db b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
return I2C_OK;
|
|
120c: 2000 movs r0, #0
|
|
return _sercom_i2c_sync_analyse_flags(hw, flags, msg);
|
|
120e: e7d9 b.n 11c4 <_sercom_i2c_sync_send_address+0x204>
|
|
1210: 00000594 .word 0x00000594
|
|
1214: 000020cc .word 0x000020cc
|
|
1218: 00000a69 .word 0x00000a69
|
|
121c: fffbffff .word 0xfffbffff
|
|
1220: 000007fe .word 0x000007fe
|
|
1224: 0000ffff .word 0x0000ffff
|
|
1228: fffffeff .word 0xfffffeff
|
|
122c: fffffbff .word 0xfffffbff
|
|
|
|
00001230 <_i2c_m_sync_init>:
|
|
{
|
|
1230: b570 push {r4, r5, r6, lr}
|
|
1232: 0004 movs r4, r0
|
|
1234: 000d movs r5, r1
|
|
ASSERT(i2c_dev);
|
|
1236: 1e43 subs r3, r0, #1
|
|
1238: 4198 sbcs r0, r3
|
|
123a: b2c0 uxtb r0, r0
|
|
123c: 4a04 ldr r2, [pc, #16] ; (1250 <_i2c_m_sync_init+0x20>)
|
|
123e: 4905 ldr r1, [pc, #20] ; (1254 <_i2c_m_sync_init+0x24>)
|
|
1240: 4b05 ldr r3, [pc, #20] ; (1258 <_i2c_m_sync_init+0x28>)
|
|
1242: 4798 blx r3
|
|
i2c_dev->hw = hw;
|
|
1244: 6125 str r5, [r4, #16]
|
|
return _i2c_m_sync_init_impl(&i2c_dev->service, hw);
|
|
1246: 0029 movs r1, r5
|
|
1248: 0020 movs r0, r4
|
|
124a: 4b04 ldr r3, [pc, #16] ; (125c <_i2c_m_sync_init+0x2c>)
|
|
124c: 4798 blx r3
|
|
}
|
|
124e: bd70 pop {r4, r5, r6, pc}
|
|
1250: 00000507 .word 0x00000507
|
|
1254: 000020cc .word 0x000020cc
|
|
1258: 00000a69 .word 0x00000a69
|
|
125c: 00000ef5 .word 0x00000ef5
|
|
|
|
00001260 <_i2c_m_sync_enable>:
|
|
{
|
|
1260: b570 push {r4, r5, r6, lr}
|
|
1262: 0004 movs r4, r0
|
|
ASSERT(i2c_dev);
|
|
1264: 4d19 ldr r5, [pc, #100] ; (12cc <_i2c_m_sync_enable+0x6c>)
|
|
1266: 1e43 subs r3, r0, #1
|
|
1268: 4198 sbcs r0, r3
|
|
126a: b2c0 uxtb r0, r0
|
|
126c: 4a18 ldr r2, [pc, #96] ; (12d0 <_i2c_m_sync_enable+0x70>)
|
|
126e: 0029 movs r1, r5
|
|
1270: 4e18 ldr r6, [pc, #96] ; (12d4 <_i2c_m_sync_enable+0x74>)
|
|
1272: 47b0 blx r6
|
|
return _i2c_m_enable_implementation(i2c_dev->hw);
|
|
1274: 6924 ldr r4, [r4, #16]
|
|
ASSERT(hw);
|
|
1276: 0020 movs r0, r4
|
|
1278: 1e43 subs r3, r0, #1
|
|
127a: 4198 sbcs r0, r3
|
|
127c: b2c0 uxtb r0, r0
|
|
127e: 4a16 ldr r2, [pc, #88] ; (12d8 <_i2c_m_sync_enable+0x78>)
|
|
1280: 0029 movs r1, r5
|
|
1282: 47b0 blx r6
|
|
((Sercom *)hw)->I2CM.CTRLA.reg |= SERCOM_I2CM_CTRLA_ENABLE;
|
|
1284: 6823 ldr r3, [r4, #0]
|
|
1286: 2202 movs r2, #2
|
|
1288: 4313 orrs r3, r2
|
|
128a: 6023 str r3, [r4, #0]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
128c: 69e3 ldr r3, [r4, #28]
|
|
128e: 079b lsls r3, r3, #30
|
|
1290: d1fc bne.n 128c <_i2c_m_sync_enable+0x2c>
|
|
1292: 2004 movs r0, #4
|
|
1294: 4911 ldr r1, [pc, #68] ; (12dc <_i2c_m_sync_enable+0x7c>)
|
|
1296: 69e3 ldr r3, [r4, #28]
|
|
1298: 075b lsls r3, r3, #29
|
|
129a: d4fc bmi.n 1296 <_i2c_m_sync_enable+0x36>
|
|
return (((Sercom *)hw)->I2CM.STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE_Msk) >> SERCOM_I2CM_STATUS_BUSSTATE_Pos;
|
|
129c: 8b62 ldrh r2, [r4, #26]
|
|
129e: 0912 lsrs r2, r2, #4
|
|
12a0: 2303 movs r3, #3
|
|
12a2: 4013 ands r3, r2
|
|
while (hri_sercomi2cm_read_STATUS_BUSSTATE_bf(hw) != I2C_IDLE) {
|
|
12a4: 2b01 cmp r3, #1
|
|
12a6: d00b beq.n 12c0 <_i2c_m_sync_enable+0x60>
|
|
timeout--;
|
|
12a8: 3901 subs r1, #1
|
|
if (timeout <= 0) {
|
|
12aa: 2900 cmp r1, #0
|
|
12ac: dcf3 bgt.n 1296 <_i2c_m_sync_enable+0x36>
|
|
if (--timeout_attempt)
|
|
12ae: 3801 subs r0, #1
|
|
12b0: 2800 cmp r0, #0
|
|
12b2: d007 beq.n 12c4 <_i2c_m_sync_enable+0x64>
|
|
}
|
|
|
|
static inline void hri_sercomi2cm_clear_STATUS_reg(const void *const hw, hri_sercomi2cm_status_reg_t mask)
|
|
{
|
|
SERCOM_CRITICAL_SECTION_ENTER();
|
|
((Sercom *)hw)->I2CM.STATUS.reg = mask;
|
|
12b4: 2310 movs r3, #16
|
|
12b6: 8363 strh r3, [r4, #26]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
12b8: 69e3 ldr r3, [r4, #28]
|
|
12ba: 075b lsls r3, r3, #29
|
|
12bc: d4fc bmi.n 12b8 <_i2c_m_sync_enable+0x58>
|
|
12be: e7e9 b.n 1294 <_i2c_m_sync_enable+0x34>
|
|
return ERR_NONE;
|
|
12c0: 2000 movs r0, #0
|
|
}
|
|
12c2: bd70 pop {r4, r5, r6, pc}
|
|
return I2C_ERR_BUSY;
|
|
12c4: 2006 movs r0, #6
|
|
12c6: 4240 negs r0, r0
|
|
return _i2c_m_enable_implementation(i2c_dev->hw);
|
|
12c8: e7fb b.n 12c2 <_i2c_m_sync_enable+0x62>
|
|
12ca: 46c0 nop ; (mov r8, r8)
|
|
12cc: 000020cc .word 0x000020cc
|
|
12d0: 00000524 .word 0x00000524
|
|
12d4: 00000a69 .word 0x00000a69
|
|
12d8: 000005f4 .word 0x000005f4
|
|
12dc: 0000ffff .word 0x0000ffff
|
|
|
|
000012e0 <_i2c_m_sync_transfer>:
|
|
{
|
|
12e0: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
12e2: 0005 movs r5, r0
|
|
12e4: 000e movs r6, r1
|
|
void * hw = i2c_dev->hw;
|
|
12e6: 6904 ldr r4, [r0, #16]
|
|
ASSERT(i2c_dev);
|
|
12e8: 1e43 subs r3, r0, #1
|
|
12ea: 4198 sbcs r0, r3
|
|
12ec: b2c0 uxtb r0, r0
|
|
12ee: 4a93 ldr r2, [pc, #588] ; (153c <_i2c_m_sync_transfer+0x25c>)
|
|
12f0: 4993 ldr r1, [pc, #588] ; (1540 <_i2c_m_sync_transfer+0x260>)
|
|
12f2: 4f94 ldr r7, [pc, #592] ; (1544 <_i2c_m_sync_transfer+0x264>)
|
|
12f4: 47b8 blx r7
|
|
ASSERT(i2c_dev->hw);
|
|
12f6: 6928 ldr r0, [r5, #16]
|
|
12f8: 1e43 subs r3, r0, #1
|
|
12fa: 4198 sbcs r0, r3
|
|
12fc: b2c0 uxtb r0, r0
|
|
12fe: 22b8 movs r2, #184 ; 0xb8
|
|
1300: 00d2 lsls r2, r2, #3
|
|
1302: 498f ldr r1, [pc, #572] ; (1540 <_i2c_m_sync_transfer+0x260>)
|
|
1304: 47b8 blx r7
|
|
ASSERT(msg);
|
|
1306: 0030 movs r0, r6
|
|
1308: 1e43 subs r3, r0, #1
|
|
130a: 4198 sbcs r0, r3
|
|
130c: b2c0 uxtb r0, r0
|
|
130e: 4a8e ldr r2, [pc, #568] ; (1548 <_i2c_m_sync_transfer+0x268>)
|
|
1310: 498b ldr r1, [pc, #556] ; (1540 <_i2c_m_sync_transfer+0x260>)
|
|
1312: 47b8 blx r7
|
|
if (i2c_dev->service.msg.flags & I2C_M_BUSY) {
|
|
1314: 886b ldrh r3, [r5, #2]
|
|
1316: 05db lsls r3, r3, #23
|
|
1318: d500 bpl.n 131c <_i2c_m_sync_transfer+0x3c>
|
|
131a: e10b b.n 1534 <_i2c_m_sync_transfer+0x254>
|
|
msg->flags |= I2C_M_BUSY;
|
|
131c: 8872 ldrh r2, [r6, #2]
|
|
131e: 2380 movs r3, #128 ; 0x80
|
|
1320: 005b lsls r3, r3, #1
|
|
1322: 469c mov ip, r3
|
|
1324: 431a orrs r2, r3
|
|
1326: 8072 strh r2, [r6, #2]
|
|
i2c_dev->service.msg = *msg;
|
|
1328: 002a movs r2, r5
|
|
132a: 0031 movs r1, r6
|
|
132c: c989 ldmia r1!, {r0, r3, r7}
|
|
132e: c289 stmia r2!, {r0, r3, r7}
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_SMEN;
|
|
1330: 6862 ldr r2, [r4, #4]
|
|
1332: 4663 mov r3, ip
|
|
1334: 4313 orrs r3, r2
|
|
1336: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1338: 69e3 ldr r3, [r4, #28]
|
|
133a: 075b lsls r3, r3, #29
|
|
133c: d4fc bmi.n 1338 <_i2c_m_sync_transfer+0x58>
|
|
ret = _sercom_i2c_sync_send_address(i2c_dev);
|
|
133e: 0028 movs r0, r5
|
|
1340: 4b82 ldr r3, [pc, #520] ; (154c <_i2c_m_sync_transfer+0x26c>)
|
|
1342: 4798 blx r3
|
|
if (ret) {
|
|
1344: 2800 cmp r0, #0
|
|
1346: d100 bne.n 134a <_i2c_m_sync_transfer+0x6a>
|
|
1348: e09d b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
i2c_dev->service.msg.flags &= ~I2C_M_BUSY;
|
|
134a: 886b ldrh r3, [r5, #2]
|
|
134c: 4a80 ldr r2, [pc, #512] ; (1550 <_i2c_m_sync_transfer+0x270>)
|
|
134e: 4013 ands r3, r2
|
|
1350: 806b strh r3, [r5, #2]
|
|
}
|
|
1352: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
return I2C_ERR_BUS;
|
|
1354: 2005 movs r0, #5
|
|
1356: 4240 negs r0, r0
|
|
1358: e0a6 b.n 14a8 <_i2c_m_sync_transfer+0x1c8>
|
|
if (msg->flags & I2C_M_STOP) {
|
|
135a: 8873 ldrh r3, [r6, #2]
|
|
135c: b21b sxth r3, r3
|
|
135e: 2b00 cmp r3, #0
|
|
1360: db04 blt.n 136c <_i2c_m_sync_transfer+0x8c>
|
|
i2c_dev->service.msg.flags &= ~I2C_M_BUSY;
|
|
1362: 886b ldrh r3, [r5, #2]
|
|
1364: 4a7a ldr r2, [pc, #488] ; (1550 <_i2c_m_sync_transfer+0x270>)
|
|
1366: 4013 ands r3, r2
|
|
1368: 806b strh r3, [r5, #2]
|
|
return ret;
|
|
136a: e7f2 b.n 1352 <_i2c_m_sync_transfer+0x72>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(mask);
|
|
136c: 6862 ldr r2, [r4, #4]
|
|
136e: 23c0 movs r3, #192 ; 0xc0
|
|
1370: 029b lsls r3, r3, #10
|
|
1372: 4313 orrs r3, r2
|
|
1374: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1376: 69e3 ldr r3, [r4, #28]
|
|
1378: 075b lsls r3, r3, #29
|
|
137a: d4fc bmi.n 1376 <_i2c_m_sync_transfer+0x96>
|
|
137c: e7f1 b.n 1362 <_i2c_m_sync_transfer+0x82>
|
|
if (status & SERCOM_I2CM_STATUS_RXNACK) {
|
|
137e: 0753 lsls r3, r2, #29
|
|
1380: d41b bmi.n 13ba <_i2c_m_sync_transfer+0xda>
|
|
if (msg->flags & I2C_M_TEN) {
|
|
1382: 886b ldrh r3, [r5, #2]
|
|
1384: 055b lsls r3, r3, #21
|
|
1386: d534 bpl.n 13f2 <_i2c_m_sync_transfer+0x112>
|
|
((((msg->addr & TEN_ADDR_MASK) >> 8) | TEN_ADDR_FRAME) << 1) | I2C_M_RD
|
|
1388: 882a ldrh r2, [r5, #0]
|
|
138a: 1212 asrs r2, r2, #8
|
|
138c: 0052 lsls r2, r2, #1
|
|
| (hri_sercomi2cm_read_ADDR_reg(hw) & SERCOM_I2CM_ADDR_HS));
|
|
138e: 2306 movs r3, #6
|
|
1390: 401a ands r2, r3
|
|
1392: 69e3 ldr r3, [r4, #28]
|
|
1394: 075b lsls r3, r3, #29
|
|
1396: d4fc bmi.n 1392 <_i2c_m_sync_transfer+0xb2>
|
|
return ((Sercom *)hw)->I2CM.ADDR.reg;
|
|
1398: 6a63 ldr r3, [r4, #36] ; 0x24
|
|
139a: 2180 movs r1, #128 ; 0x80
|
|
139c: 01c9 lsls r1, r1, #7
|
|
139e: 400b ands r3, r1
|
|
13a0: 4313 orrs r3, r2
|
|
hri_sercomi2cm_write_ADDR_reg(hw,
|
|
13a2: 22f1 movs r2, #241 ; 0xf1
|
|
13a4: 4313 orrs r3, r2
|
|
((Sercom *)hw)->I2CM.ADDR.reg = data;
|
|
13a6: 6263 str r3, [r4, #36] ; 0x24
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
13a8: 69e3 ldr r3, [r4, #28]
|
|
13aa: 075b lsls r3, r3, #29
|
|
13ac: d4fc bmi.n 13a8 <_i2c_m_sync_transfer+0xc8>
|
|
msg->flags &= ~I2C_M_TEN;
|
|
13ae: 886b ldrh r3, [r5, #2]
|
|
13b0: 4a68 ldr r2, [pc, #416] ; (1554 <_i2c_m_sync_transfer+0x274>)
|
|
13b2: 4013 ands r3, r2
|
|
13b4: 806b strh r3, [r5, #2]
|
|
return I2C_OK;
|
|
13b6: 2000 movs r0, #0
|
|
13b8: e065 b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
if (msg->len > 0) {
|
|
13ba: 686b ldr r3, [r5, #4]
|
|
13bc: 2b00 cmp r3, #0
|
|
13be: dd04 ble.n 13ca <_i2c_m_sync_transfer+0xea>
|
|
msg->flags |= I2C_M_FAIL;
|
|
13c0: 886b ldrh r3, [r5, #2]
|
|
13c2: 2280 movs r2, #128 ; 0x80
|
|
13c4: 0152 lsls r2, r2, #5
|
|
13c6: 4313 orrs r3, r2
|
|
13c8: 806b strh r3, [r5, #2]
|
|
if (msg->flags & I2C_M_STOP) {
|
|
13ca: 886b ldrh r3, [r5, #2]
|
|
13cc: b21b sxth r3, r3
|
|
13ce: 2b00 cmp r3, #0
|
|
13d0: db06 blt.n 13e0 <_i2c_m_sync_transfer+0x100>
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
13d2: 886b ldrh r3, [r5, #2]
|
|
13d4: 4a5e ldr r2, [pc, #376] ; (1550 <_i2c_m_sync_transfer+0x270>)
|
|
13d6: 4013 ands r3, r2
|
|
13d8: 806b strh r3, [r5, #2]
|
|
return I2C_NACK;
|
|
13da: 2002 movs r0, #2
|
|
13dc: 4240 negs r0, r0
|
|
13de: e052 b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(mask);
|
|
13e0: 6862 ldr r2, [r4, #4]
|
|
13e2: 23c0 movs r3, #192 ; 0xc0
|
|
13e4: 029b lsls r3, r3, #10
|
|
13e6: 4313 orrs r3, r2
|
|
13e8: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
13ea: 69e3 ldr r3, [r4, #28]
|
|
13ec: 075b lsls r3, r3, #29
|
|
13ee: d4fc bmi.n 13ea <_i2c_m_sync_transfer+0x10a>
|
|
13f0: e7ef b.n 13d2 <_i2c_m_sync_transfer+0xf2>
|
|
if (msg->len == 0) {
|
|
13f2: 6868 ldr r0, [r5, #4]
|
|
13f4: 2800 cmp r0, #0
|
|
13f6: d111 bne.n 141c <_i2c_m_sync_transfer+0x13c>
|
|
if (msg->flags & I2C_M_STOP) {
|
|
13f8: 886b ldrh r3, [r5, #2]
|
|
13fa: b21b sxth r3, r3
|
|
13fc: 2b00 cmp r3, #0
|
|
13fe: db04 blt.n 140a <_i2c_m_sync_transfer+0x12a>
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
1400: 886b ldrh r3, [r5, #2]
|
|
1402: 4a53 ldr r2, [pc, #332] ; (1550 <_i2c_m_sync_transfer+0x270>)
|
|
1404: 4013 ands r3, r2
|
|
1406: 806b strh r3, [r5, #2]
|
|
1408: e03d b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(mask);
|
|
140a: 6862 ldr r2, [r4, #4]
|
|
140c: 23c0 movs r3, #192 ; 0xc0
|
|
140e: 029b lsls r3, r3, #10
|
|
1410: 4313 orrs r3, r2
|
|
1412: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1414: 69e3 ldr r3, [r4, #28]
|
|
1416: 075b lsls r3, r3, #29
|
|
1418: d4fc bmi.n 1414 <_i2c_m_sync_transfer+0x134>
|
|
141a: e7f1 b.n 1400 <_i2c_m_sync_transfer+0x120>
|
|
hri_sercomi2cm_write_DATA_reg(hw, *msg->buffer);
|
|
141c: 68ab ldr r3, [r5, #8]
|
|
141e: 781a ldrb r2, [r3, #0]
|
|
((Sercom *)hw)->I2CM.DATA.reg = data;
|
|
1420: 2328 movs r3, #40 ; 0x28
|
|
1422: 54e2 strb r2, [r4, r3]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1424: 69e3 ldr r3, [r4, #28]
|
|
1426: 075b lsls r3, r3, #29
|
|
1428: d4fc bmi.n 1424 <_i2c_m_sync_transfer+0x144>
|
|
msg->buffer++;
|
|
142a: 68ab ldr r3, [r5, #8]
|
|
142c: 3301 adds r3, #1
|
|
142e: 60ab str r3, [r5, #8]
|
|
msg->len--;
|
|
1430: 686b ldr r3, [r5, #4]
|
|
1432: 3b01 subs r3, #1
|
|
1434: 606b str r3, [r5, #4]
|
|
return I2C_OK;
|
|
1436: 2000 movs r0, #0
|
|
1438: e025 b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
} else if (flags & SB_FLAG) {
|
|
143a: 07bb lsls r3, r7, #30
|
|
143c: d578 bpl.n 1530 <_i2c_m_sync_transfer+0x250>
|
|
if ((msg->len) && !(status & SERCOM_I2CM_STATUS_RXNACK)) {
|
|
143e: 686b ldr r3, [r5, #4]
|
|
1440: 2b00 cmp r3, #0
|
|
1442: d06d beq.n 1520 <_i2c_m_sync_transfer+0x240>
|
|
1444: 0752 lsls r2, r2, #29
|
|
1446: d46b bmi.n 1520 <_i2c_m_sync_transfer+0x240>
|
|
msg->len--;
|
|
1448: 3b01 subs r3, #1
|
|
144a: 606b str r3, [r5, #4]
|
|
if ((msg->len == 0 && !sclsm) || (msg->len == 1 && sclsm)) {
|
|
144c: 2b00 cmp r3, #0
|
|
144e: d101 bne.n 1454 <_i2c_m_sync_transfer+0x174>
|
|
1450: 2900 cmp r1, #0
|
|
1452: d04c beq.n 14ee <_i2c_m_sync_transfer+0x20e>
|
|
1454: 2b01 cmp r3, #1
|
|
1456: d048 beq.n 14ea <_i2c_m_sync_transfer+0x20a>
|
|
if (msg->len == 0) {
|
|
1458: 686b ldr r3, [r5, #4]
|
|
145a: 2b00 cmp r3, #0
|
|
145c: d107 bne.n 146e <_i2c_m_sync_transfer+0x18e>
|
|
if (msg->flags & I2C_M_STOP) {
|
|
145e: 886b ldrh r3, [r5, #2]
|
|
1460: b21b sxth r3, r3
|
|
1462: 2b00 cmp r3, #0
|
|
1464: db4c blt.n 1500 <_i2c_m_sync_transfer+0x220>
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
1466: 886b ldrh r3, [r5, #2]
|
|
1468: 4a39 ldr r2, [pc, #228] ; (1550 <_i2c_m_sync_transfer+0x270>)
|
|
146a: 4013 ands r3, r2
|
|
146c: 806b strh r3, [r5, #2]
|
|
*msg->buffer++ = hri_sercomi2cm_read_DATA_reg(hw);
|
|
146e: 68aa ldr r2, [r5, #8]
|
|
1470: 1c53 adds r3, r2, #1
|
|
1472: 60ab str r3, [r5, #8]
|
|
1474: 69e3 ldr r3, [r4, #28]
|
|
1476: 075b lsls r3, r3, #29
|
|
1478: d4fc bmi.n 1474 <_i2c_m_sync_transfer+0x194>
|
|
return ((Sercom *)hw)->I2CM.DATA.reg;
|
|
147a: 2328 movs r3, #40 ; 0x28
|
|
147c: 5ce3 ldrb r3, [r4, r3]
|
|
147e: 7013 strb r3, [r2, #0]
|
|
((Sercom *)hw)->I2CM.INTFLAG.reg = SERCOM_I2CM_INTFLAG_SB;
|
|
1480: 2302 movs r3, #2
|
|
1482: 7623 strb r3, [r4, #24]
|
|
return I2C_OK;
|
|
1484: 2000 movs r0, #0
|
|
while (i2c_dev->service.msg.flags & I2C_M_BUSY) {
|
|
1486: 886b ldrh r3, [r5, #2]
|
|
1488: 05db lsls r3, r3, #23
|
|
148a: d400 bmi.n 148e <_i2c_m_sync_transfer+0x1ae>
|
|
148c: e761 b.n 1352 <_i2c_m_sync_transfer+0x72>
|
|
void * hw = i2c_dev->hw;
|
|
148e: 6928 ldr r0, [r5, #16]
|
|
uint32_t timeout = 65535;
|
|
1490: 4a31 ldr r2, [pc, #196] ; (1558 <_i2c_m_sync_transfer+0x278>)
|
|
return ((Sercom *)hw)->I2CM.INTFLAG.reg;
|
|
1492: 7e03 ldrb r3, [r0, #24]
|
|
1494: b2db uxtb r3, r3
|
|
*flags = hri_sercomi2cm_read_INTFLAG_reg(hw);
|
|
1496: 001f movs r7, r3
|
|
if (timeout-- == 0) {
|
|
1498: 1e51 subs r1, r2, #1
|
|
149a: 2a00 cmp r2, #0
|
|
149c: d100 bne.n 14a0 <_i2c_m_sync_transfer+0x1c0>
|
|
149e: e759 b.n 1354 <_i2c_m_sync_transfer+0x74>
|
|
14a0: 000a movs r2, r1
|
|
} while (!(*flags & MB_FLAG) && !(*flags & SB_FLAG));
|
|
14a2: 079b lsls r3, r3, #30
|
|
14a4: d0f5 beq.n 1492 <_i2c_m_sync_transfer+0x1b2>
|
|
return I2C_OK;
|
|
14a6: 2000 movs r0, #0
|
|
if (ret) {
|
|
14a8: 2800 cmp r0, #0
|
|
14aa: d000 beq.n 14ae <_i2c_m_sync_transfer+0x1ce>
|
|
14ac: e755 b.n 135a <_i2c_m_sync_transfer+0x7a>
|
|
tmp = ((Sercom *)hw)->I2CM.CTRLA.reg;
|
|
14ae: 6823 ldr r3, [r4, #0]
|
|
tmp = (tmp & SERCOM_I2CM_CTRLA_SCLSM) >> SERCOM_I2CM_CTRLA_SCLSM_Pos;
|
|
14b0: 0edb lsrs r3, r3, #27
|
|
14b2: 2101 movs r1, #1
|
|
14b4: 4019 ands r1, r3
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
14b6: 69e3 ldr r3, [r4, #28]
|
|
14b8: 075b lsls r3, r3, #29
|
|
14ba: d4fc bmi.n 14b6 <_i2c_m_sync_transfer+0x1d6>
|
|
return ((Sercom *)hw)->I2CM.STATUS.reg;
|
|
14bc: 8b62 ldrh r2, [r4, #26]
|
|
14be: b292 uxth r2, r2
|
|
if (flags & MB_FLAG) {
|
|
14c0: 07fb lsls r3, r7, #31
|
|
14c2: d5ba bpl.n 143a <_i2c_m_sync_transfer+0x15a>
|
|
if (status & SERCOM_I2CM_STATUS_ARBLOST) {
|
|
14c4: 0793 lsls r3, r2, #30
|
|
14c6: d400 bmi.n 14ca <_i2c_m_sync_transfer+0x1ea>
|
|
14c8: e759 b.n 137e <_i2c_m_sync_transfer+0x9e>
|
|
((Sercom *)hw)->I2CM.INTFLAG.reg = SERCOM_I2CM_INTFLAG_MB;
|
|
14ca: 2301 movs r3, #1
|
|
14cc: 7623 strb r3, [r4, #24]
|
|
msg->flags |= I2C_M_FAIL;
|
|
14ce: 886b ldrh r3, [r5, #2]
|
|
14d0: 2180 movs r1, #128 ; 0x80
|
|
14d2: 0149 lsls r1, r1, #5
|
|
14d4: 430b orrs r3, r1
|
|
14d6: 806b strh r3, [r5, #2]
|
|
msg->flags &= ~I2C_M_BUSY;
|
|
14d8: 886b ldrh r3, [r5, #2]
|
|
14da: 491d ldr r1, [pc, #116] ; (1550 <_i2c_m_sync_transfer+0x270>)
|
|
14dc: 400b ands r3, r1
|
|
14de: 806b strh r3, [r5, #2]
|
|
if (status & SERCOM_I2CM_STATUS_BUSERR) {
|
|
14e0: 07d3 lsls r3, r2, #31
|
|
14e2: d522 bpl.n 152a <_i2c_m_sync_transfer+0x24a>
|
|
return I2C_ERR_BUS;
|
|
14e4: 2005 movs r0, #5
|
|
14e6: 4240 negs r0, r0
|
|
14e8: e7cd b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
if ((msg->len == 0 && !sclsm) || (msg->len == 1 && sclsm)) {
|
|
14ea: 2900 cmp r1, #0
|
|
14ec: d0b4 beq.n 1458 <_i2c_m_sync_transfer+0x178>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_ACKACT;
|
|
14ee: 6862 ldr r2, [r4, #4]
|
|
14f0: 2380 movs r3, #128 ; 0x80
|
|
14f2: 02db lsls r3, r3, #11
|
|
14f4: 4313 orrs r3, r2
|
|
14f6: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
14f8: 69e3 ldr r3, [r4, #28]
|
|
14fa: 075b lsls r3, r3, #29
|
|
14fc: d4fc bmi.n 14f8 <_i2c_m_sync_transfer+0x218>
|
|
14fe: e7ab b.n 1458 <_i2c_m_sync_transfer+0x178>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg &= ~SERCOM_I2CM_CTRLB_SMEN;
|
|
1500: 6863 ldr r3, [r4, #4]
|
|
1502: 4a13 ldr r2, [pc, #76] ; (1550 <_i2c_m_sync_transfer+0x270>)
|
|
1504: 4013 ands r3, r2
|
|
1506: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1508: 69e3 ldr r3, [r4, #28]
|
|
150a: 075b lsls r3, r3, #29
|
|
150c: d4fc bmi.n 1508 <_i2c_m_sync_transfer+0x228>
|
|
((Sercom *)hw)->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(mask);
|
|
150e: 6862 ldr r2, [r4, #4]
|
|
1510: 23c0 movs r3, #192 ; 0xc0
|
|
1512: 029b lsls r3, r3, #10
|
|
1514: 4313 orrs r3, r2
|
|
1516: 6063 str r3, [r4, #4]
|
|
while (((Sercom *)hw)->I2CM.SYNCBUSY.reg & reg) {
|
|
1518: 69e3 ldr r3, [r4, #28]
|
|
151a: 075b lsls r3, r3, #29
|
|
151c: d4fc bmi.n 1518 <_i2c_m_sync_transfer+0x238>
|
|
151e: e7a2 b.n 1466 <_i2c_m_sync_transfer+0x186>
|
|
((Sercom *)hw)->I2CM.INTFLAG.reg = SERCOM_I2CM_INTFLAG_SB;
|
|
1520: 2302 movs r3, #2
|
|
1522: 7623 strb r3, [r4, #24]
|
|
return I2C_NACK;
|
|
1524: 2002 movs r0, #2
|
|
1526: 4240 negs r0, r0
|
|
1528: e7ad b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
return I2C_ERR_BAD_ADDRESS;
|
|
152a: 2004 movs r0, #4
|
|
152c: 4240 negs r0, r0
|
|
152e: e7aa b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
return I2C_OK;
|
|
1530: 2000 movs r0, #0
|
|
1532: e7a8 b.n 1486 <_i2c_m_sync_transfer+0x1a6>
|
|
return I2C_ERR_BUSY;
|
|
1534: 2006 movs r0, #6
|
|
1536: 4240 negs r0, r0
|
|
1538: e70b b.n 1352 <_i2c_m_sync_transfer+0x72>
|
|
153a: 46c0 nop ; (mov r8, r8)
|
|
153c: 000005bf .word 0x000005bf
|
|
1540: 000020cc .word 0x000020cc
|
|
1544: 00000a69 .word 0x00000a69
|
|
1548: 000005c1 .word 0x000005c1
|
|
154c: 00000fc1 .word 0x00000fc1
|
|
1550: fffffeff .word 0xfffffeff
|
|
1554: fffffbff .word 0xfffffbff
|
|
1558: 0000ffff .word 0x0000ffff
|
|
|
|
0000155c <_system_time_init>:
|
|
* \brief Initialize system time module
|
|
*/
|
|
void _system_time_init(void *const hw)
|
|
{
|
|
(void)hw;
|
|
SysTick->LOAD = (0xFFFFFF << SysTick_LOAD_RELOAD_Pos);
|
|
155c: 4b02 ldr r3, [pc, #8] ; (1568 <_system_time_init+0xc>)
|
|
155e: 4a03 ldr r2, [pc, #12] ; (156c <_system_time_init+0x10>)
|
|
1560: 605a str r2, [r3, #4]
|
|
SysTick->CTRL = (1 << SysTick_CTRL_ENABLE_Pos) | (CONF_SYSTICK_TICKINT << SysTick_CTRL_TICKINT_Pos)
|
|
1562: 2205 movs r2, #5
|
|
1564: 601a str r2, [r3, #0]
|
|
| (1 << SysTick_CTRL_CLKSOURCE_Pos);
|
|
}
|
|
1566: 4770 bx lr
|
|
1568: e000e010 .word 0xe000e010
|
|
156c: 00ffffff .word 0x00ffffff
|
|
|
|
00001570 <_delay_init>:
|
|
/**
|
|
* \brief Initialize delay functionality
|
|
*/
|
|
void _delay_init(void *const hw)
|
|
{
|
|
1570: b510 push {r4, lr}
|
|
_system_time_init(hw);
|
|
1572: 4b01 ldr r3, [pc, #4] ; (1578 <_delay_init+0x8>)
|
|
1574: 4798 blx r3
|
|
}
|
|
1576: bd10 pop {r4, pc}
|
|
1578: 0000155d .word 0x0000155d
|
|
|
|
0000157c <tcc_pwm_interrupt_handler>:
|
|
* \internal TC interrupt handler for PWM
|
|
*
|
|
* \param[in] instance TC instance number
|
|
*/
|
|
static void tcc_pwm_interrupt_handler(struct _pwm_device *device)
|
|
{
|
|
157c: b570 push {r4, r5, r6, lr}
|
|
157e: 0005 movs r5, r0
|
|
void *const hw = device->hw;
|
|
1580: 6904 ldr r4, [r0, #16]
|
|
((Tcc *)hw)->INTFLAG.reg = TCC_INTFLAG_MC3;
|
|
}
|
|
|
|
static inline bool hri_tcc_get_interrupt_OVF_bit(const void *const hw)
|
|
{
|
|
return (((Tcc *)hw)->INTFLAG.reg & TCC_INTFLAG_OVF) >> TCC_INTFLAG_OVF_Pos;
|
|
1582: 6ae3 ldr r3, [r4, #44] ; 0x2c
|
|
|
|
if (hri_tcc_get_interrupt_OVF_bit(hw)) {
|
|
1584: 07db lsls r3, r3, #31
|
|
1586: d505 bpl.n 1594 <tcc_pwm_interrupt_handler+0x18>
|
|
}
|
|
|
|
static inline void hri_tcc_clear_interrupt_OVF_bit(const void *const hw)
|
|
{
|
|
((Tcc *)hw)->INTFLAG.reg = TCC_INTFLAG_OVF;
|
|
1588: 2301 movs r3, #1
|
|
158a: 62e3 str r3, [r4, #44] ; 0x2c
|
|
hri_tcc_clear_interrupt_OVF_bit(hw);
|
|
if (NULL != device->callback.pwm_period_cb) {
|
|
158c: 6803 ldr r3, [r0, #0]
|
|
158e: 2b00 cmp r3, #0
|
|
1590: d000 beq.n 1594 <tcc_pwm_interrupt_handler+0x18>
|
|
device->callback.pwm_period_cb(device);
|
|
1592: 4798 blx r3
|
|
((Tcc *)hw)->INTENSET.reg = TCC_INTENSET_ERR;
|
|
}
|
|
|
|
static inline bool hri_tcc_get_INTEN_ERR_bit(const void *const hw)
|
|
{
|
|
return (((Tcc *)hw)->INTENSET.reg & TCC_INTENSET_ERR) >> TCC_INTENSET_ERR_Pos;
|
|
1594: 6aa3 ldr r3, [r4, #40] ; 0x28
|
|
}
|
|
}
|
|
if (hri_tcc_get_INTEN_ERR_bit(hw)) {
|
|
1596: 071b lsls r3, r3, #28
|
|
1598: d506 bpl.n 15a8 <tcc_pwm_interrupt_handler+0x2c>
|
|
((Tcc *)hw)->INTFLAG.reg = TCC_INTFLAG_ERR;
|
|
159a: 2308 movs r3, #8
|
|
159c: 62e3 str r3, [r4, #44] ; 0x2c
|
|
hri_tcc_clear_interrupt_ERR_bit(hw);
|
|
if (NULL != device->callback.pwm_error_cb) {
|
|
159e: 686b ldr r3, [r5, #4]
|
|
15a0: 2b00 cmp r3, #0
|
|
15a2: d001 beq.n 15a8 <tcc_pwm_interrupt_handler+0x2c>
|
|
device->callback.pwm_error_cb(device);
|
|
15a4: 0028 movs r0, r5
|
|
15a6: 4798 blx r3
|
|
}
|
|
}
|
|
}
|
|
15a8: bd70 pop {r4, r5, r6, pc}
|
|
...
|
|
|
|
000015ac <TCC0_Handler>:
|
|
|
|
/**
|
|
* \brief TCC interrupt handler
|
|
*/
|
|
void TCC0_Handler(void)
|
|
{
|
|
15ac: b510 push {r4, lr}
|
|
tcc_pwm_interrupt_handler(_tcc0_dev);
|
|
15ae: 4b02 ldr r3, [pc, #8] ; (15b8 <TCC0_Handler+0xc>)
|
|
15b0: 6818 ldr r0, [r3, #0]
|
|
15b2: 4b02 ldr r3, [pc, #8] ; (15bc <TCC0_Handler+0x10>)
|
|
15b4: 4798 blx r3
|
|
}
|
|
15b6: bd10 pop {r4, pc}
|
|
15b8: 20000068 .word 0x20000068
|
|
15bc: 0000157d .word 0x0000157d
|
|
|
|
000015c0 <_tc_start_pwm>:
|
|
/**
|
|
* \brief Start PWM
|
|
*/
|
|
void _tc_start_pwm(struct _pwm_device *const device)
|
|
{
|
|
hri_tc_set_CTRLA_ENABLE_bit(device->hw);
|
|
15c0: 6902 ldr r2, [r0, #16]
|
|
}
|
|
|
|
static inline void hri_tc_set_CTRLA_ENABLE_bit(const void *const hw)
|
|
{
|
|
TC_CRITICAL_SECTION_ENTER();
|
|
((Tc *)hw)->COUNT16.CTRLA.reg |= TC_CTRLA_ENABLE;
|
|
15c2: 6813 ldr r3, [r2, #0]
|
|
15c4: 2102 movs r1, #2
|
|
15c6: 430b orrs r3, r1
|
|
15c8: 6013 str r3, [r2, #0]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
15ca: 6913 ldr r3, [r2, #16]
|
|
15cc: 079b lsls r3, r3, #30
|
|
15ce: d1fc bne.n 15ca <_tc_start_pwm+0xa>
|
|
}
|
|
15d0: 4770 bx lr
|
|
|
|
000015d2 <_tc_stop_pwm>:
|
|
/**
|
|
* \brief Stop PWM
|
|
*/
|
|
void _tc_stop_pwm(struct _pwm_device *const device)
|
|
{
|
|
hri_tc_clear_CTRLA_ENABLE_bit(device->hw);
|
|
15d2: 6902 ldr r2, [r0, #16]
|
|
}
|
|
|
|
static inline void hri_tc_clear_CTRLA_ENABLE_bit(const void *const hw)
|
|
{
|
|
TC_CRITICAL_SECTION_ENTER();
|
|
((Tc *)hw)->COUNT16.CTRLA.reg &= ~TC_CTRLA_ENABLE;
|
|
15d4: 6813 ldr r3, [r2, #0]
|
|
15d6: 2102 movs r1, #2
|
|
15d8: 438b bics r3, r1
|
|
15da: 6013 str r3, [r2, #0]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
15dc: 6913 ldr r3, [r2, #16]
|
|
15de: 079b lsls r3, r3, #30
|
|
15e0: d1fc bne.n 15dc <_tc_stop_pwm+0xa>
|
|
}
|
|
15e2: 4770 bx lr
|
|
|
|
000015e4 <_tc_is_pwm_enabled>:
|
|
/**
|
|
* \brief Check if PWM is running
|
|
*/
|
|
bool _tc_is_pwm_enabled(const struct _pwm_device *const device)
|
|
{
|
|
return hri_tc_get_CTRLA_ENABLE_bit(device->hw);
|
|
15e4: 6902 ldr r2, [r0, #16]
|
|
15e6: 6913 ldr r3, [r2, #16]
|
|
15e8: 079b lsls r3, r3, #30
|
|
15ea: d1fc bne.n 15e6 <_tc_is_pwm_enabled+0x2>
|
|
tmp = ((Tc *)hw)->COUNT16.CTRLA.reg;
|
|
15ec: 6813 ldr r3, [r2, #0]
|
|
tmp = (tmp & TC_CTRLA_ENABLE) >> TC_CTRLA_ENABLE_Pos;
|
|
15ee: 085b lsrs r3, r3, #1
|
|
return (bool)tmp;
|
|
15f0: 2001 movs r0, #1
|
|
15f2: 4018 ands r0, r3
|
|
}
|
|
15f4: 4770 bx lr
|
|
|
|
000015f6 <tc_pwm_interrupt_handler>:
|
|
* \internal TC interrupt handler for PWM
|
|
*
|
|
* \param[in] instance TC instance number
|
|
*/
|
|
static void tc_pwm_interrupt_handler(struct _pwm_device *device)
|
|
{
|
|
15f6: b570 push {r4, r5, r6, lr}
|
|
15f8: 0005 movs r5, r0
|
|
void *const hw = device->hw;
|
|
15fa: 6904 ldr r4, [r0, #16]
|
|
return (((Tc *)hw)->COUNT16.INTFLAG.reg & TC_INTFLAG_OVF) >> TC_INTFLAG_OVF_Pos;
|
|
15fc: 7aa3 ldrb r3, [r4, #10]
|
|
|
|
if (hri_tc_get_interrupt_OVF_bit(hw)) {
|
|
15fe: 07db lsls r3, r3, #31
|
|
1600: d505 bpl.n 160e <tc_pwm_interrupt_handler+0x18>
|
|
((Tc *)hw)->COUNT16.INTFLAG.reg = TC_INTFLAG_OVF;
|
|
1602: 2301 movs r3, #1
|
|
1604: 72a3 strb r3, [r4, #10]
|
|
hri_tc_clear_interrupt_OVF_bit(hw);
|
|
if (NULL != device->callback.pwm_period_cb) {
|
|
1606: 6803 ldr r3, [r0, #0]
|
|
1608: 2b00 cmp r3, #0
|
|
160a: d000 beq.n 160e <tc_pwm_interrupt_handler+0x18>
|
|
device->callback.pwm_period_cb(device);
|
|
160c: 4798 blx r3
|
|
return (((Tc *)hw)->COUNT16.INTENSET.reg & TC_INTENSET_ERR) >> TC_INTENSET_ERR_Pos;
|
|
160e: 7a63 ldrb r3, [r4, #9]
|
|
}
|
|
}
|
|
if (hri_tc_get_INTEN_ERR_bit(hw)) {
|
|
1610: 079b lsls r3, r3, #30
|
|
1612: d506 bpl.n 1622 <tc_pwm_interrupt_handler+0x2c>
|
|
((Tc *)hw)->COUNT16.INTFLAG.reg = TC_INTFLAG_ERR;
|
|
1614: 2302 movs r3, #2
|
|
1616: 72a3 strb r3, [r4, #10]
|
|
hri_tc_clear_interrupt_ERR_bit(hw);
|
|
if (NULL != device->callback.pwm_error_cb) {
|
|
1618: 686b ldr r3, [r5, #4]
|
|
161a: 2b00 cmp r3, #0
|
|
161c: d001 beq.n 1622 <tc_pwm_interrupt_handler+0x2c>
|
|
device->callback.pwm_error_cb(device);
|
|
161e: 0028 movs r0, r5
|
|
1620: 4798 blx r3
|
|
}
|
|
}
|
|
}
|
|
1622: bd70 pop {r4, r5, r6, pc}
|
|
|
|
00001624 <_tc_init_irq_param>:
|
|
/**
|
|
* \brief Init irq param with the given tc hardware instance
|
|
*/
|
|
static void _tc_init_irq_param(const void *const hw, void *dev)
|
|
{
|
|
if (hw == TC3) {
|
|
1624: 4b03 ldr r3, [pc, #12] ; (1634 <_tc_init_irq_param+0x10>)
|
|
1626: 4298 cmp r0, r3
|
|
1628: d000 beq.n 162c <_tc_init_irq_param+0x8>
|
|
_tc3_dev = (struct _pwm_device *)dev;
|
|
}
|
|
}
|
|
162a: 4770 bx lr
|
|
_tc3_dev = (struct _pwm_device *)dev;
|
|
162c: 4b02 ldr r3, [pc, #8] ; (1638 <_tc_init_irq_param+0x14>)
|
|
162e: 6019 str r1, [r3, #0]
|
|
}
|
|
1630: e7fb b.n 162a <_tc_init_irq_param+0x6>
|
|
1632: 46c0 nop ; (mov r8, r8)
|
|
1634: 42002c00 .word 0x42002c00
|
|
1638: 2000006c .word 0x2000006c
|
|
|
|
0000163c <get_tc_index>:
|
|
{
|
|
163c: b510 push {r4, lr}
|
|
*
|
|
* \param[in] hw The pointer to hardware instance
|
|
*/
|
|
static inline uint8_t _get_hardware_offset(const void *const hw)
|
|
{
|
|
return (((uint32_t)hw - (uint32_t)TC0) >> 10);
|
|
163e: 4b0e ldr r3, [pc, #56] ; (1678 <get_tc_index+0x3c>)
|
|
1640: 469c mov ip, r3
|
|
1642: 4460 add r0, ip
|
|
1644: 0a80 lsrs r0, r0, #10
|
|
1646: b2c3 uxtb r3, r0
|
|
for (i = 0; i < ARRAY_SIZE(_tcs); i++) {
|
|
1648: 2000 movs r0, #0
|
|
164a: 2800 cmp r0, #0
|
|
164c: d008 beq.n 1660 <get_tc_index+0x24>
|
|
ASSERT(false);
|
|
164e: 22b0 movs r2, #176 ; 0xb0
|
|
1650: 0052 lsls r2, r2, #1
|
|
1652: 490a ldr r1, [pc, #40] ; (167c <get_tc_index+0x40>)
|
|
1654: 2000 movs r0, #0
|
|
1656: 4b0a ldr r3, [pc, #40] ; (1680 <get_tc_index+0x44>)
|
|
1658: 4798 blx r3
|
|
return -1;
|
|
165a: 2001 movs r0, #1
|
|
165c: 4240 negs r0, r0
|
|
}
|
|
165e: bd10 pop {r4, pc}
|
|
if (_tcs[i].number == index) {
|
|
1660: 0082 lsls r2, r0, #2
|
|
1662: 1812 adds r2, r2, r0
|
|
1664: 0091 lsls r1, r2, #2
|
|
1666: 4a07 ldr r2, [pc, #28] ; (1684 <get_tc_index+0x48>)
|
|
1668: 5c8a ldrb r2, [r1, r2]
|
|
166a: 429a cmp r2, r3
|
|
166c: d002 beq.n 1674 <get_tc_index+0x38>
|
|
for (i = 0; i < ARRAY_SIZE(_tcs); i++) {
|
|
166e: 3001 adds r0, #1
|
|
1670: b2c0 uxtb r0, r0
|
|
1672: e7ea b.n 164a <get_tc_index+0xe>
|
|
return i;
|
|
1674: b240 sxtb r0, r0
|
|
1676: e7f2 b.n 165e <get_tc_index+0x22>
|
|
1678: bdffe000 .word 0xbdffe000
|
|
167c: 000020e8 .word 0x000020e8
|
|
1680: 00000a69 .word 0x00000a69
|
|
1684: 20000000 .word 0x20000000
|
|
|
|
00001688 <_tc_pwm_init>:
|
|
{
|
|
1688: b570 push {r4, r5, r6, lr}
|
|
168a: 0006 movs r6, r0
|
|
168c: 000c movs r4, r1
|
|
int8_t i = get_tc_index(hw);
|
|
168e: 0008 movs r0, r1
|
|
1690: 4b53 ldr r3, [pc, #332] ; (17e0 <_tc_pwm_init+0x158>)
|
|
1692: 4798 blx r3
|
|
1694: 0005 movs r5, r0
|
|
device->hw = hw;
|
|
1696: 6134 str r4, [r6, #16]
|
|
return ((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg;
|
|
1698: 6923 ldr r3, [r4, #16]
|
|
if (!hri_tc_is_syncing(hw, TC_SYNCBUSY_SWRST)) {
|
|
169a: 07db lsls r3, r3, #31
|
|
169c: d414 bmi.n 16c8 <_tc_pwm_init+0x40>
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
169e: 6923 ldr r3, [r4, #16]
|
|
16a0: 079b lsls r3, r3, #30
|
|
16a2: d1fc bne.n 169e <_tc_pwm_init+0x16>
|
|
|
|
static inline hri_tc_ctrla_reg_t hri_tc_get_CTRLA_reg(const void *const hw, hri_tc_ctrla_reg_t mask)
|
|
{
|
|
uint32_t tmp;
|
|
hri_tc_wait_for_sync(hw, TC_SYNCBUSY_SWRST | TC_SYNCBUSY_ENABLE);
|
|
tmp = ((Tc *)hw)->COUNT16.CTRLA.reg;
|
|
16a4: 6823 ldr r3, [r4, #0]
|
|
if (hri_tc_get_CTRLA_reg(hw, TC_CTRLA_ENABLE)) {
|
|
16a6: 079b lsls r3, r3, #30
|
|
16a8: d509 bpl.n 16be <_tc_pwm_init+0x36>
|
|
((Tc *)hw)->COUNT16.CTRLA.reg &= ~TC_CTRLA_ENABLE;
|
|
16aa: 6823 ldr r3, [r4, #0]
|
|
16ac: 2202 movs r2, #2
|
|
16ae: 4393 bics r3, r2
|
|
16b0: 6023 str r3, [r4, #0]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
16b2: 6923 ldr r3, [r4, #16]
|
|
16b4: 079b lsls r3, r3, #30
|
|
16b6: d1fc bne.n 16b2 <_tc_pwm_init+0x2a>
|
|
16b8: 6923 ldr r3, [r4, #16]
|
|
16ba: 079b lsls r3, r3, #30
|
|
16bc: d4fc bmi.n 16b8 <_tc_pwm_init+0x30>
|
|
}
|
|
|
|
static inline void hri_tc_write_CTRLA_reg(const void *const hw, hri_tc_ctrla_reg_t data)
|
|
{
|
|
TC_CRITICAL_SECTION_ENTER();
|
|
((Tc *)hw)->COUNT16.CTRLA.reg = data;
|
|
16be: 2301 movs r3, #1
|
|
16c0: 6023 str r3, [r4, #0]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
16c2: 6923 ldr r3, [r4, #16]
|
|
16c4: 079b lsls r3, r3, #30
|
|
16c6: d1fc bne.n 16c2 <_tc_pwm_init+0x3a>
|
|
16c8: 6923 ldr r3, [r4, #16]
|
|
16ca: 07db lsls r3, r3, #31
|
|
16cc: d4fc bmi.n 16c8 <_tc_pwm_init+0x40>
|
|
hri_tc_write_CTRLA_reg(hw, _tcs[i].ctrl_a);
|
|
16ce: 00ab lsls r3, r5, #2
|
|
16d0: 195b adds r3, r3, r5
|
|
16d2: 009a lsls r2, r3, #2
|
|
16d4: 4b43 ldr r3, [pc, #268] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
16d6: 189b adds r3, r3, r2
|
|
16d8: 685b ldr r3, [r3, #4]
|
|
((Tc *)hw)->COUNT16.CTRLA.reg = data;
|
|
16da: 6023 str r3, [r4, #0]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
16dc: 6923 ldr r3, [r4, #16]
|
|
16de: 079b lsls r3, r3, #30
|
|
16e0: d1fc bne.n 16dc <_tc_pwm_init+0x54>
|
|
hri_tc_write_DBGCTRL_reg(hw, _tcs[i].dbg_ctrl);
|
|
16e2: 00aa lsls r2, r5, #2
|
|
16e4: 1952 adds r2, r2, r5
|
|
16e6: 0091 lsls r1, r2, #2
|
|
16e8: 4b3e ldr r3, [pc, #248] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
16ea: 185b adds r3, r3, r1
|
|
16ec: 7a9a ldrb r2, [r3, #10]
|
|
}
|
|
|
|
static inline void hri_tc_write_DBGCTRL_reg(const void *const hw, hri_tc_dbgctrl_reg_t data)
|
|
{
|
|
TC_CRITICAL_SECTION_ENTER();
|
|
((Tc *)hw)->COUNT16.DBGCTRL.reg = data;
|
|
16ee: 73e2 strb r2, [r4, #15]
|
|
hri_tc_write_EVCTRL_reg(hw, _tcs[i].event_ctrl);
|
|
16f0: 891a ldrh r2, [r3, #8]
|
|
((Tc *)hw)->COUNT16.EVCTRL.reg = data;
|
|
16f2: 80e2 strh r2, [r4, #6]
|
|
((Tc *)hw)->COUNT16.WAVE.reg = data;
|
|
16f4: 2203 movs r2, #3
|
|
16f6: 7322 strb r2, [r4, #12]
|
|
if ((_tcs[i].ctrl_a & TC_CTRLA_MODE_Msk) == TC_CTRLA_MODE_COUNT32) {
|
|
16f8: 685a ldr r2, [r3, #4]
|
|
16fa: 230c movs r3, #12
|
|
16fc: 4013 ands r3, r2
|
|
16fe: 2b08 cmp r3, #8
|
|
1700: d054 beq.n 17ac <_tc_pwm_init+0x124>
|
|
} else if ((_tcs[i].ctrl_a & TC_CTRLA_MODE_Msk) == TC_CTRLA_MODE_COUNT16) {
|
|
1702: 2b00 cmp r3, #0
|
|
1704: d166 bne.n 17d4 <_tc_pwm_init+0x14c>
|
|
hri_tccount16_write_CC_reg(hw, 0, (uint16_t)_tcs[i].cc0);
|
|
1706: 00ab lsls r3, r5, #2
|
|
1708: 195b adds r3, r3, r5
|
|
170a: 009a lsls r2, r3, #2
|
|
170c: 4b35 ldr r3, [pc, #212] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
170e: 189b adds r3, r3, r2
|
|
1710: 899b ldrh r3, [r3, #12]
|
|
}
|
|
|
|
static inline void hri_tccount16_write_CC_reg(const void *const hw, uint8_t index, hri_tccount16_cc_reg_t data)
|
|
{
|
|
TC_CRITICAL_SECTION_ENTER();
|
|
((Tc *)hw)->COUNT16.CC[index].reg = data;
|
|
1712: 83a3 strh r3, [r4, #28]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
1714: 6923 ldr r3, [r4, #16]
|
|
1716: 22c0 movs r2, #192 ; 0xc0
|
|
1718: 421a tst r2, r3
|
|
171a: d1fb bne.n 1714 <_tc_pwm_init+0x8c>
|
|
hri_tccount16_write_CC_reg(hw, 1, (uint16_t)_tcs[i].cc1);
|
|
171c: 00ab lsls r3, r5, #2
|
|
171e: 195b adds r3, r3, r5
|
|
1720: 009a lsls r2, r3, #2
|
|
1722: 4b30 ldr r3, [pc, #192] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
1724: 189b adds r3, r3, r2
|
|
1726: 8a1b ldrh r3, [r3, #16]
|
|
((Tc *)hw)->COUNT16.CC[index].reg = data;
|
|
1728: 83e3 strh r3, [r4, #30]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
172a: 6923 ldr r3, [r4, #16]
|
|
172c: 22c0 movs r2, #192 ; 0xc0
|
|
172e: 421a tst r2, r3
|
|
1730: d1fb bne.n 172a <_tc_pwm_init+0xa2>
|
|
_tc_init_irq_param(hw, (void *)device);
|
|
1732: 0031 movs r1, r6
|
|
1734: 0020 movs r0, r4
|
|
1736: 4b2c ldr r3, [pc, #176] ; (17e8 <_tc_pwm_init+0x160>)
|
|
1738: 4798 blx r3
|
|
NVIC_DisableIRQ(_tcs[i].irq);
|
|
173a: 00ab lsls r3, r5, #2
|
|
173c: 195b adds r3, r3, r5
|
|
173e: 009a lsls r2, r3, #2
|
|
1740: 4b28 ldr r3, [pc, #160] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
1742: 189b adds r3, r3, r2
|
|
1744: 785b ldrb r3, [r3, #1]
|
|
1746: b25b sxtb r3, r3
|
|
\param [in] IRQn Device specific interrupt number.
|
|
\note IRQn must not be negative.
|
|
*/
|
|
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
|
|
{
|
|
if ((int32_t)(IRQn) >= 0)
|
|
1748: 2b00 cmp r3, #0
|
|
174a: db0b blt.n 1764 <_tc_pwm_init+0xdc>
|
|
{
|
|
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
|
174c: 221f movs r2, #31
|
|
174e: 4013 ands r3, r2
|
|
1750: 3a1e subs r2, #30
|
|
1752: 409a lsls r2, r3
|
|
1754: 0013 movs r3, r2
|
|
1756: 2280 movs r2, #128 ; 0x80
|
|
1758: 4924 ldr r1, [pc, #144] ; (17ec <_tc_pwm_init+0x164>)
|
|
175a: 508b str r3, [r1, r2]
|
|
\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");
|
|
175c: f3bf 8f4f dsb sy
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
1760: f3bf 8f6f isb sy
|
|
NVIC_ClearPendingIRQ(_tcs[i].irq);
|
|
1764: 00ab lsls r3, r5, #2
|
|
1766: 195b adds r3, r3, r5
|
|
1768: 009a lsls r2, r3, #2
|
|
176a: 4b1e ldr r3, [pc, #120] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
176c: 189b adds r3, r3, r2
|
|
176e: 785b ldrb r3, [r3, #1]
|
|
1770: b25b sxtb r3, r3
|
|
\param [in] IRQn Device specific interrupt number.
|
|
\note IRQn must not be negative.
|
|
*/
|
|
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
|
{
|
|
if ((int32_t)(IRQn) >= 0)
|
|
1772: 2b00 cmp r3, #0
|
|
1774: db08 blt.n 1788 <_tc_pwm_init+0x100>
|
|
{
|
|
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
|
1776: 221f movs r2, #31
|
|
1778: 4013 ands r3, r2
|
|
177a: 3a1e subs r2, #30
|
|
177c: 409a lsls r2, r3
|
|
177e: 0013 movs r3, r2
|
|
1780: 22c0 movs r2, #192 ; 0xc0
|
|
1782: 0052 lsls r2, r2, #1
|
|
1784: 4919 ldr r1, [pc, #100] ; (17ec <_tc_pwm_init+0x164>)
|
|
1786: 508b str r3, [r1, r2]
|
|
NVIC_EnableIRQ(_tcs[i].irq);
|
|
1788: 00ab lsls r3, r5, #2
|
|
178a: 195d adds r5, r3, r5
|
|
178c: 00aa lsls r2, r5, #2
|
|
178e: 4b15 ldr r3, [pc, #84] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
1790: 189b adds r3, r3, r2
|
|
1792: 785b ldrb r3, [r3, #1]
|
|
1794: b25b sxtb r3, r3
|
|
if ((int32_t)(IRQn) >= 0)
|
|
1796: 2b00 cmp r3, #0
|
|
1798: db1f blt.n 17da <_tc_pwm_init+0x152>
|
|
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
|
179a: 221f movs r2, #31
|
|
179c: 4013 ands r3, r2
|
|
179e: 3a1e subs r2, #30
|
|
17a0: 409a lsls r2, r3
|
|
17a2: 0013 movs r3, r2
|
|
17a4: 4a11 ldr r2, [pc, #68] ; (17ec <_tc_pwm_init+0x164>)
|
|
17a6: 6013 str r3, [r2, #0]
|
|
return 0;
|
|
17a8: 2000 movs r0, #0
|
|
}
|
|
17aa: bd70 pop {r4, r5, r6, pc}
|
|
hri_tccount32_write_CC_reg(hw, 0, _tcs[i].cc0);
|
|
17ac: 4b0d ldr r3, [pc, #52] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
17ae: 185b adds r3, r3, r1
|
|
17b0: 68db ldr r3, [r3, #12]
|
|
}
|
|
|
|
static inline void hri_tccount32_write_CC_reg(const void *const hw, uint8_t index, hri_tccount32_cc_reg_t data)
|
|
{
|
|
TC_CRITICAL_SECTION_ENTER();
|
|
((Tc *)hw)->COUNT32.CC[index].reg = data;
|
|
17b2: 61e3 str r3, [r4, #28]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
17b4: 6923 ldr r3, [r4, #16]
|
|
17b6: 22c0 movs r2, #192 ; 0xc0
|
|
17b8: 421a tst r2, r3
|
|
17ba: d1fb bne.n 17b4 <_tc_pwm_init+0x12c>
|
|
hri_tccount32_write_CC_reg(hw, 1, _tcs[i].cc1);
|
|
17bc: 00ab lsls r3, r5, #2
|
|
17be: 195b adds r3, r3, r5
|
|
17c0: 009a lsls r2, r3, #2
|
|
17c2: 4b08 ldr r3, [pc, #32] ; (17e4 <_tc_pwm_init+0x15c>)
|
|
17c4: 189b adds r3, r3, r2
|
|
17c6: 691b ldr r3, [r3, #16]
|
|
((Tc *)hw)->COUNT32.CC[index].reg = data;
|
|
17c8: 6223 str r3, [r4, #32]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
17ca: 6923 ldr r3, [r4, #16]
|
|
17cc: 22c0 movs r2, #192 ; 0xc0
|
|
17ce: 421a tst r2, r3
|
|
17d0: d1fb bne.n 17ca <_tc_pwm_init+0x142>
|
|
17d2: e7ae b.n 1732 <_tc_pwm_init+0xaa>
|
|
return -1;
|
|
17d4: 2001 movs r0, #1
|
|
17d6: 4240 negs r0, r0
|
|
17d8: e7e7 b.n 17aa <_tc_pwm_init+0x122>
|
|
return 0;
|
|
17da: 2000 movs r0, #0
|
|
17dc: e7e5 b.n 17aa <_tc_pwm_init+0x122>
|
|
17de: 46c0 nop ; (mov r8, r8)
|
|
17e0: 0000163d .word 0x0000163d
|
|
17e4: 20000000 .word 0x20000000
|
|
17e8: 00001625 .word 0x00001625
|
|
17ec: e000e100 .word 0xe000e100
|
|
|
|
000017f0 <_tc_set_pwm_param>:
|
|
{
|
|
17f0: b570 push {r4, r5, r6, lr}
|
|
17f2: 000e movs r6, r1
|
|
17f4: 0015 movs r5, r2
|
|
void *const hw = device->hw;
|
|
17f6: 6904 ldr r4, [r0, #16]
|
|
int8_t i = get_tc_index(hw);
|
|
17f8: 0020 movs r0, r4
|
|
17fa: 4b1b ldr r3, [pc, #108] ; (1868 <_tc_set_pwm_param+0x78>)
|
|
17fc: 4798 blx r3
|
|
_tcs[i].cc0 = period;
|
|
17fe: 0082 lsls r2, r0, #2
|
|
1800: 1812 adds r2, r2, r0
|
|
1802: 0091 lsls r1, r2, #2
|
|
1804: 4b19 ldr r3, [pc, #100] ; (186c <_tc_set_pwm_param+0x7c>)
|
|
1806: 185b adds r3, r3, r1
|
|
1808: 60de str r6, [r3, #12]
|
|
_tcs[i].cc1 = duty_cycle;
|
|
180a: 611d str r5, [r3, #16]
|
|
if ((_tcs[i].ctrl_a & TC_CTRLA_MODE_Msk) == TC_CTRLA_MODE_COUNT32) {
|
|
180c: 685a ldr r2, [r3, #4]
|
|
180e: 230c movs r3, #12
|
|
1810: 4013 ands r3, r2
|
|
1812: 2b08 cmp r3, #8
|
|
1814: d016 beq.n 1844 <_tc_set_pwm_param+0x54>
|
|
hri_tccount16_write_CC_reg(hw, 0, _tcs[i].cc0);
|
|
1816: 0083 lsls r3, r0, #2
|
|
1818: 181b adds r3, r3, r0
|
|
181a: 009a lsls r2, r3, #2
|
|
181c: 4b13 ldr r3, [pc, #76] ; (186c <_tc_set_pwm_param+0x7c>)
|
|
181e: 189b adds r3, r3, r2
|
|
1820: 899b ldrh r3, [r3, #12]
|
|
((Tc *)hw)->COUNT16.CC[index].reg = data;
|
|
1822: 83a3 strh r3, [r4, #28]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
1824: 6923 ldr r3, [r4, #16]
|
|
1826: 22c0 movs r2, #192 ; 0xc0
|
|
1828: 421a tst r2, r3
|
|
182a: d1fb bne.n 1824 <_tc_set_pwm_param+0x34>
|
|
hri_tccount16_write_CC_reg(hw, 1, _tcs[i].cc1);
|
|
182c: 0083 lsls r3, r0, #2
|
|
182e: 1818 adds r0, r3, r0
|
|
1830: 0082 lsls r2, r0, #2
|
|
1832: 4b0e ldr r3, [pc, #56] ; (186c <_tc_set_pwm_param+0x7c>)
|
|
1834: 189b adds r3, r3, r2
|
|
1836: 8a1b ldrh r3, [r3, #16]
|
|
((Tc *)hw)->COUNT16.CC[index].reg = data;
|
|
1838: 83e3 strh r3, [r4, #30]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
183a: 6923 ldr r3, [r4, #16]
|
|
183c: 22c0 movs r2, #192 ; 0xc0
|
|
183e: 421a tst r2, r3
|
|
1840: d1fb bne.n 183a <_tc_set_pwm_param+0x4a>
|
|
}
|
|
1842: bd70 pop {r4, r5, r6, pc}
|
|
((Tc *)hw)->COUNT32.CC[index].reg = data;
|
|
1844: 61e6 str r6, [r4, #28]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
1846: 6923 ldr r3, [r4, #16]
|
|
1848: 22c0 movs r2, #192 ; 0xc0
|
|
184a: 421a tst r2, r3
|
|
184c: d1fb bne.n 1846 <_tc_set_pwm_param+0x56>
|
|
hri_tccount32_write_CC_reg(hw, 1, _tcs[i].cc1);
|
|
184e: 0083 lsls r3, r0, #2
|
|
1850: 1818 adds r0, r3, r0
|
|
1852: 0082 lsls r2, r0, #2
|
|
1854: 4b05 ldr r3, [pc, #20] ; (186c <_tc_set_pwm_param+0x7c>)
|
|
1856: 189b adds r3, r3, r2
|
|
1858: 691b ldr r3, [r3, #16]
|
|
((Tc *)hw)->COUNT32.CC[index].reg = data;
|
|
185a: 6223 str r3, [r4, #32]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
185c: 6923 ldr r3, [r4, #16]
|
|
185e: 22c0 movs r2, #192 ; 0xc0
|
|
1860: 421a tst r2, r3
|
|
1862: d1fb bne.n 185c <_tc_set_pwm_param+0x6c>
|
|
1864: e7ed b.n 1842 <_tc_set_pwm_param+0x52>
|
|
1866: 46c0 nop ; (mov r8, r8)
|
|
1868: 0000163d .word 0x0000163d
|
|
186c: 20000000 .word 0x20000000
|
|
|
|
00001870 <_tc_pwm_get_period>:
|
|
{
|
|
1870: b510 push {r4, lr}
|
|
void *const hw = device->hw;
|
|
1872: 6904 ldr r4, [r0, #16]
|
|
int8_t i = get_tc_index(hw);
|
|
1874: 0020 movs r0, r4
|
|
1876: 4b0c ldr r3, [pc, #48] ; (18a8 <_tc_pwm_get_period+0x38>)
|
|
1878: 4798 blx r3
|
|
if ((_tcs[i].ctrl_a & TC_CTRLA_MODE_Msk) == TC_CTRLA_MODE_COUNT32) {
|
|
187a: 0083 lsls r3, r0, #2
|
|
187c: 1818 adds r0, r3, r0
|
|
187e: 0082 lsls r2, r0, #2
|
|
1880: 4b0a ldr r3, [pc, #40] ; (18ac <_tc_pwm_get_period+0x3c>)
|
|
1882: 189b adds r3, r3, r2
|
|
1884: 685a ldr r2, [r3, #4]
|
|
1886: 230c movs r3, #12
|
|
1888: 4013 ands r3, r2
|
|
188a: 2b08 cmp r3, #8
|
|
188c: d006 beq.n 189c <_tc_pwm_get_period+0x2c>
|
|
188e: 6923 ldr r3, [r4, #16]
|
|
1890: 22c0 movs r2, #192 ; 0xc0
|
|
1892: 421a tst r2, r3
|
|
1894: d1fb bne.n 188e <_tc_pwm_get_period+0x1e>
|
|
return ((Tc *)hw)->COUNT16.CC[index].reg;
|
|
1896: 8ba0 ldrh r0, [r4, #28]
|
|
1898: b280 uxth r0, r0
|
|
}
|
|
189a: bd10 pop {r4, pc}
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
189c: 6923 ldr r3, [r4, #16]
|
|
189e: 22c0 movs r2, #192 ; 0xc0
|
|
18a0: 421a tst r2, r3
|
|
18a2: d1fb bne.n 189c <_tc_pwm_get_period+0x2c>
|
|
}
|
|
|
|
static inline hri_tccount32_cc_reg_t hri_tccount32_read_CC_reg(const void *const hw, uint8_t index)
|
|
{
|
|
hri_tc_wait_for_sync(hw, TC_SYNCBUSY_CC0 | TC_SYNCBUSY_CC1);
|
|
return ((Tc *)hw)->COUNT32.CC[index].reg;
|
|
18a4: 69e0 ldr r0, [r4, #28]
|
|
return (pwm_period_t)(hri_tccount32_read_CC_reg(hw, 0));
|
|
18a6: e7f8 b.n 189a <_tc_pwm_get_period+0x2a>
|
|
18a8: 0000163d .word 0x0000163d
|
|
18ac: 20000000 .word 0x20000000
|
|
|
|
000018b0 <_tc_pwm_get_duty>:
|
|
{
|
|
18b0: b510 push {r4, lr}
|
|
void *const hw = device->hw;
|
|
18b2: 6904 ldr r4, [r0, #16]
|
|
int8_t i = get_tc_index(hw);
|
|
18b4: 0020 movs r0, r4
|
|
18b6: 4b14 ldr r3, [pc, #80] ; (1908 <_tc_pwm_get_duty+0x58>)
|
|
18b8: 4798 blx r3
|
|
if ((_tcs[i].ctrl_a & TC_CTRLA_MODE_Msk) == TC_CTRLA_MODE_COUNT32) {
|
|
18ba: 0083 lsls r3, r0, #2
|
|
18bc: 1818 adds r0, r3, r0
|
|
18be: 0082 lsls r2, r0, #2
|
|
18c0: 4b12 ldr r3, [pc, #72] ; (190c <_tc_pwm_get_duty+0x5c>)
|
|
18c2: 189b adds r3, r3, r2
|
|
18c4: 685a ldr r2, [r3, #4]
|
|
18c6: 230c movs r3, #12
|
|
18c8: 4013 ands r3, r2
|
|
18ca: 2b08 cmp r3, #8
|
|
18cc: d011 beq.n 18f2 <_tc_pwm_get_duty+0x42>
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
18ce: 6923 ldr r3, [r4, #16]
|
|
18d0: 22c0 movs r2, #192 ; 0xc0
|
|
18d2: 421a tst r2, r3
|
|
18d4: d1fb bne.n 18ce <_tc_pwm_get_duty+0x1e>
|
|
return ((Tc *)hw)->COUNT16.CC[index].reg;
|
|
18d6: 8ba1 ldrh r1, [r4, #28]
|
|
18d8: b289 uxth r1, r1
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
18da: 6923 ldr r3, [r4, #16]
|
|
18dc: 22c0 movs r2, #192 ; 0xc0
|
|
18de: 421a tst r2, r3
|
|
18e0: d1fb bne.n 18da <_tc_pwm_get_duty+0x2a>
|
|
return ((Tc *)hw)->COUNT16.CC[index].reg;
|
|
18e2: 8be3 ldrh r3, [r4, #30]
|
|
18e4: b29b uxth r3, r3
|
|
return ((duty_cycle * 1000) / per);
|
|
18e6: 20fa movs r0, #250 ; 0xfa
|
|
18e8: 0080 lsls r0, r0, #2
|
|
18ea: 4358 muls r0, r3
|
|
18ec: 4b08 ldr r3, [pc, #32] ; (1910 <_tc_pwm_get_duty+0x60>)
|
|
18ee: 4798 blx r3
|
|
}
|
|
18f0: bd10 pop {r4, pc}
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
18f2: 6923 ldr r3, [r4, #16]
|
|
18f4: 22c0 movs r2, #192 ; 0xc0
|
|
18f6: 421a tst r2, r3
|
|
18f8: d1fb bne.n 18f2 <_tc_pwm_get_duty+0x42>
|
|
return ((Tc *)hw)->COUNT32.CC[index].reg;
|
|
18fa: 69e1 ldr r1, [r4, #28]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
18fc: 6923 ldr r3, [r4, #16]
|
|
18fe: 22c0 movs r2, #192 ; 0xc0
|
|
1900: 421a tst r2, r3
|
|
1902: d1fb bne.n 18fc <_tc_pwm_get_duty+0x4c>
|
|
return ((Tc *)hw)->COUNT32.CC[index].reg;
|
|
1904: 6a23 ldr r3, [r4, #32]
|
|
1906: e7ee b.n 18e6 <_tc_pwm_get_duty+0x36>
|
|
1908: 0000163d .word 0x0000163d
|
|
190c: 20000000 .word 0x20000000
|
|
1910: 00001d45 .word 0x00001d45
|
|
|
|
00001914 <_tc_pwm_deinit>:
|
|
{
|
|
1914: b570 push {r4, r5, r6, lr}
|
|
void *const hw = device->hw;
|
|
1916: 6904 ldr r4, [r0, #16]
|
|
int8_t i = get_tc_index(hw);
|
|
1918: 0020 movs r0, r4
|
|
191a: 4b16 ldr r3, [pc, #88] ; (1974 <_tc_pwm_deinit+0x60>)
|
|
191c: 4798 blx r3
|
|
191e: 0005 movs r5, r0
|
|
ASSERT(ARRAY_SIZE(_tcs));
|
|
1920: 22c2 movs r2, #194 ; 0xc2
|
|
1922: 4915 ldr r1, [pc, #84] ; (1978 <_tc_pwm_deinit+0x64>)
|
|
1924: 2001 movs r0, #1
|
|
1926: 4b15 ldr r3, [pc, #84] ; (197c <_tc_pwm_deinit+0x68>)
|
|
1928: 4798 blx r3
|
|
NVIC_DisableIRQ(_tcs[i].irq);
|
|
192a: 00a8 lsls r0, r5, #2
|
|
192c: 1940 adds r0, r0, r5
|
|
192e: 0082 lsls r2, r0, #2
|
|
1930: 4b13 ldr r3, [pc, #76] ; (1980 <_tc_pwm_deinit+0x6c>)
|
|
1932: 189b adds r3, r3, r2
|
|
1934: 785b ldrb r3, [r3, #1]
|
|
1936: b25b sxtb r3, r3
|
|
if ((int32_t)(IRQn) >= 0)
|
|
1938: 2b00 cmp r3, #0
|
|
193a: db0b blt.n 1954 <_tc_pwm_deinit+0x40>
|
|
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
|
193c: 221f movs r2, #31
|
|
193e: 4013 ands r3, r2
|
|
1940: 3a1e subs r2, #30
|
|
1942: 409a lsls r2, r3
|
|
1944: 0013 movs r3, r2
|
|
1946: 2280 movs r2, #128 ; 0x80
|
|
1948: 490e ldr r1, [pc, #56] ; (1984 <_tc_pwm_deinit+0x70>)
|
|
194a: 508b str r3, [r1, r2]
|
|
__ASM volatile ("dsb 0xF":::"memory");
|
|
194c: f3bf 8f4f dsb sy
|
|
__ASM volatile ("isb 0xF":::"memory");
|
|
1950: f3bf 8f6f isb sy
|
|
((Tc *)hw)->COUNT16.CTRLA.reg &= ~TC_CTRLA_ENABLE;
|
|
1954: 6823 ldr r3, [r4, #0]
|
|
1956: 2202 movs r2, #2
|
|
1958: 4393 bics r3, r2
|
|
195a: 6023 str r3, [r4, #0]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
195c: 6923 ldr r3, [r4, #16]
|
|
195e: 079b lsls r3, r3, #30
|
|
1960: d1fc bne.n 195c <_tc_pwm_deinit+0x48>
|
|
((Tc *)hw)->COUNT16.CTRLA.reg |= TC_CTRLA_SWRST;
|
|
1962: 6823 ldr r3, [r4, #0]
|
|
1964: 2201 movs r2, #1
|
|
1966: 4313 orrs r3, r2
|
|
1968: 6023 str r3, [r4, #0]
|
|
while (((Tc *)hw)->COUNT8.SYNCBUSY.reg & reg) {
|
|
196a: 6923 ldr r3, [r4, #16]
|
|
196c: 07db lsls r3, r3, #31
|
|
196e: d4fc bmi.n 196a <_tc_pwm_deinit+0x56>
|
|
}
|
|
1970: bd70 pop {r4, r5, r6, pc}
|
|
1972: 46c0 nop ; (mov r8, r8)
|
|
1974: 0000163d .word 0x0000163d
|
|
1978: 000020e8 .word 0x000020e8
|
|
197c: 00000a69 .word 0x00000a69
|
|
1980: 20000000 .word 0x20000000
|
|
1984: e000e100 .word 0xe000e100
|
|
|
|
00001988 <_tc_pwm_set_irq_state>:
|
|
{
|
|
1988: b570 push {r4, r5, r6, lr}
|
|
198a: 0004 movs r4, r0
|
|
198c: 000e movs r6, r1
|
|
198e: 0015 movs r5, r2
|
|
ASSERT(device);
|
|
1990: 1e43 subs r3, r0, #1
|
|
1992: 4198 sbcs r0, r3
|
|
1994: b2c0 uxtb r0, r0
|
|
1996: 2218 movs r2, #24
|
|
1998: 32ff adds r2, #255 ; 0xff
|
|
199a: 490d ldr r1, [pc, #52] ; (19d0 <_tc_pwm_set_irq_state+0x48>)
|
|
199c: 4b0d ldr r3, [pc, #52] ; (19d4 <_tc_pwm_set_irq_state+0x4c>)
|
|
199e: 4798 blx r3
|
|
if (PWM_DEVICE_PERIOD_CB == type) {
|
|
19a0: 2e00 cmp r6, #0
|
|
19a2: d108 bne.n 19b6 <_tc_pwm_set_irq_state+0x2e>
|
|
hri_tc_write_INTEN_OVF_bit(device->hw, disable);
|
|
19a4: 6923 ldr r3, [r4, #16]
|
|
if (value == 0x0) {
|
|
19a6: 2d00 cmp r5, #0
|
|
19a8: d102 bne.n 19b0 <_tc_pwm_set_irq_state+0x28>
|
|
((Tc *)hw)->COUNT16.INTENCLR.reg = TC_INTENSET_OVF;
|
|
19aa: 2201 movs r2, #1
|
|
19ac: 721a strb r2, [r3, #8]
|
|
19ae: e004 b.n 19ba <_tc_pwm_set_irq_state+0x32>
|
|
((Tc *)hw)->COUNT16.INTENSET.reg = TC_INTENSET_OVF;
|
|
19b0: 2201 movs r2, #1
|
|
19b2: 725a strb r2, [r3, #9]
|
|
19b4: e001 b.n 19ba <_tc_pwm_set_irq_state+0x32>
|
|
} else if (PWM_DEVICE_ERROR_CB == type) {
|
|
19b6: 2e01 cmp r6, #1
|
|
19b8: d000 beq.n 19bc <_tc_pwm_set_irq_state+0x34>
|
|
}
|
|
19ba: bd70 pop {r4, r5, r6, pc}
|
|
hri_tc_write_INTEN_ERR_bit(device->hw, disable);
|
|
19bc: 6923 ldr r3, [r4, #16]
|
|
if (value == 0x0) {
|
|
19be: 2d00 cmp r5, #0
|
|
19c0: d002 beq.n 19c8 <_tc_pwm_set_irq_state+0x40>
|
|
((Tc *)hw)->COUNT16.INTENSET.reg = TC_INTENSET_ERR;
|
|
19c2: 2202 movs r2, #2
|
|
19c4: 725a strb r2, [r3, #9]
|
|
}
|
|
19c6: e7f8 b.n 19ba <_tc_pwm_set_irq_state+0x32>
|
|
((Tc *)hw)->COUNT16.INTENCLR.reg = TC_INTENSET_ERR;
|
|
19c8: 2202 movs r2, #2
|
|
19ca: 721a strb r2, [r3, #8]
|
|
19cc: e7f5 b.n 19ba <_tc_pwm_set_irq_state+0x32>
|
|
19ce: 46c0 nop ; (mov r8, r8)
|
|
19d0: 000020e8 .word 0x000020e8
|
|
19d4: 00000a69 .word 0x00000a69
|
|
|
|
000019d8 <_tc_get_pwm>:
|
|
return &_tc_pwm_functions;
|
|
19d8: 4801 ldr r0, [pc, #4] ; (19e0 <_tc_get_pwm+0x8>)
|
|
}
|
|
19da: 3014 adds r0, #20
|
|
19dc: 4770 bx lr
|
|
19de: 46c0 nop ; (mov r8, r8)
|
|
19e0: 20000000 .word 0x20000000
|
|
|
|
000019e4 <TC3_Handler>:
|
|
{
|
|
19e4: b510 push {r4, lr}
|
|
tc_pwm_interrupt_handler(_tc3_dev);
|
|
19e6: 4b02 ldr r3, [pc, #8] ; (19f0 <TC3_Handler+0xc>)
|
|
19e8: 6818 ldr r0, [r3, #0]
|
|
19ea: 4b02 ldr r3, [pc, #8] ; (19f4 <TC3_Handler+0x10>)
|
|
19ec: 4798 blx r3
|
|
}
|
|
19ee: bd10 pop {r4, pc}
|
|
19f0: 2000006c .word 0x2000006c
|
|
19f4: 000015f7 .word 0x000015f7
|
|
|
|
000019f8 <main>:
|
|
#include <atmel_start.h>
|
|
#include "watch-library/watch.h"
|
|
|
|
int main(void)
|
|
{
|
|
19f8: b530 push {r4, r5, lr}
|
|
19fa: b08b sub sp, #44 ; 0x2c
|
|
atmel_start_init();
|
|
19fc: 4b23 ldr r3, [pc, #140] ; (1a8c <main+0x94>)
|
|
19fe: 4798 blx r3
|
|
|
|
Watch watch;
|
|
struct calendar_date_time date_time;
|
|
date_time.date.year = 2021;
|
|
1a00: ac02 add r4, sp, #8
|
|
1a02: 4b23 ldr r3, [pc, #140] ; (1a90 <main+0x98>)
|
|
1a04: 80e3 strh r3, [r4, #6]
|
|
date_time.date.month = 4;
|
|
1a06: 2304 movs r3, #4
|
|
1a08: 7163 strb r3, [r4, #5]
|
|
date_time.date.day = 25;
|
|
1a0a: 2219 movs r2, #25
|
|
1a0c: 7122 strb r2, [r4, #4]
|
|
date_time.time.hour = 4;
|
|
1a0e: 70a3 strb r3, [r4, #2]
|
|
date_time.time.min = 0;
|
|
1a10: 2500 movs r5, #0
|
|
1a12: 7065 strb r5, [r4, #1]
|
|
date_time.time.sec = 0;
|
|
1a14: 7025 strb r5, [r4, #0]
|
|
|
|
watch_init(&watch);
|
|
1a16: a804 add r0, sp, #16
|
|
1a18: 4b1e ldr r3, [pc, #120] ; (1a94 <main+0x9c>)
|
|
1a1a: 4798 blx r3
|
|
watch_enable_led();
|
|
1a1c: 4b1e ldr r3, [pc, #120] ; (1a98 <main+0xa0>)
|
|
1a1e: 4798 blx r3
|
|
watch_enable_date_time();
|
|
1a20: 4b1e ldr r3, [pc, #120] ; (1a9c <main+0xa4>)
|
|
1a22: 4798 blx r3
|
|
watch_set_date_time(date_time);
|
|
1a24: 9802 ldr r0, [sp, #8]
|
|
1a26: 6861 ldr r1, [r4, #4]
|
|
1a28: 4b1d ldr r3, [pc, #116] ; (1aa0 <main+0xa8>)
|
|
1a2a: 4798 blx r3
|
|
watch_enable_digital_output(A0);
|
|
1a2c: 2024 movs r0, #36 ; 0x24
|
|
1a2e: 4b1d ldr r3, [pc, #116] ; (1aa4 <main+0xac>)
|
|
1a30: 4798 blx r3
|
|
((Port *)hw)->Group[submodule_index].OUTSET.reg = mask;
|
|
1a32: 2110 movs r1, #16
|
|
1a34: 2398 movs r3, #152 ; 0x98
|
|
1a36: 22c0 movs r2, #192 ; 0xc0
|
|
1a38: 05d2 lsls r2, r2, #23
|
|
1a3a: 50d1 str r1, [r2, r3]
|
|
gpio_set_pin_level(A0, true);
|
|
watch_enable_i2c();
|
|
1a3c: 4b1a ldr r3, [pc, #104] ; (1aa8 <main+0xb0>)
|
|
1a3e: 4798 blx r3
|
|
|
|
uint8_t chipID = 0;
|
|
1a40: 466b mov r3, sp
|
|
1a42: 1ddc adds r4, r3, #7
|
|
1a44: 71dd strb r5, [r3, #7]
|
|
uint8_t ChipIdRegister = 0xD0;
|
|
1a46: 1d99 adds r1, r3, #6
|
|
1a48: 23d0 movs r3, #208 ; 0xd0
|
|
1a4a: 700b strb r3, [r1, #0]
|
|
watch_i2c_send(0x77, &ChipIdRegister, 1);
|
|
1a4c: 2201 movs r2, #1
|
|
1a4e: 2077 movs r0, #119 ; 0x77
|
|
1a50: 4b16 ldr r3, [pc, #88] ; (1aac <main+0xb4>)
|
|
1a52: 4798 blx r3
|
|
watch_i2c_receive(0x77, &chipID, 1);
|
|
1a54: 2201 movs r2, #1
|
|
1a56: 0021 movs r1, r4
|
|
1a58: 2077 movs r0, #119 ; 0x77
|
|
1a5a: 4b15 ldr r3, [pc, #84] ; (1ab0 <main+0xb8>)
|
|
1a5c: 4798 blx r3
|
|
if (chipID == 0x60) {
|
|
1a5e: 7823 ldrb r3, [r4, #0]
|
|
1a60: 2b60 cmp r3, #96 ; 0x60
|
|
1a62: d101 bne.n 1a68 <main+0x70>
|
|
watch_set_led_green();
|
|
1a64: 4b13 ldr r3, [pc, #76] ; (1ab4 <main+0xbc>)
|
|
1a66: 4798 blx r3
|
|
}
|
|
|
|
uint8_t last = date_time.time.sec;
|
|
1a68: ab02 add r3, sp, #8
|
|
1a6a: 781c ldrb r4, [r3, #0]
|
|
1a6c: e001 b.n 1a72 <main+0x7a>
|
|
if (date_time.time.sec != last) {
|
|
last = date_time.time.sec;
|
|
if (last % 2 == 0) {
|
|
watch_set_led_red();
|
|
} else {
|
|
watch_set_led_green();
|
|
1a6e: 4b11 ldr r3, [pc, #68] ; (1ab4 <main+0xbc>)
|
|
1a70: 4798 blx r3
|
|
{
|
|
1a72: 0025 movs r5, r4
|
|
watch_get_date_time(&date_time);
|
|
1a74: ac02 add r4, sp, #8
|
|
1a76: 0020 movs r0, r4
|
|
1a78: 4b0f ldr r3, [pc, #60] ; (1ab8 <main+0xc0>)
|
|
1a7a: 4798 blx r3
|
|
if (date_time.time.sec != last) {
|
|
1a7c: 7824 ldrb r4, [r4, #0]
|
|
1a7e: 42a5 cmp r5, r4
|
|
1a80: d0f8 beq.n 1a74 <main+0x7c>
|
|
if (last % 2 == 0) {
|
|
1a82: 07e3 lsls r3, r4, #31
|
|
1a84: d4f3 bmi.n 1a6e <main+0x76>
|
|
watch_set_led_red();
|
|
1a86: 4b0d ldr r3, [pc, #52] ; (1abc <main+0xc4>)
|
|
1a88: 4798 blx r3
|
|
1a8a: e7f2 b.n 1a72 <main+0x7a>
|
|
1a8c: 00000109 .word 0x00000109
|
|
1a90: 000007e5 .word 0x000007e5
|
|
1a94: 00001bb1 .word 0x00001bb1
|
|
1a98: 00001bb5 .word 0x00001bb5
|
|
1a9c: 00001c19 .word 0x00001c19
|
|
1aa0: 00001c35 .word 0x00001c35
|
|
1aa4: 00001c75 .word 0x00001c75
|
|
1aa8: 00001cb9 .word 0x00001cb9
|
|
1aac: 00001ce5 .word 0x00001ce5
|
|
1ab0: 00001d15 .word 0x00001d15
|
|
1ab4: 00001c05 .word 0x00001c05
|
|
1ab8: 00001c61 .word 0x00001c61
|
|
1abc: 00001bf1 .word 0x00001bf1
|
|
|
|
00001ac0 <sleepmgr_event_callback>:
|
|
*
|
|
* \param[in] id The event ID to process
|
|
* \param[in] data Not used
|
|
*/
|
|
static void sleepmgr_event_callback(event_id_t id, event_data_t data)
|
|
{
|
|
1ac0: b570 push {r4, r5, r6, lr}
|
|
1ac2: b082 sub sp, #8
|
|
1ac4: 000e movs r6, r1
|
|
if (EVENT_IS_READY_TO_SLEEP_ID == id) {
|
|
1ac6: 2800 cmp r0, #0
|
|
1ac8: d113 bne.n 1af2 <sleepmgr_event_callback+0x32>
|
|
* \return A pointer to the head of the given list or NULL if the list is
|
|
* empty
|
|
*/
|
|
static inline void *list_get_head(const struct list_descriptor *const list)
|
|
{
|
|
return (void *)list->head;
|
|
1aca: 4b16 ldr r3, [pc, #88] ; (1b24 <sleepmgr_event_callback+0x64>)
|
|
1acc: 681d ldr r5, [r3, #0]
|
|
struct sleepmgr_ready_to_sleep_cb *cur;
|
|
struct sleepmgr_ready_to_sleep * ret_val = (struct sleepmgr_ready_to_sleep *)data;
|
|
struct sleepmgr_ready_to_sleep ready;
|
|
|
|
for (cur = (struct sleepmgr_ready_to_sleep_cb *)list_get_head(&ready_to_sleep_cbs); cur;
|
|
1ace: e00c b.n 1aea <sleepmgr_event_callback+0x2a>
|
|
cur = (struct sleepmgr_ready_to_sleep_cb *)list_get_next_element(cur)) {
|
|
ready.mode = ret_val->mode;
|
|
1ad0: 7873 ldrb r3, [r6, #1]
|
|
1ad2: ac01 add r4, sp, #4
|
|
1ad4: 7063 strb r3, [r4, #1]
|
|
ready.ready = true;
|
|
1ad6: 2301 movs r3, #1
|
|
1ad8: 7023 strb r3, [r4, #0]
|
|
cur->cb(&ready);
|
|
1ada: 0020 movs r0, r4
|
|
1adc: 686b ldr r3, [r5, #4]
|
|
1ade: 4798 blx r3
|
|
ret_val->ready &= ready.ready;
|
|
1ae0: 7832 ldrb r2, [r6, #0]
|
|
1ae2: 7823 ldrb r3, [r4, #0]
|
|
1ae4: 4013 ands r3, r2
|
|
1ae6: 7033 strb r3, [r6, #0]
|
|
* \return A pointer to the next list element or NULL if there is not next
|
|
* element
|
|
*/
|
|
static inline void *list_get_next_element(const void *const element)
|
|
{
|
|
return element ? ((struct list_element *)element)->next : NULL;
|
|
1ae8: 682d ldr r5, [r5, #0]
|
|
for (cur = (struct sleepmgr_ready_to_sleep_cb *)list_get_head(&ready_to_sleep_cbs); cur;
|
|
1aea: 2d00 cmp r5, #0
|
|
1aec: d1f0 bne.n 1ad0 <sleepmgr_event_callback+0x10>
|
|
for (cur = (struct sleepmgr_prepare_to_sleep_cb *)list_get_head(&prepare_to_sleep_cbs); cur;
|
|
cur = (struct sleepmgr_prepare_to_sleep_cb *)list_get_next_element(cur)) {
|
|
cur->cb(data);
|
|
}
|
|
}
|
|
}
|
|
1aee: b002 add sp, #8
|
|
1af0: bd70 pop {r4, r5, r6, pc}
|
|
} else if (EVENT_WOKEN_UP_ID == id) {
|
|
1af2: 2802 cmp r0, #2
|
|
1af4: d004 beq.n 1b00 <sleepmgr_event_callback+0x40>
|
|
} else if (EVENT_PREPARE_TO_SLEEP_ID == id) {
|
|
1af6: 2801 cmp r0, #1
|
|
1af8: d1f9 bne.n 1aee <sleepmgr_event_callback+0x2e>
|
|
return (void *)list->head;
|
|
1afa: 4b0a ldr r3, [pc, #40] ; (1b24 <sleepmgr_event_callback+0x64>)
|
|
1afc: 689c ldr r4, [r3, #8]
|
|
for (cur = (struct sleepmgr_prepare_to_sleep_cb *)list_get_head(&prepare_to_sleep_cbs); cur;
|
|
1afe: e00d b.n 1b1c <sleepmgr_event_callback+0x5c>
|
|
1b00: 4b08 ldr r3, [pc, #32] ; (1b24 <sleepmgr_event_callback+0x64>)
|
|
1b02: 685c ldr r4, [r3, #4]
|
|
for (cur = (struct sleepmgr_wake_up_cb *)list_get_head(&wake_up_cbs); cur;
|
|
1b04: e003 b.n 1b0e <sleepmgr_event_callback+0x4e>
|
|
cur->cb((const enum sleepmgr_wakeup_source)data);
|
|
1b06: b2f0 uxtb r0, r6
|
|
1b08: 6863 ldr r3, [r4, #4]
|
|
1b0a: 4798 blx r3
|
|
return element ? ((struct list_element *)element)->next : NULL;
|
|
1b0c: 6824 ldr r4, [r4, #0]
|
|
for (cur = (struct sleepmgr_wake_up_cb *)list_get_head(&wake_up_cbs); cur;
|
|
1b0e: 2c00 cmp r4, #0
|
|
1b10: d1f9 bne.n 1b06 <sleepmgr_event_callback+0x46>
|
|
1b12: e7ec b.n 1aee <sleepmgr_event_callback+0x2e>
|
|
cur->cb(data);
|
|
1b14: b2f0 uxtb r0, r6
|
|
1b16: 6863 ldr r3, [r4, #4]
|
|
1b18: 4798 blx r3
|
|
1b1a: 6824 ldr r4, [r4, #0]
|
|
for (cur = (struct sleepmgr_prepare_to_sleep_cb *)list_get_head(&prepare_to_sleep_cbs); cur;
|
|
1b1c: 2c00 cmp r4, #0
|
|
1b1e: d1f9 bne.n 1b14 <sleepmgr_event_callback+0x54>
|
|
1b20: e7e5 b.n 1aee <sleepmgr_event_callback+0x2e>
|
|
1b22: 46c0 nop ; (mov r8, r8)
|
|
1b24: 20000070 .word 0x20000070
|
|
|
|
00001b28 <sleepmgr_init>:
|
|
{
|
|
1b28: b570 push {r4, r5, r6, lr}
|
|
event_subscribe(&sleepmgr_event, EVENT_PREPARE_TO_SLEEP_ID, sleepmgr_event_callback);
|
|
1b2a: 4e08 ldr r6, [pc, #32] ; (1b4c <sleepmgr_init+0x24>)
|
|
1b2c: 4c08 ldr r4, [pc, #32] ; (1b50 <sleepmgr_init+0x28>)
|
|
1b2e: 340c adds r4, #12
|
|
1b30: 0032 movs r2, r6
|
|
1b32: 2101 movs r1, #1
|
|
1b34: 0020 movs r0, r4
|
|
1b36: 4d07 ldr r5, [pc, #28] ; (1b54 <sleepmgr_init+0x2c>)
|
|
1b38: 47a8 blx r5
|
|
event_subscribe(&sleepmgr_event, EVENT_IS_READY_TO_SLEEP_ID, sleepmgr_event_callback);
|
|
1b3a: 0032 movs r2, r6
|
|
1b3c: 2100 movs r1, #0
|
|
1b3e: 0020 movs r0, r4
|
|
1b40: 47a8 blx r5
|
|
event_subscribe(&sleepmgr_event, EVENT_WOKEN_UP_ID, sleepmgr_event_callback);
|
|
1b42: 0032 movs r2, r6
|
|
1b44: 2102 movs r1, #2
|
|
1b46: 0020 movs r0, r4
|
|
1b48: 47a8 blx r5
|
|
}
|
|
1b4a: bd70 pop {r4, r5, r6, pc}
|
|
1b4c: 00001ac1 .word 0x00001ac1
|
|
1b50: 20000070 .word 0x20000070
|
|
1b54: 00000a71 .word 0x00000a71
|
|
|
|
00001b58 <sleepmgr_register_ready_to_sleep_callback>:
|
|
{
|
|
1b58: b510 push {r4, lr}
|
|
1b5a: 0004 movs r4, r0
|
|
ASSERT(cb);
|
|
1b5c: 1e43 subs r3, r0, #1
|
|
1b5e: 4198 sbcs r0, r3
|
|
1b60: b2c0 uxtb r0, r0
|
|
1b62: 2240 movs r2, #64 ; 0x40
|
|
1b64: 4903 ldr r1, [pc, #12] ; (1b74 <sleepmgr_register_ready_to_sleep_callback+0x1c>)
|
|
1b66: 4b04 ldr r3, [pc, #16] ; (1b78 <sleepmgr_register_ready_to_sleep_callback+0x20>)
|
|
1b68: 4798 blx r3
|
|
list_insert_as_head(&ready_to_sleep_cbs, cb);
|
|
1b6a: 0021 movs r1, r4
|
|
1b6c: 4803 ldr r0, [pc, #12] ; (1b7c <sleepmgr_register_ready_to_sleep_callback+0x24>)
|
|
1b6e: 4b04 ldr r3, [pc, #16] ; (1b80 <sleepmgr_register_ready_to_sleep_callback+0x28>)
|
|
1b70: 4798 blx r3
|
|
}
|
|
1b72: bd10 pop {r4, pc}
|
|
1b74: 000020fc .word 0x000020fc
|
|
1b78: 00000a69 .word 0x00000a69
|
|
1b7c: 20000070 .word 0x20000070
|
|
1b80: 00000b11 .word 0x00000b11
|
|
|
|
00001b84 <sleep_cb>:
|
|
|
|
static struct sleepmgr_ready_to_sleep_cb sleepmgr_cb;
|
|
|
|
static void sleep_cb(struct sleepmgr_ready_to_sleep *const ready)
|
|
{
|
|
ready->ready = false;
|
|
1b84: 2300 movs r3, #0
|
|
1b86: 7003 strb r3, [r0, #0]
|
|
}
|
|
1b88: 4770 bx lr
|
|
...
|
|
|
|
00001b8c <sleep_manager_init>:
|
|
|
|
void sleep_manager_init(void)
|
|
{
|
|
1b8c: b510 push {r4, lr}
|
|
sleepmgr_init();
|
|
1b8e: 4b04 ldr r3, [pc, #16] ; (1ba0 <sleep_manager_init+0x14>)
|
|
1b90: 4798 blx r3
|
|
|
|
sleepmgr_cb.cb = sleep_cb;
|
|
1b92: 4804 ldr r0, [pc, #16] ; (1ba4 <sleep_manager_init+0x18>)
|
|
1b94: 4b04 ldr r3, [pc, #16] ; (1ba8 <sleep_manager_init+0x1c>)
|
|
1b96: 6043 str r3, [r0, #4]
|
|
sleepmgr_register_ready_to_sleep_callback(&sleepmgr_cb);
|
|
1b98: 4b04 ldr r3, [pc, #16] ; (1bac <sleep_manager_init+0x20>)
|
|
1b9a: 4798 blx r3
|
|
}
|
|
1b9c: bd10 pop {r4, pc}
|
|
1b9e: 46c0 nop ; (mov r8, r8)
|
|
1ba0: 00001b29 .word 0x00001b29
|
|
1ba4: 20000088 .word 0x20000088
|
|
1ba8: 00001b85 .word 0x00001b85
|
|
1bac: 00001b59 .word 0x00001b59
|
|
|
|
00001bb0 <watch_init>:
|
|
|
|
#include "watch.h"
|
|
#include "driver_init.h"
|
|
|
|
void watch_init(Watch *watch) {
|
|
}
|
|
1bb0: 4770 bx lr
|
|
...
|
|
|
|
00001bb4 <watch_enable_led>:
|
|
|
|
void watch_enable_led() {
|
|
1bb4: b510 push {r4, lr}
|
|
PWM_0_init();
|
|
1bb6: 4b06 ldr r3, [pc, #24] ; (1bd0 <watch_enable_led+0x1c>)
|
|
1bb8: 4798 blx r3
|
|
pwm_set_parameters(&PWM_0, 10000, 0);
|
|
1bba: 4c06 ldr r4, [pc, #24] ; (1bd4 <watch_enable_led+0x20>)
|
|
1bbc: 2200 movs r2, #0
|
|
1bbe: 4906 ldr r1, [pc, #24] ; (1bd8 <watch_enable_led+0x24>)
|
|
1bc0: 0020 movs r0, r4
|
|
1bc2: 4b06 ldr r3, [pc, #24] ; (1bdc <watch_enable_led+0x28>)
|
|
1bc4: 4798 blx r3
|
|
pwm_enable(&PWM_0);
|
|
1bc6: 0020 movs r0, r4
|
|
1bc8: 4b05 ldr r3, [pc, #20] ; (1be0 <watch_enable_led+0x2c>)
|
|
1bca: 4798 blx r3
|
|
}
|
|
1bcc: bd10 pop {r4, pc}
|
|
1bce: 46c0 nop ; (mov r8, r8)
|
|
1bd0: 000002d5 .word 0x000002d5
|
|
1bd4: 20000090 .word 0x20000090
|
|
1bd8: 00002710 .word 0x00002710
|
|
1bdc: 00000a2d .word 0x00000a2d
|
|
1be0: 000009e9 .word 0x000009e9
|
|
|
|
00001be4 <watch_set_led_color>:
|
|
|
|
pwm_disable(&PWM_0);
|
|
}
|
|
|
|
void watch_set_led_color(uint16_t red, uint16_t green) {
|
|
TC3->COUNT16.CC[0].reg = red;
|
|
1be4: 4b01 ldr r3, [pc, #4] ; (1bec <watch_set_led_color+0x8>)
|
|
1be6: 8398 strh r0, [r3, #28]
|
|
TC3->COUNT16.CC[1].reg = green;
|
|
1be8: 83d9 strh r1, [r3, #30]
|
|
}
|
|
1bea: 4770 bx lr
|
|
1bec: 42002c00 .word 0x42002c00
|
|
|
|
00001bf0 <watch_set_led_red>:
|
|
|
|
void watch_set_led_red() {
|
|
1bf0: b510 push {r4, lr}
|
|
watch_set_led_color(65535, 0);
|
|
1bf2: 2100 movs r1, #0
|
|
1bf4: 4801 ldr r0, [pc, #4] ; (1bfc <watch_set_led_red+0xc>)
|
|
1bf6: 4b02 ldr r3, [pc, #8] ; (1c00 <watch_set_led_red+0x10>)
|
|
1bf8: 4798 blx r3
|
|
}
|
|
1bfa: bd10 pop {r4, pc}
|
|
1bfc: 0000ffff .word 0x0000ffff
|
|
1c00: 00001be5 .word 0x00001be5
|
|
|
|
00001c04 <watch_set_led_green>:
|
|
|
|
void watch_set_led_green() {
|
|
1c04: b510 push {r4, lr}
|
|
watch_set_led_color(0, 65535);
|
|
1c06: 4902 ldr r1, [pc, #8] ; (1c10 <watch_set_led_green+0xc>)
|
|
1c08: 2000 movs r0, #0
|
|
1c0a: 4b02 ldr r3, [pc, #8] ; (1c14 <watch_set_led_green+0x10>)
|
|
1c0c: 4798 blx r3
|
|
}
|
|
1c0e: bd10 pop {r4, pc}
|
|
1c10: 0000ffff .word 0x0000ffff
|
|
1c14: 00001be5 .word 0x00001be5
|
|
|
|
00001c18 <watch_enable_date_time>:
|
|
|
|
void watch_enable_date_time() {
|
|
1c18: b510 push {r4, lr}
|
|
CALENDAR_0_init();
|
|
1c1a: 4b03 ldr r3, [pc, #12] ; (1c28 <watch_enable_date_time+0x10>)
|
|
1c1c: 4798 blx r3
|
|
calendar_enable(&CALENDAR_0);
|
|
1c1e: 4803 ldr r0, [pc, #12] ; (1c2c <watch_enable_date_time+0x14>)
|
|
1c20: 4b03 ldr r3, [pc, #12] ; (1c30 <watch_enable_date_time+0x18>)
|
|
1c22: 4798 blx r3
|
|
}
|
|
1c24: bd10 pop {r4, pc}
|
|
1c26: 46c0 nop ; (mov r8, r8)
|
|
1c28: 0000019d .word 0x0000019d
|
|
1c2c: 200000b4 .word 0x200000b4
|
|
1c30: 000006fd .word 0x000006fd
|
|
|
|
00001c34 <watch_set_date_time>:
|
|
|
|
void watch_set_date_time(struct calendar_date_time date_time) {
|
|
1c34: b510 push {r4, lr}
|
|
1c36: b082 sub sp, #8
|
|
1c38: 9000 str r0, [sp, #0]
|
|
1c3a: 9101 str r1, [sp, #4]
|
|
calendar_set_date(&CALENDAR_0, &date_time.date);
|
|
1c3c: 4c05 ldr r4, [pc, #20] ; (1c54 <watch_set_date_time+0x20>)
|
|
1c3e: a901 add r1, sp, #4
|
|
1c40: 0020 movs r0, r4
|
|
1c42: 4b05 ldr r3, [pc, #20] ; (1c58 <watch_set_date_time+0x24>)
|
|
1c44: 4798 blx r3
|
|
calendar_set_time(&CALENDAR_0, &date_time.time);
|
|
1c46: 4669 mov r1, sp
|
|
1c48: 0020 movs r0, r4
|
|
1c4a: 4b04 ldr r3, [pc, #16] ; (1c5c <watch_set_date_time+0x28>)
|
|
1c4c: 4798 blx r3
|
|
}
|
|
1c4e: b002 add sp, #8
|
|
1c50: bd10 pop {r4, pc}
|
|
1c52: 46c0 nop ; (mov r8, r8)
|
|
1c54: 200000b4 .word 0x200000b4
|
|
1c58: 0000078d .word 0x0000078d
|
|
1c5c: 00000729 .word 0x00000729
|
|
|
|
00001c60 <watch_get_date_time>:
|
|
|
|
void watch_get_date_time(struct calendar_date_time *date_time) {
|
|
1c60: b510 push {r4, lr}
|
|
1c62: 0001 movs r1, r0
|
|
calendar_get_date_time(&CALENDAR_0, date_time);
|
|
1c64: 4801 ldr r0, [pc, #4] ; (1c6c <watch_get_date_time+0xc>)
|
|
1c66: 4b02 ldr r3, [pc, #8] ; (1c70 <watch_get_date_time+0x10>)
|
|
1c68: 4798 blx r3
|
|
}
|
|
1c6a: bd10 pop {r4, pc}
|
|
1c6c: 200000b4 .word 0x200000b4
|
|
1c70: 000007f1 .word 0x000007f1
|
|
|
|
00001c74 <watch_enable_digital_output>:
|
|
void watch_enable_digital_input(const uint8_t pin) {
|
|
gpio_set_pin_direction(pin, GPIO_DIRECTION_IN);
|
|
gpio_set_pin_function(pin, GPIO_PIN_FUNCTION_OFF);
|
|
}
|
|
|
|
void watch_enable_digital_output(const uint8_t pin) {
|
|
1c74: b570 push {r4, r5, r6, lr}
|
|
* GPIO_DIRECTION_OFF = Disables the pin
|
|
* (low power state)
|
|
*/
|
|
static inline void gpio_set_pin_direction(const uint8_t pin, const enum gpio_direction direction)
|
|
{
|
|
_gpio_set_direction((enum gpio_port)GPIO_PORT(pin), 1U << GPIO_PIN(pin), direction);
|
|
1c76: 0943 lsrs r3, r0, #5
|
|
1c78: 241f movs r4, #31
|
|
1c7a: 4004 ands r4, r0
|
|
1c7c: 2501 movs r5, #1
|
|
1c7e: 0029 movs r1, r5
|
|
1c80: 40a1 lsls r1, r4
|
|
((Port *)hw)->Group[submodule_index].DIRSET.reg = mask;
|
|
1c82: 01da lsls r2, r3, #7
|
|
1c84: 20c0 movs r0, #192 ; 0xc0
|
|
1c86: 05c0 lsls r0, r0, #23
|
|
1c88: 1810 adds r0, r2, r0
|
|
1c8a: 6081 str r1, [r0, #8]
|
|
| ((mask & 0xffff0000) >> 16));
|
|
break;
|
|
|
|
case GPIO_DIRECTION_OUT:
|
|
hri_port_set_DIR_reg(PORT_IOBUS, port, mask);
|
|
hri_port_write_WRCONFIG_reg(PORT, port, PORT_WRCONFIG_WRPINCFG | (mask & 0xffff));
|
|
1c8c: 040e lsls r6, r1, #16
|
|
1c8e: 0c36 lsrs r6, r6, #16
|
|
1c90: 2080 movs r0, #128 ; 0x80
|
|
1c92: 05c0 lsls r0, r0, #23
|
|
1c94: 4330 orrs r0, r6
|
|
((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data;
|
|
1c96: 4e07 ldr r6, [pc, #28] ; (1cb4 <watch_enable_digital_output+0x40>)
|
|
1c98: 46b4 mov ip, r6
|
|
1c9a: 4462 add r2, ip
|
|
1c9c: 6290 str r0, [r2, #40] ; 0x28
|
|
hri_port_write_WRCONFIG_reg(
|
|
PORT, port, PORT_WRCONFIG_HWSEL | PORT_WRCONFIG_WRPINCFG | ((mask & 0xffff0000) >> 16));
|
|
1c9e: 0c09 lsrs r1, r1, #16
|
|
hri_port_write_WRCONFIG_reg(
|
|
1ca0: 20c0 movs r0, #192 ; 0xc0
|
|
1ca2: 0600 lsls r0, r0, #24
|
|
1ca4: 4301 orrs r1, r0
|
|
1ca6: 6291 str r1, [r2, #40] ; 0x28
|
|
tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg;
|
|
1ca8: 1910 adds r0, r2, r4
|
|
1caa: 3040 adds r0, #64 ; 0x40
|
|
1cac: 7803 ldrb r3, [r0, #0]
|
|
tmp &= ~PORT_PINCFG_PMUXEN;
|
|
1cae: 43ab bics r3, r5
|
|
((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp;
|
|
1cb0: 7003 strb r3, [r0, #0]
|
|
gpio_set_pin_direction(pin, GPIO_DIRECTION_OUT);
|
|
gpio_set_pin_function(pin, GPIO_PIN_FUNCTION_OFF);
|
|
}
|
|
1cb2: bd70 pop {r4, r5, r6, pc}
|
|
1cb4: 41006000 .word 0x41006000
|
|
|
|
00001cb8 <watch_enable_i2c>:
|
|
|
|
struct io_descriptor *I2C_0_io;
|
|
|
|
void watch_enable_i2c() {
|
|
1cb8: b510 push {r4, lr}
|
|
I2C_0_init();
|
|
1cba: 4b05 ldr r3, [pc, #20] ; (1cd0 <watch_enable_i2c+0x18>)
|
|
1cbc: 4798 blx r3
|
|
i2c_m_sync_get_io_descriptor(&I2C_0, &I2C_0_io);
|
|
1cbe: 4c05 ldr r4, [pc, #20] ; (1cd4 <watch_enable_i2c+0x1c>)
|
|
1cc0: 4905 ldr r1, [pc, #20] ; (1cd8 <watch_enable_i2c+0x20>)
|
|
1cc2: 0020 movs r0, r4
|
|
1cc4: 4b05 ldr r3, [pc, #20] ; (1cdc <watch_enable_i2c+0x24>)
|
|
1cc6: 4798 blx r3
|
|
i2c_m_sync_enable(&I2C_0);
|
|
1cc8: 0020 movs r0, r4
|
|
1cca: 4b05 ldr r3, [pc, #20] ; (1ce0 <watch_enable_i2c+0x28>)
|
|
1ccc: 4798 blx r3
|
|
}
|
|
1cce: bd10 pop {r4, pc}
|
|
1cd0: 00000235 .word 0x00000235
|
|
1cd4: 200000f8 .word 0x200000f8
|
|
1cd8: 20000118 .word 0x20000118
|
|
1cdc: 00000907 .word 0x00000907
|
|
1ce0: 000008e9 .word 0x000008e9
|
|
|
|
00001ce4 <watch_i2c_send>:
|
|
|
|
void watch_i2c_send(int16_t addr, uint8_t *buf, uint16_t length) {
|
|
1ce4: b570 push {r4, r5, r6, lr}
|
|
1ce6: 000c movs r4, r1
|
|
1ce8: 0015 movs r5, r2
|
|
i2c_m_sync_set_slaveaddr(&I2C_0, addr, I2C_M_SEVEN);
|
|
1cea: 2280 movs r2, #128 ; 0x80
|
|
1cec: 0112 lsls r2, r2, #4
|
|
1cee: 0001 movs r1, r0
|
|
1cf0: 4804 ldr r0, [pc, #16] ; (1d04 <watch_i2c_send+0x20>)
|
|
1cf2: 4b05 ldr r3, [pc, #20] ; (1d08 <watch_i2c_send+0x24>)
|
|
1cf4: 4798 blx r3
|
|
io_write(I2C_0_io, buf, length);
|
|
1cf6: 4b05 ldr r3, [pc, #20] ; (1d0c <watch_i2c_send+0x28>)
|
|
1cf8: 6818 ldr r0, [r3, #0]
|
|
1cfa: 002a movs r2, r5
|
|
1cfc: 0021 movs r1, r4
|
|
1cfe: 4b04 ldr r3, [pc, #16] ; (1d10 <watch_i2c_send+0x2c>)
|
|
1d00: 4798 blx r3
|
|
}
|
|
1d02: bd70 pop {r4, r5, r6, pc}
|
|
1d04: 200000f8 .word 0x200000f8
|
|
1d08: 000008f5 .word 0x000008f5
|
|
1d0c: 20000118 .word 0x20000118
|
|
1d10: 00000911 .word 0x00000911
|
|
|
|
00001d14 <watch_i2c_receive>:
|
|
|
|
void watch_i2c_receive(int16_t addr, uint8_t *buf, uint16_t length) {
|
|
1d14: b570 push {r4, r5, r6, lr}
|
|
1d16: 000c movs r4, r1
|
|
1d18: 0015 movs r5, r2
|
|
i2c_m_sync_set_slaveaddr(&I2C_0, addr, I2C_M_SEVEN);
|
|
1d1a: 2280 movs r2, #128 ; 0x80
|
|
1d1c: 0112 lsls r2, r2, #4
|
|
1d1e: 0001 movs r1, r0
|
|
1d20: 4804 ldr r0, [pc, #16] ; (1d34 <watch_i2c_receive+0x20>)
|
|
1d22: 4b05 ldr r3, [pc, #20] ; (1d38 <watch_i2c_receive+0x24>)
|
|
1d24: 4798 blx r3
|
|
io_read(I2C_0_io, buf, length);
|
|
1d26: 4b05 ldr r3, [pc, #20] ; (1d3c <watch_i2c_receive+0x28>)
|
|
1d28: 6818 ldr r0, [r3, #0]
|
|
1d2a: 002a movs r2, r5
|
|
1d2c: 0021 movs r1, r4
|
|
1d2e: 4b04 ldr r3, [pc, #16] ; (1d40 <watch_i2c_receive+0x2c>)
|
|
1d30: 4798 blx r3
|
|
}
|
|
1d32: bd70 pop {r4, r5, r6, pc}
|
|
1d34: 200000f8 .word 0x200000f8
|
|
1d38: 000008f5 .word 0x000008f5
|
|
1d3c: 20000118 .word 0x20000118
|
|
1d40: 00000949 .word 0x00000949
|
|
|
|
00001d44 <__udivsi3>:
|
|
1d44: 2200 movs r2, #0
|
|
1d46: 0843 lsrs r3, r0, #1
|
|
1d48: 428b cmp r3, r1
|
|
1d4a: d374 bcc.n 1e36 <__udivsi3+0xf2>
|
|
1d4c: 0903 lsrs r3, r0, #4
|
|
1d4e: 428b cmp r3, r1
|
|
1d50: d35f bcc.n 1e12 <__udivsi3+0xce>
|
|
1d52: 0a03 lsrs r3, r0, #8
|
|
1d54: 428b cmp r3, r1
|
|
1d56: d344 bcc.n 1de2 <__udivsi3+0x9e>
|
|
1d58: 0b03 lsrs r3, r0, #12
|
|
1d5a: 428b cmp r3, r1
|
|
1d5c: d328 bcc.n 1db0 <__udivsi3+0x6c>
|
|
1d5e: 0c03 lsrs r3, r0, #16
|
|
1d60: 428b cmp r3, r1
|
|
1d62: d30d bcc.n 1d80 <__udivsi3+0x3c>
|
|
1d64: 22ff movs r2, #255 ; 0xff
|
|
1d66: 0209 lsls r1, r1, #8
|
|
1d68: ba12 rev r2, r2
|
|
1d6a: 0c03 lsrs r3, r0, #16
|
|
1d6c: 428b cmp r3, r1
|
|
1d6e: d302 bcc.n 1d76 <__udivsi3+0x32>
|
|
1d70: 1212 asrs r2, r2, #8
|
|
1d72: 0209 lsls r1, r1, #8
|
|
1d74: d065 beq.n 1e42 <__udivsi3+0xfe>
|
|
1d76: 0b03 lsrs r3, r0, #12
|
|
1d78: 428b cmp r3, r1
|
|
1d7a: d319 bcc.n 1db0 <__udivsi3+0x6c>
|
|
1d7c: e000 b.n 1d80 <__udivsi3+0x3c>
|
|
1d7e: 0a09 lsrs r1, r1, #8
|
|
1d80: 0bc3 lsrs r3, r0, #15
|
|
1d82: 428b cmp r3, r1
|
|
1d84: d301 bcc.n 1d8a <__udivsi3+0x46>
|
|
1d86: 03cb lsls r3, r1, #15
|
|
1d88: 1ac0 subs r0, r0, r3
|
|
1d8a: 4152 adcs r2, r2
|
|
1d8c: 0b83 lsrs r3, r0, #14
|
|
1d8e: 428b cmp r3, r1
|
|
1d90: d301 bcc.n 1d96 <__udivsi3+0x52>
|
|
1d92: 038b lsls r3, r1, #14
|
|
1d94: 1ac0 subs r0, r0, r3
|
|
1d96: 4152 adcs r2, r2
|
|
1d98: 0b43 lsrs r3, r0, #13
|
|
1d9a: 428b cmp r3, r1
|
|
1d9c: d301 bcc.n 1da2 <__udivsi3+0x5e>
|
|
1d9e: 034b lsls r3, r1, #13
|
|
1da0: 1ac0 subs r0, r0, r3
|
|
1da2: 4152 adcs r2, r2
|
|
1da4: 0b03 lsrs r3, r0, #12
|
|
1da6: 428b cmp r3, r1
|
|
1da8: d301 bcc.n 1dae <__udivsi3+0x6a>
|
|
1daa: 030b lsls r3, r1, #12
|
|
1dac: 1ac0 subs r0, r0, r3
|
|
1dae: 4152 adcs r2, r2
|
|
1db0: 0ac3 lsrs r3, r0, #11
|
|
1db2: 428b cmp r3, r1
|
|
1db4: d301 bcc.n 1dba <__udivsi3+0x76>
|
|
1db6: 02cb lsls r3, r1, #11
|
|
1db8: 1ac0 subs r0, r0, r3
|
|
1dba: 4152 adcs r2, r2
|
|
1dbc: 0a83 lsrs r3, r0, #10
|
|
1dbe: 428b cmp r3, r1
|
|
1dc0: d301 bcc.n 1dc6 <__udivsi3+0x82>
|
|
1dc2: 028b lsls r3, r1, #10
|
|
1dc4: 1ac0 subs r0, r0, r3
|
|
1dc6: 4152 adcs r2, r2
|
|
1dc8: 0a43 lsrs r3, r0, #9
|
|
1dca: 428b cmp r3, r1
|
|
1dcc: d301 bcc.n 1dd2 <__udivsi3+0x8e>
|
|
1dce: 024b lsls r3, r1, #9
|
|
1dd0: 1ac0 subs r0, r0, r3
|
|
1dd2: 4152 adcs r2, r2
|
|
1dd4: 0a03 lsrs r3, r0, #8
|
|
1dd6: 428b cmp r3, r1
|
|
1dd8: d301 bcc.n 1dde <__udivsi3+0x9a>
|
|
1dda: 020b lsls r3, r1, #8
|
|
1ddc: 1ac0 subs r0, r0, r3
|
|
1dde: 4152 adcs r2, r2
|
|
1de0: d2cd bcs.n 1d7e <__udivsi3+0x3a>
|
|
1de2: 09c3 lsrs r3, r0, #7
|
|
1de4: 428b cmp r3, r1
|
|
1de6: d301 bcc.n 1dec <__udivsi3+0xa8>
|
|
1de8: 01cb lsls r3, r1, #7
|
|
1dea: 1ac0 subs r0, r0, r3
|
|
1dec: 4152 adcs r2, r2
|
|
1dee: 0983 lsrs r3, r0, #6
|
|
1df0: 428b cmp r3, r1
|
|
1df2: d301 bcc.n 1df8 <__udivsi3+0xb4>
|
|
1df4: 018b lsls r3, r1, #6
|
|
1df6: 1ac0 subs r0, r0, r3
|
|
1df8: 4152 adcs r2, r2
|
|
1dfa: 0943 lsrs r3, r0, #5
|
|
1dfc: 428b cmp r3, r1
|
|
1dfe: d301 bcc.n 1e04 <__udivsi3+0xc0>
|
|
1e00: 014b lsls r3, r1, #5
|
|
1e02: 1ac0 subs r0, r0, r3
|
|
1e04: 4152 adcs r2, r2
|
|
1e06: 0903 lsrs r3, r0, #4
|
|
1e08: 428b cmp r3, r1
|
|
1e0a: d301 bcc.n 1e10 <__udivsi3+0xcc>
|
|
1e0c: 010b lsls r3, r1, #4
|
|
1e0e: 1ac0 subs r0, r0, r3
|
|
1e10: 4152 adcs r2, r2
|
|
1e12: 08c3 lsrs r3, r0, #3
|
|
1e14: 428b cmp r3, r1
|
|
1e16: d301 bcc.n 1e1c <__udivsi3+0xd8>
|
|
1e18: 00cb lsls r3, r1, #3
|
|
1e1a: 1ac0 subs r0, r0, r3
|
|
1e1c: 4152 adcs r2, r2
|
|
1e1e: 0883 lsrs r3, r0, #2
|
|
1e20: 428b cmp r3, r1
|
|
1e22: d301 bcc.n 1e28 <__udivsi3+0xe4>
|
|
1e24: 008b lsls r3, r1, #2
|
|
1e26: 1ac0 subs r0, r0, r3
|
|
1e28: 4152 adcs r2, r2
|
|
1e2a: 0843 lsrs r3, r0, #1
|
|
1e2c: 428b cmp r3, r1
|
|
1e2e: d301 bcc.n 1e34 <__udivsi3+0xf0>
|
|
1e30: 004b lsls r3, r1, #1
|
|
1e32: 1ac0 subs r0, r0, r3
|
|
1e34: 4152 adcs r2, r2
|
|
1e36: 1a41 subs r1, r0, r1
|
|
1e38: d200 bcs.n 1e3c <__udivsi3+0xf8>
|
|
1e3a: 4601 mov r1, r0
|
|
1e3c: 4152 adcs r2, r2
|
|
1e3e: 4610 mov r0, r2
|
|
1e40: 4770 bx lr
|
|
1e42: e7ff b.n 1e44 <__udivsi3+0x100>
|
|
1e44: b501 push {r0, lr}
|
|
1e46: 2000 movs r0, #0
|
|
1e48: f000 f806 bl 1e58 <__aeabi_idiv0>
|
|
1e4c: bd02 pop {r1, pc}
|
|
1e4e: 46c0 nop ; (mov r8, r8)
|
|
|
|
00001e50 <__aeabi_uidivmod>:
|
|
1e50: 2900 cmp r1, #0
|
|
1e52: d0f7 beq.n 1e44 <__udivsi3+0x100>
|
|
1e54: e776 b.n 1d44 <__udivsi3>
|
|
1e56: 4770 bx lr
|
|
|
|
00001e58 <__aeabi_idiv0>:
|
|
1e58: 4770 bx lr
|
|
1e5a: 46c0 nop ; (mov r8, r8)
|
|
|
|
00001e5c <__ffssi2>:
|
|
1e5c: b510 push {r4, lr}
|
|
1e5e: 2300 movs r3, #0
|
|
1e60: 2800 cmp r0, #0
|
|
1e62: d002 beq.n 1e6a <__ffssi2+0xe>
|
|
1e64: f000 f804 bl 1e70 <__ctzsi2>
|
|
1e68: 1c43 adds r3, r0, #1
|
|
1e6a: 0018 movs r0, r3
|
|
1e6c: bd10 pop {r4, pc}
|
|
1e6e: 46c0 nop ; (mov r8, r8)
|
|
|
|
00001e70 <__ctzsi2>:
|
|
1e70: 4241 negs r1, r0
|
|
1e72: 4008 ands r0, r1
|
|
1e74: 211c movs r1, #28
|
|
1e76: 2301 movs r3, #1
|
|
1e78: 041b lsls r3, r3, #16
|
|
1e7a: 4298 cmp r0, r3
|
|
1e7c: d301 bcc.n 1e82 <__ctzsi2+0x12>
|
|
1e7e: 0c00 lsrs r0, r0, #16
|
|
1e80: 3910 subs r1, #16
|
|
1e82: 0a1b lsrs r3, r3, #8
|
|
1e84: 4298 cmp r0, r3
|
|
1e86: d301 bcc.n 1e8c <__ctzsi2+0x1c>
|
|
1e88: 0a00 lsrs r0, r0, #8
|
|
1e8a: 3908 subs r1, #8
|
|
1e8c: 091b lsrs r3, r3, #4
|
|
1e8e: 4298 cmp r0, r3
|
|
1e90: d301 bcc.n 1e96 <__ctzsi2+0x26>
|
|
1e92: 0900 lsrs r0, r0, #4
|
|
1e94: 3904 subs r1, #4
|
|
1e96: a202 add r2, pc, #8 ; (adr r2, 1ea0 <__ctzsi2+0x30>)
|
|
1e98: 5c10 ldrb r0, [r2, r0]
|
|
1e9a: 1a40 subs r0, r0, r1
|
|
1e9c: 4770 bx lr
|
|
1e9e: 46c0 nop ; (mov r8, r8)
|
|
1ea0: 1d1d1c1b .word 0x1d1d1c1b
|
|
1ea4: 1e1e1e1e .word 0x1e1e1e1e
|
|
1ea8: 1f1f1f1f .word 0x1f1f1f1f
|
|
1eac: 1f1f1f1f .word 0x1f1f1f1f
|
|
|
|
00001eb0 <__libc_init_array>:
|
|
1eb0: b570 push {r4, r5, r6, lr}
|
|
1eb2: 2600 movs r6, #0
|
|
1eb4: 4d0c ldr r5, [pc, #48] ; (1ee8 <__libc_init_array+0x38>)
|
|
1eb6: 4c0d ldr r4, [pc, #52] ; (1eec <__libc_init_array+0x3c>)
|
|
1eb8: 1b64 subs r4, r4, r5
|
|
1eba: 10a4 asrs r4, r4, #2
|
|
1ebc: 42a6 cmp r6, r4
|
|
1ebe: d109 bne.n 1ed4 <__libc_init_array+0x24>
|
|
1ec0: 2600 movs r6, #0
|
|
1ec2: f000 f92d bl 2120 <_init>
|
|
1ec6: 4d0a ldr r5, [pc, #40] ; (1ef0 <__libc_init_array+0x40>)
|
|
1ec8: 4c0a ldr r4, [pc, #40] ; (1ef4 <__libc_init_array+0x44>)
|
|
1eca: 1b64 subs r4, r4, r5
|
|
1ecc: 10a4 asrs r4, r4, #2
|
|
1ece: 42a6 cmp r6, r4
|
|
1ed0: d105 bne.n 1ede <__libc_init_array+0x2e>
|
|
1ed2: bd70 pop {r4, r5, r6, pc}
|
|
1ed4: 00b3 lsls r3, r6, #2
|
|
1ed6: 58eb ldr r3, [r5, r3]
|
|
1ed8: 4798 blx r3
|
|
1eda: 3601 adds r6, #1
|
|
1edc: e7ee b.n 1ebc <__libc_init_array+0xc>
|
|
1ede: 00b3 lsls r3, r6, #2
|
|
1ee0: 58eb ldr r3, [r5, r3]
|
|
1ee2: 4798 blx r3
|
|
1ee4: 3601 adds r6, #1
|
|
1ee6: e7f2 b.n 1ece <__libc_init_array+0x1e>
|
|
1ee8: 0000212c .word 0x0000212c
|
|
1eec: 0000212c .word 0x0000212c
|
|
1ef0: 0000212c .word 0x0000212c
|
|
1ef4: 00002130 .word 0x00002130
|
|
1ef8: 000003c2 .word 0x000003c2
|
|
1efc: 000003e6 .word 0x000003e6
|
|
1f00: 000003c6 .word 0x000003c6
|
|
1f04: 000003e6 .word 0x000003e6
|
|
1f08: 000003ca .word 0x000003ca
|
|
1f0c: 000003e6 .word 0x000003e6
|
|
1f10: 000003ca .word 0x000003ca
|
|
1f14: 000003e6 .word 0x000003e6
|
|
1f18: 000003e6 .word 0x000003e6
|
|
1f1c: 000003ca .word 0x000003ca
|
|
1f20: 000003e6 .word 0x000003e6
|
|
1f24: 000003ca .word 0x000003ca
|
|
1f28: 000003e6 .word 0x000003e6
|
|
1f2c: 000003da .word 0x000003da
|
|
1f30: 000003ea .word 0x000003ea
|
|
1f34: 000003de .word 0x000003de
|
|
1f38: 000003ea .word 0x000003ea
|
|
1f3c: 000003e2 .word 0x000003e2
|
|
1f40: 000003ea .word 0x000003ea
|
|
1f44: 000003e2 .word 0x000003e2
|
|
1f48: 000003ea .word 0x000003ea
|
|
1f4c: 000003ea .word 0x000003ea
|
|
1f50: 000003e2 .word 0x000003e2
|
|
1f54: 000003ea .word 0x000003ea
|
|
1f58: 000003e2 .word 0x000003e2
|
|
1f5c: 000003ea .word 0x000003ea
|
|
1f60: 0000058c .word 0x0000058c
|
|
1f64: 00000586 .word 0x00000586
|
|
1f68: 00000590 .word 0x00000590
|
|
1f6c: 0000059e .word 0x0000059e
|
|
1f70: 000005aa .word 0x000005aa
|
|
1f74: 000005ba .word 0x000005ba
|
|
1f78: 00000636 .word 0x00000636
|
|
1f7c: 00000618 .word 0x00000618
|
|
1f80: 0000065a .word 0x0000065a
|
|
1f84: 00000674 .word 0x00000674
|
|
1f88: 00000688 .word 0x00000688
|
|
1f8c: 00000696 .word 0x00000696
|
|
1f90: 682f2e2e .word 0x682f2e2e
|
|
1f94: 732f6c61 .word 0x732f6c61
|
|
1f98: 682f6372 .word 0x682f6372
|
|
1f9c: 635f6c61 .word 0x635f6c61
|
|
1fa0: 6e656c61 .word 0x6e656c61
|
|
1fa4: 2e726164 .word 0x2e726164
|
|
1fa8: 00000063 .word 0x00000063
|
|
1fac: 682f2e2e .word 0x682f2e2e
|
|
1fb0: 732f6c61 .word 0x732f6c61
|
|
1fb4: 682f6372 .word 0x682f6372
|
|
1fb8: 695f6c61 .word 0x695f6c61
|
|
1fbc: 6d5f6332 .word 0x6d5f6332
|
|
1fc0: 6e79735f .word 0x6e79735f
|
|
1fc4: 00632e63 .word 0x00632e63
|
|
1fc8: 682f2e2e .word 0x682f2e2e
|
|
1fcc: 732f6c61 .word 0x732f6c61
|
|
1fd0: 682f6372 .word 0x682f6372
|
|
1fd4: 695f6c61 .word 0x695f6c61
|
|
1fd8: 00632e6f .word 0x00632e6f
|
|
1fdc: 682f2e2e .word 0x682f2e2e
|
|
1fe0: 732f6c61 .word 0x732f6c61
|
|
1fe4: 682f6372 .word 0x682f6372
|
|
1fe8: 705f6c61 .word 0x705f6c61
|
|
1fec: 632e6d77 .word 0x632e6d77
|
|
1ff0: 00000000 .word 0x00000000
|
|
1ff4: 682f2e2e .word 0x682f2e2e
|
|
1ff8: 752f6c61 .word 0x752f6c61
|
|
1ffc: 736c6974 .word 0x736c6974
|
|
2000: 6372732f .word 0x6372732f
|
|
2004: 6974752f .word 0x6974752f
|
|
2008: 655f736c .word 0x655f736c
|
|
200c: 746e6576 .word 0x746e6576
|
|
2010: 0000632e .word 0x0000632e
|
|
2014: 682f2e2e .word 0x682f2e2e
|
|
2018: 752f6c61 .word 0x752f6c61
|
|
201c: 736c6974 .word 0x736c6974
|
|
2020: 6372732f .word 0x6372732f
|
|
2024: 6974752f .word 0x6974752f
|
|
2028: 6c5f736c .word 0x6c5f736c
|
|
202c: 2e747369 .word 0x2e747369
|
|
2030: 00000063 .word 0x00000063
|
|
|
|
00002034 <_map>:
|
|
2034: 00000005 00000025 00000006 00000016 ....%...........
|
|
2044: 00000007 00000017 682f2e2e 652f6c70 ........../hpl/e
|
|
2054: 682f6369 655f6c70 632e6369 00000000 ic/hpl_eic.c....
|
|
2064: 682f2e2e 722f6c70 682f6374 725f6c70 ../hpl/rtc/hpl_r
|
|
2074: 632e6374 00000000 tc.c....
|
|
|
|
0000207c <_usarts>:
|
|
...
|
|
|
|
00002090 <_i2cms>:
|
|
2090: 00000001 00200014 00000100 00000f0e ...... .........
|
|
20a0: 00d70000 003d0900 ......=.
|
|
|
|
000020a8 <_i2css>:
|
|
...
|
|
|
|
000020b8 <sercomspi_regs>:
|
|
...
|
|
20cc: 682f2e2e 732f6c70 6f637265 70682f6d ../hpl/sercom/hp
|
|
20dc: 65735f6c 6d6f6372 0000632e 682f2e2e l_sercom.c..../h
|
|
20ec: 742f6c70 70682f63 63745f6c 0000632e pl/tc/hpl_tc.c..
|
|
20fc: 732f2e2e 7065656c 6e616d5f 72656761 ../sleep_manager
|
|
210c: 656c732f 6d5f7065 67616e61 632e7265 /sleep_manager.c
|
|
211c: 00000000 ....
|
|
|
|
00002120 <_init>:
|
|
2120: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
2122: 46c0 nop ; (mov r8, r8)
|
|
2124: bcf8 pop {r3, r4, r5, r6, r7}
|
|
2126: bc08 pop {r3}
|
|
2128: 469e mov lr, r3
|
|
212a: 4770 bx lr
|
|
|
|
0000212c <__init_array_start>:
|
|
212c: 000000d1 .word 0x000000d1
|
|
|
|
00002130 <_fini>:
|
|
2130: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
2132: 46c0 nop ; (mov r8, r8)
|
|
2134: bcf8 pop {r3, r4, r5, r6, r7}
|
|
2136: bc08 pop {r3}
|
|
2138: 469e mov lr, r3
|
|
213a: 4770 bx lr
|
|
|
|
0000213c <__fini_array_start>:
|
|
213c: 000000a9 .word 0x000000a9
|