diff options
Diffstat (limited to 'Smol Watch Project/My Project/Debug/My Project.lss')
-rw-r--r-- | Smol Watch Project/My Project/Debug/My Project.lss | 5931 |
1 files changed, 5931 insertions, 0 deletions
diff --git a/Smol Watch Project/My Project/Debug/My Project.lss b/Smol Watch Project/My Project/Debug/My Project.lss new file mode 100644 index 00000000..b6e56b2d --- /dev/null +++ b/Smol Watch Project/My Project/Debug/My Project.lss @@ -0,0 +1,5931 @@ +
+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
|