You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9181 lines
350 KiB
Plaintext
9181 lines
350 KiB
Plaintext
|
|
D21_ADC_with_DMA.elf: file format elf32-littlearm
|
|
|
|
Sections:
|
|
Idx Name Size VMA LMA File off Algn
|
|
0 .text 00003960 00000000 00000000 00010000 2**2
|
|
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
|
1 .relocate 0000007c 20000000 00003960 00020000 2**2
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
2 .bss 00000220 20000080 000039e0 0002007c 2**4
|
|
ALLOC
|
|
3 .stack 00002000 200002a0 00003c00 0002007c 2**0
|
|
ALLOC
|
|
4 .ARM.attributes 00000028 00000000 00000000 0002007c 2**0
|
|
CONTENTS, READONLY
|
|
5 .comment 00000059 00000000 00000000 000200a4 2**0
|
|
CONTENTS, READONLY
|
|
6 .debug_info 0002e296 00000000 00000000 000200fd 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
7 .debug_abbrev 00004281 00000000 00000000 0004e393 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
8 .debug_loc 00004e91 00000000 00000000 00052614 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
9 .debug_aranges 00000548 00000000 00000000 000574a5 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
10 .debug_ranges 00000610 00000000 00000000 000579ed 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
11 .debug_macro 0001ca44 00000000 00000000 00057ffd 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
12 .debug_line 0000e317 00000000 00000000 00074a41 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
13 .debug_str 00090169 00000000 00000000 00082d58 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
14 .debug_frame 000014c8 00000000 00000000 00112ec4 2**2
|
|
CONTENTS, READONLY, DEBUGGING
|
|
|
|
Disassembly of section .text:
|
|
|
|
00000000 <exception_table>:
|
|
0: a0 22 00 20 51 1c 00 00 4d 1c 00 00 4d 1c 00 00 .". Q...M...M...
|
|
...
|
|
2c: 4d 1c 00 00 00 00 00 00 00 00 00 00 4d 1c 00 00 M...........M...
|
|
3c: 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 M...M...M...M...
|
|
4c: 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 4d 05 00 00 M...M...M...M...
|
|
5c: 4d 1c 00 00 4d 1c 00 00 15 15 00 00 25 15 00 00 M...M.......%...
|
|
6c: 35 15 00 00 45 15 00 00 55 15 00 00 65 15 00 00 5...E...U...e...
|
|
7c: 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 M...M...M...M...
|
|
8c: 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 M...M...M...M...
|
|
9c: 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 4d 1c 00 00 M...M...M...M...
|
|
ac: 4d 1c 00 00 00 00 00 00 M.......
|
|
|
|
000000b4 <__do_global_dtors_aux>:
|
|
b4: b510 push {r4, lr}
|
|
b6: 4c06 ldr r4, [pc, #24] ; (d0 <__do_global_dtors_aux+0x1c>)
|
|
b8: 7823 ldrb r3, [r4, #0]
|
|
ba: 2b00 cmp r3, #0
|
|
bc: d107 bne.n ce <__do_global_dtors_aux+0x1a>
|
|
be: 4b05 ldr r3, [pc, #20] ; (d4 <__do_global_dtors_aux+0x20>)
|
|
c0: 2b00 cmp r3, #0
|
|
c2: d002 beq.n ca <__do_global_dtors_aux+0x16>
|
|
c4: 4804 ldr r0, [pc, #16] ; (d8 <__do_global_dtors_aux+0x24>)
|
|
c6: e000 b.n ca <__do_global_dtors_aux+0x16>
|
|
c8: bf00 nop
|
|
ca: 2301 movs r3, #1
|
|
cc: 7023 strb r3, [r4, #0]
|
|
ce: bd10 pop {r4, pc}
|
|
d0: 20000080 .word 0x20000080
|
|
d4: 00000000 .word 0x00000000
|
|
d8: 00003960 .word 0x00003960
|
|
|
|
000000dc <frame_dummy>:
|
|
dc: 4b08 ldr r3, [pc, #32] ; (100 <frame_dummy+0x24>)
|
|
de: b510 push {r4, lr}
|
|
e0: 2b00 cmp r3, #0
|
|
e2: d003 beq.n ec <frame_dummy+0x10>
|
|
e4: 4907 ldr r1, [pc, #28] ; (104 <frame_dummy+0x28>)
|
|
e6: 4808 ldr r0, [pc, #32] ; (108 <frame_dummy+0x2c>)
|
|
e8: e000 b.n ec <frame_dummy+0x10>
|
|
ea: bf00 nop
|
|
ec: 4807 ldr r0, [pc, #28] ; (10c <frame_dummy+0x30>)
|
|
ee: 6803 ldr r3, [r0, #0]
|
|
f0: 2b00 cmp r3, #0
|
|
f2: d100 bne.n f6 <frame_dummy+0x1a>
|
|
f4: bd10 pop {r4, pc}
|
|
f6: 4b06 ldr r3, [pc, #24] ; (110 <frame_dummy+0x34>)
|
|
f8: 2b00 cmp r3, #0
|
|
fa: d0fb beq.n f4 <frame_dummy+0x18>
|
|
fc: 4798 blx r3
|
|
fe: e7f9 b.n f4 <frame_dummy+0x18>
|
|
100: 00000000 .word 0x00000000
|
|
104: 20000084 .word 0x20000084
|
|
108: 00003960 .word 0x00003960
|
|
10c: 00003960 .word 0x00003960
|
|
110: 00000000 .word 0x00000000
|
|
|
|
00000114 <adc_get_config_defaults>:
|
|
*
|
|
* \param[out] config Pointer to configuration struct to initialize to
|
|
* default values
|
|
*/
|
|
void adc_get_config_defaults(struct adc_config *const config)
|
|
{
|
|
114: b510 push {r4, lr}
|
|
Assert(config);
|
|
config->clock_source = GCLK_GENERATOR_0;
|
|
116: 2200 movs r2, #0
|
|
118: 2300 movs r3, #0
|
|
11a: 7002 strb r2, [r0, #0]
|
|
config->reference = ADC_REFERENCE_INT1V;
|
|
11c: 7042 strb r2, [r0, #1]
|
|
config->clock_prescaler = ADC_CLOCK_PRESCALER_DIV4;
|
|
11e: 2100 movs r1, #0
|
|
120: 8042 strh r2, [r0, #2]
|
|
config->resolution = ADC_RESOLUTION_12BIT;
|
|
122: 7101 strb r1, [r0, #4]
|
|
config->window.window_mode = ADC_WINDOW_MODE_DISABLE;
|
|
124: 7603 strb r3, [r0, #24]
|
|
config->window.window_upper_value = 0;
|
|
126: 6202 str r2, [r0, #32]
|
|
config->window.window_lower_value = 0;
|
|
128: 61c2 str r2, [r0, #28]
|
|
config->gain_factor = ADC_GAIN_FACTOR_1X;
|
|
12a: 6082 str r2, [r0, #8]
|
|
#if SAMR21
|
|
config->positive_input = ADC_POSITIVE_INPUT_PIN6 ;
|
|
#else
|
|
config->positive_input = ADC_POSITIVE_INPUT_PIN0 ;
|
|
12c: 7303 strb r3, [r0, #12]
|
|
#endif
|
|
config->negative_input = ADC_NEGATIVE_INPUT_GND ;
|
|
12e: 24c0 movs r4, #192 ; 0xc0
|
|
130: 0164 lsls r4, r4, #5
|
|
132: 81c4 strh r4, [r0, #14]
|
|
config->accumulate_samples = ADC_ACCUMULATE_DISABLE;
|
|
134: 7403 strb r3, [r0, #16]
|
|
config->divide_result = ADC_DIVIDE_RESULT_DISABLE;
|
|
136: 7443 strb r3, [r0, #17]
|
|
config->left_adjust = false;
|
|
138: 7483 strb r3, [r0, #18]
|
|
config->differential_mode = false;
|
|
13a: 74c3 strb r3, [r0, #19]
|
|
config->freerunning = false;
|
|
13c: 7503 strb r3, [r0, #20]
|
|
config->event_action = ADC_EVENT_ACTION_DISABLED;
|
|
13e: 242a movs r4, #42 ; 0x2a
|
|
140: 5503 strb r3, [r0, r4]
|
|
config->run_in_standby = false;
|
|
142: 7543 strb r3, [r0, #21]
|
|
config->reference_compensation_enable = false;
|
|
144: 7583 strb r3, [r0, #22]
|
|
config->correction.correction_enable = false;
|
|
146: 3c06 subs r4, #6
|
|
148: 5503 strb r3, [r0, r4]
|
|
config->correction.gain_correction = ADC_GAINCORR_RESETVALUE;
|
|
14a: 84c2 strh r2, [r0, #38] ; 0x26
|
|
config->correction.offset_correction = ADC_OFFSETCORR_RESETVALUE;
|
|
14c: 8502 strh r2, [r0, #40] ; 0x28
|
|
config->sample_length = 0;
|
|
14e: 75c1 strb r1, [r0, #23]
|
|
config->pin_scan.offset_start_scan = 0;
|
|
150: 232b movs r3, #43 ; 0x2b
|
|
152: 54c1 strb r1, [r0, r3]
|
|
config->pin_scan.inputs_to_scan = 0;
|
|
154: 3301 adds r3, #1
|
|
156: 54c1 strb r1, [r0, r3]
|
|
}
|
|
158: bd10 pop {r4, pc}
|
|
...
|
|
|
|
0000015c <adc_init>:
|
|
*/
|
|
enum status_code adc_init(
|
|
struct adc_module *const module_inst,
|
|
Adc *hw,
|
|
struct adc_config *config)
|
|
{
|
|
15c: b5f0 push {r4, r5, r6, r7, lr}
|
|
15e: 46d6 mov lr, sl
|
|
160: 464f mov r7, r9
|
|
162: 4646 mov r6, r8
|
|
164: b5c0 push {r6, r7, lr}
|
|
166: b096 sub sp, #88 ; 0x58
|
|
168: 0007 movs r7, r0
|
|
16a: 0016 movs r6, r2
|
|
Assert(module_inst);
|
|
Assert(hw);
|
|
Assert(config);
|
|
|
|
/* Associate the software module instance with the hardware module */
|
|
module_inst->hw = hw;
|
|
16c: 6001 str r1, [r0, #0]
|
|
case SYSTEM_CLOCK_APB_APBB:
|
|
PM->APBBMASK.reg |= mask;
|
|
break;
|
|
|
|
case SYSTEM_CLOCK_APB_APBC:
|
|
PM->APBCMASK.reg |= mask;
|
|
16e: 4acb ldr r2, [pc, #812] ; (49c <adc_init+0x340>)
|
|
170: 6a10 ldr r0, [r2, #32]
|
|
172: 2380 movs r3, #128 ; 0x80
|
|
174: 025b lsls r3, r3, #9
|
|
176: 4303 orrs r3, r0
|
|
178: 6213 str r3, [r2, #32]
|
|
|
|
/* Turn on the digital interface clock */
|
|
system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, PM_APBCMASK_ADC);
|
|
|
|
if (hw->CTRLA.reg & ADC_CTRLA_SWRST) {
|
|
17a: 780b ldrb r3, [r1, #0]
|
|
/* We are in the middle of a reset. Abort. */
|
|
return STATUS_BUSY;
|
|
17c: 2005 movs r0, #5
|
|
if (hw->CTRLA.reg & ADC_CTRLA_SWRST) {
|
|
17e: 07db lsls r3, r3, #31
|
|
180: d505 bpl.n 18e <adc_init+0x32>
|
|
}
|
|
#endif
|
|
|
|
/* Write configuration to module */
|
|
return _adc_set_config(module_inst, config);
|
|
}
|
|
182: b016 add sp, #88 ; 0x58
|
|
184: bc1c pop {r2, r3, r4}
|
|
186: 4690 mov r8, r2
|
|
188: 4699 mov r9, r3
|
|
18a: 46a2 mov sl, r4
|
|
18c: bdf0 pop {r4, r5, r6, r7, pc}
|
|
if (hw->CTRLA.reg & ADC_CTRLA_ENABLE) {
|
|
18e: 780b ldrb r3, [r1, #0]
|
|
return STATUS_ERR_DENIED;
|
|
190: 3017 adds r0, #23
|
|
if (hw->CTRLA.reg & ADC_CTRLA_ENABLE) {
|
|
192: 079b lsls r3, r3, #30
|
|
194: d4f5 bmi.n 182 <adc_init+0x26>
|
|
module_inst->reference = config->reference;
|
|
196: 7873 ldrb r3, [r6, #1]
|
|
198: 713b strb r3, [r7, #4]
|
|
if (module_inst->reference == ADC_REFERENCE_INT1V) {
|
|
19a: 2b00 cmp r3, #0
|
|
19c: d104 bne.n 1a8 <adc_init+0x4c>
|
|
case SYSTEM_VOLTAGE_REFERENCE_TEMPSENSE:
|
|
SYSCTRL->VREF.reg |= SYSCTRL_VREF_TSEN;
|
|
break;
|
|
|
|
case SYSTEM_VOLTAGE_REFERENCE_BANDGAP:
|
|
SYSCTRL->VREF.reg |= SYSCTRL_VREF_BGOUTEN;
|
|
19e: 4ac0 ldr r2, [pc, #768] ; (4a0 <adc_init+0x344>)
|
|
1a0: 6c13 ldr r3, [r2, #64] ; 0x40
|
|
1a2: 2104 movs r1, #4
|
|
1a4: 430b orrs r3, r1
|
|
1a6: 6413 str r3, [r2, #64] ; 0x40
|
|
Adc *const adc_module = module_inst->hw;
|
|
1a8: 683b ldr r3, [r7, #0]
|
|
1aa: 4698 mov r8, r3
|
|
gclk_chan_conf.source_generator = config->clock_source;
|
|
1ac: 7833 ldrb r3, [r6, #0]
|
|
1ae: 466a mov r2, sp
|
|
1b0: 7013 strb r3, [r2, #0]
|
|
system_gclk_chan_set_config(ADC_GCLK_ID, &gclk_chan_conf);
|
|
1b2: 4669 mov r1, sp
|
|
1b4: 201e movs r0, #30
|
|
1b6: 4bbb ldr r3, [pc, #748] ; (4a4 <adc_init+0x348>)
|
|
1b8: 4798 blx r3
|
|
system_gclk_chan_enable(ADC_GCLK_ID);
|
|
1ba: 201e movs r0, #30
|
|
1bc: 4bba ldr r3, [pc, #744] ; (4a8 <adc_init+0x34c>)
|
|
1be: 4798 blx r3
|
|
if (config->pin_scan.inputs_to_scan != 0) {
|
|
1c0: 232c movs r3, #44 ; 0x2c
|
|
1c2: 5cf2 ldrb r2, [r6, r3]
|
|
1c4: 2a00 cmp r2, #0
|
|
1c6: d054 beq.n 272 <adc_init+0x116>
|
|
uint8_t offset = config->pin_scan.offset_start_scan;
|
|
1c8: 3b01 subs r3, #1
|
|
1ca: 5cf5 ldrb r5, [r6, r3]
|
|
uint8_t start_pin =
|
|
1cc: 7b33 ldrb r3, [r6, #12]
|
|
1ce: 18eb adds r3, r5, r3
|
|
1d0: b2db uxtb r3, r3
|
|
uint8_t end_pin =
|
|
1d2: 18d1 adds r1, r2, r3
|
|
while (start_pin < end_pin) {
|
|
1d4: b2c9 uxtb r1, r1
|
|
1d6: 428b cmp r3, r1
|
|
1d8: d221 bcs.n 21e <adc_init+0xc2>
|
|
1da: 1952 adds r2, r2, r5
|
|
1dc: b2d3 uxtb r3, r2
|
|
1de: 4699 mov r9, r3
|
|
const uint32_t pinmapping[] = {
|
|
1e0: 4bb2 ldr r3, [pc, #712] ; (4ac <adc_init+0x350>)
|
|
1e2: 469a mov sl, r3
|
|
1e4: e003 b.n 1ee <adc_init+0x92>
|
|
offset++;
|
|
1e6: 3501 adds r5, #1
|
|
1e8: b2ed uxtb r5, r5
|
|
while (start_pin < end_pin) {
|
|
1ea: 45a9 cmp r9, r5
|
|
1ec: d017 beq.n 21e <adc_init+0xc2>
|
|
_adc_configure_ain_pin((offset % 16)+(uint8_t)config->positive_input);
|
|
1ee: 240f movs r4, #15
|
|
1f0: 402c ands r4, r5
|
|
1f2: 7b33 ldrb r3, [r6, #12]
|
|
1f4: 18e4 adds r4, r4, r3
|
|
const uint32_t pinmapping[] = {
|
|
1f6: 2250 movs r2, #80 ; 0x50
|
|
1f8: 49ad ldr r1, [pc, #692] ; (4b0 <adc_init+0x354>)
|
|
1fa: a802 add r0, sp, #8
|
|
1fc: 47d0 blx sl
|
|
if (pin <= ADC_EXTCHANNEL_MSB) {
|
|
1fe: 2c13 cmp r4, #19
|
|
200: d8f1 bhi.n 1e6 <adc_init+0x8a>
|
|
pin_map_result = pinmapping[pin >> ADC_INPUTCTRL_MUXPOS_Pos];
|
|
202: 00a4 lsls r4, r4, #2
|
|
204: ab02 add r3, sp, #8
|
|
206: 58e0 ldr r0, [r4, r3]
|
|
/* Sanity check arguments */
|
|
Assert(config);
|
|
|
|
/* Default configuration values */
|
|
config->mux_position = SYSTEM_PINMUX_GPIO;
|
|
config->direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
|
|
208: a901 add r1, sp, #4
|
|
20a: 2300 movs r3, #0
|
|
20c: 704b strb r3, [r1, #1]
|
|
config->input_pull = SYSTEM_PINMUX_PIN_PULL_UP;
|
|
config->powersave = false;
|
|
20e: 70cb strb r3, [r1, #3]
|
|
config.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
|
210: 708b strb r3, [r1, #2]
|
|
config.mux_position = 1;
|
|
212: 3301 adds r3, #1
|
|
214: 700b strb r3, [r1, #0]
|
|
system_pinmux_pin_set_config(pin_map_result, &config);
|
|
216: b2c0 uxtb r0, r0
|
|
218: 4ba6 ldr r3, [pc, #664] ; (4b4 <adc_init+0x358>)
|
|
21a: 4798 blx r3
|
|
21c: e7e3 b.n 1e6 <adc_init+0x8a>
|
|
_adc_configure_ain_pin(config->negative_input);
|
|
21e: 89f4 ldrh r4, [r6, #14]
|
|
const uint32_t pinmapping[] = {
|
|
220: 2250 movs r2, #80 ; 0x50
|
|
222: 49a3 ldr r1, [pc, #652] ; (4b0 <adc_init+0x354>)
|
|
224: a802 add r0, sp, #8
|
|
226: 4ba1 ldr r3, [pc, #644] ; (4ac <adc_init+0x350>)
|
|
228: 4798 blx r3
|
|
if (pin <= ADC_EXTCHANNEL_MSB) {
|
|
22a: 2c13 cmp r4, #19
|
|
22c: d913 bls.n 256 <adc_init+0xfa>
|
|
adc_module->CTRLA.reg = (config->run_in_standby << ADC_CTRLA_RUNSTDBY_Pos);
|
|
22e: 7d73 ldrb r3, [r6, #21]
|
|
230: 009b lsls r3, r3, #2
|
|
232: b2db uxtb r3, r3
|
|
234: 4642 mov r2, r8
|
|
236: 7013 strb r3, [r2, #0]
|
|
(config->reference_compensation_enable << ADC_REFCTRL_REFCOMP_Pos) |
|
|
238: 7db3 ldrb r3, [r6, #22]
|
|
23a: 01db lsls r3, r3, #7
|
|
23c: 7872 ldrb r2, [r6, #1]
|
|
23e: 4313 orrs r3, r2
|
|
240: b2db uxtb r3, r3
|
|
adc_module->REFCTRL.reg =
|
|
242: 4642 mov r2, r8
|
|
244: 7053 strb r3, [r2, #1]
|
|
switch (config->resolution) {
|
|
246: 7933 ldrb r3, [r6, #4]
|
|
248: 2b34 cmp r3, #52 ; 0x34
|
|
24a: d900 bls.n 24e <adc_init+0xf2>
|
|
24c: e178 b.n 540 <adc_init+0x3e4>
|
|
24e: 009b lsls r3, r3, #2
|
|
250: 4a99 ldr r2, [pc, #612] ; (4b8 <adc_init+0x35c>)
|
|
252: 58d3 ldr r3, [r2, r3]
|
|
254: 469f mov pc, r3
|
|
pin_map_result = pinmapping[pin >> ADC_INPUTCTRL_MUXPOS_Pos];
|
|
256: 00a4 lsls r4, r4, #2
|
|
258: ab02 add r3, sp, #8
|
|
25a: 58e0 ldr r0, [r4, r3]
|
|
config->direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
|
|
25c: a901 add r1, sp, #4
|
|
25e: 2300 movs r3, #0
|
|
260: 704b strb r3, [r1, #1]
|
|
config->powersave = false;
|
|
262: 70cb strb r3, [r1, #3]
|
|
config.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
|
264: 708b strb r3, [r1, #2]
|
|
config.mux_position = 1;
|
|
266: 3301 adds r3, #1
|
|
268: 700b strb r3, [r1, #0]
|
|
system_pinmux_pin_set_config(pin_map_result, &config);
|
|
26a: b2c0 uxtb r0, r0
|
|
26c: 4b91 ldr r3, [pc, #580] ; (4b4 <adc_init+0x358>)
|
|
26e: 4798 blx r3
|
|
270: e7dd b.n 22e <adc_init+0xd2>
|
|
_adc_configure_ain_pin(config->positive_input);
|
|
272: 7b34 ldrb r4, [r6, #12]
|
|
const uint32_t pinmapping[] = {
|
|
274: 2250 movs r2, #80 ; 0x50
|
|
276: 498e ldr r1, [pc, #568] ; (4b0 <adc_init+0x354>)
|
|
278: a802 add r0, sp, #8
|
|
27a: 4b8c ldr r3, [pc, #560] ; (4ac <adc_init+0x350>)
|
|
27c: 4798 blx r3
|
|
if (pin <= ADC_EXTCHANNEL_MSB) {
|
|
27e: 2c13 cmp r4, #19
|
|
280: d915 bls.n 2ae <adc_init+0x152>
|
|
_adc_configure_ain_pin(config->negative_input);
|
|
282: 89f4 ldrh r4, [r6, #14]
|
|
const uint32_t pinmapping[] = {
|
|
284: 2250 movs r2, #80 ; 0x50
|
|
286: 498a ldr r1, [pc, #552] ; (4b0 <adc_init+0x354>)
|
|
288: a802 add r0, sp, #8
|
|
28a: 4b88 ldr r3, [pc, #544] ; (4ac <adc_init+0x350>)
|
|
28c: 4798 blx r3
|
|
if (pin <= ADC_EXTCHANNEL_MSB) {
|
|
28e: 2c13 cmp r4, #19
|
|
290: d8cd bhi.n 22e <adc_init+0xd2>
|
|
pin_map_result = pinmapping[pin >> ADC_INPUTCTRL_MUXPOS_Pos];
|
|
292: 00a4 lsls r4, r4, #2
|
|
294: ab02 add r3, sp, #8
|
|
296: 58e0 ldr r0, [r4, r3]
|
|
config->direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
|
|
298: a901 add r1, sp, #4
|
|
29a: 2300 movs r3, #0
|
|
29c: 704b strb r3, [r1, #1]
|
|
config->powersave = false;
|
|
29e: 70cb strb r3, [r1, #3]
|
|
config.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
|
2a0: 708b strb r3, [r1, #2]
|
|
config.mux_position = 1;
|
|
2a2: 3301 adds r3, #1
|
|
2a4: 700b strb r3, [r1, #0]
|
|
system_pinmux_pin_set_config(pin_map_result, &config);
|
|
2a6: b2c0 uxtb r0, r0
|
|
2a8: 4b82 ldr r3, [pc, #520] ; (4b4 <adc_init+0x358>)
|
|
2aa: 4798 blx r3
|
|
2ac: e7bf b.n 22e <adc_init+0xd2>
|
|
pin_map_result = pinmapping[pin >> ADC_INPUTCTRL_MUXPOS_Pos];
|
|
2ae: 00a4 lsls r4, r4, #2
|
|
2b0: ab02 add r3, sp, #8
|
|
2b2: 58e0 ldr r0, [r4, r3]
|
|
config->direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
|
|
2b4: a901 add r1, sp, #4
|
|
2b6: 2300 movs r3, #0
|
|
2b8: 704b strb r3, [r1, #1]
|
|
config->powersave = false;
|
|
2ba: 70cb strb r3, [r1, #3]
|
|
config.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
|
2bc: 708b strb r3, [r1, #2]
|
|
config.mux_position = 1;
|
|
2be: 3301 adds r3, #1
|
|
2c0: 700b strb r3, [r1, #0]
|
|
system_pinmux_pin_set_config(pin_map_result, &config);
|
|
2c2: b2c0 uxtb r0, r0
|
|
2c4: 4b7b ldr r3, [pc, #492] ; (4b4 <adc_init+0x358>)
|
|
2c6: 4798 blx r3
|
|
2c8: e7db b.n 282 <adc_init+0x126>
|
|
accumulate = ADC_ACCUMULATE_SAMPLES_16;
|
|
2ca: 2304 movs r3, #4
|
|
resolution = ADC_RESOLUTION_16BIT;
|
|
2cc: 2410 movs r4, #16
|
|
adjres = ADC_DIVIDE_RESULT_4;
|
|
2ce: 2102 movs r1, #2
|
|
2d0: e01a b.n 308 <adc_init+0x1ac>
|
|
adjres = config->divide_result;
|
|
2d2: 7c71 ldrb r1, [r6, #17]
|
|
accumulate = config->accumulate_samples;
|
|
2d4: 7c33 ldrb r3, [r6, #16]
|
|
resolution = ADC_RESOLUTION_16BIT;
|
|
2d6: 2410 movs r4, #16
|
|
2d8: e016 b.n 308 <adc_init+0x1ac>
|
|
accumulate = ADC_ACCUMULATE_SAMPLES_64;
|
|
2da: 2306 movs r3, #6
|
|
resolution = ADC_RESOLUTION_16BIT;
|
|
2dc: 2410 movs r4, #16
|
|
adjres = ADC_DIVIDE_RESULT_2;
|
|
2de: 2101 movs r1, #1
|
|
2e0: e012 b.n 308 <adc_init+0x1ac>
|
|
accumulate = ADC_ACCUMULATE_SAMPLES_256;
|
|
2e2: 2308 movs r3, #8
|
|
resolution = ADC_RESOLUTION_16BIT;
|
|
2e4: 2410 movs r4, #16
|
|
adjres = ADC_DIVIDE_RESULT_DISABLE;
|
|
2e6: 2100 movs r1, #0
|
|
2e8: e00e b.n 308 <adc_init+0x1ac>
|
|
enum adc_accumulate_samples accumulate = ADC_ACCUMULATE_DISABLE;
|
|
2ea: 2300 movs r3, #0
|
|
resolution = ADC_RESOLUTION_8BIT;
|
|
2ec: 2430 movs r4, #48 ; 0x30
|
|
uint8_t adjres = 0;
|
|
2ee: 2100 movs r1, #0
|
|
2f0: e00a b.n 308 <adc_init+0x1ac>
|
|
enum adc_accumulate_samples accumulate = ADC_ACCUMULATE_DISABLE;
|
|
2f2: 2300 movs r3, #0
|
|
resolution = ADC_RESOLUTION_10BIT;
|
|
2f4: 2420 movs r4, #32
|
|
uint8_t adjres = 0;
|
|
2f6: 2100 movs r1, #0
|
|
2f8: e006 b.n 308 <adc_init+0x1ac>
|
|
enum adc_accumulate_samples accumulate = ADC_ACCUMULATE_DISABLE;
|
|
2fa: 2300 movs r3, #0
|
|
resolution = ADC_RESOLUTION_12BIT;
|
|
2fc: 2400 movs r4, #0
|
|
uint8_t adjres = 0;
|
|
2fe: 2100 movs r1, #0
|
|
300: e002 b.n 308 <adc_init+0x1ac>
|
|
accumulate = ADC_ACCUMULATE_SAMPLES_4;
|
|
302: 2302 movs r3, #2
|
|
resolution = ADC_RESOLUTION_16BIT;
|
|
304: 2410 movs r4, #16
|
|
adjres = ADC_DIVIDE_RESULT_2;
|
|
306: 2101 movs r1, #1
|
|
adc_module->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(adjres) | accumulate;
|
|
308: 0109 lsls r1, r1, #4
|
|
30a: 2270 movs r2, #112 ; 0x70
|
|
30c: 400a ands r2, r1
|
|
30e: 4313 orrs r3, r2
|
|
310: 4642 mov r2, r8
|
|
312: 7093 strb r3, [r2, #2]
|
|
if (config->sample_length > 63) {
|
|
314: 7df3 ldrb r3, [r6, #23]
|
|
return STATUS_ERR_INVALID_ARG;
|
|
316: 2017 movs r0, #23
|
|
if (config->sample_length > 63) {
|
|
318: 2b3f cmp r3, #63 ; 0x3f
|
|
31a: d900 bls.n 31e <adc_init+0x1c2>
|
|
31c: e731 b.n 182 <adc_init+0x26>
|
|
adc_module->SAMPCTRL.reg =
|
|
31e: 70d3 strb r3, [r2, #3]
|
|
struct adc_module *const module_inst)
|
|
{
|
|
/* Sanity check arguments */
|
|
Assert(module_inst);
|
|
|
|
Adc *const adc_module = module_inst->hw;
|
|
320: 683a ldr r2, [r7, #0]
|
|
|
|
if (adc_module->STATUS.reg & ADC_STATUS_SYNCBUSY) {
|
|
322: 7e53 ldrb r3, [r2, #25]
|
|
while (adc_is_syncing(module_inst)) {
|
|
324: b25b sxtb r3, r3
|
|
326: 2b00 cmp r3, #0
|
|
328: dbfb blt.n 322 <adc_init+0x1c6>
|
|
(config->differential_mode << ADC_CTRLB_DIFFMODE_Pos);
|
|
32a: 7cf3 ldrb r3, [r6, #19]
|
|
(config->left_adjust << ADC_CTRLB_LEFTADJ_Pos) |
|
|
32c: 8872 ldrh r2, [r6, #2]
|
|
32e: 4313 orrs r3, r2
|
|
(config->correction.correction_enable << ADC_CTRLB_CORREN_Pos) |
|
|
330: 2224 movs r2, #36 ; 0x24
|
|
332: 5cb2 ldrb r2, [r6, r2]
|
|
334: 00d2 lsls r2, r2, #3
|
|
(config->left_adjust << ADC_CTRLB_LEFTADJ_Pos) |
|
|
336: 4313 orrs r3, r2
|
|
(config->freerunning << ADC_CTRLB_FREERUN_Pos) |
|
|
338: 7d32 ldrb r2, [r6, #20]
|
|
33a: 0092 lsls r2, r2, #2
|
|
(config->left_adjust << ADC_CTRLB_LEFTADJ_Pos) |
|
|
33c: 4313 orrs r3, r2
|
|
33e: 7cb2 ldrb r2, [r6, #18]
|
|
340: 0052 lsls r2, r2, #1
|
|
342: 4313 orrs r3, r2
|
|
344: 4323 orrs r3, r4
|
|
adc_module->CTRLB.reg =
|
|
346: 4642 mov r2, r8
|
|
348: 8093 strh r3, [r2, #4]
|
|
if (config->window.window_mode != ADC_WINDOW_MODE_DISABLE) {
|
|
34a: 7e33 ldrb r3, [r6, #24]
|
|
34c: 2b00 cmp r3, #0
|
|
34e: d020 beq.n 392 <adc_init+0x236>
|
|
switch (resolution) {
|
|
350: 2c10 cmp r4, #16
|
|
352: d100 bne.n 356 <adc_init+0x1fa>
|
|
354: e0d6 b.n 504 <adc_init+0x3a8>
|
|
356: d800 bhi.n 35a <adc_init+0x1fe>
|
|
358: e080 b.n 45c <adc_init+0x300>
|
|
35a: 2c20 cmp r4, #32
|
|
35c: d100 bne.n 360 <adc_init+0x204>
|
|
35e: e0b3 b.n 4c8 <adc_init+0x36c>
|
|
360: 2c30 cmp r4, #48 ; 0x30
|
|
362: d116 bne.n 392 <adc_init+0x236>
|
|
if (config->differential_mode &&
|
|
364: 7cf2 ldrb r2, [r6, #19]
|
|
366: 2a00 cmp r2, #0
|
|
368: d00a beq.n 380 <adc_init+0x224>
|
|
(config->window.window_lower_value > 127 ||
|
|
36a: 69f2 ldr r2, [r6, #28]
|
|
36c: 3280 adds r2, #128 ; 0x80
|
|
return STATUS_ERR_INVALID_ARG;
|
|
36e: 2017 movs r0, #23
|
|
if (config->differential_mode &&
|
|
370: 2aff cmp r2, #255 ; 0xff
|
|
372: d900 bls.n 376 <adc_init+0x21a>
|
|
374: e705 b.n 182 <adc_init+0x26>
|
|
config->window.window_lower_value < -128 ||
|
|
376: 6a32 ldr r2, [r6, #32]
|
|
378: 3280 adds r2, #128 ; 0x80
|
|
37a: 2aff cmp r2, #255 ; 0xff
|
|
37c: d900 bls.n 380 <adc_init+0x224>
|
|
37e: e700 b.n 182 <adc_init+0x26>
|
|
return STATUS_ERR_INVALID_ARG;
|
|
380: 2017 movs r0, #23
|
|
} else if (config->window.window_lower_value > 255 ||
|
|
382: 69f2 ldr r2, [r6, #28]
|
|
384: 2aff cmp r2, #255 ; 0xff
|
|
386: dd00 ble.n 38a <adc_init+0x22e>
|
|
388: e6fb b.n 182 <adc_init+0x26>
|
|
38a: 6a32 ldr r2, [r6, #32]
|
|
38c: 2aff cmp r2, #255 ; 0xff
|
|
38e: dd00 ble.n 392 <adc_init+0x236>
|
|
390: e6f7 b.n 182 <adc_init+0x26>
|
|
Adc *const adc_module = module_inst->hw;
|
|
392: 6839 ldr r1, [r7, #0]
|
|
if (adc_module->STATUS.reg & ADC_STATUS_SYNCBUSY) {
|
|
394: 7e4a ldrb r2, [r1, #25]
|
|
while (adc_is_syncing(module_inst)) {
|
|
396: b252 sxtb r2, r2
|
|
398: 2a00 cmp r2, #0
|
|
39a: dbfb blt.n 394 <adc_init+0x238>
|
|
adc_module->WINCTRL.reg = config->window.window_mode;
|
|
39c: 4642 mov r2, r8
|
|
39e: 7213 strb r3, [r2, #8]
|
|
Adc *const adc_module = module_inst->hw;
|
|
3a0: 683a ldr r2, [r7, #0]
|
|
if (adc_module->STATUS.reg & ADC_STATUS_SYNCBUSY) {
|
|
3a2: 7e53 ldrb r3, [r2, #25]
|
|
while (adc_is_syncing(module_inst)) {
|
|
3a4: b25b sxtb r3, r3
|
|
3a6: 2b00 cmp r3, #0
|
|
3a8: dbfb blt.n 3a2 <adc_init+0x246>
|
|
adc_module->WINLT.reg =
|
|
3aa: 8bb3 ldrh r3, [r6, #28]
|
|
3ac: 4642 mov r2, r8
|
|
3ae: 8393 strh r3, [r2, #28]
|
|
Adc *const adc_module = module_inst->hw;
|
|
3b0: 683a ldr r2, [r7, #0]
|
|
if (adc_module->STATUS.reg & ADC_STATUS_SYNCBUSY) {
|
|
3b2: 7e53 ldrb r3, [r2, #25]
|
|
while (adc_is_syncing(module_inst)) {
|
|
3b4: b25b sxtb r3, r3
|
|
3b6: 2b00 cmp r3, #0
|
|
3b8: dbfb blt.n 3b2 <adc_init+0x256>
|
|
adc_module->WINUT.reg = config->window.window_upper_value <<
|
|
3ba: 8c33 ldrh r3, [r6, #32]
|
|
3bc: 4642 mov r2, r8
|
|
3be: 8413 strh r3, [r2, #32]
|
|
uint8_t inputs_to_scan = config->pin_scan.inputs_to_scan;
|
|
3c0: 232c movs r3, #44 ; 0x2c
|
|
3c2: 5cf3 ldrb r3, [r6, r3]
|
|
if (inputs_to_scan > 0) {
|
|
3c4: 2b00 cmp r3, #0
|
|
3c6: d005 beq.n 3d4 <adc_init+0x278>
|
|
inputs_to_scan--;
|
|
3c8: 3b01 subs r3, #1
|
|
3ca: b2db uxtb r3, r3
|
|
return STATUS_ERR_INVALID_ARG;
|
|
3cc: 2017 movs r0, #23
|
|
if (inputs_to_scan > (ADC_INPUTCTRL_INPUTSCAN_Msk >> ADC_INPUTCTRL_INPUTSCAN_Pos) ||
|
|
3ce: 2b0f cmp r3, #15
|
|
3d0: d900 bls.n 3d4 <adc_init+0x278>
|
|
3d2: e6d6 b.n 182 <adc_init+0x26>
|
|
config->pin_scan.offset_start_scan > (ADC_INPUTCTRL_INPUTOFFSET_Msk >> ADC_INPUTCTRL_INPUTOFFSET_Pos)) {
|
|
3d4: 222b movs r2, #43 ; 0x2b
|
|
3d6: 5cb1 ldrb r1, [r6, r2]
|
|
return STATUS_ERR_INVALID_ARG;
|
|
3d8: 2017 movs r0, #23
|
|
if (inputs_to_scan > (ADC_INPUTCTRL_INPUTSCAN_Msk >> ADC_INPUTCTRL_INPUTSCAN_Pos) ||
|
|
3da: 290f cmp r1, #15
|
|
3dc: d900 bls.n 3e0 <adc_init+0x284>
|
|
3de: e6d0 b.n 182 <adc_init+0x26>
|
|
Adc *const adc_module = module_inst->hw;
|
|
3e0: 6838 ldr r0, [r7, #0]
|
|
if (adc_module->STATUS.reg & ADC_STATUS_SYNCBUSY) {
|
|
3e2: 7e42 ldrb r2, [r0, #25]
|
|
while (adc_is_syncing(module_inst)) {
|
|
3e4: b252 sxtb r2, r2
|
|
3e6: 2a00 cmp r2, #0
|
|
3e8: dbfb blt.n 3e2 <adc_init+0x286>
|
|
config->negative_input |
|
|
3ea: 89f2 ldrh r2, [r6, #14]
|
|
config->positive_input;
|
|
3ec: 7b30 ldrb r0, [r6, #12]
|
|
config->negative_input |
|
|
3ee: 4302 orrs r2, r0
|
|
3f0: 68b0 ldr r0, [r6, #8]
|
|
3f2: 4302 orrs r2, r0
|
|
(config->pin_scan.offset_start_scan <<
|
|
3f4: 0509 lsls r1, r1, #20
|
|
config->negative_input |
|
|
3f6: 430a orrs r2, r1
|
|
(inputs_to_scan << ADC_INPUTCTRL_INPUTSCAN_Pos) |
|
|
3f8: 041b lsls r3, r3, #16
|
|
config->negative_input |
|
|
3fa: 4313 orrs r3, r2
|
|
adc_module->INPUTCTRL.reg =
|
|
3fc: 4642 mov r2, r8
|
|
3fe: 6113 str r3, [r2, #16]
|
|
adc_module->EVCTRL.reg = config->event_action;
|
|
400: 232a movs r3, #42 ; 0x2a
|
|
402: 5cf3 ldrb r3, [r6, r3]
|
|
404: 7513 strb r3, [r2, #20]
|
|
adc_module->INTENCLR.reg =
|
|
406: 230f movs r3, #15
|
|
408: 7593 strb r3, [r2, #22]
|
|
if (config->correction.correction_enable){
|
|
40a: 3315 adds r3, #21
|
|
40c: 5cf3 ldrb r3, [r6, r3]
|
|
40e: 2b00 cmp r3, #0
|
|
410: d012 beq.n 438 <adc_init+0x2dc>
|
|
if (config->correction.gain_correction > ADC_GAINCORR_GAINCORR_Msk) {
|
|
412: 8cf3 ldrh r3, [r6, #38] ; 0x26
|
|
414: 4a29 ldr r2, [pc, #164] ; (4bc <adc_init+0x360>)
|
|
return STATUS_ERR_INVALID_ARG;
|
|
416: 2017 movs r0, #23
|
|
if (config->correction.gain_correction > ADC_GAINCORR_GAINCORR_Msk) {
|
|
418: 4293 cmp r3, r2
|
|
41a: d900 bls.n 41e <adc_init+0x2c2>
|
|
41c: e6b1 b.n 182 <adc_init+0x26>
|
|
adc_module->GAINCORR.reg = config->correction.gain_correction <<
|
|
41e: 4642 mov r2, r8
|
|
420: 8493 strh r3, [r2, #36] ; 0x24
|
|
if (config->correction.offset_correction > 2047 ||
|
|
422: 8d32 ldrh r2, [r6, #40] ; 0x28
|
|
424: 2380 movs r3, #128 ; 0x80
|
|
426: 011b lsls r3, r3, #4
|
|
428: 18d3 adds r3, r2, r3
|
|
42a: 4924 ldr r1, [pc, #144] ; (4bc <adc_init+0x360>)
|
|
42c: b29b uxth r3, r3
|
|
42e: 428b cmp r3, r1
|
|
430: d900 bls.n 434 <adc_init+0x2d8>
|
|
432: e6a6 b.n 182 <adc_init+0x26>
|
|
adc_module->OFFSETCORR.reg = config->correction.offset_correction <<
|
|
434: 4643 mov r3, r8
|
|
436: 84da strh r2, [r3, #38] ; 0x26
|
|
ADC_CALIB_BIAS_CAL(
|
|
438: 4b21 ldr r3, [pc, #132] ; (4c0 <adc_init+0x364>)
|
|
43a: 681b ldr r3, [r3, #0]
|
|
43c: 015b lsls r3, r3, #5
|
|
43e: 22e0 movs r2, #224 ; 0xe0
|
|
440: 00d2 lsls r2, r2, #3
|
|
442: 4013 ands r3, r2
|
|
ADC_CALIB_LINEARITY_CAL(
|
|
444: 4a1f ldr r2, [pc, #124] ; (4c4 <adc_init+0x368>)
|
|
446: 6851 ldr r1, [r2, #4]
|
|
448: 0149 lsls r1, r1, #5
|
|
44a: 6812 ldr r2, [r2, #0]
|
|
44c: 0ed2 lsrs r2, r2, #27
|
|
44e: 430a orrs r2, r1
|
|
450: b2d2 uxtb r2, r2
|
|
) |
|
|
452: 4313 orrs r3, r2
|
|
adc_module->CALIB.reg =
|
|
454: 4642 mov r2, r8
|
|
456: 8513 strh r3, [r2, #40] ; 0x28
|
|
return STATUS_OK;
|
|
458: 2000 movs r0, #0
|
|
45a: e692 b.n 182 <adc_init+0x26>
|
|
switch (resolution) {
|
|
45c: 2c00 cmp r4, #0
|
|
45e: d198 bne.n 392 <adc_init+0x236>
|
|
if (config->differential_mode &&
|
|
460: 7cf2 ldrb r2, [r6, #19]
|
|
462: 2a00 cmp r2, #0
|
|
464: d00f beq.n 486 <adc_init+0x32a>
|
|
(config->window.window_lower_value > 2047 ||
|
|
466: 69f2 ldr r2, [r6, #28]
|
|
468: 2180 movs r1, #128 ; 0x80
|
|
46a: 0109 lsls r1, r1, #4
|
|
46c: 468c mov ip, r1
|
|
46e: 4462 add r2, ip
|
|
if (config->differential_mode &&
|
|
470: 4912 ldr r1, [pc, #72] ; (4bc <adc_init+0x360>)
|
|
return STATUS_ERR_INVALID_ARG;
|
|
472: 2017 movs r0, #23
|
|
if (config->differential_mode &&
|
|
474: 428a cmp r2, r1
|
|
476: d900 bls.n 47a <adc_init+0x31e>
|
|
478: e683 b.n 182 <adc_init+0x26>
|
|
config->window.window_lower_value < -2048 ||
|
|
47a: 6a32 ldr r2, [r6, #32]
|
|
47c: 4462 add r2, ip
|
|
47e: 490f ldr r1, [pc, #60] ; (4bc <adc_init+0x360>)
|
|
480: 428a cmp r2, r1
|
|
482: d900 bls.n 486 <adc_init+0x32a>
|
|
484: e67d b.n 182 <adc_init+0x26>
|
|
} else if (config->window.window_lower_value > 4095 ||
|
|
486: 4a0d ldr r2, [pc, #52] ; (4bc <adc_init+0x360>)
|
|
return STATUS_ERR_INVALID_ARG;
|
|
488: 2017 movs r0, #23
|
|
} else if (config->window.window_lower_value > 4095 ||
|
|
48a: 69f1 ldr r1, [r6, #28]
|
|
48c: 4291 cmp r1, r2
|
|
48e: dd00 ble.n 492 <adc_init+0x336>
|
|
490: e677 b.n 182 <adc_init+0x26>
|
|
492: 6a31 ldr r1, [r6, #32]
|
|
494: 4291 cmp r1, r2
|
|
496: dd00 ble.n 49a <adc_init+0x33e>
|
|
498: e673 b.n 182 <adc_init+0x26>
|
|
49a: e77a b.n 392 <adc_init+0x236>
|
|
49c: 40000400 .word 0x40000400
|
|
4a0: 40000800 .word 0x40000800
|
|
4a4: 00001af5 .word 0x00001af5
|
|
4a8: 00001a69 .word 0x00001a69
|
|
4ac: 000026c9 .word 0x000026c9
|
|
4b0: 000037a4 .word 0x000037a4
|
|
4b4: 00001bed .word 0x00001bed
|
|
4b8: 000036d0 .word 0x000036d0
|
|
4bc: 00000fff .word 0x00000fff
|
|
4c0: 00806024 .word 0x00806024
|
|
4c4: 00806020 .word 0x00806020
|
|
if (config->differential_mode &&
|
|
4c8: 7cf2 ldrb r2, [r6, #19]
|
|
4ca: 2a00 cmp r2, #0
|
|
4cc: d00f beq.n 4ee <adc_init+0x392>
|
|
(config->window.window_lower_value > 511 ||
|
|
4ce: 69f2 ldr r2, [r6, #28]
|
|
4d0: 2180 movs r1, #128 ; 0x80
|
|
4d2: 0089 lsls r1, r1, #2
|
|
4d4: 468c mov ip, r1
|
|
4d6: 4462 add r2, ip
|
|
if (config->differential_mode &&
|
|
4d8: 491a ldr r1, [pc, #104] ; (544 <adc_init+0x3e8>)
|
|
return STATUS_ERR_INVALID_ARG;
|
|
4da: 2017 movs r0, #23
|
|
if (config->differential_mode &&
|
|
4dc: 428a cmp r2, r1
|
|
4de: d900 bls.n 4e2 <adc_init+0x386>
|
|
4e0: e64f b.n 182 <adc_init+0x26>
|
|
config->window.window_lower_value < -512 ||
|
|
4e2: 6a32 ldr r2, [r6, #32]
|
|
4e4: 4462 add r2, ip
|
|
4e6: 4917 ldr r1, [pc, #92] ; (544 <adc_init+0x3e8>)
|
|
4e8: 428a cmp r2, r1
|
|
4ea: d900 bls.n 4ee <adc_init+0x392>
|
|
4ec: e649 b.n 182 <adc_init+0x26>
|
|
} else if (config->window.window_lower_value > 1023 ||
|
|
4ee: 4a15 ldr r2, [pc, #84] ; (544 <adc_init+0x3e8>)
|
|
return STATUS_ERR_INVALID_ARG;
|
|
4f0: 2017 movs r0, #23
|
|
} else if (config->window.window_lower_value > 1023 ||
|
|
4f2: 69f1 ldr r1, [r6, #28]
|
|
4f4: 4291 cmp r1, r2
|
|
4f6: dd00 ble.n 4fa <adc_init+0x39e>
|
|
4f8: e643 b.n 182 <adc_init+0x26>
|
|
4fa: 6a31 ldr r1, [r6, #32]
|
|
4fc: 4291 cmp r1, r2
|
|
4fe: dd00 ble.n 502 <adc_init+0x3a6>
|
|
500: e63f b.n 182 <adc_init+0x26>
|
|
502: e746 b.n 392 <adc_init+0x236>
|
|
if (config->differential_mode &&
|
|
504: 7cf2 ldrb r2, [r6, #19]
|
|
506: 2a00 cmp r2, #0
|
|
508: d00f beq.n 52a <adc_init+0x3ce>
|
|
(config->window.window_lower_value > 32767 ||
|
|
50a: 69f2 ldr r2, [r6, #28]
|
|
50c: 2180 movs r1, #128 ; 0x80
|
|
50e: 0209 lsls r1, r1, #8
|
|
510: 468c mov ip, r1
|
|
512: 4462 add r2, ip
|
|
if (config->differential_mode &&
|
|
514: 490c ldr r1, [pc, #48] ; (548 <adc_init+0x3ec>)
|
|
return STATUS_ERR_INVALID_ARG;
|
|
516: 2017 movs r0, #23
|
|
if (config->differential_mode &&
|
|
518: 428a cmp r2, r1
|
|
51a: d900 bls.n 51e <adc_init+0x3c2>
|
|
51c: e631 b.n 182 <adc_init+0x26>
|
|
config->window.window_lower_value < -32768 ||
|
|
51e: 6a32 ldr r2, [r6, #32]
|
|
520: 4462 add r2, ip
|
|
522: 4909 ldr r1, [pc, #36] ; (548 <adc_init+0x3ec>)
|
|
524: 428a cmp r2, r1
|
|
526: d900 bls.n 52a <adc_init+0x3ce>
|
|
528: e62b b.n 182 <adc_init+0x26>
|
|
} else if (config->window.window_lower_value > 65535 ||
|
|
52a: 4a07 ldr r2, [pc, #28] ; (548 <adc_init+0x3ec>)
|
|
return STATUS_ERR_INVALID_ARG;
|
|
52c: 2017 movs r0, #23
|
|
} else if (config->window.window_lower_value > 65535 ||
|
|
52e: 69f1 ldr r1, [r6, #28]
|
|
530: 4291 cmp r1, r2
|
|
532: dd00 ble.n 536 <adc_init+0x3da>
|
|
534: e625 b.n 182 <adc_init+0x26>
|
|
536: 6a31 ldr r1, [r6, #32]
|
|
538: 4291 cmp r1, r2
|
|
53a: dd00 ble.n 53e <adc_init+0x3e2>
|
|
53c: e621 b.n 182 <adc_init+0x26>
|
|
53e: e728 b.n 392 <adc_init+0x236>
|
|
return STATUS_ERR_INVALID_ARG;
|
|
540: 2017 movs r0, #23
|
|
542: e61e b.n 182 <adc_init+0x26>
|
|
544: 000003ff .word 0x000003ff
|
|
548: 0000ffff .word 0x0000ffff
|
|
|
|
0000054c <DMAC_Handler>:
|
|
/**
|
|
* \brief DMA interrupt service routine.
|
|
*
|
|
*/
|
|
void DMAC_Handler( void )
|
|
{
|
|
54c: b510 push {r4, lr}
|
|
* are only re-enabled upon leaving the outermost nested critical section.
|
|
*
|
|
*/
|
|
static inline void system_interrupt_enter_critical_section(void)
|
|
{
|
|
cpu_irq_enter_critical();
|
|
54e: 4b26 ldr r3, [pc, #152] ; (5e8 <DMAC_Handler+0x9c>)
|
|
550: 4798 blx r3
|
|
uint32_t total_size;
|
|
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Get Pending channel */
|
|
active_channel = DMAC->INTPEND.reg & DMAC_INTPEND_ID_Msk;
|
|
552: 4926 ldr r1, [pc, #152] ; (5ec <DMAC_Handler+0xa0>)
|
|
554: 8c0b ldrh r3, [r1, #32]
|
|
556: 220f movs r2, #15
|
|
|
|
Assert(_dma_active_resource[active_channel]);
|
|
|
|
/* Get active DMA resource based on channel */
|
|
resource = _dma_active_resource[active_channel];
|
|
558: 4013 ands r3, r2
|
|
55a: 009b lsls r3, r3, #2
|
|
55c: 4824 ldr r0, [pc, #144] ; (5f0 <DMAC_Handler+0xa4>)
|
|
55e: 5818 ldr r0, [r3, r0]
|
|
|
|
/* Select the active channel */
|
|
DMAC->CHID.reg = DMAC_CHID_ID(resource->channel_id);
|
|
560: 7803 ldrb r3, [r0, #0]
|
|
562: 401a ands r2, r3
|
|
564: 233f movs r3, #63 ; 0x3f
|
|
566: 54ca strb r2, [r1, r3]
|
|
isr = DMAC->CHINTFLAG.reg;
|
|
568: 330f adds r3, #15
|
|
56a: 5cca ldrb r2, [r1, r3]
|
|
56c: b2d2 uxtb r2, r2
|
|
|
|
/* Calculate block transfer size of the DMA transfer */
|
|
total_size = descriptor_section[resource->channel_id].BTCNT.reg;
|
|
56e: 7803 ldrb r3, [r0, #0]
|
|
570: 011b lsls r3, r3, #4
|
|
572: 4920 ldr r1, [pc, #128] ; (5f4 <DMAC_Handler+0xa8>)
|
|
574: 18c9 adds r1, r1, r3
|
|
576: 8849 ldrh r1, [r1, #2]
|
|
write_size = _write_back_section[resource->channel_id].BTCNT.reg;
|
|
578: 4c1f ldr r4, [pc, #124] ; (5f8 <DMAC_Handler+0xac>)
|
|
57a: 18e3 adds r3, r4, r3
|
|
57c: 885b ldrh r3, [r3, #2]
|
|
resource->transfered_size = total_size - write_size;
|
|
57e: 1acb subs r3, r1, r3
|
|
580: 6143 str r3, [r0, #20]
|
|
|
|
/* DMA channel interrupt handler */
|
|
if (isr & DMAC_CHINTENCLR_TERR) {
|
|
582: 07d3 lsls r3, r2, #31
|
|
584: d50f bpl.n 5a6 <DMAC_Handler+0x5a>
|
|
/* Clear transfer error flag */
|
|
DMAC->CHINTFLAG.reg = DMAC_CHINTENCLR_TERR;
|
|
586: 2101 movs r1, #1
|
|
588: 234e movs r3, #78 ; 0x4e
|
|
58a: 4a18 ldr r2, [pc, #96] ; (5ec <DMAC_Handler+0xa0>)
|
|
58c: 54d1 strb r1, [r2, r3]
|
|
|
|
/* Set I/O ERROR status */
|
|
resource->job_status = STATUS_ERR_IO;
|
|
58e: 3b3e subs r3, #62 ; 0x3e
|
|
590: 7443 strb r3, [r0, #17]
|
|
|
|
/* Execute the callback function */
|
|
if ((resource->callback_enable & (1<<DMA_CALLBACK_TRANSFER_ERROR)) &&
|
|
592: 7c03 ldrb r3, [r0, #16]
|
|
594: 07db lsls r3, r3, #31
|
|
596: d503 bpl.n 5a0 <DMAC_Handler+0x54>
|
|
(resource->callback[DMA_CALLBACK_TRANSFER_ERROR])) {
|
|
598: 6843 ldr r3, [r0, #4]
|
|
if ((resource->callback_enable & (1<<DMA_CALLBACK_TRANSFER_ERROR)) &&
|
|
59a: 2b00 cmp r3, #0
|
|
59c: d000 beq.n 5a0 <DMAC_Handler+0x54>
|
|
resource->callback[DMA_CALLBACK_TRANSFER_ERROR](resource);
|
|
59e: 4798 blx r3
|
|
* are only re-enabled upon leaving the outermost nested critical section.
|
|
*
|
|
*/
|
|
static inline void system_interrupt_leave_critical_section(void)
|
|
{
|
|
cpu_irq_leave_critical();
|
|
5a0: 4b16 ldr r3, [pc, #88] ; (5fc <DMAC_Handler+0xb0>)
|
|
5a2: 4798 blx r3
|
|
resource->callback[DMA_CALLBACK_CHANNEL_SUSPEND](resource);
|
|
}
|
|
}
|
|
|
|
system_interrupt_leave_critical_section();
|
|
}
|
|
5a4: bd10 pop {r4, pc}
|
|
} else if (isr & DMAC_CHINTENCLR_TCMPL) {
|
|
5a6: 0793 lsls r3, r2, #30
|
|
5a8: d50d bpl.n 5c6 <DMAC_Handler+0x7a>
|
|
DMAC->CHINTFLAG.reg = DMAC_CHINTENCLR_TCMPL;
|
|
5aa: 2102 movs r1, #2
|
|
5ac: 234e movs r3, #78 ; 0x4e
|
|
5ae: 4a0f ldr r2, [pc, #60] ; (5ec <DMAC_Handler+0xa0>)
|
|
5b0: 54d1 strb r1, [r2, r3]
|
|
resource->job_status = STATUS_OK;
|
|
5b2: 2300 movs r3, #0
|
|
5b4: 7443 strb r3, [r0, #17]
|
|
if ((resource->callback_enable & (1 << DMA_CALLBACK_TRANSFER_DONE)) &&
|
|
5b6: 7c03 ldrb r3, [r0, #16]
|
|
5b8: 079b lsls r3, r3, #30
|
|
5ba: d5f1 bpl.n 5a0 <DMAC_Handler+0x54>
|
|
(resource->callback[DMA_CALLBACK_TRANSFER_DONE])) {
|
|
5bc: 6883 ldr r3, [r0, #8]
|
|
if ((resource->callback_enable & (1 << DMA_CALLBACK_TRANSFER_DONE)) &&
|
|
5be: 2b00 cmp r3, #0
|
|
5c0: d0ee beq.n 5a0 <DMAC_Handler+0x54>
|
|
resource->callback[DMA_CALLBACK_TRANSFER_DONE](resource);
|
|
5c2: 4798 blx r3
|
|
5c4: e7ec b.n 5a0 <DMAC_Handler+0x54>
|
|
} else if (isr & DMAC_CHINTENCLR_SUSP) {
|
|
5c6: 0753 lsls r3, r2, #29
|
|
5c8: d5ea bpl.n 5a0 <DMAC_Handler+0x54>
|
|
DMAC->CHINTFLAG.reg = DMAC_CHINTENCLR_SUSP;
|
|
5ca: 2104 movs r1, #4
|
|
5cc: 234e movs r3, #78 ; 0x4e
|
|
5ce: 4a07 ldr r2, [pc, #28] ; (5ec <DMAC_Handler+0xa0>)
|
|
5d0: 54d1 strb r1, [r2, r3]
|
|
resource->job_status = STATUS_SUSPEND;
|
|
5d2: 3b48 subs r3, #72 ; 0x48
|
|
5d4: 7443 strb r3, [r0, #17]
|
|
if ((resource->callback_enable & (1 << DMA_CALLBACK_CHANNEL_SUSPEND)) &&
|
|
5d6: 7c03 ldrb r3, [r0, #16]
|
|
5d8: 075b lsls r3, r3, #29
|
|
5da: d5e1 bpl.n 5a0 <DMAC_Handler+0x54>
|
|
(resource->callback[DMA_CALLBACK_CHANNEL_SUSPEND])){
|
|
5dc: 68c3 ldr r3, [r0, #12]
|
|
if ((resource->callback_enable & (1 << DMA_CALLBACK_CHANNEL_SUSPEND)) &&
|
|
5de: 2b00 cmp r3, #0
|
|
5e0: d0de beq.n 5a0 <DMAC_Handler+0x54>
|
|
resource->callback[DMA_CALLBACK_CHANNEL_SUSPEND](resource);
|
|
5e2: 4798 blx r3
|
|
5e4: e7dc b.n 5a0 <DMAC_Handler+0x54>
|
|
5e6: 46c0 nop ; (mov r8, r8)
|
|
5e8: 000015e1 .word 0x000015e1
|
|
5ec: 41004800 .word 0x41004800
|
|
5f0: 2000009c .word 0x2000009c
|
|
5f4: 200001e0 .word 0x200001e0
|
|
5f8: 200000b0 .word 0x200000b0
|
|
5fc: 00001621 .word 0x00001621
|
|
|
|
00000600 <dma_get_config_defaults>:
|
|
*/
|
|
void dma_get_config_defaults(struct dma_resource_config *config)
|
|
{
|
|
Assert(config);
|
|
/* Set as priority 0 */
|
|
config->priority = DMA_PRIORITY_LEVEL_0;
|
|
600: 2300 movs r3, #0
|
|
602: 7003 strb r3, [r0, #0]
|
|
/* Only software/event trigger */
|
|
config->peripheral_trigger = 0;
|
|
604: 7043 strb r3, [r0, #1]
|
|
/* Transaction trigger */
|
|
config->trigger_action = DMA_TRIGGER_ACTION_TRANSACTION;
|
|
606: 2203 movs r2, #3
|
|
608: 7082 strb r2, [r0, #2]
|
|
|
|
/* Event configurations, no event input/output */
|
|
config->event_config.input_action = DMA_EVENT_INPUT_NOACT;
|
|
60a: 70c3 strb r3, [r0, #3]
|
|
config->event_config.event_output_enable = false;
|
|
60c: 7103 strb r3, [r0, #4]
|
|
#ifdef FEATURE_DMA_CHANNEL_STANDBY
|
|
config->run_in_standby = false;
|
|
#endif
|
|
}
|
|
60e: 4770 bx lr
|
|
|
|
00000610 <dma_allocate>:
|
|
* \retval STATUS_OK The DMA resource was allocated successfully
|
|
* \retval STATUS_ERR_NOT_FOUND DMA resource allocation failed
|
|
*/
|
|
enum status_code dma_allocate(struct dma_resource *resource,
|
|
struct dma_resource_config *config)
|
|
{
|
|
610: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
612: 46ce mov lr, r9
|
|
614: 4647 mov r7, r8
|
|
616: b580 push {r7, lr}
|
|
618: 0005 movs r5, r0
|
|
61a: 000e movs r6, r1
|
|
cpu_irq_enter_critical();
|
|
61c: 4b45 ldr r3, [pc, #276] ; (734 <dma_allocate+0x124>)
|
|
61e: 4798 blx r3
|
|
|
|
Assert(resource);
|
|
|
|
system_interrupt_enter_critical_section();
|
|
|
|
if (!_dma_inst._dma_init) {
|
|
620: 4b45 ldr r3, [pc, #276] ; (738 <dma_allocate+0x128>)
|
|
622: 781b ldrb r3, [r3, #0]
|
|
624: 2b00 cmp r3, #0
|
|
626: d118 bne.n 65a <dma_allocate+0x4a>
|
|
PM->AHBMASK.reg |= ahb_mask;
|
|
628: 4b44 ldr r3, [pc, #272] ; (73c <dma_allocate+0x12c>)
|
|
62a: 695a ldr r2, [r3, #20]
|
|
62c: 2120 movs r1, #32
|
|
62e: 430a orrs r2, r1
|
|
630: 615a str r2, [r3, #20]
|
|
PM->APBBMASK.reg |= mask;
|
|
632: 69da ldr r2, [r3, #28]
|
|
634: 3910 subs r1, #16
|
|
636: 430a orrs r2, r1
|
|
638: 61da str r2, [r3, #28]
|
|
system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBB,
|
|
PM_APBBMASK_DMAC);
|
|
#endif
|
|
|
|
/* Perform a software reset before enable DMA controller */
|
|
DMAC->CTRL.reg &= ~DMAC_CTRL_DMAENABLE;
|
|
63a: 4b41 ldr r3, [pc, #260] ; (740 <dma_allocate+0x130>)
|
|
63c: 881a ldrh r2, [r3, #0]
|
|
63e: 390e subs r1, #14
|
|
640: 438a bics r2, r1
|
|
642: 801a strh r2, [r3, #0]
|
|
DMAC->CTRL.reg = DMAC_CTRL_SWRST;
|
|
644: 2201 movs r2, #1
|
|
646: 801a strh r2, [r3, #0]
|
|
|
|
/* Setup descriptor base address and write back section base
|
|
* address */
|
|
DMAC->BASEADDR.reg = (uint32_t)descriptor_section;
|
|
648: 4a3e ldr r2, [pc, #248] ; (744 <dma_allocate+0x134>)
|
|
64a: 635a str r2, [r3, #52] ; 0x34
|
|
DMAC->WRBADDR.reg = (uint32_t)_write_back_section;
|
|
64c: 4a3e ldr r2, [pc, #248] ; (748 <dma_allocate+0x138>)
|
|
64e: 639a str r2, [r3, #56] ; 0x38
|
|
|
|
/* Enable all priority level at the same time */
|
|
DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf);
|
|
650: 4a3e ldr r2, [pc, #248] ; (74c <dma_allocate+0x13c>)
|
|
652: 801a strh r2, [r3, #0]
|
|
|
|
_dma_inst._dma_init = true;
|
|
654: 4b38 ldr r3, [pc, #224] ; (738 <dma_allocate+0x128>)
|
|
656: 2201 movs r2, #1
|
|
658: 701a strb r2, [r3, #0]
|
|
65a: 4b36 ldr r3, [pc, #216] ; (734 <dma_allocate+0x124>)
|
|
65c: 4798 blx r3
|
|
tmp = _dma_inst.allocated_channels;
|
|
65e: 4b36 ldr r3, [pc, #216] ; (738 <dma_allocate+0x128>)
|
|
660: 685b ldr r3, [r3, #4]
|
|
if (!(tmp & 0x00000001)) {
|
|
662: 07da lsls r2, r3, #31
|
|
664: d50f bpl.n 686 <dma_allocate+0x76>
|
|
tmp = tmp >> 1;
|
|
666: 085b lsrs r3, r3, #1
|
|
for (count = 0; count < CONF_MAX_USED_CHANNEL_NUM; ++count) {
|
|
668: 2401 movs r4, #1
|
|
if (!(tmp & 0x00000001)) {
|
|
66a: 2201 movs r2, #1
|
|
66c: 421a tst r2, r3
|
|
66e: d00b beq.n 688 <dma_allocate+0x78>
|
|
tmp = tmp >> 1;
|
|
670: 085b lsrs r3, r3, #1
|
|
for (count = 0; count < CONF_MAX_USED_CHANNEL_NUM; ++count) {
|
|
672: 3401 adds r4, #1
|
|
674: b2e4 uxtb r4, r4
|
|
676: 2c05 cmp r4, #5
|
|
678: d1f8 bne.n 66c <dma_allocate+0x5c>
|
|
cpu_irq_leave_critical();
|
|
67a: 4b35 ldr r3, [pc, #212] ; (750 <dma_allocate+0x140>)
|
|
67c: 4798 blx r3
|
|
67e: 4b34 ldr r3, [pc, #208] ; (750 <dma_allocate+0x140>)
|
|
680: 4798 blx r3
|
|
|
|
/* If no channel available, return not found */
|
|
if (new_channel == DMA_INVALID_CHANNEL) {
|
|
system_interrupt_leave_critical_section();
|
|
|
|
return STATUS_ERR_NOT_FOUND;
|
|
682: 2014 movs r0, #20
|
|
684: e051 b.n 72a <dma_allocate+0x11a>
|
|
for (count = 0; count < CONF_MAX_USED_CHANNEL_NUM; ++count) {
|
|
686: 2400 movs r4, #0
|
|
_dma_inst.allocated_channels |= 1 << count;
|
|
688: 4a2b ldr r2, [pc, #172] ; (738 <dma_allocate+0x128>)
|
|
68a: 6851 ldr r1, [r2, #4]
|
|
68c: 2301 movs r3, #1
|
|
68e: 40a3 lsls r3, r4
|
|
690: 430b orrs r3, r1
|
|
692: 6053 str r3, [r2, #4]
|
|
_dma_inst.free_channels--;
|
|
694: 7a13 ldrb r3, [r2, #8]
|
|
696: 3b01 subs r3, #1
|
|
698: 7213 strb r3, [r2, #8]
|
|
69a: 4b2d ldr r3, [pc, #180] ; (750 <dma_allocate+0x140>)
|
|
69c: 4798 blx r3
|
|
if (new_channel == DMA_INVALID_CHANNEL) {
|
|
69e: 2cff cmp r4, #255 ; 0xff
|
|
6a0: d0ed beq.n 67e <dma_allocate+0x6e>
|
|
}
|
|
|
|
/* Set the channel */
|
|
resource->channel_id = new_channel;
|
|
6a2: 702c strb r4, [r5, #0]
|
|
|
|
/** Perform a reset for the allocated channel */
|
|
DMAC->CHID.reg = DMAC_CHID_ID(resource->channel_id);
|
|
6a4: 230f movs r3, #15
|
|
6a6: 4698 mov r8, r3
|
|
6a8: 401c ands r4, r3
|
|
6aa: 4f25 ldr r7, [pc, #148] ; (740 <dma_allocate+0x130>)
|
|
6ac: 3330 adds r3, #48 ; 0x30
|
|
6ae: 4699 mov r9, r3
|
|
6b0: 54fc strb r4, [r7, r3]
|
|
DMAC->CHCTRLA.reg &= ~DMAC_CHCTRLA_ENABLE;
|
|
6b2: 3301 adds r3, #1
|
|
6b4: 5cfa ldrb r2, [r7, r3]
|
|
6b6: 2102 movs r1, #2
|
|
6b8: 438a bics r2, r1
|
|
6ba: 54fa strb r2, [r7, r3]
|
|
DMAC->CHCTRLA.reg = DMAC_CHCTRLA_SWRST;
|
|
6bc: 2401 movs r4, #1
|
|
6be: 54fc strb r4, [r7, r3]
|
|
cpu_irq_enter_critical();
|
|
6c0: 4b1c ldr r3, [pc, #112] ; (734 <dma_allocate+0x124>)
|
|
6c2: 4798 blx r3
|
|
DMAC->CHID.reg = DMAC_CHID_ID(resource->channel_id);
|
|
6c4: 782b ldrb r3, [r5, #0]
|
|
6c6: 4642 mov r2, r8
|
|
6c8: 4013 ands r3, r2
|
|
6ca: 464a mov r2, r9
|
|
6cc: 54bb strb r3, [r7, r2]
|
|
DMAC->SWTRIGCTRL.reg &= (uint32_t)(~(1 << resource->channel_id));
|
|
6ce: 693b ldr r3, [r7, #16]
|
|
6d0: 782a ldrb r2, [r5, #0]
|
|
6d2: 4094 lsls r4, r2
|
|
6d4: 43a3 bics r3, r4
|
|
6d6: 613b str r3, [r7, #16]
|
|
temp_CHCTRLB_reg = DMAC_CHCTRLB_LVL(resource_config->priority) | \
|
|
6d8: 7832 ldrb r2, [r6, #0]
|
|
6da: 0152 lsls r2, r2, #5
|
|
6dc: 2360 movs r3, #96 ; 0x60
|
|
6de: 4013 ands r3, r2
|
|
DMAC_CHCTRLB_TRIGSRC(resource_config->peripheral_trigger) | \
|
|
6e0: 7872 ldrb r2, [r6, #1]
|
|
6e2: 0212 lsls r2, r2, #8
|
|
6e4: 21fc movs r1, #252 ; 0xfc
|
|
6e6: 0189 lsls r1, r1, #6
|
|
6e8: 400a ands r2, r1
|
|
temp_CHCTRLB_reg = DMAC_CHCTRLB_LVL(resource_config->priority) | \
|
|
6ea: 4313 orrs r3, r2
|
|
DMAC_CHCTRLB_TRIGACT(resource_config->trigger_action);
|
|
6ec: 78b2 ldrb r2, [r6, #2]
|
|
6ee: 0592 lsls r2, r2, #22
|
|
6f0: 21c0 movs r1, #192 ; 0xc0
|
|
6f2: 0409 lsls r1, r1, #16
|
|
6f4: 400a ands r2, r1
|
|
temp_CHCTRLB_reg = DMAC_CHCTRLB_LVL(resource_config->priority) | \
|
|
6f6: 4313 orrs r3, r2
|
|
if(resource_config->event_config.input_action){
|
|
6f8: 78f1 ldrb r1, [r6, #3]
|
|
6fa: 2900 cmp r1, #0
|
|
6fc: d004 beq.n 708 <dma_allocate+0xf8>
|
|
temp_CHCTRLB_reg |= DMAC_CHCTRLB_EVIE | DMAC_CHCTRLB_EVACT(
|
|
6fe: 2207 movs r2, #7
|
|
700: 400a ands r2, r1
|
|
702: 2108 movs r1, #8
|
|
704: 430a orrs r2, r1
|
|
706: 4313 orrs r3, r2
|
|
if (resource_config->event_config.event_output_enable) {
|
|
708: 7932 ldrb r2, [r6, #4]
|
|
70a: 2a00 cmp r2, #0
|
|
70c: d001 beq.n 712 <dma_allocate+0x102>
|
|
temp_CHCTRLB_reg |= DMAC_CHCTRLB_EVOE;
|
|
70e: 2210 movs r2, #16
|
|
710: 4313 orrs r3, r2
|
|
DMAC->CHCTRLB.reg = temp_CHCTRLB_reg;
|
|
712: 4a0b ldr r2, [pc, #44] ; (740 <dma_allocate+0x130>)
|
|
714: 6453 str r3, [r2, #68] ; 0x44
|
|
cpu_irq_leave_critical();
|
|
716: 4c0e ldr r4, [pc, #56] ; (750 <dma_allocate+0x140>)
|
|
718: 47a0 blx r4
|
|
#endif
|
|
|
|
/** Configure the DMA control,channel registers and descriptors here */
|
|
_dma_set_config(resource, config);
|
|
|
|
resource->descriptor = NULL;
|
|
71a: 2300 movs r3, #0
|
|
71c: 61ab str r3, [r5, #24]
|
|
|
|
/* Log the DMA resource into the internal DMA resource pool */
|
|
_dma_active_resource[resource->channel_id] = resource;
|
|
71e: 782b ldrb r3, [r5, #0]
|
|
720: 009b lsls r3, r3, #2
|
|
722: 4a0c ldr r2, [pc, #48] ; (754 <dma_allocate+0x144>)
|
|
724: 509d str r5, [r3, r2]
|
|
726: 47a0 blx r4
|
|
|
|
system_interrupt_leave_critical_section();
|
|
|
|
return STATUS_OK;
|
|
728: 2000 movs r0, #0
|
|
}
|
|
72a: bc0c pop {r2, r3}
|
|
72c: 4690 mov r8, r2
|
|
72e: 4699 mov r9, r3
|
|
730: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
732: 46c0 nop ; (mov r8, r8)
|
|
734: 000015e1 .word 0x000015e1
|
|
738: 20000000 .word 0x20000000
|
|
73c: 40000400 .word 0x40000400
|
|
740: 41004800 .word 0x41004800
|
|
744: 200001e0 .word 0x200001e0
|
|
748: 200000b0 .word 0x200000b0
|
|
74c: 00000f02 .word 0x00000f02
|
|
750: 00001621 .word 0x00001621
|
|
754: 2000009c .word 0x2000009c
|
|
|
|
00000758 <dma_start_transfer_job>:
|
|
* \retval STATUS_OK The transfer was started successfully
|
|
* \retval STATUS_BUSY The DMA resource was busy and the transfer was not started
|
|
* \retval STATUS_ERR_INVALID_ARG Transfer size is 0 and transfer was not started
|
|
*/
|
|
enum status_code dma_start_transfer_job(struct dma_resource *resource)
|
|
{
|
|
758: b570 push {r4, r5, r6, lr}
|
|
75a: 0004 movs r4, r0
|
|
cpu_irq_enter_critical();
|
|
75c: 4b19 ldr r3, [pc, #100] ; (7c4 <dma_start_transfer_job+0x6c>)
|
|
75e: 4798 blx r3
|
|
Assert(resource->channel_id != DMA_INVALID_CHANNEL);
|
|
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Check if resource was busy */
|
|
if (resource->job_status == STATUS_BUSY) {
|
|
760: 7c63 ldrb r3, [r4, #17]
|
|
762: 2b05 cmp r3, #5
|
|
764: d008 beq.n 778 <dma_start_transfer_job+0x20>
|
|
system_interrupt_leave_critical_section();
|
|
return STATUS_BUSY;
|
|
}
|
|
|
|
/* Check if transfer size is valid */
|
|
if (resource->descriptor->BTCNT.reg == 0) {
|
|
766: 69a3 ldr r3, [r4, #24]
|
|
768: 885b ldrh r3, [r3, #2]
|
|
76a: b29b uxth r3, r3
|
|
76c: 2b00 cmp r3, #0
|
|
76e: d107 bne.n 780 <dma_start_transfer_job+0x28>
|
|
cpu_irq_leave_critical();
|
|
770: 4b15 ldr r3, [pc, #84] ; (7c8 <dma_start_transfer_job+0x70>)
|
|
772: 4798 blx r3
|
|
system_interrupt_leave_critical_section();
|
|
return STATUS_ERR_INVALID_ARG;
|
|
774: 2017 movs r0, #23
|
|
DMAC->CHCTRLA.reg |= DMAC_CHCTRLA_ENABLE;
|
|
|
|
system_interrupt_leave_critical_section();
|
|
|
|
return STATUS_OK;
|
|
}
|
|
776: bd70 pop {r4, r5, r6, pc}
|
|
778: 4b13 ldr r3, [pc, #76] ; (7c8 <dma_start_transfer_job+0x70>)
|
|
77a: 4798 blx r3
|
|
return STATUS_BUSY;
|
|
77c: 2005 movs r0, #5
|
|
77e: e7fa b.n 776 <dma_start_transfer_job+0x1e>
|
|
* \param[in] vector Interrupt vector to enable
|
|
*/
|
|
static inline void system_interrupt_enable(
|
|
const enum system_interrupt_vector vector)
|
|
{
|
|
NVIC->ISER[0] = (uint32_t)(1 << ((uint32_t)vector & 0x0000001f));
|
|
780: 2640 movs r6, #64 ; 0x40
|
|
782: 4b12 ldr r3, [pc, #72] ; (7cc <dma_start_transfer_job+0x74>)
|
|
784: 601e str r6, [r3, #0]
|
|
DMAC->CHID.reg = DMAC_CHID_ID(resource->channel_id);
|
|
786: 7822 ldrb r2, [r4, #0]
|
|
788: 230f movs r3, #15
|
|
78a: 4013 ands r3, r2
|
|
78c: 4d10 ldr r5, [pc, #64] ; (7d0 <dma_start_transfer_job+0x78>)
|
|
78e: 223f movs r2, #63 ; 0x3f
|
|
790: 54ab strb r3, [r5, r2]
|
|
DMAC->CHINTENSET.reg = (DMAC_CHINTENSET_MASK & g_chan_interrupt_flag[resource->channel_id]);
|
|
792: 7823 ldrb r3, [r4, #0]
|
|
794: 4a0f ldr r2, [pc, #60] ; (7d4 <dma_start_transfer_job+0x7c>)
|
|
796: 5cd2 ldrb r2, [r2, r3]
|
|
798: 2307 movs r3, #7
|
|
79a: 4013 ands r3, r2
|
|
79c: 224d movs r2, #77 ; 0x4d
|
|
79e: 54ab strb r3, [r5, r2]
|
|
resource->job_status = STATUS_BUSY;
|
|
7a0: 2305 movs r3, #5
|
|
7a2: 7463 strb r3, [r4, #17]
|
|
memcpy(&descriptor_section[resource->channel_id], resource->descriptor,
|
|
7a4: 7820 ldrb r0, [r4, #0]
|
|
7a6: 0100 lsls r0, r0, #4
|
|
7a8: 4b0b ldr r3, [pc, #44] ; (7d8 <dma_start_transfer_job+0x80>)
|
|
7aa: 18c0 adds r0, r0, r3
|
|
7ac: 69a1 ldr r1, [r4, #24]
|
|
7ae: 3a3d subs r2, #61 ; 0x3d
|
|
7b0: 4b0a ldr r3, [pc, #40] ; (7dc <dma_start_transfer_job+0x84>)
|
|
7b2: 4798 blx r3
|
|
DMAC->CHCTRLA.reg |= DMAC_CHCTRLA_ENABLE;
|
|
7b4: 5dab ldrb r3, [r5, r6]
|
|
7b6: 2202 movs r2, #2
|
|
7b8: 4313 orrs r3, r2
|
|
7ba: 55ab strb r3, [r5, r6]
|
|
cpu_irq_leave_critical();
|
|
7bc: 4b02 ldr r3, [pc, #8] ; (7c8 <dma_start_transfer_job+0x70>)
|
|
7be: 4798 blx r3
|
|
return STATUS_OK;
|
|
7c0: 2000 movs r0, #0
|
|
7c2: e7d8 b.n 776 <dma_start_transfer_job+0x1e>
|
|
7c4: 000015e1 .word 0x000015e1
|
|
7c8: 00001621 .word 0x00001621
|
|
7cc: e000e100 .word 0xe000e100
|
|
7d0: 41004800 .word 0x41004800
|
|
7d4: 20000100 .word 0x20000100
|
|
7d8: 200001e0 .word 0x200001e0
|
|
7dc: 000026c9 .word 0x000026c9
|
|
|
|
000007e0 <dma_descriptor_create>:
|
|
* \param[in] config Pointer to the descriptor configuration structure
|
|
*
|
|
*/
|
|
void dma_descriptor_create(DmacDescriptor* descriptor,
|
|
struct dma_descriptor_config *config)
|
|
{
|
|
7e0: b5f0 push {r4, r5, r6, r7, lr}
|
|
/* Set block transfer control */
|
|
descriptor->BTCTRL.bit.VALID = config->descriptor_valid;
|
|
7e2: 780a ldrb r2, [r1, #0]
|
|
7e4: 8803 ldrh r3, [r0, #0]
|
|
7e6: 2601 movs r6, #1
|
|
7e8: 4032 ands r2, r6
|
|
7ea: 2401 movs r4, #1
|
|
7ec: 43a3 bics r3, r4
|
|
7ee: 4313 orrs r3, r2
|
|
7f0: 8003 strh r3, [r0, #0]
|
|
descriptor->BTCTRL.bit.EVOSEL = config->event_output_selection;
|
|
7f2: 784b ldrb r3, [r1, #1]
|
|
7f4: 8804 ldrh r4, [r0, #0]
|
|
7f6: 2703 movs r7, #3
|
|
7f8: 403b ands r3, r7
|
|
7fa: 005b lsls r3, r3, #1
|
|
7fc: 2206 movs r2, #6
|
|
7fe: 4394 bics r4, r2
|
|
800: 431c orrs r4, r3
|
|
802: 8004 strh r4, [r0, #0]
|
|
descriptor->BTCTRL.bit.BLOCKACT = config->block_action;
|
|
804: 788d ldrb r5, [r1, #2]
|
|
806: 8804 ldrh r4, [r0, #0]
|
|
808: 403d ands r5, r7
|
|
80a: 00ed lsls r5, r5, #3
|
|
80c: 2318 movs r3, #24
|
|
80e: 439c bics r4, r3
|
|
810: 432c orrs r4, r5
|
|
812: 8004 strh r4, [r0, #0]
|
|
descriptor->BTCTRL.bit.BEATSIZE = config->beat_size;
|
|
814: 78ca ldrb r2, [r1, #3]
|
|
816: 8803 ldrh r3, [r0, #0]
|
|
818: 403a ands r2, r7
|
|
81a: 0212 lsls r2, r2, #8
|
|
81c: 4c16 ldr r4, [pc, #88] ; (878 <dma_descriptor_create+0x98>)
|
|
81e: 4023 ands r3, r4
|
|
820: 4313 orrs r3, r2
|
|
822: 8003 strh r3, [r0, #0]
|
|
descriptor->BTCTRL.bit.SRCINC = config->src_increment_enable;
|
|
824: 790b ldrb r3, [r1, #4]
|
|
826: 8804 ldrh r4, [r0, #0]
|
|
828: 4033 ands r3, r6
|
|
82a: 029b lsls r3, r3, #10
|
|
82c: 4a13 ldr r2, [pc, #76] ; (87c <dma_descriptor_create+0x9c>)
|
|
82e: 4014 ands r4, r2
|
|
830: 431c orrs r4, r3
|
|
832: 8004 strh r4, [r0, #0]
|
|
descriptor->BTCTRL.bit.DSTINC = config->dst_increment_enable;
|
|
834: 794d ldrb r5, [r1, #5]
|
|
836: 8804 ldrh r4, [r0, #0]
|
|
838: 4035 ands r5, r6
|
|
83a: 02ed lsls r5, r5, #11
|
|
83c: 4b10 ldr r3, [pc, #64] ; (880 <dma_descriptor_create+0xa0>)
|
|
83e: 401c ands r4, r3
|
|
840: 432c orrs r4, r5
|
|
842: 8004 strh r4, [r0, #0]
|
|
descriptor->BTCTRL.bit.STEPSEL = config->step_selection;
|
|
844: 798a ldrb r2, [r1, #6]
|
|
846: 8803 ldrh r3, [r0, #0]
|
|
848: 4032 ands r2, r6
|
|
84a: 0312 lsls r2, r2, #12
|
|
84c: 4c0d ldr r4, [pc, #52] ; (884 <dma_descriptor_create+0xa4>)
|
|
84e: 4023 ands r3, r4
|
|
850: 4313 orrs r3, r2
|
|
852: 8003 strh r3, [r0, #0]
|
|
descriptor->BTCTRL.bit.STEPSIZE = config->step_size;
|
|
854: 79cb ldrb r3, [r1, #7]
|
|
856: 2207 movs r2, #7
|
|
858: 401a ands r2, r3
|
|
85a: 8803 ldrh r3, [r0, #0]
|
|
85c: 0352 lsls r2, r2, #13
|
|
85e: 04db lsls r3, r3, #19
|
|
860: 0cdb lsrs r3, r3, #19
|
|
862: 4313 orrs r3, r2
|
|
864: 8003 strh r3, [r0, #0]
|
|
|
|
/* Set transfer size, source address and destination address */
|
|
descriptor->BTCNT.reg = config->block_transfer_count;
|
|
866: 890b ldrh r3, [r1, #8]
|
|
868: 8043 strh r3, [r0, #2]
|
|
descriptor->SRCADDR.reg = config->source_address;
|
|
86a: 68cb ldr r3, [r1, #12]
|
|
86c: 6043 str r3, [r0, #4]
|
|
descriptor->DSTADDR.reg = config->destination_address;
|
|
86e: 690b ldr r3, [r1, #16]
|
|
870: 6083 str r3, [r0, #8]
|
|
|
|
/* Set next transfer descriptor address */
|
|
descriptor->DESCADDR.reg = config->next_descriptor_address;
|
|
872: 694b ldr r3, [r1, #20]
|
|
874: 60c3 str r3, [r0, #12]
|
|
}
|
|
876: bdf0 pop {r4, r5, r6, r7, pc}
|
|
878: fffffcff .word 0xfffffcff
|
|
87c: fffffbff .word 0xfffffbff
|
|
880: fffff7ff .word 0xfffff7ff
|
|
884: ffffefff .word 0xffffefff
|
|
|
|
00000888 <dma_add_descriptor>:
|
|
enum status_code dma_add_descriptor(struct dma_resource *resource,
|
|
DmacDescriptor* descriptor)
|
|
{
|
|
DmacDescriptor* desc = resource->descriptor;
|
|
|
|
if (resource->job_status == STATUS_BUSY) {
|
|
888: 7c42 ldrb r2, [r0, #17]
|
|
return STATUS_BUSY;
|
|
88a: 2305 movs r3, #5
|
|
if (resource->job_status == STATUS_BUSY) {
|
|
88c: 2a05 cmp r2, #5
|
|
88e: d00b beq.n 8a8 <dma_add_descriptor+0x20>
|
|
DmacDescriptor* desc = resource->descriptor;
|
|
890: 6983 ldr r3, [r0, #24]
|
|
}
|
|
|
|
/* Look up for an empty space for the descriptor */
|
|
if (desc == NULL) {
|
|
892: 2b00 cmp r3, #0
|
|
894: d00a beq.n 8ac <dma_add_descriptor+0x24>
|
|
resource->descriptor = descriptor;
|
|
} else {
|
|
/* Looking for end of descriptor link */
|
|
while(desc->DESCADDR.reg != 0) {
|
|
896: 68da ldr r2, [r3, #12]
|
|
898: 2a00 cmp r2, #0
|
|
89a: d003 beq.n 8a4 <dma_add_descriptor+0x1c>
|
|
desc = (DmacDescriptor*)(desc->DESCADDR.reg);
|
|
89c: 68db ldr r3, [r3, #12]
|
|
while(desc->DESCADDR.reg != 0) {
|
|
89e: 68da ldr r2, [r3, #12]
|
|
8a0: 2a00 cmp r2, #0
|
|
8a2: d1fb bne.n 89c <dma_add_descriptor+0x14>
|
|
}
|
|
|
|
/* Set to the end of descriptor list */
|
|
desc->DESCADDR.reg = (uint32_t)descriptor;
|
|
8a4: 60d9 str r1, [r3, #12]
|
|
}
|
|
|
|
return STATUS_OK;
|
|
8a6: 2300 movs r3, #0
|
|
}
|
|
8a8: 0018 movs r0, r3
|
|
8aa: 4770 bx lr
|
|
resource->descriptor = descriptor;
|
|
8ac: 6181 str r1, [r0, #24]
|
|
return STATUS_OK;
|
|
8ae: 2300 movs r3, #0
|
|
8b0: e7fa b.n 8a8 <dma_add_descriptor+0x20>
|
|
|
|
000008b2 <long_division>:
|
|
/**
|
|
* \internal Calculate 64 bit division, ref can be found in
|
|
* http://en.wikipedia.org/wiki/Division_algorithm#Long_division
|
|
*/
|
|
static uint64_t long_division(uint64_t n, uint64_t d)
|
|
{
|
|
8b2: b5f0 push {r4, r5, r6, r7, lr}
|
|
8b4: 46de mov lr, fp
|
|
8b6: 4657 mov r7, sl
|
|
8b8: 464e mov r6, r9
|
|
8ba: 4645 mov r5, r8
|
|
8bc: b5e0 push {r5, r6, r7, lr}
|
|
8be: b087 sub sp, #28
|
|
8c0: 4680 mov r8, r0
|
|
8c2: 9104 str r1, [sp, #16]
|
|
8c4: 0016 movs r6, r2
|
|
8c6: 001f movs r7, r3
|
|
int32_t i;
|
|
uint64_t q = 0, r = 0, bit_shift;
|
|
8c8: 2200 movs r2, #0
|
|
8ca: 2300 movs r3, #0
|
|
8cc: 2100 movs r1, #0
|
|
8ce: 468b mov fp, r1
|
|
for (i = 63; i >= 0; i--) {
|
|
8d0: 243f movs r4, #63 ; 0x3f
|
|
bit_shift = (uint64_t)1 << i;
|
|
8d2: 2001 movs r0, #1
|
|
8d4: 0021 movs r1, r4
|
|
8d6: 9600 str r6, [sp, #0]
|
|
8d8: 9701 str r7, [sp, #4]
|
|
8da: 465c mov r4, fp
|
|
8dc: 9403 str r4, [sp, #12]
|
|
8de: 4644 mov r4, r8
|
|
8e0: 9405 str r4, [sp, #20]
|
|
8e2: e013 b.n 90c <long_division+0x5a>
|
|
8e4: 2420 movs r4, #32
|
|
8e6: 1a64 subs r4, r4, r1
|
|
8e8: 0005 movs r5, r0
|
|
8ea: 40e5 lsrs r5, r4
|
|
8ec: 46a8 mov r8, r5
|
|
8ee: e014 b.n 91a <long_division+0x68>
|
|
if (n & bit_shift) {
|
|
r |= 0x01;
|
|
}
|
|
|
|
if (r >= d) {
|
|
r = r - d;
|
|
8f0: 9c00 ldr r4, [sp, #0]
|
|
8f2: 9d01 ldr r5, [sp, #4]
|
|
8f4: 1b12 subs r2, r2, r4
|
|
8f6: 41ab sbcs r3, r5
|
|
q |= bit_shift;
|
|
8f8: 465c mov r4, fp
|
|
8fa: 464d mov r5, r9
|
|
8fc: 432c orrs r4, r5
|
|
8fe: 46a3 mov fp, r4
|
|
900: 9c03 ldr r4, [sp, #12]
|
|
902: 4645 mov r5, r8
|
|
904: 432c orrs r4, r5
|
|
906: 9403 str r4, [sp, #12]
|
|
for (i = 63; i >= 0; i--) {
|
|
908: 3901 subs r1, #1
|
|
90a: d325 bcc.n 958 <long_division+0xa6>
|
|
bit_shift = (uint64_t)1 << i;
|
|
90c: 2420 movs r4, #32
|
|
90e: 4264 negs r4, r4
|
|
910: 190c adds r4, r1, r4
|
|
912: d4e7 bmi.n 8e4 <long_division+0x32>
|
|
914: 0005 movs r5, r0
|
|
916: 40a5 lsls r5, r4
|
|
918: 46a8 mov r8, r5
|
|
91a: 0004 movs r4, r0
|
|
91c: 408c lsls r4, r1
|
|
91e: 46a1 mov r9, r4
|
|
r = r << 1;
|
|
920: 1892 adds r2, r2, r2
|
|
922: 415b adcs r3, r3
|
|
924: 0014 movs r4, r2
|
|
926: 001d movs r5, r3
|
|
if (n & bit_shift) {
|
|
928: 9e05 ldr r6, [sp, #20]
|
|
92a: 464f mov r7, r9
|
|
92c: 403e ands r6, r7
|
|
92e: 46b4 mov ip, r6
|
|
930: 9e04 ldr r6, [sp, #16]
|
|
932: 4647 mov r7, r8
|
|
934: 403e ands r6, r7
|
|
936: 46b2 mov sl, r6
|
|
938: 4666 mov r6, ip
|
|
93a: 4657 mov r7, sl
|
|
93c: 433e orrs r6, r7
|
|
93e: d003 beq.n 948 <long_division+0x96>
|
|
r |= 0x01;
|
|
940: 0006 movs r6, r0
|
|
942: 4326 orrs r6, r4
|
|
944: 0032 movs r2, r6
|
|
946: 002b movs r3, r5
|
|
if (r >= d) {
|
|
948: 9c00 ldr r4, [sp, #0]
|
|
94a: 9d01 ldr r5, [sp, #4]
|
|
94c: 429d cmp r5, r3
|
|
94e: d8db bhi.n 908 <long_division+0x56>
|
|
950: d1ce bne.n 8f0 <long_division+0x3e>
|
|
952: 4294 cmp r4, r2
|
|
954: d8d8 bhi.n 908 <long_division+0x56>
|
|
956: e7cb b.n 8f0 <long_division+0x3e>
|
|
958: 9b03 ldr r3, [sp, #12]
|
|
}
|
|
}
|
|
|
|
return q;
|
|
}
|
|
95a: 4658 mov r0, fp
|
|
95c: 0019 movs r1, r3
|
|
95e: b007 add sp, #28
|
|
960: bc3c pop {r2, r3, r4, r5}
|
|
962: 4690 mov r8, r2
|
|
964: 4699 mov r9, r3
|
|
966: 46a2 mov sl, r4
|
|
968: 46ab mov fp, r5
|
|
96a: bdf0 pop {r4, r5, r6, r7, pc}
|
|
|
|
0000096c <_sercom_get_sync_baud_val>:
|
|
*/
|
|
enum status_code _sercom_get_sync_baud_val(
|
|
const uint32_t baudrate,
|
|
const uint32_t external_clock,
|
|
uint16_t *const baudvalue)
|
|
{
|
|
96c: b510 push {r4, lr}
|
|
uint16_t baud_calculated = 0;
|
|
uint32_t clock_value = external_clock;
|
|
|
|
|
|
/* Check if baudrate is outside of valid range */
|
|
if (baudrate > (external_clock / 2)) {
|
|
96e: 0849 lsrs r1, r1, #1
|
|
/* Return with error code */
|
|
return STATUS_ERR_BAUDRATE_UNAVAILABLE;
|
|
970: 2340 movs r3, #64 ; 0x40
|
|
972: 2400 movs r4, #0
|
|
if (baudrate > (external_clock / 2)) {
|
|
974: 4281 cmp r1, r0
|
|
976: d202 bcs.n 97e <_sercom_get_sync_baud_val+0x12>
|
|
return STATUS_ERR_BAUDRATE_UNAVAILABLE;
|
|
} else {
|
|
*baudvalue = baud_calculated;
|
|
return STATUS_OK;
|
|
}
|
|
}
|
|
978: 0018 movs r0, r3
|
|
97a: bd10 pop {r4, pc}
|
|
baud_calculated++;
|
|
97c: 001c movs r4, r3
|
|
clock_value = clock_value - baudrate;
|
|
97e: 1a09 subs r1, r1, r0
|
|
baud_calculated++;
|
|
980: 1c63 adds r3, r4, #1
|
|
982: b29b uxth r3, r3
|
|
while (clock_value >= baudrate) {
|
|
984: 4288 cmp r0, r1
|
|
986: d9f9 bls.n 97c <_sercom_get_sync_baud_val+0x10>
|
|
return STATUS_ERR_BAUDRATE_UNAVAILABLE;
|
|
988: 2340 movs r3, #64 ; 0x40
|
|
if (baud_calculated > 0xFF) {
|
|
98a: 2cff cmp r4, #255 ; 0xff
|
|
98c: d8f4 bhi.n 978 <_sercom_get_sync_baud_val+0xc>
|
|
*baudvalue = baud_calculated;
|
|
98e: 8014 strh r4, [r2, #0]
|
|
return STATUS_OK;
|
|
990: 2300 movs r3, #0
|
|
992: e7f1 b.n 978 <_sercom_get_sync_baud_val+0xc>
|
|
|
|
00000994 <_sercom_get_async_baud_val>:
|
|
const uint32_t baudrate,
|
|
const uint32_t peripheral_clock,
|
|
uint16_t *const baudval,
|
|
enum sercom_asynchronous_operation_mode mode,
|
|
enum sercom_asynchronous_sample_num sample_num)
|
|
{
|
|
994: b5f0 push {r4, r5, r6, r7, lr}
|
|
996: b083 sub sp, #12
|
|
998: 000f movs r7, r1
|
|
99a: 0016 movs r6, r2
|
|
99c: aa08 add r2, sp, #32
|
|
99e: 7811 ldrb r1, [r2, #0]
|
|
uint8_t baud_fp;
|
|
uint32_t baud_int = 0;
|
|
uint64_t temp1;
|
|
|
|
/* Check if the baudrate is outside of valid range */
|
|
if ((baudrate * sample_num) > peripheral_clock) {
|
|
9a0: 0004 movs r4, r0
|
|
9a2: 434c muls r4, r1
|
|
/* Return with error code */
|
|
return STATUS_ERR_BAUDRATE_UNAVAILABLE;
|
|
9a4: 2240 movs r2, #64 ; 0x40
|
|
if ((baudrate * sample_num) > peripheral_clock) {
|
|
9a6: 42bc cmp r4, r7
|
|
9a8: d902 bls.n 9b0 <_sercom_get_async_baud_val+0x1c>
|
|
baud_calculated = baud_int | (baud_fp << 13);
|
|
}
|
|
|
|
*baudval = baud_calculated;
|
|
return STATUS_OK;
|
|
}
|
|
9aa: 0010 movs r0, r2
|
|
9ac: b003 add sp, #12
|
|
9ae: bdf0 pop {r4, r5, r6, r7, pc}
|
|
if(mode == SERCOM_ASYNC_OPERATION_MODE_ARITHMETIC) {
|
|
9b0: 2b00 cmp r3, #0
|
|
9b2: d114 bne.n 9de <_sercom_get_async_baud_val+0x4a>
|
|
temp1 = ((sample_num * (uint64_t)baudrate) << SHIFT);
|
|
9b4: 0002 movs r2, r0
|
|
9b6: 0008 movs r0, r1
|
|
9b8: 2100 movs r1, #0
|
|
9ba: 4c19 ldr r4, [pc, #100] ; (a20 <_sercom_get_async_baud_val+0x8c>)
|
|
9bc: 47a0 blx r4
|
|
9be: 0001 movs r1, r0
|
|
ratio = long_division(temp1, peripheral_clock);
|
|
9c0: 003a movs r2, r7
|
|
9c2: 2300 movs r3, #0
|
|
9c4: 2000 movs r0, #0
|
|
9c6: 4c17 ldr r4, [pc, #92] ; (a24 <_sercom_get_async_baud_val+0x90>)
|
|
9c8: 47a0 blx r4
|
|
scale = ((uint64_t)1 << SHIFT) - ratio;
|
|
9ca: 2200 movs r2, #0
|
|
9cc: 2301 movs r3, #1
|
|
9ce: 1a12 subs r2, r2, r0
|
|
9d0: 418b sbcs r3, r1
|
|
baud_calculated = (65536 * scale) >> SHIFT;
|
|
9d2: 0c12 lsrs r2, r2, #16
|
|
9d4: 041b lsls r3, r3, #16
|
|
9d6: 431a orrs r2, r3
|
|
*baudval = baud_calculated;
|
|
9d8: 8032 strh r2, [r6, #0]
|
|
return STATUS_OK;
|
|
9da: 2200 movs r2, #0
|
|
9dc: e7e5 b.n 9aa <_sercom_get_async_baud_val+0x16>
|
|
uint64_t baud_calculated = 0;
|
|
9de: 2200 movs r2, #0
|
|
} else if(mode == SERCOM_ASYNC_OPERATION_MODE_FRACTIONAL) {
|
|
9e0: 2b01 cmp r3, #1
|
|
9e2: d1f9 bne.n 9d8 <_sercom_get_async_baud_val+0x44>
|
|
temp1 = ((uint64_t)baudrate * sample_num);
|
|
9e4: 000a movs r2, r1
|
|
9e6: 2300 movs r3, #0
|
|
9e8: 2100 movs r1, #0
|
|
9ea: 4c0d ldr r4, [pc, #52] ; (a20 <_sercom_get_async_baud_val+0x8c>)
|
|
9ec: 47a0 blx r4
|
|
9ee: 0002 movs r2, r0
|
|
9f0: 000b movs r3, r1
|
|
9f2: 9200 str r2, [sp, #0]
|
|
9f4: 9301 str r3, [sp, #4]
|
|
baud_int = long_division( peripheral_clock, temp1);
|
|
9f6: 0038 movs r0, r7
|
|
9f8: 2100 movs r1, #0
|
|
9fa: 4c0a ldr r4, [pc, #40] ; (a24 <_sercom_get_async_baud_val+0x90>)
|
|
9fc: 47a0 blx r4
|
|
9fe: 0005 movs r5, r0
|
|
if(baud_int > BAUD_INT_MAX) {
|
|
a00: 2380 movs r3, #128 ; 0x80
|
|
a02: 019b lsls r3, r3, #6
|
|
return STATUS_ERR_BAUDRATE_UNAVAILABLE;
|
|
a04: 2240 movs r2, #64 ; 0x40
|
|
if(baud_int > BAUD_INT_MAX) {
|
|
a06: 4298 cmp r0, r3
|
|
a08: d8cf bhi.n 9aa <_sercom_get_async_baud_val+0x16>
|
|
temp1 = long_division( 8 * (uint64_t)peripheral_clock, temp1);
|
|
a0a: 0f79 lsrs r1, r7, #29
|
|
a0c: 00f8 lsls r0, r7, #3
|
|
a0e: 9a00 ldr r2, [sp, #0]
|
|
a10: 9b01 ldr r3, [sp, #4]
|
|
a12: 47a0 blx r4
|
|
baud_fp = temp1 - 8 * baud_int;
|
|
a14: 00ea lsls r2, r5, #3
|
|
a16: 1a82 subs r2, r0, r2
|
|
baud_calculated = baud_int | (baud_fp << 13);
|
|
a18: b2d2 uxtb r2, r2
|
|
a1a: 0352 lsls r2, r2, #13
|
|
a1c: 432a orrs r2, r5
|
|
a1e: e7db b.n 9d8 <_sercom_get_async_baud_val+0x44>
|
|
a20: 00001f0d .word 0x00001f0d
|
|
a24: 000008b3 .word 0x000008b3
|
|
|
|
00000a28 <sercom_set_gclk_generator>:
|
|
* forced.
|
|
*/
|
|
enum status_code sercom_set_gclk_generator(
|
|
const enum gclk_generator generator_source,
|
|
const bool force_change)
|
|
{
|
|
a28: b510 push {r4, lr}
|
|
a2a: b082 sub sp, #8
|
|
a2c: 0004 movs r4, r0
|
|
/* Check if valid option */
|
|
if (!_sercom_config.generator_is_set || force_change) {
|
|
a2e: 4b0e ldr r3, [pc, #56] ; (a68 <sercom_set_gclk_generator+0x40>)
|
|
a30: 781b ldrb r3, [r3, #0]
|
|
a32: 2b00 cmp r3, #0
|
|
a34: d007 beq.n a46 <sercom_set_gclk_generator+0x1e>
|
|
a36: 2900 cmp r1, #0
|
|
a38: d105 bne.n a46 <sercom_set_gclk_generator+0x1e>
|
|
/* Save config */
|
|
_sercom_config.generator_source = generator_source;
|
|
_sercom_config.generator_is_set = true;
|
|
|
|
return STATUS_OK;
|
|
} else if (generator_source == _sercom_config.generator_source) {
|
|
a3a: 4b0b ldr r3, [pc, #44] ; (a68 <sercom_set_gclk_generator+0x40>)
|
|
a3c: 785b ldrb r3, [r3, #1]
|
|
a3e: 4283 cmp r3, r0
|
|
a40: d010 beq.n a64 <sercom_set_gclk_generator+0x3c>
|
|
/* Return status OK if same config */
|
|
return STATUS_OK;
|
|
}
|
|
|
|
/* Return invalid config to already initialized GCLK */
|
|
return STATUS_ERR_ALREADY_INITIALIZED;
|
|
a42: 201d movs r0, #29
|
|
a44: e00c b.n a60 <sercom_set_gclk_generator+0x38>
|
|
gclk_chan_conf.source_generator = generator_source;
|
|
a46: a901 add r1, sp, #4
|
|
a48: 700c strb r4, [r1, #0]
|
|
system_gclk_chan_set_config(SERCOM_GCLK_ID, &gclk_chan_conf);
|
|
a4a: 2013 movs r0, #19
|
|
a4c: 4b07 ldr r3, [pc, #28] ; (a6c <sercom_set_gclk_generator+0x44>)
|
|
a4e: 4798 blx r3
|
|
system_gclk_chan_enable(SERCOM_GCLK_ID);
|
|
a50: 2013 movs r0, #19
|
|
a52: 4b07 ldr r3, [pc, #28] ; (a70 <sercom_set_gclk_generator+0x48>)
|
|
a54: 4798 blx r3
|
|
_sercom_config.generator_source = generator_source;
|
|
a56: 4b04 ldr r3, [pc, #16] ; (a68 <sercom_set_gclk_generator+0x40>)
|
|
a58: 705c strb r4, [r3, #1]
|
|
_sercom_config.generator_is_set = true;
|
|
a5a: 2201 movs r2, #1
|
|
a5c: 701a strb r2, [r3, #0]
|
|
return STATUS_OK;
|
|
a5e: 2000 movs r0, #0
|
|
}
|
|
a60: b002 add sp, #8
|
|
a62: bd10 pop {r4, pc}
|
|
return STATUS_OK;
|
|
a64: 2000 movs r0, #0
|
|
a66: e7fb b.n a60 <sercom_set_gclk_generator+0x38>
|
|
a68: 20000108 .word 0x20000108
|
|
a6c: 00001af5 .word 0x00001af5
|
|
a70: 00001a69 .word 0x00001a69
|
|
|
|
00000a74 <_sercom_get_default_pad>:
|
|
*/
|
|
uint32_t _sercom_get_default_pad(
|
|
Sercom *const sercom_module,
|
|
const uint8_t pad)
|
|
{
|
|
switch ((uintptr_t)sercom_module) {
|
|
a74: 4b40 ldr r3, [pc, #256] ; (b78 <_sercom_get_default_pad+0x104>)
|
|
a76: 4298 cmp r0, r3
|
|
a78: d031 beq.n ade <_sercom_get_default_pad+0x6a>
|
|
a7a: d90a bls.n a92 <_sercom_get_default_pad+0x1e>
|
|
a7c: 4b3f ldr r3, [pc, #252] ; (b7c <_sercom_get_default_pad+0x108>)
|
|
a7e: 4298 cmp r0, r3
|
|
a80: d04d beq.n b1e <_sercom_get_default_pad+0xaa>
|
|
a82: 4b3f ldr r3, [pc, #252] ; (b80 <_sercom_get_default_pad+0x10c>)
|
|
a84: 4298 cmp r0, r3
|
|
a86: d05a beq.n b3e <_sercom_get_default_pad+0xca>
|
|
a88: 4b3e ldr r3, [pc, #248] ; (b84 <_sercom_get_default_pad+0x110>)
|
|
a8a: 4298 cmp r0, r3
|
|
a8c: d037 beq.n afe <_sercom_get_default_pad+0x8a>
|
|
/* Auto-generate a lookup table for the default SERCOM pad defaults */
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
}
|
|
|
|
Assert(false);
|
|
return 0;
|
|
a8e: 2000 movs r0, #0
|
|
}
|
|
a90: 4770 bx lr
|
|
switch ((uintptr_t)sercom_module) {
|
|
a92: 4b3d ldr r3, [pc, #244] ; (b88 <_sercom_get_default_pad+0x114>)
|
|
a94: 4298 cmp r0, r3
|
|
a96: d00c beq.n ab2 <_sercom_get_default_pad+0x3e>
|
|
a98: 4b3c ldr r3, [pc, #240] ; (b8c <_sercom_get_default_pad+0x118>)
|
|
a9a: 4298 cmp r0, r3
|
|
a9c: d1f7 bne.n a8e <_sercom_get_default_pad+0x1a>
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
a9e: 2901 cmp r1, #1
|
|
aa0: d017 beq.n ad2 <_sercom_get_default_pad+0x5e>
|
|
aa2: 2900 cmp r1, #0
|
|
aa4: d05d beq.n b62 <_sercom_get_default_pad+0xee>
|
|
aa6: 2902 cmp r1, #2
|
|
aa8: d015 beq.n ad6 <_sercom_get_default_pad+0x62>
|
|
aaa: 2903 cmp r1, #3
|
|
aac: d015 beq.n ada <_sercom_get_default_pad+0x66>
|
|
return 0;
|
|
aae: 2000 movs r0, #0
|
|
ab0: e7ee b.n a90 <_sercom_get_default_pad+0x1c>
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
ab2: 2901 cmp r1, #1
|
|
ab4: d007 beq.n ac6 <_sercom_get_default_pad+0x52>
|
|
ab6: 2900 cmp r1, #0
|
|
ab8: d051 beq.n b5e <_sercom_get_default_pad+0xea>
|
|
aba: 2902 cmp r1, #2
|
|
abc: d005 beq.n aca <_sercom_get_default_pad+0x56>
|
|
abe: 2903 cmp r1, #3
|
|
ac0: d005 beq.n ace <_sercom_get_default_pad+0x5a>
|
|
return 0;
|
|
ac2: 2000 movs r0, #0
|
|
ac4: e7e4 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
ac6: 4832 ldr r0, [pc, #200] ; (b90 <_sercom_get_default_pad+0x11c>)
|
|
ac8: e7e2 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
aca: 4832 ldr r0, [pc, #200] ; (b94 <_sercom_get_default_pad+0x120>)
|
|
acc: e7e0 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
ace: 4832 ldr r0, [pc, #200] ; (b98 <_sercom_get_default_pad+0x124>)
|
|
ad0: e7de b.n a90 <_sercom_get_default_pad+0x1c>
|
|
ad2: 4832 ldr r0, [pc, #200] ; (b9c <_sercom_get_default_pad+0x128>)
|
|
ad4: e7dc b.n a90 <_sercom_get_default_pad+0x1c>
|
|
ad6: 4832 ldr r0, [pc, #200] ; (ba0 <_sercom_get_default_pad+0x12c>)
|
|
ad8: e7da b.n a90 <_sercom_get_default_pad+0x1c>
|
|
ada: 4832 ldr r0, [pc, #200] ; (ba4 <_sercom_get_default_pad+0x130>)
|
|
adc: e7d8 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
ade: 2901 cmp r1, #1
|
|
ae0: d007 beq.n af2 <_sercom_get_default_pad+0x7e>
|
|
ae2: 2900 cmp r1, #0
|
|
ae4: d03f beq.n b66 <_sercom_get_default_pad+0xf2>
|
|
ae6: 2902 cmp r1, #2
|
|
ae8: d005 beq.n af6 <_sercom_get_default_pad+0x82>
|
|
aea: 2903 cmp r1, #3
|
|
aec: d005 beq.n afa <_sercom_get_default_pad+0x86>
|
|
return 0;
|
|
aee: 2000 movs r0, #0
|
|
af0: e7ce b.n a90 <_sercom_get_default_pad+0x1c>
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
af2: 482d ldr r0, [pc, #180] ; (ba8 <_sercom_get_default_pad+0x134>)
|
|
af4: e7cc b.n a90 <_sercom_get_default_pad+0x1c>
|
|
af6: 482d ldr r0, [pc, #180] ; (bac <_sercom_get_default_pad+0x138>)
|
|
af8: e7ca b.n a90 <_sercom_get_default_pad+0x1c>
|
|
afa: 482d ldr r0, [pc, #180] ; (bb0 <_sercom_get_default_pad+0x13c>)
|
|
afc: e7c8 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
afe: 2901 cmp r1, #1
|
|
b00: d007 beq.n b12 <_sercom_get_default_pad+0x9e>
|
|
b02: 2900 cmp r1, #0
|
|
b04: d031 beq.n b6a <_sercom_get_default_pad+0xf6>
|
|
b06: 2902 cmp r1, #2
|
|
b08: d005 beq.n b16 <_sercom_get_default_pad+0xa2>
|
|
b0a: 2903 cmp r1, #3
|
|
b0c: d005 beq.n b1a <_sercom_get_default_pad+0xa6>
|
|
return 0;
|
|
b0e: 2000 movs r0, #0
|
|
b10: e7be b.n a90 <_sercom_get_default_pad+0x1c>
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
b12: 4828 ldr r0, [pc, #160] ; (bb4 <_sercom_get_default_pad+0x140>)
|
|
b14: e7bc b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b16: 4828 ldr r0, [pc, #160] ; (bb8 <_sercom_get_default_pad+0x144>)
|
|
b18: e7ba b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b1a: 4828 ldr r0, [pc, #160] ; (bbc <_sercom_get_default_pad+0x148>)
|
|
b1c: e7b8 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b1e: 2901 cmp r1, #1
|
|
b20: d007 beq.n b32 <_sercom_get_default_pad+0xbe>
|
|
b22: 2900 cmp r1, #0
|
|
b24: d023 beq.n b6e <_sercom_get_default_pad+0xfa>
|
|
b26: 2902 cmp r1, #2
|
|
b28: d005 beq.n b36 <_sercom_get_default_pad+0xc2>
|
|
b2a: 2903 cmp r1, #3
|
|
b2c: d005 beq.n b3a <_sercom_get_default_pad+0xc6>
|
|
return 0;
|
|
b2e: 2000 movs r0, #0
|
|
b30: e7ae b.n a90 <_sercom_get_default_pad+0x1c>
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
b32: 4823 ldr r0, [pc, #140] ; (bc0 <_sercom_get_default_pad+0x14c>)
|
|
b34: e7ac b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b36: 4823 ldr r0, [pc, #140] ; (bc4 <_sercom_get_default_pad+0x150>)
|
|
b38: e7aa b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b3a: 4823 ldr r0, [pc, #140] ; (bc8 <_sercom_get_default_pad+0x154>)
|
|
b3c: e7a8 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b3e: 2901 cmp r1, #1
|
|
b40: d007 beq.n b52 <_sercom_get_default_pad+0xde>
|
|
b42: 2900 cmp r1, #0
|
|
b44: d015 beq.n b72 <_sercom_get_default_pad+0xfe>
|
|
b46: 2902 cmp r1, #2
|
|
b48: d005 beq.n b56 <_sercom_get_default_pad+0xe2>
|
|
b4a: 2903 cmp r1, #3
|
|
b4c: d005 beq.n b5a <_sercom_get_default_pad+0xe6>
|
|
return 0;
|
|
b4e: 2000 movs r0, #0
|
|
b50: e79e b.n a90 <_sercom_get_default_pad+0x1c>
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_PAD_DEFAULTS_CASE, pad)
|
|
b52: 481e ldr r0, [pc, #120] ; (bcc <_sercom_get_default_pad+0x158>)
|
|
b54: e79c b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b56: 481e ldr r0, [pc, #120] ; (bd0 <_sercom_get_default_pad+0x15c>)
|
|
b58: e79a b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b5a: 481e ldr r0, [pc, #120] ; (bd4 <_sercom_get_default_pad+0x160>)
|
|
b5c: e798 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b5e: 481e ldr r0, [pc, #120] ; (bd8 <_sercom_get_default_pad+0x164>)
|
|
b60: e796 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b62: 2003 movs r0, #3
|
|
b64: e794 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b66: 481d ldr r0, [pc, #116] ; (bdc <_sercom_get_default_pad+0x168>)
|
|
b68: e792 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b6a: 481d ldr r0, [pc, #116] ; (be0 <_sercom_get_default_pad+0x16c>)
|
|
b6c: e790 b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b6e: 481d ldr r0, [pc, #116] ; (be4 <_sercom_get_default_pad+0x170>)
|
|
b70: e78e b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b72: 481d ldr r0, [pc, #116] ; (be8 <_sercom_get_default_pad+0x174>)
|
|
b74: e78c b.n a90 <_sercom_get_default_pad+0x1c>
|
|
b76: 46c0 nop ; (mov r8, r8)
|
|
b78: 42001000 .word 0x42001000
|
|
b7c: 42001800 .word 0x42001800
|
|
b80: 42001c00 .word 0x42001c00
|
|
b84: 42001400 .word 0x42001400
|
|
b88: 42000800 .word 0x42000800
|
|
b8c: 42000c00 .word 0x42000c00
|
|
b90: 00050003 .word 0x00050003
|
|
b94: 00060003 .word 0x00060003
|
|
b98: 00070003 .word 0x00070003
|
|
b9c: 00010003 .word 0x00010003
|
|
ba0: 001e0003 .word 0x001e0003
|
|
ba4: 001f0003 .word 0x001f0003
|
|
ba8: 00090003 .word 0x00090003
|
|
bac: 000a0003 .word 0x000a0003
|
|
bb0: 000b0003 .word 0x000b0003
|
|
bb4: 00110003 .word 0x00110003
|
|
bb8: 00120003 .word 0x00120003
|
|
bbc: 00130003 .word 0x00130003
|
|
bc0: 000d0003 .word 0x000d0003
|
|
bc4: 000e0003 .word 0x000e0003
|
|
bc8: 000f0003 .word 0x000f0003
|
|
bcc: 00170003 .word 0x00170003
|
|
bd0: 00180003 .word 0x00180003
|
|
bd4: 00190003 .word 0x00190003
|
|
bd8: 00040003 .word 0x00040003
|
|
bdc: 00080003 .word 0x00080003
|
|
be0: 00100003 .word 0x00100003
|
|
be4: 000c0003 .word 0x000c0003
|
|
be8: 00160003 .word 0x00160003
|
|
|
|
00000bec <_sercom_get_sercom_inst_index>:
|
|
*
|
|
* \return Index of given instance.
|
|
*/
|
|
uint8_t _sercom_get_sercom_inst_index(
|
|
Sercom *const sercom_instance)
|
|
{
|
|
bec: b530 push {r4, r5, lr}
|
|
bee: b087 sub sp, #28
|
|
/* Save all available SERCOM instances for compare */
|
|
Sercom *sercom_instances[SERCOM_INST_NUM] = SERCOM_INSTS;
|
|
bf0: 4b0b ldr r3, [pc, #44] ; (c20 <_sercom_get_sercom_inst_index+0x34>)
|
|
bf2: 466a mov r2, sp
|
|
bf4: cb32 ldmia r3!, {r1, r4, r5}
|
|
bf6: c232 stmia r2!, {r1, r4, r5}
|
|
bf8: cb32 ldmia r3!, {r1, r4, r5}
|
|
bfa: c232 stmia r2!, {r1, r4, r5}
|
|
|
|
/* Find index for sercom instance */
|
|
for (uint32_t i = 0; i < SERCOM_INST_NUM; i++) {
|
|
if ((uintptr_t)sercom_instance == (uintptr_t)sercom_instances[i]) {
|
|
bfc: 9b00 ldr r3, [sp, #0]
|
|
bfe: 4283 cmp r3, r0
|
|
c00: d00b beq.n c1a <_sercom_get_sercom_inst_index+0x2e>
|
|
c02: 2301 movs r3, #1
|
|
c04: 009a lsls r2, r3, #2
|
|
c06: 4669 mov r1, sp
|
|
c08: 5852 ldr r2, [r2, r1]
|
|
c0a: 4282 cmp r2, r0
|
|
c0c: d006 beq.n c1c <_sercom_get_sercom_inst_index+0x30>
|
|
for (uint32_t i = 0; i < SERCOM_INST_NUM; i++) {
|
|
c0e: 3301 adds r3, #1
|
|
c10: 2b06 cmp r3, #6
|
|
c12: d1f7 bne.n c04 <_sercom_get_sercom_inst_index+0x18>
|
|
}
|
|
}
|
|
|
|
/* Invalid data given */
|
|
Assert(false);
|
|
return 0;
|
|
c14: 2000 movs r0, #0
|
|
}
|
|
c16: b007 add sp, #28
|
|
c18: bd30 pop {r4, r5, pc}
|
|
for (uint32_t i = 0; i < SERCOM_INST_NUM; i++) {
|
|
c1a: 2300 movs r3, #0
|
|
return i;
|
|
c1c: b2d8 uxtb r0, r3
|
|
c1e: e7fa b.n c16 <_sercom_get_sercom_inst_index+0x2a>
|
|
c20: 000037f4 .word 0x000037f4
|
|
|
|
00000c24 <_read>:
|
|
int __attribute__((weak))
|
|
_read (int file, char * ptr, int len); // Remove GCC compiler warning
|
|
|
|
int __attribute__((weak))
|
|
_read (int file, char * ptr, int len)
|
|
{
|
|
c24: b5f0 push {r4, r5, r6, r7, lr}
|
|
c26: 46c6 mov lr, r8
|
|
c28: b500 push {lr}
|
|
c2a: 000c movs r4, r1
|
|
c2c: 4690 mov r8, r2
|
|
int nChars = 0;
|
|
|
|
if (file != 0) {
|
|
c2e: 2800 cmp r0, #0
|
|
c30: d10f bne.n c52 <_read+0x2e>
|
|
return -1;
|
|
}
|
|
|
|
for (; len > 0; --len) {
|
|
c32: 2a00 cmp r2, #0
|
|
c34: dd11 ble.n c5a <_read+0x36>
|
|
c36: 188f adds r7, r1, r2
|
|
ptr_get(stdio_base, ptr);
|
|
c38: 4e09 ldr r6, [pc, #36] ; (c60 <_read+0x3c>)
|
|
c3a: 4d0a ldr r5, [pc, #40] ; (c64 <_read+0x40>)
|
|
c3c: 6830 ldr r0, [r6, #0]
|
|
c3e: 0021 movs r1, r4
|
|
c40: 682b ldr r3, [r5, #0]
|
|
c42: 4798 blx r3
|
|
ptr++;
|
|
c44: 3401 adds r4, #1
|
|
for (; len > 0; --len) {
|
|
c46: 42bc cmp r4, r7
|
|
c48: d1f8 bne.n c3c <_read+0x18>
|
|
nChars++;
|
|
}
|
|
return nChars;
|
|
}
|
|
c4a: 4640 mov r0, r8
|
|
c4c: bc04 pop {r2}
|
|
c4e: 4690 mov r8, r2
|
|
c50: bdf0 pop {r4, r5, r6, r7, pc}
|
|
return -1;
|
|
c52: 2301 movs r3, #1
|
|
c54: 425b negs r3, r3
|
|
c56: 4698 mov r8, r3
|
|
c58: e7f7 b.n c4a <_read+0x26>
|
|
for (; len > 0; --len) {
|
|
c5a: 4680 mov r8, r0
|
|
c5c: e7f5 b.n c4a <_read+0x26>
|
|
c5e: 46c0 nop ; (mov r8, r8)
|
|
c60: 20000238 .word 0x20000238
|
|
c64: 20000230 .word 0x20000230
|
|
|
|
00000c68 <_write>:
|
|
int __attribute__((weak))
|
|
_write (int file, char * ptr, int len);
|
|
|
|
int __attribute__((weak))
|
|
_write (int file, char * ptr, int len)
|
|
{
|
|
c68: b5f0 push {r4, r5, r6, r7, lr}
|
|
c6a: 46c6 mov lr, r8
|
|
c6c: b500 push {lr}
|
|
c6e: 000e movs r6, r1
|
|
c70: 0015 movs r5, r2
|
|
int nChars = 0;
|
|
|
|
if ((file != 1) && (file != 2) && (file!=3)) {
|
|
c72: 3801 subs r0, #1
|
|
c74: 2802 cmp r0, #2
|
|
c76: d810 bhi.n c9a <_write+0x32>
|
|
return -1;
|
|
}
|
|
|
|
for (; len != 0; --len) {
|
|
c78: 2a00 cmp r2, #0
|
|
c7a: d011 beq.n ca0 <_write+0x38>
|
|
c7c: 2400 movs r4, #0
|
|
if (ptr_put(stdio_base, *ptr++) < 0) {
|
|
c7e: 4b0c ldr r3, [pc, #48] ; (cb0 <_write+0x48>)
|
|
c80: 4698 mov r8, r3
|
|
c82: 4f0c ldr r7, [pc, #48] ; (cb4 <_write+0x4c>)
|
|
c84: 4643 mov r3, r8
|
|
c86: 6818 ldr r0, [r3, #0]
|
|
c88: 5d31 ldrb r1, [r6, r4]
|
|
c8a: 683b ldr r3, [r7, #0]
|
|
c8c: 4798 blx r3
|
|
c8e: 2800 cmp r0, #0
|
|
c90: db08 blt.n ca4 <_write+0x3c>
|
|
return -1;
|
|
}
|
|
++nChars;
|
|
c92: 3401 adds r4, #1
|
|
for (; len != 0; --len) {
|
|
c94: 42a5 cmp r5, r4
|
|
c96: d1f5 bne.n c84 <_write+0x1c>
|
|
c98: e006 b.n ca8 <_write+0x40>
|
|
return -1;
|
|
c9a: 2401 movs r4, #1
|
|
c9c: 4264 negs r4, r4
|
|
c9e: e003 b.n ca8 <_write+0x40>
|
|
for (; len != 0; --len) {
|
|
ca0: 0014 movs r4, r2
|
|
ca2: e001 b.n ca8 <_write+0x40>
|
|
return -1;
|
|
ca4: 2401 movs r4, #1
|
|
ca6: 4264 negs r4, r4
|
|
}
|
|
return nChars;
|
|
}
|
|
ca8: 0020 movs r0, r4
|
|
caa: bc04 pop {r2}
|
|
cac: 4690 mov r8, r2
|
|
cae: bdf0 pop {r4, r5, r6, r7, pc}
|
|
cb0: 20000238 .word 0x20000238
|
|
cb4: 20000234 .word 0x20000234
|
|
|
|
00000cb8 <padc_init>:
|
|
|
|
COMPILER_ALIGNED(16)
|
|
DmacDescriptor adc_descriptor SECTION_DMAC_DESCRIPTOR;
|
|
|
|
void padc_init(void)
|
|
{
|
|
cb8: b530 push {r4, r5, lr}
|
|
cba: b095 sub sp, #84 ; 0x54
|
|
// configure adc
|
|
struct adc_config adc_conf;
|
|
adc_get_config_defaults(&adc_conf);
|
|
cbc: ac08 add r4, sp, #32
|
|
cbe: 0020 movs r0, r4
|
|
cc0: 4b2a ldr r3, [pc, #168] ; (d6c <padc_init+0xb4>)
|
|
cc2: 4798 blx r3
|
|
adc_conf.gain_factor = P_ADC_GAIN_FACTOR;
|
|
cc4: 2300 movs r3, #0
|
|
cc6: 60a3 str r3, [r4, #8]
|
|
adc_conf.resolution = P_ADC_RESOLUTION;
|
|
cc8: 7123 strb r3, [r4, #4]
|
|
adc_conf.clock_prescaler = P_ADC_CLOCK_PRESCALAR;
|
|
cca: 2280 movs r2, #128 ; 0x80
|
|
ccc: 0092 lsls r2, r2, #2
|
|
cce: 8062 strh r2, [r4, #2]
|
|
adc_conf.reference = P_ADC_VREF;
|
|
cd0: 2201 movs r2, #1
|
|
cd2: 7062 strb r2, [r4, #1]
|
|
adc_conf.positive_input = P_ADC_POSITIVE_INPUT_PIN;
|
|
cd4: 2104 movs r1, #4
|
|
cd6: 7321 strb r1, [r4, #12]
|
|
adc_conf.negative_input = P_ADC_NEGATIVE_INPUT_PIN;
|
|
cd8: 21c0 movs r1, #192 ; 0xc0
|
|
cda: 0149 lsls r1, r1, #5
|
|
cdc: 81e1 strh r1, [r4, #14]
|
|
adc_conf.freerunning = true;
|
|
cde: 7522 strb r2, [r4, #20]
|
|
adc_conf.left_adjust = false;
|
|
ce0: 74a3 strb r3, [r4, #18]
|
|
|
|
adc_init(&adc_mod, ADC, &adc_conf);
|
|
ce2: 4d23 ldr r5, [pc, #140] ; (d70 <padc_init+0xb8>)
|
|
ce4: 0022 movs r2, r4
|
|
ce6: 4923 ldr r1, [pc, #140] ; (d74 <padc_init+0xbc>)
|
|
ce8: 0028 movs r0, r5
|
|
cea: 4b23 ldr r3, [pc, #140] ; (d78 <padc_init+0xc0>)
|
|
cec: 4798 blx r3
|
|
struct adc_module *const module_inst)
|
|
{
|
|
Assert(module_inst);
|
|
Assert(module_inst->hw);
|
|
|
|
Adc *const adc_module = module_inst->hw;
|
|
cee: 682a ldr r2, [r5, #0]
|
|
cf0: 7e53 ldrb r3, [r2, #25]
|
|
|
|
while (adc_is_syncing(module_inst)) {
|
|
cf2: b25b sxtb r3, r3
|
|
cf4: 2b00 cmp r3, #0
|
|
cf6: dbfb blt.n cf0 <padc_init+0x38>
|
|
system_interrupt_enable(SYSTEM_INTERRUPT_MODULE_ADC);
|
|
# endif
|
|
#endif
|
|
|
|
/* Disbale interrupt */
|
|
adc_module->INTENCLR.reg = ADC_INTENCLR_MASK;
|
|
cf8: 230f movs r3, #15
|
|
cfa: 7593 strb r3, [r2, #22]
|
|
/* Clear interrupt flag */
|
|
adc_module->INTFLAG.reg = ADC_INTFLAG_MASK;
|
|
cfc: 7613 strb r3, [r2, #24]
|
|
|
|
adc_module->CTRLA.reg |= ADC_CTRLA_ENABLE;
|
|
cfe: 7813 ldrb r3, [r2, #0]
|
|
d00: 2102 movs r1, #2
|
|
d02: 430b orrs r3, r1
|
|
d04: 7013 strb r3, [r2, #0]
|
|
Adc *const adc_module = module_inst->hw;
|
|
d06: 4b1a ldr r3, [pc, #104] ; (d70 <padc_init+0xb8>)
|
|
d08: 681a ldr r2, [r3, #0]
|
|
if (adc_module->STATUS.reg & ADC_STATUS_SYNCBUSY) {
|
|
d0a: 7e53 ldrb r3, [r2, #25]
|
|
|
|
while (adc_is_syncing(module_inst)) {
|
|
d0c: b25b sxtb r3, r3
|
|
d0e: 2b00 cmp r3, #0
|
|
d10: dbfb blt.n d0a <padc_init+0x52>
|
|
adc_enable(&adc_mod);
|
|
|
|
// configure dma resource
|
|
struct dma_resource_config dma_resource_conf;
|
|
dma_get_config_defaults(&dma_resource_conf);
|
|
d12: ac06 add r4, sp, #24
|
|
d14: 0020 movs r0, r4
|
|
d16: 4b19 ldr r3, [pc, #100] ; (d7c <padc_init+0xc4>)
|
|
d18: 4798 blx r3
|
|
dma_resource_conf.peripheral_trigger = ADC_DMAC_ID_RESRDY;
|
|
d1a: 2327 movs r3, #39 ; 0x27
|
|
d1c: 7063 strb r3, [r4, #1]
|
|
dma_resource_conf.trigger_action = DMA_TRIGGER_ACTION_BEAT;
|
|
d1e: 3b25 subs r3, #37 ; 0x25
|
|
d20: 70a3 strb r3, [r4, #2]
|
|
// allocate dma resource
|
|
dma_allocate(&adc_resource, &dma_resource_conf);
|
|
d22: 4d17 ldr r5, [pc, #92] ; (d80 <padc_init+0xc8>)
|
|
d24: 0021 movs r1, r4
|
|
d26: 0028 movs r0, r5
|
|
d28: 4b16 ldr r3, [pc, #88] ; (d84 <padc_init+0xcc>)
|
|
d2a: 4798 blx r3
|
|
static inline void dma_descriptor_get_config_defaults(struct dma_descriptor_config *config)
|
|
{
|
|
Assert(config);
|
|
|
|
/* Set descriptor as valid */
|
|
config->descriptor_valid = true;
|
|
d2c: 2201 movs r2, #1
|
|
d2e: 466b mov r3, sp
|
|
d30: 701a strb r2, [r3, #0]
|
|
/* Disable event output */
|
|
config->event_output_selection = DMA_EVENT_OUTPUT_DISABLE;
|
|
d32: 2300 movs r3, #0
|
|
d34: 4669 mov r1, sp
|
|
d36: 704b strb r3, [r1, #1]
|
|
/* No block action */
|
|
config->block_action = DMA_BLOCK_ACTION_NOACT;
|
|
d38: 708b strb r3, [r1, #2]
|
|
/* Set beat size to one byte */
|
|
config->beat_size = DMA_BEAT_SIZE_BYTE;
|
|
/* Enable source increment */
|
|
config->src_increment_enable = true;
|
|
/* Enable destination increment */
|
|
config->dst_increment_enable = true;
|
|
d3a: 714a strb r2, [r1, #5]
|
|
/* Step size is applied to the destination address */
|
|
config->step_selection = DMA_STEPSEL_DST;
|
|
d3c: 718b strb r3, [r1, #6]
|
|
/* Address increment is beat size multiplied by 1*/
|
|
config->step_size = DMA_ADDRESS_INCREMENT_STEP_SIZE_1;
|
|
d3e: 71cb strb r3, [r1, #7]
|
|
// setup transfer descriptor
|
|
struct dma_descriptor_config dma_desc_conf;
|
|
dma_descriptor_get_config_defaults(&dma_desc_conf);
|
|
dma_desc_conf.beat_size = DMA_BEAT_SIZE_HWORD; // 16 bit
|
|
d40: 70ca strb r2, [r1, #3]
|
|
dma_desc_conf.dst_increment_enable = true;
|
|
dma_desc_conf.src_increment_enable = false;
|
|
d42: 710b strb r3, [r1, #4]
|
|
dma_desc_conf.block_transfer_count = sizeof(raw_adc_values) / 2;
|
|
d44: 3310 adds r3, #16
|
|
d46: 810b strh r3, [r1, #8]
|
|
dma_desc_conf.source_address = (uint32_t)(&adc_mod.hw->RESULT.reg);
|
|
d48: 4b09 ldr r3, [pc, #36] ; (d70 <padc_init+0xb8>)
|
|
d4a: 681b ldr r3, [r3, #0]
|
|
d4c: 331a adds r3, #26
|
|
d4e: 9303 str r3, [sp, #12]
|
|
dma_desc_conf.destination_address = (uint32_t)(raw_adc_values + (sizeof(raw_adc_values) / 2));
|
|
d50: 4b0d ldr r3, [pc, #52] ; (d88 <padc_init+0xd0>)
|
|
d52: 3320 adds r3, #32
|
|
d54: 9304 str r3, [sp, #16]
|
|
dma_desc_conf.next_descriptor_address = (uint32_t)&adc_descriptor;
|
|
d56: 4c0d ldr r4, [pc, #52] ; (d8c <padc_init+0xd4>)
|
|
d58: 9405 str r4, [sp, #20]
|
|
dma_descriptor_create(&adc_descriptor, &dma_desc_conf);
|
|
d5a: 0020 movs r0, r4
|
|
d5c: 4b0c ldr r3, [pc, #48] ; (d90 <padc_init+0xd8>)
|
|
d5e: 4798 blx r3
|
|
dma_add_descriptor(&adc_resource, &adc_descriptor);
|
|
d60: 0021 movs r1, r4
|
|
d62: 0028 movs r0, r5
|
|
d64: 4b0b ldr r3, [pc, #44] ; (d94 <padc_init+0xdc>)
|
|
d66: 4798 blx r3
|
|
}
|
|
d68: b015 add sp, #84 ; 0x54
|
|
d6a: bd30 pop {r4, r5, pc}
|
|
d6c: 00000115 .word 0x00000115
|
|
d70: 2000010c .word 0x2000010c
|
|
d74: 42004000 .word 0x42004000
|
|
d78: 0000015d .word 0x0000015d
|
|
d7c: 00000601 .word 0x00000601
|
|
d80: 20000114 .word 0x20000114
|
|
d84: 00000611 .word 0x00000611
|
|
d88: 20000130 .word 0x20000130
|
|
d8c: 20000240 .word 0x20000240
|
|
d90: 000007e1 .word 0x000007e1
|
|
d94: 00000889 .word 0x00000889
|
|
|
|
00000d98 <padc_start>:
|
|
|
|
void padc_start(void)
|
|
{
|
|
d98: b510 push {r4, lr}
|
|
struct adc_module *const module_inst)
|
|
{
|
|
Assert(module_inst);
|
|
Assert(module_inst->hw);
|
|
|
|
Adc *const adc_module = module_inst->hw;
|
|
d9a: 4b09 ldr r3, [pc, #36] ; (dc0 <padc_start+0x28>)
|
|
d9c: 681a ldr r2, [r3, #0]
|
|
d9e: 7e53 ldrb r3, [r2, #25]
|
|
|
|
while (adc_is_syncing(module_inst)) {
|
|
da0: b25b sxtb r3, r3
|
|
da2: 2b00 cmp r3, #0
|
|
da4: dbfb blt.n d9e <padc_start+0x6>
|
|
/* Wait for synchronization */
|
|
}
|
|
|
|
adc_module->SWTRIG.reg |= ADC_SWTRIG_START;
|
|
da6: 7b13 ldrb r3, [r2, #12]
|
|
da8: 2102 movs r1, #2
|
|
daa: 430b orrs r3, r1
|
|
dac: 7313 strb r3, [r2, #12]
|
|
dae: 7e53 ldrb r3, [r2, #25]
|
|
|
|
while (adc_is_syncing(module_inst)) {
|
|
db0: b25b sxtb r3, r3
|
|
db2: 2b00 cmp r3, #0
|
|
db4: dbfb blt.n dae <padc_start+0x16>
|
|
adc_start_conversion(&adc_mod);
|
|
dma_start_transfer_job(&adc_resource);
|
|
db6: 4803 ldr r0, [pc, #12] ; (dc4 <padc_start+0x2c>)
|
|
db8: 4b03 ldr r3, [pc, #12] ; (dc8 <padc_start+0x30>)
|
|
dba: 4798 blx r3
|
|
}
|
|
dbc: bd10 pop {r4, pc}
|
|
dbe: 46c0 nop ; (mov r8, r8)
|
|
dc0: 2000010c .word 0x2000010c
|
|
dc4: 20000114 .word 0x20000114
|
|
dc8: 00000759 .word 0x00000759
|
|
|
|
00000dcc <padc_get_raw>:
|
|
uint16_t raw = padc_get_raw();
|
|
return (float)((float)raw / 4096.0f * P_ADC_VREF_VAL);
|
|
}
|
|
|
|
uint16_t padc_get_raw(void)
|
|
{
|
|
dcc: 4b05 ldr r3, [pc, #20] ; (de4 <padc_get_raw+0x18>)
|
|
dce: 0019 movs r1, r3
|
|
dd0: 3120 adds r1, #32
|
|
uint32_t sum = 0;
|
|
dd2: 2000 movs r0, #0
|
|
for(int ind = 0; ind < P_ADC_OVERSAMPLE_RATE; ind++)
|
|
{
|
|
sum += (uint32_t)raw_adc_values[ind];
|
|
dd4: 881a ldrh r2, [r3, #0]
|
|
dd6: 1880 adds r0, r0, r2
|
|
dd8: 3302 adds r3, #2
|
|
for(int ind = 0; ind < P_ADC_OVERSAMPLE_RATE; ind++)
|
|
dda: 428b cmp r3, r1
|
|
ddc: d1fa bne.n dd4 <padc_get_raw+0x8>
|
|
}
|
|
sum /= P_ADC_OVERSAMPLE_RATE;
|
|
dde: 0900 lsrs r0, r0, #4
|
|
return (uint16_t)sum;
|
|
de0: b280 uxth r0, r0
|
|
de2: 4770 bx lr
|
|
de4: 20000130 .word 0x20000130
|
|
|
|
00000de8 <padc_get_voltage>:
|
|
{
|
|
de8: b510 push {r4, lr}
|
|
uint16_t raw = padc_get_raw();
|
|
dea: 4b05 ldr r3, [pc, #20] ; (e00 <padc_get_voltage+0x18>)
|
|
dec: 4798 blx r3
|
|
return (float)((float)raw / 4096.0f * P_ADC_VREF_VAL);
|
|
dee: 4b05 ldr r3, [pc, #20] ; (e04 <padc_get_voltage+0x1c>)
|
|
df0: 4798 blx r3
|
|
df2: 4c05 ldr r4, [pc, #20] ; (e08 <padc_get_voltage+0x20>)
|
|
df4: 21e6 movs r1, #230 ; 0xe6
|
|
df6: 0589 lsls r1, r1, #22
|
|
df8: 47a0 blx r4
|
|
dfa: 4904 ldr r1, [pc, #16] ; (e0c <padc_get_voltage+0x24>)
|
|
dfc: 47a0 blx r4
|
|
}
|
|
dfe: bd10 pop {r4, pc}
|
|
e00: 00000dcd .word 0x00000dcd
|
|
e04: 000025b9 .word 0x000025b9
|
|
e08: 00001f61 .word 0x00001f61
|
|
e0c: 400eb368 .word 0x400eb368
|
|
|
|
00000e10 <usart_serial_getchar>:
|
|
* \param[out] c Destination for the read character.
|
|
*/
|
|
static inline void usart_serial_getchar(
|
|
struct usart_module *const module,
|
|
uint8_t *c)
|
|
{
|
|
e10: b570 push {r4, r5, r6, lr}
|
|
e12: b082 sub sp, #8
|
|
e14: 0005 movs r5, r0
|
|
e16: 000e movs r6, r1
|
|
uint16_t temp = 0;
|
|
e18: 2200 movs r2, #0
|
|
e1a: 466b mov r3, sp
|
|
e1c: 80da strh r2, [r3, #6]
|
|
|
|
while(STATUS_OK != usart_read_wait(module, &temp));
|
|
e1e: 4c06 ldr r4, [pc, #24] ; (e38 <usart_serial_getchar+0x28>)
|
|
e20: 466b mov r3, sp
|
|
e22: 1d99 adds r1, r3, #6
|
|
e24: 0028 movs r0, r5
|
|
e26: 47a0 blx r4
|
|
e28: 2800 cmp r0, #0
|
|
e2a: d1f9 bne.n e20 <usart_serial_getchar+0x10>
|
|
|
|
*c = temp;
|
|
e2c: 466b mov r3, sp
|
|
e2e: 3306 adds r3, #6
|
|
e30: 881b ldrh r3, [r3, #0]
|
|
e32: 7033 strb r3, [r6, #0]
|
|
}
|
|
e34: b002 add sp, #8
|
|
e36: bd70 pop {r4, r5, r6, pc}
|
|
e38: 000012a7 .word 0x000012a7
|
|
|
|
00000e3c <usart_serial_putchar>:
|
|
{
|
|
e3c: b570 push {r4, r5, r6, lr}
|
|
e3e: 0005 movs r5, r0
|
|
while(STATUS_OK !=usart_write_wait(module, c));
|
|
e40: b28c uxth r4, r1
|
|
e42: 4e03 ldr r6, [pc, #12] ; (e50 <usart_serial_putchar+0x14>)
|
|
e44: 0021 movs r1, r4
|
|
e46: 0028 movs r0, r5
|
|
e48: 47b0 blx r6
|
|
e4a: 2800 cmp r0, #0
|
|
e4c: d1fa bne.n e44 <usart_serial_putchar+0x8>
|
|
}
|
|
e4e: bd70 pop {r4, r5, r6, pc}
|
|
e50: 00001281 .word 0x00001281
|
|
|
|
00000e54 <pusart_init>:
|
|
#include "pusart.h"
|
|
|
|
void pusart_init(void)
|
|
{
|
|
e54: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
{
|
|
/* Sanity check arguments */
|
|
Assert(config);
|
|
|
|
/* Set default config in the config struct */
|
|
config->data_order = USART_DATAORDER_LSB;
|
|
e56: 4a2c ldr r2, [pc, #176] ; (f08 <pusart_init+0xb4>)
|
|
e58: 2380 movs r3, #128 ; 0x80
|
|
e5a: 05db lsls r3, r3, #23
|
|
e5c: 6013 str r3, [r2, #0]
|
|
config->transfer_mode = USART_TRANSFER_ASYNCHRONOUSLY;
|
|
e5e: 2300 movs r3, #0
|
|
e60: 6053 str r3, [r2, #4]
|
|
config->parity = USART_PARITY_NONE;
|
|
e62: 21ff movs r1, #255 ; 0xff
|
|
e64: 8111 strh r1, [r2, #8]
|
|
config->stopbits = USART_STOPBITS_1;
|
|
e66: 2100 movs r1, #0
|
|
e68: 7293 strb r3, [r2, #10]
|
|
config->character_size = USART_CHARACTER_SIZE_8BIT;
|
|
e6a: 72d3 strb r3, [r2, #11]
|
|
config->baudrate = 9600;
|
|
config->receiver_enable = true;
|
|
e6c: 2401 movs r4, #1
|
|
e6e: 2024 movs r0, #36 ; 0x24
|
|
e70: 5414 strb r4, [r2, r0]
|
|
config->transmitter_enable = true;
|
|
e72: 3001 adds r0, #1
|
|
e74: 5414 strb r4, [r2, r0]
|
|
config->clock_polarity_inverted = false;
|
|
e76: 3001 adds r0, #1
|
|
e78: 5413 strb r3, [r2, r0]
|
|
config->use_external_clock = false;
|
|
e7a: 3001 adds r0, #1
|
|
e7c: 5413 strb r3, [r2, r0]
|
|
config->ext_clock_freq = 0;
|
|
e7e: 6293 str r3, [r2, #40] ; 0x28
|
|
config->mux_setting = USART_RX_1_TX_2_XCK_3;
|
|
config->run_in_standby = false;
|
|
e80: 3005 adds r0, #5
|
|
e82: 5413 strb r3, [r2, r0]
|
|
config->generator_source = GCLK_GENERATOR_0;
|
|
e84: 3001 adds r0, #1
|
|
e86: 5413 strb r3, [r2, r0]
|
|
config->pinmux_pad0 = PINMUX_DEFAULT;
|
|
config->pinmux_pad1 = PINMUX_DEFAULT;
|
|
config->pinmux_pad2 = PINMUX_DEFAULT;
|
|
config->pinmux_pad3 = PINMUX_DEFAULT;
|
|
#ifdef FEATURE_USART_OVER_SAMPLE
|
|
config->sample_adjustment = USART_SAMPLE_ADJUSTMENT_7_8_9;
|
|
e88: 6153 str r3, [r2, #20]
|
|
config->sample_rate = USART_SAMPLE_RATE_16X_ARITHMETIC;
|
|
e8a: 8213 strh r3, [r2, #16]
|
|
#endif
|
|
#ifdef FEATURE_USART_LIN_SLAVE
|
|
config->lin_slave_enable = false;
|
|
e8c: 76d3 strb r3, [r2, #27]
|
|
config->lin_header_delay = LIN_MASTER_HEADER_DELAY_0;
|
|
config->lin_break_length = LIN_MASTER_BREAK_LENGTH_13_BIT;
|
|
#endif
|
|
|
|
#ifdef FEATURE_USART_IMMEDIATE_BUFFER_OVERFLOW_NOTIFICATION
|
|
config->immediate_buffer_overflow_notification = false;
|
|
e8e: 7611 strb r1, [r2, #24]
|
|
#endif
|
|
#ifdef FEATURE_USART_START_FRAME_DECTION
|
|
config->start_frame_detection_enable = false;
|
|
e90: 7711 strb r1, [r2, #28]
|
|
#endif
|
|
#ifdef FEATURE_USART_IRDA
|
|
config->encoding_format_enable = false;
|
|
e92: 7651 strb r1, [r2, #25]
|
|
config->receive_pulse_length = 19;
|
|
e94: 2313 movs r3, #19
|
|
e96: 7693 strb r3, [r2, #26]
|
|
config->iso7816_config.inhibit_nack = ISO7816_INHIBIT_NACK_DISABLE;
|
|
config->iso7816_config.successive_recv_nack = ISO7816_SUCCESSIVE_RECV_NACK_DISABLE;
|
|
config->iso7816_config.max_iterations = 7;
|
|
#endif
|
|
#ifdef FEATURE_USART_COLLISION_DECTION
|
|
config->collision_detection_enable = false;
|
|
e98: 7751 strb r1, [r2, #29]
|
|
static struct usart_config uconf;
|
|
usart_get_config_defaults(&uconf);
|
|
uconf.pinmux_pad0 = DEBUG_USART_PINMUX_PAD0;
|
|
e9a: 4b1c ldr r3, [pc, #112] ; (f0c <pusart_init+0xb8>)
|
|
e9c: 6313 str r3, [r2, #48] ; 0x30
|
|
uconf.pinmux_pad1 = DEBUG_USART_PINMUX_PAD1;
|
|
e9e: 4b1c ldr r3, [pc, #112] ; (f10 <pusart_init+0xbc>)
|
|
ea0: 6353 str r3, [r2, #52] ; 0x34
|
|
uconf.pinmux_pad2 = DEBUG_USART_PINMUX_PAD2;
|
|
ea2: 2301 movs r3, #1
|
|
ea4: 425b negs r3, r3
|
|
ea6: 6393 str r3, [r2, #56] ; 0x38
|
|
uconf.pinmux_pad3 = DEBUG_USART_PINMUX_PAD3;
|
|
ea8: 63d3 str r3, [r2, #60] ; 0x3c
|
|
uconf.mux_setting = DEBUG_USART_MUX_SETTING;
|
|
eaa: 2380 movs r3, #128 ; 0x80
|
|
eac: 035b lsls r3, r3, #13
|
|
eae: 60d3 str r3, [r2, #12]
|
|
uconf.baudrate = DEBUG_USART_BAUDRATE;
|
|
eb0: 23e1 movs r3, #225 ; 0xe1
|
|
eb2: 025b lsls r3, r3, #9
|
|
eb4: 6213 str r3, [r2, #32]
|
|
static inline void stdio_serial_init(
|
|
struct usart_module *const module,
|
|
usart_inst_t const hw,
|
|
const struct usart_config *const config)
|
|
{
|
|
stdio_base = (void *)module;
|
|
eb6: 4d17 ldr r5, [pc, #92] ; (f14 <pusart_init+0xc0>)
|
|
eb8: 4b17 ldr r3, [pc, #92] ; (f18 <pusart_init+0xc4>)
|
|
eba: 601d str r5, [r3, #0]
|
|
ptr_put = (int (*)(void volatile*,char))&usart_serial_putchar;
|
|
ebc: 4917 ldr r1, [pc, #92] ; (f1c <pusart_init+0xc8>)
|
|
ebe: 4b18 ldr r3, [pc, #96] ; (f20 <pusart_init+0xcc>)
|
|
ec0: 6019 str r1, [r3, #0]
|
|
ptr_get = (void (*)(void volatile*,char*))&usart_serial_getchar;
|
|
ec2: 4918 ldr r1, [pc, #96] ; (f24 <pusart_init+0xd0>)
|
|
ec4: 4b18 ldr r3, [pc, #96] ; (f28 <pusart_init+0xd4>)
|
|
ec6: 6019 str r1, [r3, #0]
|
|
if (usart_init(module, hw, config) == STATUS_OK) {
|
|
ec8: 4918 ldr r1, [pc, #96] ; (f2c <pusart_init+0xd8>)
|
|
eca: 0028 movs r0, r5
|
|
ecc: 4b18 ldr r3, [pc, #96] ; (f30 <pusart_init+0xdc>)
|
|
ece: 4798 blx r3
|
|
|
|
usart_serial_init(module, hw, config);
|
|
# if defined(__GNUC__)
|
|
// Specify that stdout and stdin should not be buffered.
|
|
setbuf(stdout, NULL);
|
|
ed0: 4f18 ldr r7, [pc, #96] ; (f34 <pusart_init+0xe0>)
|
|
ed2: 683b ldr r3, [r7, #0]
|
|
ed4: 6898 ldr r0, [r3, #8]
|
|
ed6: 2100 movs r1, #0
|
|
ed8: 4e17 ldr r6, [pc, #92] ; (f38 <pusart_init+0xe4>)
|
|
eda: 47b0 blx r6
|
|
setbuf(stdin, NULL);
|
|
edc: 683b ldr r3, [r7, #0]
|
|
ede: 6858 ldr r0, [r3, #4]
|
|
ee0: 2100 movs r1, #0
|
|
ee2: 47b0 blx r6
|
|
/* Sanity check arguments */
|
|
Assert(module);
|
|
Assert(module->hw);
|
|
|
|
/* Get a pointer to the hardware module instance */
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
ee4: 682e ldr r6, [r5, #0]
|
|
|
|
#if USART_CALLBACK_MODE == true
|
|
/* Enable Global interrupt for module */
|
|
system_interrupt_enable(_sercom_get_interrupt_vector(module->hw));
|
|
ee6: 0030 movs r0, r6
|
|
ee8: 4b14 ldr r3, [pc, #80] ; (f3c <pusart_init+0xe8>)
|
|
eea: 4798 blx r3
|
|
NVIC->ISER[0] = (uint32_t)(1 << ((uint32_t)vector & 0x0000001f));
|
|
eec: 231f movs r3, #31
|
|
eee: 4018 ands r0, r3
|
|
ef0: 4084 lsls r4, r0
|
|
ef2: 4b13 ldr r3, [pc, #76] ; (f40 <pusart_init+0xec>)
|
|
ef4: 601c str r4, [r3, #0]
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
ef6: 682a ldr r2, [r5, #0]
|
|
return (usart_hw->SYNCBUSY.reg);
|
|
ef8: 69d3 ldr r3, [r2, #28]
|
|
while (usart_is_syncing(module)) {
|
|
efa: 2b00 cmp r3, #0
|
|
efc: d1fc bne.n ef8 <pusart_init+0xa4>
|
|
|
|
/* Wait until synchronization is complete */
|
|
_usart_wait_for_sync(module);
|
|
|
|
/* Enable USART module */
|
|
usart_hw->CTRLA.reg |= SERCOM_USART_CTRLA_ENABLE;
|
|
efe: 6833 ldr r3, [r6, #0]
|
|
f00: 2202 movs r2, #2
|
|
f02: 4313 orrs r3, r2
|
|
f04: 6033 str r3, [r6, #0]
|
|
stdio_serial_init(&umod, DEBUG_USART_MODULE, &uconf);
|
|
usart_enable(&umod);
|
|
}
|
|
f06: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
f08: 20000150 .word 0x20000150
|
|
f0c: 00160002 .word 0x00160002
|
|
f10: 00170002 .word 0x00170002
|
|
f14: 20000250 .word 0x20000250
|
|
f18: 20000238 .word 0x20000238
|
|
f1c: 00000e3d .word 0x00000e3d
|
|
f20: 20000234 .word 0x20000234
|
|
f24: 00000e11 .word 0x00000e11
|
|
f28: 20000230 .word 0x20000230
|
|
f2c: 42001400 .word 0x42001400
|
|
f30: 00000f45 .word 0x00000f45
|
|
f34: 20000018 .word 0x20000018
|
|
f38: 00002721 .word 0x00002721
|
|
f3c: 000014e5 .word 0x000014e5
|
|
f40: e000e100 .word 0xe000e100
|
|
|
|
00000f44 <usart_init>:
|
|
*/
|
|
enum status_code usart_init(
|
|
struct usart_module *const module,
|
|
Sercom *const hw,
|
|
const struct usart_config *const config)
|
|
{
|
|
f44: b5f0 push {r4, r5, r6, r7, lr}
|
|
f46: 46de mov lr, fp
|
|
f48: 4657 mov r7, sl
|
|
f4a: 464e mov r6, r9
|
|
f4c: 4645 mov r5, r8
|
|
f4e: b5e0 push {r5, r6, r7, lr}
|
|
f50: b091 sub sp, #68 ; 0x44
|
|
f52: 0005 movs r5, r0
|
|
f54: 000c movs r4, r1
|
|
f56: 0016 movs r6, r2
|
|
Assert(config);
|
|
|
|
enum status_code status_code = STATUS_OK;
|
|
|
|
/* Assign module pointer to software instance struct */
|
|
module->hw = hw;
|
|
f58: 6029 str r1, [r5, #0]
|
|
|
|
/* Get a pointer to the hardware module instance */
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
|
|
uint32_t sercom_index = _sercom_get_sercom_inst_index(module->hw);
|
|
f5a: 0008 movs r0, r1
|
|
f5c: 4bba ldr r3, [pc, #744] ; (1248 <usart_init+0x304>)
|
|
f5e: 4798 blx r3
|
|
f60: 0002 movs r2, r0
|
|
#else
|
|
pm_index = sercom_index + PM_APBCMASK_SERCOM0_Pos;
|
|
gclk_index = sercom_index + SERCOM0_GCLK_ID_CORE;
|
|
#endif
|
|
|
|
if (usart_hw->CTRLA.reg & SERCOM_USART_CTRLA_SWRST) {
|
|
f62: 6823 ldr r3, [r4, #0]
|
|
/* The module is busy resetting itself */
|
|
return STATUS_BUSY;
|
|
f64: 2005 movs r0, #5
|
|
if (usart_hw->CTRLA.reg & SERCOM_USART_CTRLA_SWRST) {
|
|
f66: 07db lsls r3, r3, #31
|
|
f68: d506 bpl.n f78 <usart_init+0x34>
|
|
_sercom_set_handler(instance_index, _usart_interrupt_handler);
|
|
_sercom_instances[instance_index] = module;
|
|
#endif
|
|
|
|
return status_code;
|
|
}
|
|
f6a: b011 add sp, #68 ; 0x44
|
|
f6c: bc3c pop {r2, r3, r4, r5}
|
|
f6e: 4690 mov r8, r2
|
|
f70: 4699 mov r9, r3
|
|
f72: 46a2 mov sl, r4
|
|
f74: 46ab mov fp, r5
|
|
f76: bdf0 pop {r4, r5, r6, r7, pc}
|
|
if (usart_hw->CTRLA.reg & SERCOM_USART_CTRLA_ENABLE) {
|
|
f78: 6823 ldr r3, [r4, #0]
|
|
return STATUS_ERR_DENIED;
|
|
f7a: 3017 adds r0, #23
|
|
if (usart_hw->CTRLA.reg & SERCOM_USART_CTRLA_ENABLE) {
|
|
f7c: 079b lsls r3, r3, #30
|
|
f7e: d4f4 bmi.n f6a <usart_init+0x26>
|
|
PM->APBCMASK.reg |= mask;
|
|
f80: 49b2 ldr r1, [pc, #712] ; (124c <usart_init+0x308>)
|
|
f82: 6a08 ldr r0, [r1, #32]
|
|
pm_index = sercom_index + PM_APBCMASK_SERCOM0_Pos;
|
|
f84: 1c97 adds r7, r2, #2
|
|
system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, 1 << pm_index);
|
|
f86: 2301 movs r3, #1
|
|
f88: 40bb lsls r3, r7
|
|
f8a: 4303 orrs r3, r0
|
|
f8c: 620b str r3, [r1, #32]
|
|
gclk_chan_conf.source_generator = config->generator_source;
|
|
f8e: a90f add r1, sp, #60 ; 0x3c
|
|
f90: 272d movs r7, #45 ; 0x2d
|
|
f92: 5df3 ldrb r3, [r6, r7]
|
|
f94: 700b strb r3, [r1, #0]
|
|
gclk_index = sercom_index + SERCOM0_GCLK_ID_CORE;
|
|
f96: 3214 adds r2, #20
|
|
system_gclk_chan_set_config(gclk_index, &gclk_chan_conf);
|
|
f98: b2d3 uxtb r3, r2
|
|
f9a: 9302 str r3, [sp, #8]
|
|
f9c: 0018 movs r0, r3
|
|
f9e: 4bac ldr r3, [pc, #688] ; (1250 <usart_init+0x30c>)
|
|
fa0: 4798 blx r3
|
|
system_gclk_chan_enable(gclk_index);
|
|
fa2: 9802 ldr r0, [sp, #8]
|
|
fa4: 4bab ldr r3, [pc, #684] ; (1254 <usart_init+0x310>)
|
|
fa6: 4798 blx r3
|
|
sercom_set_gclk_generator(config->generator_source, false);
|
|
fa8: 5df0 ldrb r0, [r6, r7]
|
|
faa: 2100 movs r1, #0
|
|
fac: 4baa ldr r3, [pc, #680] ; (1258 <usart_init+0x314>)
|
|
fae: 4798 blx r3
|
|
module->character_size = config->character_size;
|
|
fb0: 7af3 ldrb r3, [r6, #11]
|
|
fb2: 716b strb r3, [r5, #5]
|
|
module->receiver_enabled = config->receiver_enable;
|
|
fb4: 2324 movs r3, #36 ; 0x24
|
|
fb6: 5cf3 ldrb r3, [r6, r3]
|
|
fb8: 71ab strb r3, [r5, #6]
|
|
module->transmitter_enabled = config->transmitter_enable;
|
|
fba: 2325 movs r3, #37 ; 0x25
|
|
fbc: 5cf3 ldrb r3, [r6, r3]
|
|
fbe: 71eb strb r3, [r5, #7]
|
|
module->lin_slave_enabled = config->lin_slave_enable;
|
|
fc0: 7ef3 ldrb r3, [r6, #27]
|
|
fc2: 722b strb r3, [r5, #8]
|
|
module->start_frame_detection_enabled = config->start_frame_detection_enable;
|
|
fc4: 7f33 ldrb r3, [r6, #28]
|
|
fc6: 726b strb r3, [r5, #9]
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
fc8: 682b ldr r3, [r5, #0]
|
|
fca: 4698 mov r8, r3
|
|
uint32_t sercom_index = _sercom_get_sercom_inst_index(module->hw);
|
|
fcc: 0018 movs r0, r3
|
|
fce: 4b9e ldr r3, [pc, #632] ; (1248 <usart_init+0x304>)
|
|
fd0: 4798 blx r3
|
|
gclk_index = sercom_index + SERCOM0_GCLK_ID_CORE;
|
|
fd2: 3014 adds r0, #20
|
|
uint16_t baud = 0;
|
|
fd4: 2200 movs r2, #0
|
|
fd6: 230e movs r3, #14
|
|
fd8: a906 add r1, sp, #24
|
|
fda: 468c mov ip, r1
|
|
fdc: 4463 add r3, ip
|
|
fde: 801a strh r2, [r3, #0]
|
|
switch (config->sample_rate) {
|
|
fe0: 8a32 ldrh r2, [r6, #16]
|
|
fe2: 9202 str r2, [sp, #8]
|
|
fe4: 2380 movs r3, #128 ; 0x80
|
|
fe6: 01db lsls r3, r3, #7
|
|
fe8: 429a cmp r2, r3
|
|
fea: d100 bne.n fee <usart_init+0xaa>
|
|
fec: e09a b.n 1124 <usart_init+0x1e0>
|
|
fee: d90f bls.n 1010 <usart_init+0xcc>
|
|
ff0: 23c0 movs r3, #192 ; 0xc0
|
|
ff2: 01db lsls r3, r3, #7
|
|
ff4: 9a02 ldr r2, [sp, #8]
|
|
ff6: 429a cmp r2, r3
|
|
ff8: d100 bne.n ffc <usart_init+0xb8>
|
|
ffa: e08e b.n 111a <usart_init+0x1d6>
|
|
ffc: 2380 movs r3, #128 ; 0x80
|
|
ffe: 021b lsls r3, r3, #8
|
|
1000: 429a cmp r2, r3
|
|
1002: d000 beq.n 1006 <usart_init+0xc2>
|
|
1004: e11b b.n 123e <usart_init+0x2fa>
|
|
sample_num = SERCOM_ASYNC_SAMPLE_NUM_3;
|
|
1006: 2303 movs r3, #3
|
|
1008: 9306 str r3, [sp, #24]
|
|
mode = SERCOM_ASYNC_OPERATION_MODE_ARITHMETIC;
|
|
100a: 2300 movs r3, #0
|
|
100c: 9307 str r3, [sp, #28]
|
|
100e: e008 b.n 1022 <usart_init+0xde>
|
|
switch (config->sample_rate) {
|
|
1010: 2380 movs r3, #128 ; 0x80
|
|
1012: 019b lsls r3, r3, #6
|
|
1014: 429a cmp r2, r3
|
|
1016: d000 beq.n 101a <usart_init+0xd6>
|
|
1018: e111 b.n 123e <usart_init+0x2fa>
|
|
sample_num = SERCOM_ASYNC_SAMPLE_NUM_16;
|
|
101a: 2310 movs r3, #16
|
|
101c: 9306 str r3, [sp, #24]
|
|
mode = SERCOM_ASYNC_OPERATION_MODE_FRACTIONAL;
|
|
101e: 3b0f subs r3, #15
|
|
1020: 9307 str r3, [sp, #28]
|
|
ctrla = (uint32_t)config->data_order |
|
|
1022: 6833 ldr r3, [r6, #0]
|
|
1024: 9305 str r3, [sp, #20]
|
|
(uint32_t)config->mux_setting |
|
|
1026: 68f3 ldr r3, [r6, #12]
|
|
1028: 469b mov fp, r3
|
|
config->sample_adjustment |
|
|
102a: 6973 ldr r3, [r6, #20]
|
|
102c: 9303 str r3, [sp, #12]
|
|
(config->immediate_buffer_overflow_notification << SERCOM_USART_CTRLA_IBON_Pos) |
|
|
102e: 7e33 ldrb r3, [r6, #24]
|
|
1030: 9304 str r3, [sp, #16]
|
|
(config->clock_polarity_inverted << SERCOM_USART_CTRLA_CPOL_Pos);
|
|
1032: 2326 movs r3, #38 ; 0x26
|
|
1034: 5cf3 ldrb r3, [r6, r3]
|
|
1036: 469a mov sl, r3
|
|
transfer_mode = (uint32_t)config->transfer_mode;
|
|
1038: 6873 ldr r3, [r6, #4]
|
|
103a: 4699 mov r9, r3
|
|
switch (transfer_mode)
|
|
103c: 2b00 cmp r3, #0
|
|
103e: d100 bne.n 1042 <usart_init+0xfe>
|
|
1040: e09c b.n 117c <usart_init+0x238>
|
|
1042: 2380 movs r3, #128 ; 0x80
|
|
1044: 055b lsls r3, r3, #21
|
|
1046: 4599 cmp r9, r3
|
|
1048: d100 bne.n 104c <usart_init+0x108>
|
|
104a: e080 b.n 114e <usart_init+0x20a>
|
|
if(config->encoding_format_enable) {
|
|
104c: 7e73 ldrb r3, [r6, #25]
|
|
104e: 2b00 cmp r3, #0
|
|
1050: d002 beq.n 1058 <usart_init+0x114>
|
|
usart_hw->RXPL.reg = config->receive_pulse_length;
|
|
1052: 7eb3 ldrb r3, [r6, #26]
|
|
1054: 4642 mov r2, r8
|
|
1056: 7393 strb r3, [r2, #14]
|
|
usart_hw->BAUD.reg = baud;
|
|
1058: 230e movs r3, #14
|
|
105a: aa06 add r2, sp, #24
|
|
105c: 4694 mov ip, r2
|
|
105e: 4463 add r3, ip
|
|
1060: 881b ldrh r3, [r3, #0]
|
|
1062: 4642 mov r2, r8
|
|
1064: 8193 strh r3, [r2, #12]
|
|
ctrla |= transfer_mode;
|
|
1066: 9b05 ldr r3, [sp, #20]
|
|
1068: 465a mov r2, fp
|
|
106a: 4313 orrs r3, r2
|
|
106c: 9a03 ldr r2, [sp, #12]
|
|
106e: 4313 orrs r3, r2
|
|
1070: 464a mov r2, r9
|
|
1072: 4313 orrs r3, r2
|
|
1074: 9f02 ldr r7, [sp, #8]
|
|
1076: 431f orrs r7, r3
|
|
(config->immediate_buffer_overflow_notification << SERCOM_USART_CTRLA_IBON_Pos) |
|
|
1078: 9b04 ldr r3, [sp, #16]
|
|
107a: 021b lsls r3, r3, #8
|
|
ctrla |= transfer_mode;
|
|
107c: 431f orrs r7, r3
|
|
(config->clock_polarity_inverted << SERCOM_USART_CTRLA_CPOL_Pos);
|
|
107e: 4653 mov r3, sl
|
|
1080: 075b lsls r3, r3, #29
|
|
ctrla |= transfer_mode;
|
|
1082: 431f orrs r7, r3
|
|
if (config->use_external_clock == false) {
|
|
1084: 2327 movs r3, #39 ; 0x27
|
|
1086: 5cf3 ldrb r3, [r6, r3]
|
|
1088: 2b00 cmp r3, #0
|
|
108a: d101 bne.n 1090 <usart_init+0x14c>
|
|
ctrla |= SERCOM_USART_CTRLA_MODE(0x1);
|
|
108c: 3304 adds r3, #4
|
|
108e: 431f orrs r7, r3
|
|
(config->encoding_format_enable << SERCOM_USART_CTRLB_ENC_Pos) |
|
|
1090: 7e73 ldrb r3, [r6, #25]
|
|
1092: 029b lsls r3, r3, #10
|
|
(config->start_frame_detection_enable << SERCOM_USART_CTRLB_SFDE_Pos) |
|
|
1094: 7f32 ldrb r2, [r6, #28]
|
|
1096: 0252 lsls r2, r2, #9
|
|
(config->encoding_format_enable << SERCOM_USART_CTRLB_ENC_Pos) |
|
|
1098: 4313 orrs r3, r2
|
|
(config->collision_detection_enable << SERCOM_USART_CTRLB_COLDEN_Pos) |
|
|
109a: 7f72 ldrb r2, [r6, #29]
|
|
109c: 0212 lsls r2, r2, #8
|
|
(config->start_frame_detection_enable << SERCOM_USART_CTRLB_SFDE_Pos) |
|
|
109e: 4313 orrs r3, r2
|
|
(config->receiver_enable << SERCOM_USART_CTRLB_RXEN_Pos) |
|
|
10a0: 2224 movs r2, #36 ; 0x24
|
|
10a2: 5cb2 ldrb r2, [r6, r2]
|
|
10a4: 0452 lsls r2, r2, #17
|
|
(config->collision_detection_enable << SERCOM_USART_CTRLB_COLDEN_Pos) |
|
|
10a6: 4313 orrs r3, r2
|
|
(config->transmitter_enable << SERCOM_USART_CTRLB_TXEN_Pos);
|
|
10a8: 2225 movs r2, #37 ; 0x25
|
|
10aa: 5cb2 ldrb r2, [r6, r2]
|
|
10ac: 0412 lsls r2, r2, #16
|
|
(config->receiver_enable << SERCOM_USART_CTRLB_RXEN_Pos) |
|
|
10ae: 4313 orrs r3, r2
|
|
ctrlb |= (uint32_t)config->character_size;
|
|
10b0: 7ab1 ldrb r1, [r6, #10]
|
|
10b2: 7af2 ldrb r2, [r6, #11]
|
|
10b4: 4311 orrs r1, r2
|
|
10b6: 4319 orrs r1, r3
|
|
if (config->parity != USART_PARITY_NONE) {
|
|
10b8: 8933 ldrh r3, [r6, #8]
|
|
10ba: 2bff cmp r3, #255 ; 0xff
|
|
10bc: d100 bne.n 10c0 <usart_init+0x17c>
|
|
10be: e081 b.n 11c4 <usart_init+0x280>
|
|
ctrla |= SERCOM_USART_CTRLA_FORM(1);
|
|
10c0: 2280 movs r2, #128 ; 0x80
|
|
10c2: 0452 lsls r2, r2, #17
|
|
10c4: 4317 orrs r7, r2
|
|
ctrlb |= config->parity;
|
|
10c6: 4319 orrs r1, r3
|
|
if (config->run_in_standby || system_is_debugger_present()) {
|
|
10c8: 232c movs r3, #44 ; 0x2c
|
|
10ca: 5cf3 ldrb r3, [r6, r3]
|
|
10cc: 2b00 cmp r3, #0
|
|
10ce: d103 bne.n 10d8 <usart_init+0x194>
|
|
* \retval false Debugger is not connected to the system
|
|
*
|
|
*/
|
|
static inline bool system_is_debugger_present(void)
|
|
{
|
|
return DSU->STATUSB.reg & DSU_STATUSB_DBGPRES;
|
|
10d0: 4b62 ldr r3, [pc, #392] ; (125c <usart_init+0x318>)
|
|
10d2: 789b ldrb r3, [r3, #2]
|
|
10d4: 079b lsls r3, r3, #30
|
|
10d6: d501 bpl.n 10dc <usart_init+0x198>
|
|
ctrla |= SERCOM_USART_CTRLA_RUNSTDBY;
|
|
10d8: 2380 movs r3, #128 ; 0x80
|
|
10da: 431f orrs r7, r3
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
10dc: 682a ldr r2, [r5, #0]
|
|
return (usart_hw->SYNCBUSY.reg);
|
|
10de: 69d3 ldr r3, [r2, #28]
|
|
while (usart_is_syncing(module)) {
|
|
10e0: 2b00 cmp r3, #0
|
|
10e2: d1fc bne.n 10de <usart_init+0x19a>
|
|
usart_hw->CTRLB.reg = ctrlb;
|
|
10e4: 4643 mov r3, r8
|
|
10e6: 6059 str r1, [r3, #4]
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
10e8: 682a ldr r2, [r5, #0]
|
|
return (usart_hw->SYNCBUSY.reg);
|
|
10ea: 69d3 ldr r3, [r2, #28]
|
|
while (usart_is_syncing(module)) {
|
|
10ec: 2b00 cmp r3, #0
|
|
10ee: d1fc bne.n 10ea <usart_init+0x1a6>
|
|
usart_hw->CTRLA.reg = ctrla;
|
|
10f0: 4643 mov r3, r8
|
|
10f2: 601f str r7, [r3, #0]
|
|
config->mux_position = SYSTEM_PINMUX_GPIO;
|
|
10f4: ab0e add r3, sp, #56 ; 0x38
|
|
10f6: 2280 movs r2, #128 ; 0x80
|
|
10f8: 701a strb r2, [r3, #0]
|
|
config->direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
|
|
10fa: 2200 movs r2, #0
|
|
10fc: 705a strb r2, [r3, #1]
|
|
config->powersave = false;
|
|
10fe: 70da strb r2, [r3, #3]
|
|
pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
|
1100: 709a strb r2, [r3, #2]
|
|
uint32_t pad_pinmuxes[] = {
|
|
1102: 6b33 ldr r3, [r6, #48] ; 0x30
|
|
1104: 930a str r3, [sp, #40] ; 0x28
|
|
1106: 6b73 ldr r3, [r6, #52] ; 0x34
|
|
1108: 930b str r3, [sp, #44] ; 0x2c
|
|
110a: 6bb3 ldr r3, [r6, #56] ; 0x38
|
|
110c: 930c str r3, [sp, #48] ; 0x30
|
|
110e: 6bf3 ldr r3, [r6, #60] ; 0x3c
|
|
1110: 9302 str r3, [sp, #8]
|
|
1112: 930d str r3, [sp, #52] ; 0x34
|
|
1114: 2700 movs r7, #0
|
|
uint32_t current_pinmux = pad_pinmuxes[pad];
|
|
1116: ae0a add r6, sp, #40 ; 0x28
|
|
1118: e063 b.n 11e2 <usart_init+0x29e>
|
|
sample_num = SERCOM_ASYNC_SAMPLE_NUM_8;
|
|
111a: 2308 movs r3, #8
|
|
111c: 9306 str r3, [sp, #24]
|
|
mode = SERCOM_ASYNC_OPERATION_MODE_FRACTIONAL;
|
|
111e: 3b07 subs r3, #7
|
|
1120: 9307 str r3, [sp, #28]
|
|
1122: e77e b.n 1022 <usart_init+0xde>
|
|
ctrla = (uint32_t)config->data_order |
|
|
1124: 6833 ldr r3, [r6, #0]
|
|
1126: 9305 str r3, [sp, #20]
|
|
(uint32_t)config->mux_setting |
|
|
1128: 68f3 ldr r3, [r6, #12]
|
|
112a: 469b mov fp, r3
|
|
config->sample_adjustment |
|
|
112c: 6973 ldr r3, [r6, #20]
|
|
112e: 9303 str r3, [sp, #12]
|
|
(config->immediate_buffer_overflow_notification << SERCOM_USART_CTRLA_IBON_Pos) |
|
|
1130: 7e33 ldrb r3, [r6, #24]
|
|
1132: 9304 str r3, [sp, #16]
|
|
(config->clock_polarity_inverted << SERCOM_USART_CTRLA_CPOL_Pos);
|
|
1134: 2326 movs r3, #38 ; 0x26
|
|
1136: 5cf3 ldrb r3, [r6, r3]
|
|
1138: 469a mov sl, r3
|
|
transfer_mode = (uint32_t)config->transfer_mode;
|
|
113a: 6873 ldr r3, [r6, #4]
|
|
113c: 4699 mov r9, r3
|
|
switch (transfer_mode)
|
|
113e: 2b00 cmp r3, #0
|
|
1140: d018 beq.n 1174 <usart_init+0x230>
|
|
1142: 2380 movs r3, #128 ; 0x80
|
|
1144: 055b lsls r3, r3, #21
|
|
1146: 4599 cmp r9, r3
|
|
1148: d001 beq.n 114e <usart_init+0x20a>
|
|
enum status_code status_code = STATUS_OK;
|
|
114a: 2000 movs r0, #0
|
|
114c: e025 b.n 119a <usart_init+0x256>
|
|
if (!config->use_external_clock) {
|
|
114e: 2327 movs r3, #39 ; 0x27
|
|
1150: 5cf3 ldrb r3, [r6, r3]
|
|
1152: 2b00 cmp r3, #0
|
|
1154: d000 beq.n 1158 <usart_init+0x214>
|
|
1156: e779 b.n 104c <usart_init+0x108>
|
|
status_code = _sercom_get_sync_baud_val(config->baudrate,
|
|
1158: 6a33 ldr r3, [r6, #32]
|
|
115a: 001f movs r7, r3
|
|
115c: b2c0 uxtb r0, r0
|
|
115e: 4b40 ldr r3, [pc, #256] ; (1260 <usart_init+0x31c>)
|
|
1160: 4798 blx r3
|
|
1162: 0001 movs r1, r0
|
|
1164: 220e movs r2, #14
|
|
1166: ab06 add r3, sp, #24
|
|
1168: 469c mov ip, r3
|
|
116a: 4462 add r2, ip
|
|
116c: 0038 movs r0, r7
|
|
116e: 4b3d ldr r3, [pc, #244] ; (1264 <usart_init+0x320>)
|
|
1170: 4798 blx r3
|
|
1172: e012 b.n 119a <usart_init+0x256>
|
|
sample_num = SERCOM_ASYNC_SAMPLE_NUM_8;
|
|
1174: 2308 movs r3, #8
|
|
1176: 9306 str r3, [sp, #24]
|
|
mode = SERCOM_ASYNC_OPERATION_MODE_ARITHMETIC;
|
|
1178: 2300 movs r3, #0
|
|
117a: 9307 str r3, [sp, #28]
|
|
if (config->use_external_clock) {
|
|
117c: 2327 movs r3, #39 ; 0x27
|
|
117e: 5cf3 ldrb r3, [r6, r3]
|
|
1180: 2b00 cmp r3, #0
|
|
1182: d00e beq.n 11a2 <usart_init+0x25e>
|
|
status_code =
|
|
1184: 9b06 ldr r3, [sp, #24]
|
|
1186: 9300 str r3, [sp, #0]
|
|
1188: 9b07 ldr r3, [sp, #28]
|
|
118a: 220e movs r2, #14
|
|
118c: a906 add r1, sp, #24
|
|
118e: 468c mov ip, r1
|
|
1190: 4462 add r2, ip
|
|
1192: 6ab1 ldr r1, [r6, #40] ; 0x28
|
|
1194: 6a30 ldr r0, [r6, #32]
|
|
1196: 4f34 ldr r7, [pc, #208] ; (1268 <usart_init+0x324>)
|
|
1198: 47b8 blx r7
|
|
if (status_code != STATUS_OK) {
|
|
119a: 2800 cmp r0, #0
|
|
119c: d000 beq.n 11a0 <usart_init+0x25c>
|
|
119e: e6e4 b.n f6a <usart_init+0x26>
|
|
11a0: e754 b.n 104c <usart_init+0x108>
|
|
_sercom_get_async_baud_val(config->baudrate,
|
|
11a2: 6a33 ldr r3, [r6, #32]
|
|
11a4: 001f movs r7, r3
|
|
11a6: b2c0 uxtb r0, r0
|
|
11a8: 4b2d ldr r3, [pc, #180] ; (1260 <usart_init+0x31c>)
|
|
11aa: 4798 blx r3
|
|
11ac: 0001 movs r1, r0
|
|
status_code =
|
|
11ae: 9b06 ldr r3, [sp, #24]
|
|
11b0: 9300 str r3, [sp, #0]
|
|
11b2: 9b07 ldr r3, [sp, #28]
|
|
11b4: 220e movs r2, #14
|
|
11b6: a806 add r0, sp, #24
|
|
11b8: 4684 mov ip, r0
|
|
11ba: 4462 add r2, ip
|
|
11bc: 0038 movs r0, r7
|
|
11be: 4f2a ldr r7, [pc, #168] ; (1268 <usart_init+0x324>)
|
|
11c0: 47b8 blx r7
|
|
11c2: e7ea b.n 119a <usart_init+0x256>
|
|
if(config->lin_slave_enable) {
|
|
11c4: 7ef3 ldrb r3, [r6, #27]
|
|
11c6: 2b00 cmp r3, #0
|
|
11c8: d100 bne.n 11cc <usart_init+0x288>
|
|
11ca: e77d b.n 10c8 <usart_init+0x184>
|
|
ctrla |= SERCOM_USART_CTRLA_FORM(0x4);
|
|
11cc: 2380 movs r3, #128 ; 0x80
|
|
11ce: 04db lsls r3, r3, #19
|
|
11d0: 431f orrs r7, r3
|
|
11d2: e779 b.n 10c8 <usart_init+0x184>
|
|
current_pinmux = _sercom_get_default_pad(hw, pad);
|
|
11d4: 0020 movs r0, r4
|
|
11d6: 4b25 ldr r3, [pc, #148] ; (126c <usart_init+0x328>)
|
|
11d8: 4798 blx r3
|
|
11da: e007 b.n 11ec <usart_init+0x2a8>
|
|
11dc: 3701 adds r7, #1
|
|
for (uint8_t pad = 0; pad < 4; pad++) {
|
|
11de: 2f04 cmp r7, #4
|
|
11e0: d00d beq.n 11fe <usart_init+0x2ba>
|
|
11e2: b2f9 uxtb r1, r7
|
|
uint32_t current_pinmux = pad_pinmuxes[pad];
|
|
11e4: 00bb lsls r3, r7, #2
|
|
11e6: 5998 ldr r0, [r3, r6]
|
|
if (current_pinmux == PINMUX_DEFAULT) {
|
|
11e8: 2800 cmp r0, #0
|
|
11ea: d0f3 beq.n 11d4 <usart_init+0x290>
|
|
if (current_pinmux != PINMUX_UNUSED) {
|
|
11ec: 1c43 adds r3, r0, #1
|
|
11ee: d0f5 beq.n 11dc <usart_init+0x298>
|
|
pin_conf.mux_position = current_pinmux & 0xFFFF;
|
|
11f0: a90e add r1, sp, #56 ; 0x38
|
|
11f2: 7008 strb r0, [r1, #0]
|
|
system_pinmux_pin_set_config(current_pinmux >> 16, &pin_conf);
|
|
11f4: 0c00 lsrs r0, r0, #16
|
|
11f6: b2c0 uxtb r0, r0
|
|
11f8: 4b1d ldr r3, [pc, #116] ; (1270 <usart_init+0x32c>)
|
|
11fa: 4798 blx r3
|
|
11fc: e7ee b.n 11dc <usart_init+0x298>
|
|
module->callback[i] = NULL;
|
|
11fe: 2300 movs r3, #0
|
|
1200: 60eb str r3, [r5, #12]
|
|
1202: 612b str r3, [r5, #16]
|
|
1204: 616b str r3, [r5, #20]
|
|
1206: 61ab str r3, [r5, #24]
|
|
1208: 61eb str r3, [r5, #28]
|
|
120a: 622b str r3, [r5, #32]
|
|
module->tx_buffer_ptr = NULL;
|
|
120c: 62ab str r3, [r5, #40] ; 0x28
|
|
module->rx_buffer_ptr = NULL;
|
|
120e: 626b str r3, [r5, #36] ; 0x24
|
|
module->remaining_tx_buffer_length = 0x0000;
|
|
1210: 2200 movs r2, #0
|
|
1212: 85eb strh r3, [r5, #46] ; 0x2e
|
|
module->remaining_rx_buffer_length = 0x0000;
|
|
1214: 85ab strh r3, [r5, #44] ; 0x2c
|
|
module->callback_reg_mask = 0x00;
|
|
1216: 3330 adds r3, #48 ; 0x30
|
|
1218: 54ea strb r2, [r5, r3]
|
|
module->callback_enable_mask = 0x00;
|
|
121a: 3301 adds r3, #1
|
|
121c: 54ea strb r2, [r5, r3]
|
|
module->rx_status = STATUS_OK;
|
|
121e: 3301 adds r3, #1
|
|
1220: 54ea strb r2, [r5, r3]
|
|
module->tx_status = STATUS_OK;
|
|
1222: 3301 adds r3, #1
|
|
1224: 54ea strb r2, [r5, r3]
|
|
uint8_t instance_index = _sercom_get_sercom_inst_index(module->hw);
|
|
1226: 6828 ldr r0, [r5, #0]
|
|
1228: 4b07 ldr r3, [pc, #28] ; (1248 <usart_init+0x304>)
|
|
122a: 4798 blx r3
|
|
122c: 0004 movs r4, r0
|
|
_sercom_set_handler(instance_index, _usart_interrupt_handler);
|
|
122e: 4911 ldr r1, [pc, #68] ; (1274 <usart_init+0x330>)
|
|
1230: 4b11 ldr r3, [pc, #68] ; (1278 <usart_init+0x334>)
|
|
1232: 4798 blx r3
|
|
_sercom_instances[instance_index] = module;
|
|
1234: 00a4 lsls r4, r4, #2
|
|
1236: 4b11 ldr r3, [pc, #68] ; (127c <usart_init+0x338>)
|
|
1238: 50e5 str r5, [r4, r3]
|
|
return status_code;
|
|
123a: 2000 movs r0, #0
|
|
123c: e695 b.n f6a <usart_init+0x26>
|
|
enum sercom_asynchronous_sample_num sample_num = SERCOM_ASYNC_SAMPLE_NUM_16;
|
|
123e: 2310 movs r3, #16
|
|
1240: 9306 str r3, [sp, #24]
|
|
enum sercom_asynchronous_operation_mode mode = SERCOM_ASYNC_OPERATION_MODE_ARITHMETIC;
|
|
1242: 2300 movs r3, #0
|
|
1244: 9307 str r3, [sp, #28]
|
|
1246: e6ec b.n 1022 <usart_init+0xde>
|
|
1248: 00000bed .word 0x00000bed
|
|
124c: 40000400 .word 0x40000400
|
|
1250: 00001af5 .word 0x00001af5
|
|
1254: 00001a69 .word 0x00001a69
|
|
1258: 00000a29 .word 0x00000a29
|
|
125c: 41002000 .word 0x41002000
|
|
1260: 00001b11 .word 0x00001b11
|
|
1264: 0000096d .word 0x0000096d
|
|
1268: 00000995 .word 0x00000995
|
|
126c: 00000a75 .word 0x00000a75
|
|
1270: 00001bed .word 0x00001bed
|
|
1274: 00001311 .word 0x00001311
|
|
1278: 000014a9 .word 0x000014a9
|
|
127c: 20000284 .word 0x20000284
|
|
|
|
00001280 <usart_write_wait>:
|
|
|
|
/* Get a pointer to the hardware module instance */
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
|
|
/* Check that the transmitter is enabled */
|
|
if (!(module->transmitter_enabled)) {
|
|
1280: 79c2 ldrb r2, [r0, #7]
|
|
return STATUS_ERR_DENIED;
|
|
1282: 231c movs r3, #28
|
|
if (!(module->transmitter_enabled)) {
|
|
1284: 2a00 cmp r2, #0
|
|
1286: d101 bne.n 128c <usart_write_wait+0xc>
|
|
while (!(usart_hw->INTFLAG.reg & SERCOM_USART_INTFLAG_TXC)) {
|
|
/* Wait until data is sent */
|
|
}
|
|
|
|
return STATUS_OK;
|
|
}
|
|
1288: 0018 movs r0, r3
|
|
128a: 4770 bx lr
|
|
if (module->remaining_tx_buffer_length > 0) {
|
|
128c: 8dc2 ldrh r2, [r0, #46] ; 0x2e
|
|
128e: b292 uxth r2, r2
|
|
return STATUS_BUSY;
|
|
1290: 3b17 subs r3, #23
|
|
if (module->remaining_tx_buffer_length > 0) {
|
|
1292: 2a00 cmp r2, #0
|
|
1294: d1f8 bne.n 1288 <usart_write_wait+0x8>
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
1296: 6802 ldr r2, [r0, #0]
|
|
usart_hw->DATA.reg = tx_data;
|
|
1298: 8511 strh r1, [r2, #40] ; 0x28
|
|
while (!(usart_hw->INTFLAG.reg & SERCOM_USART_INTFLAG_TXC)) {
|
|
129a: 2102 movs r1, #2
|
|
129c: 7e13 ldrb r3, [r2, #24]
|
|
129e: 420b tst r3, r1
|
|
12a0: d0fc beq.n 129c <usart_write_wait+0x1c>
|
|
return STATUS_OK;
|
|
12a2: 2300 movs r3, #0
|
|
12a4: e7f0 b.n 1288 <usart_write_wait+0x8>
|
|
|
|
000012a6 <usart_read_wait>:
|
|
|
|
/* Get a pointer to the hardware module instance */
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
|
|
/* Check that the receiver is enabled */
|
|
if (!(module->receiver_enabled)) {
|
|
12a6: 7982 ldrb r2, [r0, #6]
|
|
return STATUS_ERR_DENIED;
|
|
12a8: 231c movs r3, #28
|
|
if (!(module->receiver_enabled)) {
|
|
12aa: 2a00 cmp r2, #0
|
|
12ac: d101 bne.n 12b2 <usart_read_wait+0xc>
|
|
|
|
/* Read data from USART module */
|
|
*rx_data = usart_hw->DATA.reg;
|
|
|
|
return STATUS_OK;
|
|
}
|
|
12ae: 0018 movs r0, r3
|
|
12b0: 4770 bx lr
|
|
if (module->remaining_rx_buffer_length > 0) {
|
|
12b2: 8d82 ldrh r2, [r0, #44] ; 0x2c
|
|
12b4: b292 uxth r2, r2
|
|
return STATUS_BUSY;
|
|
12b6: 3b17 subs r3, #23
|
|
if (module->remaining_rx_buffer_length > 0) {
|
|
12b8: 2a00 cmp r2, #0
|
|
12ba: d1f8 bne.n 12ae <usart_read_wait+0x8>
|
|
SercomUsart *const usart_hw = &(module->hw->USART);
|
|
12bc: 6802 ldr r2, [r0, #0]
|
|
if (!(usart_hw->INTFLAG.reg & SERCOM_USART_INTFLAG_RXC)) {
|
|
12be: 7e10 ldrb r0, [r2, #24]
|
|
12c0: 0740 lsls r0, r0, #29
|
|
12c2: d5f4 bpl.n 12ae <usart_read_wait+0x8>
|
|
error_code = (uint8_t)(usart_hw->STATUS.reg & SERCOM_USART_STATUS_MASK);
|
|
12c4: 8b53 ldrh r3, [r2, #26]
|
|
12c6: b2db uxtb r3, r3
|
|
if (error_code) {
|
|
12c8: 0698 lsls r0, r3, #26
|
|
12ca: d01d beq.n 1308 <usart_read_wait+0x62>
|
|
if (error_code & SERCOM_USART_STATUS_FERR) {
|
|
12cc: 0798 lsls r0, r3, #30
|
|
12ce: d503 bpl.n 12d8 <usart_read_wait+0x32>
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_FERR;
|
|
12d0: 2302 movs r3, #2
|
|
12d2: 8353 strh r3, [r2, #26]
|
|
return STATUS_ERR_BAD_FORMAT;
|
|
12d4: 3318 adds r3, #24
|
|
12d6: e7ea b.n 12ae <usart_read_wait+0x8>
|
|
} else if (error_code & SERCOM_USART_STATUS_BUFOVF) {
|
|
12d8: 0758 lsls r0, r3, #29
|
|
12da: d503 bpl.n 12e4 <usart_read_wait+0x3e>
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_BUFOVF;
|
|
12dc: 2304 movs r3, #4
|
|
12de: 8353 strh r3, [r2, #26]
|
|
return STATUS_ERR_OVERFLOW;
|
|
12e0: 331a adds r3, #26
|
|
12e2: e7e4 b.n 12ae <usart_read_wait+0x8>
|
|
} else if (error_code & SERCOM_USART_STATUS_PERR) {
|
|
12e4: 07d8 lsls r0, r3, #31
|
|
12e6: d503 bpl.n 12f0 <usart_read_wait+0x4a>
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_PERR;
|
|
12e8: 2301 movs r3, #1
|
|
12ea: 8353 strh r3, [r2, #26]
|
|
return STATUS_ERR_BAD_DATA;
|
|
12ec: 3312 adds r3, #18
|
|
12ee: e7de b.n 12ae <usart_read_wait+0x8>
|
|
else if (error_code & SERCOM_USART_STATUS_ISF) {
|
|
12f0: 06d8 lsls r0, r3, #27
|
|
12f2: d503 bpl.n 12fc <usart_read_wait+0x56>
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_ISF;
|
|
12f4: 2310 movs r3, #16
|
|
12f6: 8353 strh r3, [r2, #26]
|
|
return STATUS_ERR_PROTOCOL;
|
|
12f8: 3332 adds r3, #50 ; 0x32
|
|
12fa: e7d8 b.n 12ae <usart_read_wait+0x8>
|
|
else if (error_code & SERCOM_USART_STATUS_COLL) {
|
|
12fc: 069b lsls r3, r3, #26
|
|
12fe: d503 bpl.n 1308 <usart_read_wait+0x62>
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_COLL;
|
|
1300: 2320 movs r3, #32
|
|
1302: 8353 strh r3, [r2, #26]
|
|
return STATUS_ERR_PACKET_COLLISION;
|
|
1304: 3321 adds r3, #33 ; 0x21
|
|
1306: e7d2 b.n 12ae <usart_read_wait+0x8>
|
|
*rx_data = usart_hw->DATA.reg;
|
|
1308: 8d13 ldrh r3, [r2, #40] ; 0x28
|
|
130a: 800b strh r3, [r1, #0]
|
|
return STATUS_OK;
|
|
130c: 2300 movs r3, #0
|
|
130e: e7ce b.n 12ae <usart_read_wait+0x8>
|
|
|
|
00001310 <_usart_interrupt_handler>:
|
|
* \param[in] instance ID of the SERCOM instance calling the interrupt
|
|
* handler.
|
|
*/
|
|
void _usart_interrupt_handler(
|
|
uint8_t instance)
|
|
{
|
|
1310: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
uint16_t callback_status;
|
|
uint8_t error_code;
|
|
|
|
|
|
/* Get device instance from the look-up table */
|
|
struct usart_module *module
|
|
1312: 0080 lsls r0, r0, #2
|
|
1314: 4b62 ldr r3, [pc, #392] ; (14a0 <_usart_interrupt_handler+0x190>)
|
|
1316: 58c5 ldr r5, [r0, r3]
|
|
= (struct usart_module *)_sercom_instances[instance];
|
|
|
|
/* Pointer to the hardware module instance */
|
|
SercomUsart *const usart_hw
|
|
= &(module->hw->USART);
|
|
1318: 682c ldr r4, [r5, #0]
|
|
return (usart_hw->SYNCBUSY.reg);
|
|
131a: 69e3 ldr r3, [r4, #28]
|
|
while (usart_is_syncing(module)) {
|
|
131c: 2b00 cmp r3, #0
|
|
131e: d1fc bne.n 131a <_usart_interrupt_handler+0xa>
|
|
|
|
/* Wait for the synchronization to complete */
|
|
_usart_wait_for_sync(module);
|
|
|
|
/* Read and mask interrupt flag register */
|
|
interrupt_status = usart_hw->INTFLAG.reg;
|
|
1320: 7e23 ldrb r3, [r4, #24]
|
|
interrupt_status &= usart_hw->INTENSET.reg;
|
|
1322: 7da6 ldrb r6, [r4, #22]
|
|
1324: 401e ands r6, r3
|
|
callback_status = module->callback_reg_mask &
|
|
1326: 2330 movs r3, #48 ; 0x30
|
|
1328: 5ceb ldrb r3, [r5, r3]
|
|
132a: 2231 movs r2, #49 ; 0x31
|
|
132c: 5caf ldrb r7, [r5, r2]
|
|
132e: 401f ands r7, r3
|
|
module->callback_enable_mask;
|
|
|
|
/* Check if a DATA READY interrupt has occurred,
|
|
* and if there is more to transfer */
|
|
if (interrupt_status & SERCOM_USART_INTFLAG_DRE) {
|
|
1330: 07f3 lsls r3, r6, #31
|
|
1332: d522 bpl.n 137a <_usart_interrupt_handler+0x6a>
|
|
if (module->remaining_tx_buffer_length) {
|
|
1334: 8deb ldrh r3, [r5, #46] ; 0x2e
|
|
1336: b29b uxth r3, r3
|
|
1338: 2b00 cmp r3, #0
|
|
133a: d01c beq.n 1376 <_usart_interrupt_handler+0x66>
|
|
/* Write value will be at least 8-bits long */
|
|
uint16_t data_to_send = *(module->tx_buffer_ptr);
|
|
133c: 6aaa ldr r2, [r5, #40] ; 0x28
|
|
133e: 7813 ldrb r3, [r2, #0]
|
|
1340: b2db uxtb r3, r3
|
|
/* Increment 8-bit pointer */
|
|
(module->tx_buffer_ptr)++;
|
|
1342: 1c51 adds r1, r2, #1
|
|
1344: 62a9 str r1, [r5, #40] ; 0x28
|
|
|
|
if (module->character_size == USART_CHARACTER_SIZE_9BIT) {
|
|
1346: 7969 ldrb r1, [r5, #5]
|
|
1348: 2901 cmp r1, #1
|
|
134a: d00e beq.n 136a <_usart_interrupt_handler+0x5a>
|
|
uint16_t data_to_send = *(module->tx_buffer_ptr);
|
|
134c: b29b uxth r3, r3
|
|
data_to_send |= (*(module->tx_buffer_ptr) << 8);
|
|
/* Increment 8-bit pointer */
|
|
(module->tx_buffer_ptr)++;
|
|
}
|
|
/* Write the data to send */
|
|
usart_hw->DATA.reg = (data_to_send & SERCOM_USART_DATA_MASK);
|
|
134e: 05db lsls r3, r3, #23
|
|
1350: 0ddb lsrs r3, r3, #23
|
|
1352: 8523 strh r3, [r4, #40] ; 0x28
|
|
|
|
if (--(module->remaining_tx_buffer_length) == 0) {
|
|
1354: 8deb ldrh r3, [r5, #46] ; 0x2e
|
|
1356: 3b01 subs r3, #1
|
|
1358: b29b uxth r3, r3
|
|
135a: 85eb strh r3, [r5, #46] ; 0x2e
|
|
135c: 2b00 cmp r3, #0
|
|
135e: d10c bne.n 137a <_usart_interrupt_handler+0x6a>
|
|
/* Disable the Data Register Empty Interrupt */
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTFLAG_DRE;
|
|
1360: 3301 adds r3, #1
|
|
1362: 7523 strb r3, [r4, #20]
|
|
/* Enable Transmission Complete interrupt */
|
|
usart_hw->INTENSET.reg = SERCOM_USART_INTFLAG_TXC;
|
|
1364: 3301 adds r3, #1
|
|
1366: 75a3 strb r3, [r4, #22]
|
|
1368: e007 b.n 137a <_usart_interrupt_handler+0x6a>
|
|
data_to_send |= (*(module->tx_buffer_ptr) << 8);
|
|
136a: 7851 ldrb r1, [r2, #1]
|
|
136c: 0209 lsls r1, r1, #8
|
|
136e: 430b orrs r3, r1
|
|
(module->tx_buffer_ptr)++;
|
|
1370: 3202 adds r2, #2
|
|
1372: 62aa str r2, [r5, #40] ; 0x28
|
|
1374: e7eb b.n 134e <_usart_interrupt_handler+0x3e>
|
|
|
|
}
|
|
} else {
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTFLAG_DRE;
|
|
1376: 2301 movs r3, #1
|
|
1378: 7523 strb r3, [r4, #20]
|
|
}
|
|
}
|
|
|
|
/* Check if the Transmission Complete interrupt has occurred and
|
|
* that the transmit buffer is empty */
|
|
if (interrupt_status & SERCOM_USART_INTFLAG_TXC) {
|
|
137a: 07b3 lsls r3, r6, #30
|
|
137c: d506 bpl.n 138c <_usart_interrupt_handler+0x7c>
|
|
|
|
/* Disable TX Complete Interrupt, and set STATUS_OK */
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTFLAG_TXC;
|
|
137e: 2302 movs r3, #2
|
|
1380: 7523 strb r3, [r4, #20]
|
|
module->tx_status = STATUS_OK;
|
|
1382: 2200 movs r2, #0
|
|
1384: 3331 adds r3, #49 ; 0x31
|
|
1386: 54ea strb r2, [r5, r3]
|
|
|
|
/* Run callback if registered and enabled */
|
|
if (callback_status & (1 << USART_CALLBACK_BUFFER_TRANSMITTED)) {
|
|
1388: 07fb lsls r3, r7, #31
|
|
138a: d41a bmi.n 13c2 <_usart_interrupt_handler+0xb2>
|
|
}
|
|
}
|
|
|
|
/* Check if the Receive Complete interrupt has occurred, and that
|
|
* there's more data to receive */
|
|
if (interrupt_status & SERCOM_USART_INTFLAG_RXC) {
|
|
138c: 0773 lsls r3, r6, #29
|
|
138e: d565 bpl.n 145c <_usart_interrupt_handler+0x14c>
|
|
|
|
if (module->remaining_rx_buffer_length) {
|
|
1390: 8dab ldrh r3, [r5, #44] ; 0x2c
|
|
1392: b29b uxth r3, r3
|
|
1394: 2b00 cmp r3, #0
|
|
1396: d05f beq.n 1458 <_usart_interrupt_handler+0x148>
|
|
/* Read out the status code and mask away all but the 4 LSBs*/
|
|
error_code = (uint8_t)(usart_hw->STATUS.reg & SERCOM_USART_STATUS_MASK);
|
|
1398: 8b63 ldrh r3, [r4, #26]
|
|
139a: b2db uxtb r3, r3
|
|
#if !SAMD20
|
|
/* CTS status should not be considered as an error */
|
|
if(error_code & SERCOM_USART_STATUS_CTS) {
|
|
139c: 071a lsls r2, r3, #28
|
|
139e: d414 bmi.n 13ca <_usart_interrupt_handler+0xba>
|
|
error_code = (uint8_t)(usart_hw->STATUS.reg & SERCOM_USART_STATUS_MASK);
|
|
13a0: 223f movs r2, #63 ; 0x3f
|
|
13a2: 4013 ands r3, r2
|
|
if(error_code & SERCOM_USART_STATUS_TXE) {
|
|
error_code &= ~SERCOM_USART_STATUS_TXE;
|
|
}
|
|
#endif
|
|
/* Check if an error has occurred during the receiving */
|
|
if (error_code) {
|
|
13a4: 2b00 cmp r3, #0
|
|
13a6: d034 beq.n 1412 <_usart_interrupt_handler+0x102>
|
|
/* Check which error occurred */
|
|
if (error_code & SERCOM_USART_STATUS_FERR) {
|
|
13a8: 079a lsls r2, r3, #30
|
|
13aa: d511 bpl.n 13d0 <_usart_interrupt_handler+0xc0>
|
|
/* Store the error code and clear flag by writing 1 to it */
|
|
module->rx_status = STATUS_ERR_BAD_FORMAT;
|
|
13ac: 221a movs r2, #26
|
|
13ae: 2332 movs r3, #50 ; 0x32
|
|
13b0: 54ea strb r2, [r5, r3]
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_FERR;
|
|
13b2: 3b30 subs r3, #48 ; 0x30
|
|
13b4: 8363 strh r3, [r4, #26]
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_COLL;
|
|
}
|
|
#endif
|
|
|
|
/* Run callback if registered and enabled */
|
|
if (callback_status
|
|
13b6: 077b lsls r3, r7, #29
|
|
13b8: d550 bpl.n 145c <_usart_interrupt_handler+0x14c>
|
|
& (1 << USART_CALLBACK_ERROR)) {
|
|
(*(module->callback[USART_CALLBACK_ERROR]))(module);
|
|
13ba: 0028 movs r0, r5
|
|
13bc: 696b ldr r3, [r5, #20]
|
|
13be: 4798 blx r3
|
|
13c0: e04c b.n 145c <_usart_interrupt_handler+0x14c>
|
|
(*(module->callback[USART_CALLBACK_BUFFER_TRANSMITTED]))(module);
|
|
13c2: 0028 movs r0, r5
|
|
13c4: 68eb ldr r3, [r5, #12]
|
|
13c6: 4798 blx r3
|
|
13c8: e7e0 b.n 138c <_usart_interrupt_handler+0x7c>
|
|
error_code &= ~SERCOM_USART_STATUS_CTS;
|
|
13ca: 2237 movs r2, #55 ; 0x37
|
|
13cc: 4013 ands r3, r2
|
|
13ce: e7e9 b.n 13a4 <_usart_interrupt_handler+0x94>
|
|
} else if (error_code & SERCOM_USART_STATUS_BUFOVF) {
|
|
13d0: 075a lsls r2, r3, #29
|
|
13d2: d505 bpl.n 13e0 <_usart_interrupt_handler+0xd0>
|
|
module->rx_status = STATUS_ERR_OVERFLOW;
|
|
13d4: 221e movs r2, #30
|
|
13d6: 2332 movs r3, #50 ; 0x32
|
|
13d8: 54ea strb r2, [r5, r3]
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_BUFOVF;
|
|
13da: 3b2e subs r3, #46 ; 0x2e
|
|
13dc: 8363 strh r3, [r4, #26]
|
|
13de: e7ea b.n 13b6 <_usart_interrupt_handler+0xa6>
|
|
} else if (error_code & SERCOM_USART_STATUS_PERR) {
|
|
13e0: 07da lsls r2, r3, #31
|
|
13e2: d505 bpl.n 13f0 <_usart_interrupt_handler+0xe0>
|
|
module->rx_status = STATUS_ERR_BAD_DATA;
|
|
13e4: 2213 movs r2, #19
|
|
13e6: 2332 movs r3, #50 ; 0x32
|
|
13e8: 54ea strb r2, [r5, r3]
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_PERR;
|
|
13ea: 3b31 subs r3, #49 ; 0x31
|
|
13ec: 8363 strh r3, [r4, #26]
|
|
13ee: e7e2 b.n 13b6 <_usart_interrupt_handler+0xa6>
|
|
else if (error_code & SERCOM_USART_STATUS_ISF) {
|
|
13f0: 06da lsls r2, r3, #27
|
|
13f2: d505 bpl.n 1400 <_usart_interrupt_handler+0xf0>
|
|
module->rx_status = STATUS_ERR_PROTOCOL;
|
|
13f4: 2242 movs r2, #66 ; 0x42
|
|
13f6: 2332 movs r3, #50 ; 0x32
|
|
13f8: 54ea strb r2, [r5, r3]
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_ISF;
|
|
13fa: 3b22 subs r3, #34 ; 0x22
|
|
13fc: 8363 strh r3, [r4, #26]
|
|
13fe: e7da b.n 13b6 <_usart_interrupt_handler+0xa6>
|
|
else if (error_code & SERCOM_USART_STATUS_COLL) {
|
|
1400: 2220 movs r2, #32
|
|
1402: 421a tst r2, r3
|
|
1404: d0d7 beq.n 13b6 <_usart_interrupt_handler+0xa6>
|
|
module->rx_status = STATUS_ERR_PACKET_COLLISION;
|
|
1406: 3221 adds r2, #33 ; 0x21
|
|
1408: 2332 movs r3, #50 ; 0x32
|
|
140a: 54ea strb r2, [r5, r3]
|
|
usart_hw->STATUS.reg = SERCOM_USART_STATUS_COLL;
|
|
140c: 3b12 subs r3, #18
|
|
140e: 8363 strh r3, [r4, #26]
|
|
1410: e7d1 b.n 13b6 <_usart_interrupt_handler+0xa6>
|
|
|
|
} else {
|
|
|
|
/* Read current packet from DATA register,
|
|
* increment buffer pointer and decrement buffer length */
|
|
uint16_t received_data = (usart_hw->DATA.reg & SERCOM_USART_DATA_MASK);
|
|
1412: 8d23 ldrh r3, [r4, #40] ; 0x28
|
|
1414: 05db lsls r3, r3, #23
|
|
1416: 0ddb lsrs r3, r3, #23
|
|
|
|
/* Read value will be at least 8-bits long */
|
|
*(module->rx_buffer_ptr) = received_data;
|
|
1418: b2da uxtb r2, r3
|
|
141a: 6a69 ldr r1, [r5, #36] ; 0x24
|
|
141c: 700a strb r2, [r1, #0]
|
|
/* Increment 8-bit pointer */
|
|
module->rx_buffer_ptr += 1;
|
|
141e: 6a6a ldr r2, [r5, #36] ; 0x24
|
|
1420: 1c51 adds r1, r2, #1
|
|
1422: 6269 str r1, [r5, #36] ; 0x24
|
|
|
|
if (module->character_size == USART_CHARACTER_SIZE_9BIT) {
|
|
1424: 7969 ldrb r1, [r5, #5]
|
|
1426: 2901 cmp r1, #1
|
|
1428: d010 beq.n 144c <_usart_interrupt_handler+0x13c>
|
|
/* Increment 8-bit pointer */
|
|
module->rx_buffer_ptr += 1;
|
|
}
|
|
|
|
/* Check if the last character have been received */
|
|
if(--(module->remaining_rx_buffer_length) == 0) {
|
|
142a: 8dab ldrh r3, [r5, #44] ; 0x2c
|
|
142c: 3b01 subs r3, #1
|
|
142e: b29b uxth r3, r3
|
|
1430: 85ab strh r3, [r5, #44] ; 0x2c
|
|
1432: 2b00 cmp r3, #0
|
|
1434: d112 bne.n 145c <_usart_interrupt_handler+0x14c>
|
|
/* Disable RX Complete Interrupt,
|
|
* and set STATUS_OK */
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTFLAG_RXC;
|
|
1436: 3304 adds r3, #4
|
|
1438: 7523 strb r3, [r4, #20]
|
|
module->rx_status = STATUS_OK;
|
|
143a: 2200 movs r2, #0
|
|
143c: 332e adds r3, #46 ; 0x2e
|
|
143e: 54ea strb r2, [r5, r3]
|
|
|
|
/* Run callback if registered and enabled */
|
|
if (callback_status
|
|
1440: 07bb lsls r3, r7, #30
|
|
1442: d50b bpl.n 145c <_usart_interrupt_handler+0x14c>
|
|
& (1 << USART_CALLBACK_BUFFER_RECEIVED)) {
|
|
(*(module->callback[USART_CALLBACK_BUFFER_RECEIVED]))(module);
|
|
1444: 0028 movs r0, r5
|
|
1446: 692b ldr r3, [r5, #16]
|
|
1448: 4798 blx r3
|
|
144a: e007 b.n 145c <_usart_interrupt_handler+0x14c>
|
|
*(module->rx_buffer_ptr) = (received_data >> 8);
|
|
144c: 0a1b lsrs r3, r3, #8
|
|
144e: 7053 strb r3, [r2, #1]
|
|
module->rx_buffer_ptr += 1;
|
|
1450: 6a6b ldr r3, [r5, #36] ; 0x24
|
|
1452: 3301 adds r3, #1
|
|
1454: 626b str r3, [r5, #36] ; 0x24
|
|
1456: e7e8 b.n 142a <_usart_interrupt_handler+0x11a>
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
/* This should not happen. Disable Receive Complete interrupt. */
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTFLAG_RXC;
|
|
1458: 2304 movs r3, #4
|
|
145a: 7523 strb r3, [r4, #20]
|
|
}
|
|
}
|
|
|
|
#ifdef FEATURE_USART_HARDWARE_FLOW_CONTROL
|
|
if (interrupt_status & SERCOM_USART_INTFLAG_CTSIC) {
|
|
145c: 06f3 lsls r3, r6, #27
|
|
145e: d504 bpl.n 146a <_usart_interrupt_handler+0x15a>
|
|
/* Disable interrupts */
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTENCLR_CTSIC;
|
|
1460: 2310 movs r3, #16
|
|
1462: 7523 strb r3, [r4, #20]
|
|
/* Clear interrupt flag */
|
|
usart_hw->INTFLAG.reg = SERCOM_USART_INTFLAG_CTSIC;
|
|
1464: 7623 strb r3, [r4, #24]
|
|
|
|
/* Run callback if registered and enabled */
|
|
if (callback_status & (1 << USART_CALLBACK_CTS_INPUT_CHANGE)) {
|
|
1466: 06fb lsls r3, r7, #27
|
|
1468: d40e bmi.n 1488 <_usart_interrupt_handler+0x178>
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef FEATURE_USART_LIN_SLAVE
|
|
if (interrupt_status & SERCOM_USART_INTFLAG_RXBRK) {
|
|
146a: 06b3 lsls r3, r6, #26
|
|
146c: d504 bpl.n 1478 <_usart_interrupt_handler+0x168>
|
|
/* Disable interrupts */
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTENCLR_RXBRK;
|
|
146e: 2320 movs r3, #32
|
|
1470: 7523 strb r3, [r4, #20]
|
|
/* Clear interrupt flag */
|
|
usart_hw->INTFLAG.reg = SERCOM_USART_INTFLAG_RXBRK;
|
|
1472: 7623 strb r3, [r4, #24]
|
|
|
|
/* Run callback if registered and enabled */
|
|
if (callback_status & (1 << USART_CALLBACK_BREAK_RECEIVED)) {
|
|
1474: 073b lsls r3, r7, #28
|
|
1476: d40b bmi.n 1490 <_usart_interrupt_handler+0x180>
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef FEATURE_USART_START_FRAME_DECTION
|
|
if (interrupt_status & SERCOM_USART_INTFLAG_RXS) {
|
|
1478: 0733 lsls r3, r6, #28
|
|
147a: d504 bpl.n 1486 <_usart_interrupt_handler+0x176>
|
|
/* Disable interrupts */
|
|
usart_hw->INTENCLR.reg = SERCOM_USART_INTENCLR_RXS;
|
|
147c: 2308 movs r3, #8
|
|
147e: 7523 strb r3, [r4, #20]
|
|
/* Clear interrupt flag */
|
|
usart_hw->INTFLAG.reg = SERCOM_USART_INTFLAG_RXS;
|
|
1480: 7623 strb r3, [r4, #24]
|
|
|
|
/* Run callback if registered and enabled */
|
|
if (callback_status & (1 << USART_CALLBACK_START_RECEIVED)) {
|
|
1482: 06bb lsls r3, r7, #26
|
|
1484: d408 bmi.n 1498 <_usart_interrupt_handler+0x188>
|
|
(*(module->callback[USART_CALLBACK_START_RECEIVED]))(module);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
1486: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
(*(module->callback[USART_CALLBACK_CTS_INPUT_CHANGE]))(module);
|
|
1488: 0028 movs r0, r5
|
|
148a: 69eb ldr r3, [r5, #28]
|
|
148c: 4798 blx r3
|
|
148e: e7ec b.n 146a <_usart_interrupt_handler+0x15a>
|
|
(*(module->callback[USART_CALLBACK_BREAK_RECEIVED]))(module);
|
|
1490: 0028 movs r0, r5
|
|
1492: 69ab ldr r3, [r5, #24]
|
|
1494: 4798 blx r3
|
|
1496: e7ef b.n 1478 <_usart_interrupt_handler+0x168>
|
|
(*(module->callback[USART_CALLBACK_START_RECEIVED]))(module);
|
|
1498: 6a2b ldr r3, [r5, #32]
|
|
149a: 0028 movs r0, r5
|
|
149c: 4798 blx r3
|
|
}
|
|
149e: e7f2 b.n 1486 <_usart_interrupt_handler+0x176>
|
|
14a0: 20000284 .word 0x20000284
|
|
|
|
000014a4 <_sercom_default_handler>:
|
|
*/
|
|
static void _sercom_default_handler(
|
|
const uint8_t instance)
|
|
{
|
|
Assert(false);
|
|
}
|
|
14a4: 4770 bx lr
|
|
...
|
|
|
|
000014a8 <_sercom_set_handler>:
|
|
* \param[in] interrupt_handler Pointer to instance callback handler.
|
|
*/
|
|
void _sercom_set_handler(
|
|
const uint8_t instance,
|
|
const sercom_handler_t interrupt_handler)
|
|
{
|
|
14a8: b5f0 push {r4, r5, r6, r7, lr}
|
|
/* Initialize handlers with default handler and device instances with 0 */
|
|
if (_handler_table_initialized == false) {
|
|
14aa: 4b0a ldr r3, [pc, #40] ; (14d4 <_sercom_set_handler+0x2c>)
|
|
14ac: 781b ldrb r3, [r3, #0]
|
|
14ae: 2b00 cmp r3, #0
|
|
14b0: d10c bne.n 14cc <_sercom_set_handler+0x24>
|
|
for (uint32_t i = 0; i < SERCOM_INST_NUM; i++) {
|
|
_sercom_interrupt_handlers[i] = &_sercom_default_handler;
|
|
14b2: 4f09 ldr r7, [pc, #36] ; (14d8 <_sercom_set_handler+0x30>)
|
|
14b4: 4e09 ldr r6, [pc, #36] ; (14dc <_sercom_set_handler+0x34>)
|
|
_sercom_instances[i] = NULL;
|
|
14b6: 4d0a ldr r5, [pc, #40] ; (14e0 <_sercom_set_handler+0x38>)
|
|
14b8: 2400 movs r4, #0
|
|
_sercom_interrupt_handlers[i] = &_sercom_default_handler;
|
|
14ba: 51de str r6, [r3, r7]
|
|
_sercom_instances[i] = NULL;
|
|
14bc: 195a adds r2, r3, r5
|
|
14be: 6014 str r4, [r2, #0]
|
|
14c0: 3304 adds r3, #4
|
|
for (uint32_t i = 0; i < SERCOM_INST_NUM; i++) {
|
|
14c2: 2b18 cmp r3, #24
|
|
14c4: d1f9 bne.n 14ba <_sercom_set_handler+0x12>
|
|
}
|
|
|
|
_handler_table_initialized = true;
|
|
14c6: 2201 movs r2, #1
|
|
14c8: 4b02 ldr r3, [pc, #8] ; (14d4 <_sercom_set_handler+0x2c>)
|
|
14ca: 701a strb r2, [r3, #0]
|
|
}
|
|
|
|
/* Save interrupt handler */
|
|
_sercom_interrupt_handlers[instance] = interrupt_handler;
|
|
14cc: 0080 lsls r0, r0, #2
|
|
14ce: 4b02 ldr r3, [pc, #8] ; (14d8 <_sercom_set_handler+0x30>)
|
|
14d0: 50c1 str r1, [r0, r3]
|
|
}
|
|
14d2: bdf0 pop {r4, r5, r6, r7, pc}
|
|
14d4: 20000190 .word 0x20000190
|
|
14d8: 20000194 .word 0x20000194
|
|
14dc: 000014a5 .word 0x000014a5
|
|
14e0: 20000284 .word 0x20000284
|
|
|
|
000014e4 <_sercom_get_interrupt_vector>:
|
|
* \retval SYSTEM_INTERRUPT_MODULE_SERCOM6
|
|
* \retval SYSTEM_INTERRUPT_MODULE_SERCOM7
|
|
*/
|
|
enum system_interrupt_vector _sercom_get_interrupt_vector(
|
|
Sercom *const sercom_instance)
|
|
{
|
|
14e4: b500 push {lr}
|
|
14e6: b083 sub sp, #12
|
|
const uint8_t sercom_int_vectors[SERCOM_INST_NUM] =
|
|
14e8: 2309 movs r3, #9
|
|
14ea: 466a mov r2, sp
|
|
14ec: 7013 strb r3, [r2, #0]
|
|
14ee: 3301 adds r3, #1
|
|
14f0: 7053 strb r3, [r2, #1]
|
|
14f2: 3301 adds r3, #1
|
|
14f4: 7093 strb r3, [r2, #2]
|
|
14f6: 3301 adds r3, #1
|
|
14f8: 70d3 strb r3, [r2, #3]
|
|
14fa: 3301 adds r3, #1
|
|
14fc: 7113 strb r3, [r2, #4]
|
|
14fe: 3301 adds r3, #1
|
|
1500: 7153 strb r3, [r2, #5]
|
|
{
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_INTERRUPT_VECT_NUM, ~)
|
|
};
|
|
|
|
/* Retrieve the index of the SERCOM being requested */
|
|
uint8_t instance_index = _sercom_get_sercom_inst_index(sercom_instance);
|
|
1502: 4b03 ldr r3, [pc, #12] ; (1510 <_sercom_get_interrupt_vector+0x2c>)
|
|
1504: 4798 blx r3
|
|
|
|
/* Get the vector number from the lookup table for the requested SERCOM */
|
|
return (enum system_interrupt_vector)sercom_int_vectors[instance_index];
|
|
1506: 466b mov r3, sp
|
|
1508: 5618 ldrsb r0, [r3, r0]
|
|
}
|
|
150a: b003 add sp, #12
|
|
150c: bd00 pop {pc}
|
|
150e: 46c0 nop ; (mov r8, r8)
|
|
1510: 00000bed .word 0x00000bed
|
|
|
|
00001514 <SERCOM0_Handler>:
|
|
|
|
/** Auto-generate a set of interrupt handlers for each SERCOM in the device */
|
|
MREPEAT(SERCOM_INST_NUM, _SERCOM_INTERRUPT_HANDLER, ~)
|
|
1514: b510 push {r4, lr}
|
|
1516: 4b02 ldr r3, [pc, #8] ; (1520 <SERCOM0_Handler+0xc>)
|
|
1518: 681b ldr r3, [r3, #0]
|
|
151a: 2000 movs r0, #0
|
|
151c: 4798 blx r3
|
|
151e: bd10 pop {r4, pc}
|
|
1520: 20000194 .word 0x20000194
|
|
|
|
00001524 <SERCOM1_Handler>:
|
|
1524: b510 push {r4, lr}
|
|
1526: 4b02 ldr r3, [pc, #8] ; (1530 <SERCOM1_Handler+0xc>)
|
|
1528: 685b ldr r3, [r3, #4]
|
|
152a: 2001 movs r0, #1
|
|
152c: 4798 blx r3
|
|
152e: bd10 pop {r4, pc}
|
|
1530: 20000194 .word 0x20000194
|
|
|
|
00001534 <SERCOM2_Handler>:
|
|
1534: b510 push {r4, lr}
|
|
1536: 4b02 ldr r3, [pc, #8] ; (1540 <SERCOM2_Handler+0xc>)
|
|
1538: 689b ldr r3, [r3, #8]
|
|
153a: 2002 movs r0, #2
|
|
153c: 4798 blx r3
|
|
153e: bd10 pop {r4, pc}
|
|
1540: 20000194 .word 0x20000194
|
|
|
|
00001544 <SERCOM3_Handler>:
|
|
1544: b510 push {r4, lr}
|
|
1546: 4b02 ldr r3, [pc, #8] ; (1550 <SERCOM3_Handler+0xc>)
|
|
1548: 68db ldr r3, [r3, #12]
|
|
154a: 2003 movs r0, #3
|
|
154c: 4798 blx r3
|
|
154e: bd10 pop {r4, pc}
|
|
1550: 20000194 .word 0x20000194
|
|
|
|
00001554 <SERCOM4_Handler>:
|
|
1554: b510 push {r4, lr}
|
|
1556: 4b02 ldr r3, [pc, #8] ; (1560 <SERCOM4_Handler+0xc>)
|
|
1558: 691b ldr r3, [r3, #16]
|
|
155a: 2004 movs r0, #4
|
|
155c: 4798 blx r3
|
|
155e: bd10 pop {r4, pc}
|
|
1560: 20000194 .word 0x20000194
|
|
|
|
00001564 <SERCOM5_Handler>:
|
|
1564: b510 push {r4, lr}
|
|
1566: 4b02 ldr r3, [pc, #8] ; (1570 <SERCOM5_Handler+0xc>)
|
|
1568: 695b ldr r3, [r3, #20]
|
|
156a: 2005 movs r0, #5
|
|
156c: 4798 blx r3
|
|
156e: bd10 pop {r4, pc}
|
|
1570: 20000194 .word 0x20000194
|
|
|
|
00001574 <delay_init>:
|
|
*
|
|
* This must be called during start up to initialize the delay routine with
|
|
* the current used main clock. It must run any time the main CPU clock is changed.
|
|
*/
|
|
void delay_init(void)
|
|
{
|
|
1574: b570 push {r4, r5, r6, lr}
|
|
cycles_per_ms = system_gclk_gen_get_hz(0);
|
|
1576: 2000 movs r0, #0
|
|
1578: 4b08 ldr r3, [pc, #32] ; (159c <delay_init+0x28>)
|
|
157a: 4798 blx r3
|
|
157c: 0005 movs r5, r0
|
|
cycles_per_ms /= 1000;
|
|
157e: 4c08 ldr r4, [pc, #32] ; (15a0 <delay_init+0x2c>)
|
|
1580: 21fa movs r1, #250 ; 0xfa
|
|
1582: 0089 lsls r1, r1, #2
|
|
1584: 47a0 blx r4
|
|
1586: 4b07 ldr r3, [pc, #28] ; (15a4 <delay_init+0x30>)
|
|
1588: 6018 str r0, [r3, #0]
|
|
cycles_per_us = cycles_per_ms / 1000;
|
|
158a: 4907 ldr r1, [pc, #28] ; (15a8 <delay_init+0x34>)
|
|
158c: 0028 movs r0, r5
|
|
158e: 47a0 blx r4
|
|
1590: 4b06 ldr r3, [pc, #24] ; (15ac <delay_init+0x38>)
|
|
1592: 6018 str r0, [r3, #0]
|
|
|
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
|
|
1594: 2205 movs r2, #5
|
|
1596: 4b06 ldr r3, [pc, #24] ; (15b0 <delay_init+0x3c>)
|
|
1598: 601a str r2, [r3, #0]
|
|
}
|
|
159a: bd70 pop {r4, r5, r6, pc}
|
|
159c: 000019dd .word 0x000019dd
|
|
15a0: 00001df5 .word 0x00001df5
|
|
15a4: 2000000c .word 0x2000000c
|
|
15a8: 000f4240 .word 0x000f4240
|
|
15ac: 20000010 .word 0x20000010
|
|
15b0: e000e010 .word 0xe000e010
|
|
|
|
000015b4 <delay_cycles_ms>:
|
|
*
|
|
* \param n Number of milliseconds to wait
|
|
*/
|
|
void delay_cycles_ms(
|
|
uint32_t n)
|
|
{
|
|
15b4: b530 push {r4, r5, lr}
|
|
while (n--) {
|
|
/* Devide up to blocks of 1ms */
|
|
delay_cycles(cycles_per_ms);
|
|
15b6: 4b08 ldr r3, [pc, #32] ; (15d8 <delay_cycles_ms+0x24>)
|
|
15b8: 681c ldr r4, [r3, #0]
|
|
*/
|
|
static inline void delay_cycles(
|
|
const uint32_t n)
|
|
{
|
|
if (n > 0) {
|
|
SysTick->LOAD = n;
|
|
15ba: 4a08 ldr r2, [pc, #32] ; (15dc <delay_cycles_ms+0x28>)
|
|
SysTick->VAL = 0;
|
|
15bc: 2500 movs r5, #0
|
|
|
|
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) {
|
|
15be: 2180 movs r1, #128 ; 0x80
|
|
15c0: 0249 lsls r1, r1, #9
|
|
while (n--) {
|
|
15c2: 3801 subs r0, #1
|
|
15c4: d307 bcc.n 15d6 <delay_cycles_ms+0x22>
|
|
if (n > 0) {
|
|
15c6: 2c00 cmp r4, #0
|
|
15c8: d0fb beq.n 15c2 <delay_cycles_ms+0xe>
|
|
SysTick->LOAD = n;
|
|
15ca: 6054 str r4, [r2, #4]
|
|
SysTick->VAL = 0;
|
|
15cc: 6095 str r5, [r2, #8]
|
|
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) {
|
|
15ce: 6813 ldr r3, [r2, #0]
|
|
15d0: 420b tst r3, r1
|
|
15d2: d0fc beq.n 15ce <delay_cycles_ms+0x1a>
|
|
15d4: e7f5 b.n 15c2 <delay_cycles_ms+0xe>
|
|
}
|
|
}
|
|
15d6: bd30 pop {r4, r5, pc}
|
|
15d8: 2000000c .word 0x2000000c
|
|
15dc: e000e010 .word 0xe000e010
|
|
|
|
000015e0 <cpu_irq_enter_critical>:
|
|
volatile bool g_interrupt_enabled = true;
|
|
#endif
|
|
|
|
void cpu_irq_enter_critical(void)
|
|
{
|
|
if (cpu_irq_critical_section_counter == 0) {
|
|
15e0: 4b0c ldr r3, [pc, #48] ; (1614 <cpu_irq_enter_critical+0x34>)
|
|
15e2: 681b ldr r3, [r3, #0]
|
|
15e4: 2b00 cmp r3, #0
|
|
15e6: d106 bne.n 15f6 <cpu_irq_enter_critical+0x16>
|
|
*/
|
|
__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void)
|
|
{
|
|
uint32_t result;
|
|
|
|
__ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory");
|
|
15e8: f3ef 8310 mrs r3, PRIMASK
|
|
if (cpu_irq_is_enabled()) {
|
|
15ec: 2b00 cmp r3, #0
|
|
15ee: d007 beq.n 1600 <cpu_irq_enter_critical+0x20>
|
|
cpu_irq_disable();
|
|
cpu_irq_prev_interrupt_state = true;
|
|
} else {
|
|
/* Make sure the to save the prev state as false */
|
|
cpu_irq_prev_interrupt_state = false;
|
|
15f0: 2200 movs r2, #0
|
|
15f2: 4b09 ldr r3, [pc, #36] ; (1618 <cpu_irq_enter_critical+0x38>)
|
|
15f4: 701a strb r2, [r3, #0]
|
|
}
|
|
|
|
}
|
|
|
|
cpu_irq_critical_section_counter++;
|
|
15f6: 4a07 ldr r2, [pc, #28] ; (1614 <cpu_irq_enter_critical+0x34>)
|
|
15f8: 6813 ldr r3, [r2, #0]
|
|
15fa: 3301 adds r3, #1
|
|
15fc: 6013 str r3, [r2, #0]
|
|
}
|
|
15fe: 4770 bx lr
|
|
__ASM volatile ("cpsid i" : : : "memory");
|
|
1600: b672 cpsid i
|
|
\details Ensures the apparent order of the explicit memory operations before
|
|
and after the instruction, without ensuring their completion.
|
|
*/
|
|
__STATIC_FORCEINLINE void __DMB(void)
|
|
{
|
|
__ASM volatile ("dmb 0xF":::"memory");
|
|
1602: f3bf 8f5f dmb sy
|
|
cpu_irq_disable();
|
|
1606: 2200 movs r2, #0
|
|
1608: 4b04 ldr r3, [pc, #16] ; (161c <cpu_irq_enter_critical+0x3c>)
|
|
160a: 701a strb r2, [r3, #0]
|
|
cpu_irq_prev_interrupt_state = true;
|
|
160c: 3201 adds r2, #1
|
|
160e: 4b02 ldr r3, [pc, #8] ; (1618 <cpu_irq_enter_critical+0x38>)
|
|
1610: 701a strb r2, [r3, #0]
|
|
1612: e7f0 b.n 15f6 <cpu_irq_enter_critical+0x16>
|
|
1614: 200001ac .word 0x200001ac
|
|
1618: 200001b0 .word 0x200001b0
|
|
161c: 20000014 .word 0x20000014
|
|
|
|
00001620 <cpu_irq_leave_critical>:
|
|
void cpu_irq_leave_critical(void)
|
|
{
|
|
/* Check if the user is trying to leave a critical section when not in a critical section */
|
|
Assert(cpu_irq_critical_section_counter > 0);
|
|
|
|
cpu_irq_critical_section_counter--;
|
|
1620: 4b08 ldr r3, [pc, #32] ; (1644 <cpu_irq_leave_critical+0x24>)
|
|
1622: 681a ldr r2, [r3, #0]
|
|
1624: 3a01 subs r2, #1
|
|
1626: 601a str r2, [r3, #0]
|
|
|
|
/* Only enable global interrupts when the counter reaches 0 and the state of the global interrupt flag
|
|
was enabled when entering critical state */
|
|
if ((cpu_irq_critical_section_counter == 0) && (cpu_irq_prev_interrupt_state)) {
|
|
1628: 681b ldr r3, [r3, #0]
|
|
162a: 2b00 cmp r3, #0
|
|
162c: d109 bne.n 1642 <cpu_irq_leave_critical+0x22>
|
|
162e: 4b06 ldr r3, [pc, #24] ; (1648 <cpu_irq_leave_critical+0x28>)
|
|
1630: 781b ldrb r3, [r3, #0]
|
|
1632: 2b00 cmp r3, #0
|
|
1634: d005 beq.n 1642 <cpu_irq_leave_critical+0x22>
|
|
cpu_irq_enable();
|
|
1636: 2201 movs r2, #1
|
|
1638: 4b04 ldr r3, [pc, #16] ; (164c <cpu_irq_leave_critical+0x2c>)
|
|
163a: 701a strb r2, [r3, #0]
|
|
163c: f3bf 8f5f dmb sy
|
|
__ASM volatile ("cpsie i" : : : "memory");
|
|
1640: b662 cpsie i
|
|
}
|
|
}
|
|
1642: 4770 bx lr
|
|
1644: 200001ac .word 0x200001ac
|
|
1648: 200001b0 .word 0x200001b0
|
|
164c: 20000014 .word 0x20000014
|
|
|
|
00001650 <system_board_init>:
|
|
void board_init(void);
|
|
# pragma weak board_init=system_board_init
|
|
#endif
|
|
|
|
void system_board_init(void)
|
|
{
|
|
1650: b5f0 push {r4, r5, r6, r7, lr}
|
|
1652: b083 sub sp, #12
|
|
/* Sanity check arguments */
|
|
Assert(config);
|
|
|
|
/* Default configuration values */
|
|
config->direction = PORT_PIN_DIR_INPUT;
|
|
config->input_pull = PORT_PIN_PULL_UP;
|
|
1654: ac01 add r4, sp, #4
|
|
1656: 2501 movs r5, #1
|
|
1658: 7065 strb r5, [r4, #1]
|
|
config->powersave = false;
|
|
165a: 2700 movs r7, #0
|
|
165c: 70a7 strb r7, [r4, #2]
|
|
struct port_config pin_conf;
|
|
port_get_config_defaults(&pin_conf);
|
|
|
|
/* Configure LEDs as outputs, turn them off */
|
|
pin_conf.direction = PORT_PIN_DIR_OUTPUT;
|
|
165e: 7025 strb r5, [r4, #0]
|
|
port_pin_set_config(LED_0_PIN, &pin_conf);
|
|
1660: 0021 movs r1, r4
|
|
1662: 203e movs r0, #62 ; 0x3e
|
|
1664: 4e06 ldr r6, [pc, #24] ; (1680 <system_board_init+0x30>)
|
|
1666: 47b0 blx r6
|
|
PortGroup *const port_base = port_get_group_from_gpio_pin(gpio_pin);
|
|
uint32_t pin_mask = (1UL << (gpio_pin % 32));
|
|
|
|
/* Set the pin to high or low atomically based on the requested level */
|
|
if (level) {
|
|
port_base->OUTSET.reg = pin_mask;
|
|
1668: 2280 movs r2, #128 ; 0x80
|
|
166a: 05d2 lsls r2, r2, #23
|
|
166c: 4b05 ldr r3, [pc, #20] ; (1684 <system_board_init+0x34>)
|
|
166e: 619a str r2, [r3, #24]
|
|
port_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
|
|
|
|
/* Set buttons as inputs */
|
|
pin_conf.direction = PORT_PIN_DIR_INPUT;
|
|
1670: 7027 strb r7, [r4, #0]
|
|
pin_conf.input_pull = PORT_PIN_PULL_UP;
|
|
1672: 7065 strb r5, [r4, #1]
|
|
port_pin_set_config(BUTTON_0_PIN, &pin_conf);
|
|
1674: 0021 movs r1, r4
|
|
1676: 200f movs r0, #15
|
|
1678: 47b0 blx r6
|
|
port_pin_set_output_level(AT86RFX_RST_PIN, true);
|
|
port_pin_set_output_level(AT86RFX_SLP_PIN, true);
|
|
pin_conf.direction = PORT_PIN_DIR_INPUT;
|
|
port_pin_set_config(AT86RFX_SPI_MISO, &pin_conf);
|
|
#endif
|
|
}
|
|
167a: b003 add sp, #12
|
|
167c: bdf0 pop {r4, r5, r6, r7, pc}
|
|
167e: 46c0 nop ; (mov r8, r8)
|
|
1680: 00001689 .word 0x00001689
|
|
1684: 41004480 .word 0x41004480
|
|
|
|
00001688 <port_pin_set_config>:
|
|
* \param[in] config Configuration settings for the pin
|
|
*/
|
|
void port_pin_set_config(
|
|
const uint8_t gpio_pin,
|
|
const struct port_config *const config)
|
|
{
|
|
1688: b500 push {lr}
|
|
168a: b083 sub sp, #12
|
|
config->mux_position = SYSTEM_PINMUX_GPIO;
|
|
168c: ab01 add r3, sp, #4
|
|
168e: 2280 movs r2, #128 ; 0x80
|
|
1690: 701a strb r2, [r3, #0]
|
|
|
|
struct system_pinmux_config pinmux_config;
|
|
system_pinmux_get_config_defaults(&pinmux_config);
|
|
|
|
pinmux_config.mux_position = SYSTEM_PINMUX_GPIO;
|
|
pinmux_config.direction = (enum system_pinmux_pin_dir)config->direction;
|
|
1692: 780a ldrb r2, [r1, #0]
|
|
1694: 705a strb r2, [r3, #1]
|
|
pinmux_config.input_pull = (enum system_pinmux_pin_pull)config->input_pull;
|
|
1696: 784a ldrb r2, [r1, #1]
|
|
1698: 709a strb r2, [r3, #2]
|
|
pinmux_config.powersave = config->powersave;
|
|
169a: 788a ldrb r2, [r1, #2]
|
|
169c: 70da strb r2, [r3, #3]
|
|
|
|
system_pinmux_pin_set_config(gpio_pin, &pinmux_config);
|
|
169e: 0019 movs r1, r3
|
|
16a0: 4b01 ldr r3, [pc, #4] ; (16a8 <port_pin_set_config+0x20>)
|
|
16a2: 4798 blx r3
|
|
}
|
|
16a4: b003 add sp, #12
|
|
16a6: bd00 pop {pc}
|
|
16a8: 00001bed .word 0x00001bed
|
|
|
|
000016ac <system_clock_source_get_hz>:
|
|
*
|
|
* \returns Frequency of the given clock source, in Hz.
|
|
*/
|
|
uint32_t system_clock_source_get_hz(
|
|
const enum system_clock_source clock_source)
|
|
{
|
|
16ac: b510 push {r4, lr}
|
|
switch (clock_source) {
|
|
16ae: 2808 cmp r0, #8
|
|
16b0: d803 bhi.n 16ba <system_clock_source_get_hz+0xe>
|
|
16b2: 0080 lsls r0, r0, #2
|
|
16b4: 4b1c ldr r3, [pc, #112] ; (1728 <system_clock_source_get_hz+0x7c>)
|
|
16b6: 581b ldr r3, [r3, r0]
|
|
16b8: 469f mov pc, r3
|
|
|
|
return _system_clock_inst.dpll.frequency;
|
|
#endif
|
|
|
|
default:
|
|
return 0;
|
|
16ba: 2000 movs r0, #0
|
|
16bc: e032 b.n 1724 <system_clock_source_get_hz+0x78>
|
|
return _system_clock_inst.xosc.frequency;
|
|
16be: 4b1b ldr r3, [pc, #108] ; (172c <system_clock_source_get_hz+0x80>)
|
|
16c0: 6918 ldr r0, [r3, #16]
|
|
16c2: e02f b.n 1724 <system_clock_source_get_hz+0x78>
|
|
return 8000000UL >> SYSCTRL->OSC8M.bit.PRESC;
|
|
16c4: 4b1a ldr r3, [pc, #104] ; (1730 <system_clock_source_get_hz+0x84>)
|
|
16c6: 6a1b ldr r3, [r3, #32]
|
|
16c8: 059b lsls r3, r3, #22
|
|
16ca: 0f9b lsrs r3, r3, #30
|
|
16cc: 4819 ldr r0, [pc, #100] ; (1734 <system_clock_source_get_hz+0x88>)
|
|
16ce: 40d8 lsrs r0, r3
|
|
16d0: e028 b.n 1724 <system_clock_source_get_hz+0x78>
|
|
return _system_clock_inst.xosc32k.frequency;
|
|
16d2: 4b16 ldr r3, [pc, #88] ; (172c <system_clock_source_get_hz+0x80>)
|
|
16d4: 6958 ldr r0, [r3, #20]
|
|
16d6: e025 b.n 1724 <system_clock_source_get_hz+0x78>
|
|
if (!(_system_clock_inst.dfll.control & SYSCTRL_DFLLCTRL_ENABLE))
|
|
16d8: 4b14 ldr r3, [pc, #80] ; (172c <system_clock_source_get_hz+0x80>)
|
|
16da: 681b ldr r3, [r3, #0]
|
|
return 0;
|
|
16dc: 2000 movs r0, #0
|
|
if (!(_system_clock_inst.dfll.control & SYSCTRL_DFLLCTRL_ENABLE))
|
|
16de: 079b lsls r3, r3, #30
|
|
16e0: d520 bpl.n 1724 <system_clock_source_get_hz+0x78>
|
|
while (!(SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY)) {
|
|
16e2: 4913 ldr r1, [pc, #76] ; (1730 <system_clock_source_get_hz+0x84>)
|
|
16e4: 2210 movs r2, #16
|
|
16e6: 68cb ldr r3, [r1, #12]
|
|
16e8: 421a tst r2, r3
|
|
16ea: d0fc beq.n 16e6 <system_clock_source_get_hz+0x3a>
|
|
switch(_system_clock_inst.dfll.control &
|
|
16ec: 4b0f ldr r3, [pc, #60] ; (172c <system_clock_source_get_hz+0x80>)
|
|
16ee: 681a ldr r2, [r3, #0]
|
|
16f0: 2324 movs r3, #36 ; 0x24
|
|
16f2: 4013 ands r3, r2
|
|
16f4: 2b04 cmp r3, #4
|
|
16f6: d001 beq.n 16fc <system_clock_source_get_hz+0x50>
|
|
return 48000000UL;
|
|
16f8: 480f ldr r0, [pc, #60] ; (1738 <system_clock_source_get_hz+0x8c>)
|
|
16fa: e013 b.n 1724 <system_clock_source_get_hz+0x78>
|
|
return system_gclk_chan_get_hz(SYSCTRL_GCLK_ID_DFLL48) *
|
|
16fc: 2000 movs r0, #0
|
|
16fe: 4b0f ldr r3, [pc, #60] ; (173c <system_clock_source_get_hz+0x90>)
|
|
1700: 4798 blx r3
|
|
(_system_clock_inst.dfll.mul & 0xffff);
|
|
1702: 4b0a ldr r3, [pc, #40] ; (172c <system_clock_source_get_hz+0x80>)
|
|
1704: 689b ldr r3, [r3, #8]
|
|
1706: 041b lsls r3, r3, #16
|
|
1708: 0c1b lsrs r3, r3, #16
|
|
return system_gclk_chan_get_hz(SYSCTRL_GCLK_ID_DFLL48) *
|
|
170a: 4358 muls r0, r3
|
|
170c: e00a b.n 1724 <system_clock_source_get_hz+0x78>
|
|
if (!(SYSCTRL->DPLLSTATUS.reg & SYSCTRL_DPLLSTATUS_ENABLE)) {
|
|
170e: 2350 movs r3, #80 ; 0x50
|
|
1710: 4a07 ldr r2, [pc, #28] ; (1730 <system_clock_source_get_hz+0x84>)
|
|
1712: 5cd3 ldrb r3, [r2, r3]
|
|
return 0;
|
|
1714: 2000 movs r0, #0
|
|
if (!(SYSCTRL->DPLLSTATUS.reg & SYSCTRL_DPLLSTATUS_ENABLE)) {
|
|
1716: 075b lsls r3, r3, #29
|
|
1718: d504 bpl.n 1724 <system_clock_source_get_hz+0x78>
|
|
return _system_clock_inst.dpll.frequency;
|
|
171a: 4b04 ldr r3, [pc, #16] ; (172c <system_clock_source_get_hz+0x80>)
|
|
171c: 68d8 ldr r0, [r3, #12]
|
|
171e: e001 b.n 1724 <system_clock_source_get_hz+0x78>
|
|
return 32768UL;
|
|
1720: 2080 movs r0, #128 ; 0x80
|
|
1722: 0200 lsls r0, r0, #8
|
|
}
|
|
}
|
|
1724: bd10 pop {r4, pc}
|
|
1726: 46c0 nop ; (mov r8, r8)
|
|
1728: 0000380c .word 0x0000380c
|
|
172c: 200001b4 .word 0x200001b4
|
|
1730: 40000800 .word 0x40000800
|
|
1734: 007a1200 .word 0x007a1200
|
|
1738: 02dc6c00 .word 0x02dc6c00
|
|
173c: 00001b11 .word 0x00001b11
|
|
|
|
00001740 <system_clock_source_osc8m_set_config>:
|
|
*
|
|
* \param[in] config OSC8M configuration structure containing the new config
|
|
*/
|
|
void system_clock_source_osc8m_set_config(
|
|
struct system_clock_source_osc8m_config *const config)
|
|
{
|
|
1740: b570 push {r4, r5, r6, lr}
|
|
SYSCTRL_OSC8M_Type temp = SYSCTRL->OSC8M;
|
|
1742: 490c ldr r1, [pc, #48] ; (1774 <system_clock_source_osc8m_set_config+0x34>)
|
|
1744: 6a0b ldr r3, [r1, #32]
|
|
|
|
/* Use temporary struct to reduce register access */
|
|
temp.bit.PRESC = config->prescaler;
|
|
1746: 7804 ldrb r4, [r0, #0]
|
|
temp.bit.ONDEMAND = config->on_demand;
|
|
1748: 7885 ldrb r5, [r0, #2]
|
|
temp.bit.RUNSTDBY = config->run_in_standby;
|
|
|
|
SYSCTRL->OSC8M = temp;
|
|
174a: 7840 ldrb r0, [r0, #1]
|
|
174c: 2201 movs r2, #1
|
|
174e: 4010 ands r0, r2
|
|
1750: 0180 lsls r0, r0, #6
|
|
1752: 2640 movs r6, #64 ; 0x40
|
|
1754: 43b3 bics r3, r6
|
|
1756: 4303 orrs r3, r0
|
|
1758: 402a ands r2, r5
|
|
175a: 01d2 lsls r2, r2, #7
|
|
175c: 2080 movs r0, #128 ; 0x80
|
|
175e: 4383 bics r3, r0
|
|
1760: 4313 orrs r3, r2
|
|
1762: 2203 movs r2, #3
|
|
1764: 4022 ands r2, r4
|
|
1766: 0212 lsls r2, r2, #8
|
|
1768: 4803 ldr r0, [pc, #12] ; (1778 <system_clock_source_osc8m_set_config+0x38>)
|
|
176a: 4003 ands r3, r0
|
|
176c: 4313 orrs r3, r2
|
|
176e: 620b str r3, [r1, #32]
|
|
}
|
|
1770: bd70 pop {r4, r5, r6, pc}
|
|
1772: 46c0 nop ; (mov r8, r8)
|
|
1774: 40000800 .word 0x40000800
|
|
1778: fffffcff .word 0xfffffcff
|
|
|
|
0000177c <system_clock_source_enable>:
|
|
* device
|
|
*/
|
|
enum status_code system_clock_source_enable(
|
|
const enum system_clock_source clock_source)
|
|
{
|
|
switch (clock_source) {
|
|
177c: 2808 cmp r0, #8
|
|
177e: d803 bhi.n 1788 <system_clock_source_enable+0xc>
|
|
1780: 0080 lsls r0, r0, #2
|
|
1782: 4b25 ldr r3, [pc, #148] ; (1818 <system_clock_source_enable+0x9c>)
|
|
1784: 581b ldr r3, [r3, r0]
|
|
1786: 469f mov pc, r3
|
|
/* Always enabled */
|
|
return STATUS_OK;
|
|
|
|
default:
|
|
Assert(false);
|
|
return STATUS_ERR_INVALID_ARG;
|
|
1788: 2017 movs r0, #23
|
|
178a: e044 b.n 1816 <system_clock_source_enable+0x9a>
|
|
SYSCTRL->OSC8M.reg |= SYSCTRL_OSC8M_ENABLE;
|
|
178c: 4a23 ldr r2, [pc, #140] ; (181c <system_clock_source_enable+0xa0>)
|
|
178e: 6a13 ldr r3, [r2, #32]
|
|
1790: 2102 movs r1, #2
|
|
1792: 430b orrs r3, r1
|
|
1794: 6213 str r3, [r2, #32]
|
|
return STATUS_OK;
|
|
1796: 2000 movs r0, #0
|
|
1798: e03d b.n 1816 <system_clock_source_enable+0x9a>
|
|
SYSCTRL->OSC32K.reg |= SYSCTRL_OSC32K_ENABLE;
|
|
179a: 4a20 ldr r2, [pc, #128] ; (181c <system_clock_source_enable+0xa0>)
|
|
179c: 6993 ldr r3, [r2, #24]
|
|
179e: 2102 movs r1, #2
|
|
17a0: 430b orrs r3, r1
|
|
17a2: 6193 str r3, [r2, #24]
|
|
}
|
|
|
|
return STATUS_OK;
|
|
17a4: 2000 movs r0, #0
|
|
break;
|
|
17a6: e036 b.n 1816 <system_clock_source_enable+0x9a>
|
|
SYSCTRL->XOSC.reg |= SYSCTRL_XOSC_ENABLE;
|
|
17a8: 4a1c ldr r2, [pc, #112] ; (181c <system_clock_source_enable+0xa0>)
|
|
17aa: 8a13 ldrh r3, [r2, #16]
|
|
17ac: 2102 movs r1, #2
|
|
17ae: 430b orrs r3, r1
|
|
17b0: 8213 strh r3, [r2, #16]
|
|
return STATUS_OK;
|
|
17b2: 2000 movs r0, #0
|
|
break;
|
|
17b4: e02f b.n 1816 <system_clock_source_enable+0x9a>
|
|
SYSCTRL->XOSC32K.reg |= SYSCTRL_XOSC32K_ENABLE;
|
|
17b6: 4a19 ldr r2, [pc, #100] ; (181c <system_clock_source_enable+0xa0>)
|
|
17b8: 8a93 ldrh r3, [r2, #20]
|
|
17ba: 2102 movs r1, #2
|
|
17bc: 430b orrs r3, r1
|
|
17be: 8293 strh r3, [r2, #20]
|
|
return STATUS_OK;
|
|
17c0: 2000 movs r0, #0
|
|
break;
|
|
17c2: e028 b.n 1816 <system_clock_source_enable+0x9a>
|
|
_system_clock_inst.dfll.control |= SYSCTRL_DFLLCTRL_ENABLE;
|
|
17c4: 4916 ldr r1, [pc, #88] ; (1820 <system_clock_source_enable+0xa4>)
|
|
17c6: 680b ldr r3, [r1, #0]
|
|
17c8: 2202 movs r2, #2
|
|
17ca: 4313 orrs r3, r2
|
|
17cc: 600b str r3, [r1, #0]
|
|
SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE;
|
|
17ce: 4b13 ldr r3, [pc, #76] ; (181c <system_clock_source_enable+0xa0>)
|
|
17d0: 849a strh r2, [r3, #36] ; 0x24
|
|
while (!(SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY)) {
|
|
17d2: 0019 movs r1, r3
|
|
17d4: 320e adds r2, #14
|
|
17d6: 68cb ldr r3, [r1, #12]
|
|
17d8: 421a tst r2, r3
|
|
17da: d0fc beq.n 17d6 <system_clock_source_enable+0x5a>
|
|
SYSCTRL->DFLLMUL.reg = _system_clock_inst.dfll.mul;
|
|
17dc: 4a10 ldr r2, [pc, #64] ; (1820 <system_clock_source_enable+0xa4>)
|
|
17de: 6891 ldr r1, [r2, #8]
|
|
17e0: 4b0e ldr r3, [pc, #56] ; (181c <system_clock_source_enable+0xa0>)
|
|
17e2: 62d9 str r1, [r3, #44] ; 0x2c
|
|
SYSCTRL->DFLLVAL.reg = _system_clock_inst.dfll.val;
|
|
17e4: 6852 ldr r2, [r2, #4]
|
|
17e6: 629a str r2, [r3, #40] ; 0x28
|
|
SYSCTRL->DFLLCTRL.reg = 0;
|
|
17e8: 2200 movs r2, #0
|
|
17ea: 849a strh r2, [r3, #36] ; 0x24
|
|
while (!(SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY)) {
|
|
17ec: 0019 movs r1, r3
|
|
17ee: 3210 adds r2, #16
|
|
17f0: 68cb ldr r3, [r1, #12]
|
|
17f2: 421a tst r2, r3
|
|
17f4: d0fc beq.n 17f0 <system_clock_source_enable+0x74>
|
|
SYSCTRL->DFLLCTRL.reg = _system_clock_inst.dfll.control;
|
|
17f6: 4b0a ldr r3, [pc, #40] ; (1820 <system_clock_source_enable+0xa4>)
|
|
17f8: 681b ldr r3, [r3, #0]
|
|
17fa: b29b uxth r3, r3
|
|
17fc: 4a07 ldr r2, [pc, #28] ; (181c <system_clock_source_enable+0xa0>)
|
|
17fe: 8493 strh r3, [r2, #36] ; 0x24
|
|
return STATUS_OK;
|
|
1800: 2000 movs r0, #0
|
|
1802: e008 b.n 1816 <system_clock_source_enable+0x9a>
|
|
SYSCTRL->DPLLCTRLA.reg |= SYSCTRL_DPLLCTRLA_ENABLE;
|
|
1804: 4905 ldr r1, [pc, #20] ; (181c <system_clock_source_enable+0xa0>)
|
|
1806: 2244 movs r2, #68 ; 0x44
|
|
1808: 5c8b ldrb r3, [r1, r2]
|
|
180a: 2002 movs r0, #2
|
|
180c: 4303 orrs r3, r0
|
|
180e: 548b strb r3, [r1, r2]
|
|
return STATUS_OK;
|
|
1810: 2000 movs r0, #0
|
|
break;
|
|
1812: e000 b.n 1816 <system_clock_source_enable+0x9a>
|
|
return STATUS_OK;
|
|
1814: 2000 movs r0, #0
|
|
}
|
|
1816: 4770 bx lr
|
|
1818: 00003830 .word 0x00003830
|
|
181c: 40000800 .word 0x40000800
|
|
1820: 200001b4 .word 0x200001b4
|
|
|
|
00001824 <system_clock_init>:
|
|
* \note OSC8M is always enabled and if user selects other clocks for GCLK generators,
|
|
* the OSC8M default enable can be disabled after system_clock_init. Make sure the
|
|
* clock switch successfully before disabling OSC8M.
|
|
*/
|
|
void system_clock_init(void)
|
|
{
|
|
1824: b530 push {r4, r5, lr}
|
|
1826: b085 sub sp, #20
|
|
/* Various bits in the INTFLAG register can be set to one at startup.
|
|
This will ensure that these bits are cleared */
|
|
SYSCTRL->INTFLAG.reg = SYSCTRL_INTFLAG_BOD33RDY | SYSCTRL_INTFLAG_BOD33DET |
|
|
1828: 22c2 movs r2, #194 ; 0xc2
|
|
182a: 00d2 lsls r2, r2, #3
|
|
182c: 4b1a ldr r3, [pc, #104] ; (1898 <system_clock_init+0x74>)
|
|
182e: 609a str r2, [r3, #8]
|
|
static inline void system_flash_set_waitstates(uint8_t wait_states)
|
|
{
|
|
Assert(NVMCTRL_CTRLB_RWS((uint32_t)wait_states) ==
|
|
((uint32_t)wait_states << NVMCTRL_CTRLB_RWS_Pos));
|
|
|
|
NVMCTRL->CTRLB.bit.RWS = wait_states;
|
|
1830: 4a1a ldr r2, [pc, #104] ; (189c <system_clock_init+0x78>)
|
|
1832: 6853 ldr r3, [r2, #4]
|
|
1834: 211e movs r1, #30
|
|
1836: 438b bics r3, r1
|
|
1838: 6053 str r3, [r2, #4]
|
|
gclk_conf.source_generator = GCLK_GENERATOR_1;
|
|
183a: 2301 movs r3, #1
|
|
183c: 466a mov r2, sp
|
|
183e: 7013 strb r3, [r2, #0]
|
|
for (gclk_id = 0; gclk_id < GCLK_NUM; gclk_id++) {
|
|
1840: 2400 movs r4, #0
|
|
system_gclk_chan_set_config(gclk_id, &gclk_conf);
|
|
1842: 4d17 ldr r5, [pc, #92] ; (18a0 <system_clock_init+0x7c>)
|
|
1844: b2e0 uxtb r0, r4
|
|
1846: 4669 mov r1, sp
|
|
1848: 47a8 blx r5
|
|
for (gclk_id = 0; gclk_id < GCLK_NUM; gclk_id++) {
|
|
184a: 3401 adds r4, #1
|
|
184c: 2c25 cmp r4, #37 ; 0x25
|
|
184e: d1f9 bne.n 1844 <system_clock_init+0x20>
|
|
config->run_in_standby = false;
|
|
1850: a803 add r0, sp, #12
|
|
1852: 2400 movs r4, #0
|
|
1854: 7044 strb r4, [r0, #1]
|
|
config->on_demand = true;
|
|
1856: 2501 movs r5, #1
|
|
1858: 7085 strb r5, [r0, #2]
|
|
|
|
/* OSC8M */
|
|
struct system_clock_source_osc8m_config osc8m_conf;
|
|
system_clock_source_osc8m_get_config_defaults(&osc8m_conf);
|
|
|
|
osc8m_conf.prescaler = CONF_CLOCK_OSC8M_PRESCALER;
|
|
185a: 7004 strb r4, [r0, #0]
|
|
osc8m_conf.on_demand = CONF_CLOCK_OSC8M_ON_DEMAND;
|
|
osc8m_conf.run_in_standby = CONF_CLOCK_OSC8M_RUN_IN_STANDBY;
|
|
|
|
system_clock_source_osc8m_set_config(&osc8m_conf);
|
|
185c: 4b11 ldr r3, [pc, #68] ; (18a4 <system_clock_init+0x80>)
|
|
185e: 4798 blx r3
|
|
system_clock_source_enable(SYSTEM_CLOCK_SOURCE_OSC8M);
|
|
1860: 2006 movs r0, #6
|
|
1862: 4b11 ldr r3, [pc, #68] ; (18a8 <system_clock_init+0x84>)
|
|
1864: 4798 blx r3
|
|
|
|
|
|
/* GCLK */
|
|
#if CONF_CLOCK_CONFIGURE_GCLK == true
|
|
system_gclk_init();
|
|
1866: 4b11 ldr r3, [pc, #68] ; (18ac <system_clock_init+0x88>)
|
|
1868: 4798 blx r3
|
|
PM->CPUSEL.reg = (uint32_t)divider;
|
|
186a: 4b11 ldr r3, [pc, #68] ; (18b0 <system_clock_init+0x8c>)
|
|
186c: 721c strb r4, [r3, #8]
|
|
PM->APBASEL.reg = (uint32_t)divider;
|
|
186e: 725c strb r4, [r3, #9]
|
|
PM->APBBSEL.reg = (uint32_t)divider;
|
|
1870: 729c strb r4, [r3, #10]
|
|
PM->APBCSEL.reg = (uint32_t)divider;
|
|
1872: 72dc strb r4, [r3, #11]
|
|
{
|
|
/* Sanity check arguments */
|
|
Assert(config);
|
|
|
|
/* Default configuration values */
|
|
config->division_factor = 1;
|
|
1874: 9501 str r5, [sp, #4]
|
|
config->high_when_disabled = false;
|
|
1876: 466b mov r3, sp
|
|
1878: 705c strb r4, [r3, #1]
|
|
#if SAML21 || SAML22 || SAMR30 || SAMR34 || SAMR35
|
|
config->source_clock = GCLK_SOURCE_OSC16M;
|
|
#elif (SAMC20) || (SAMC21)
|
|
config->source_clock = GCLK_SOURCE_OSC48M;
|
|
#else
|
|
config->source_clock = GCLK_SOURCE_OSC8M;
|
|
187a: 2306 movs r3, #6
|
|
187c: 466a mov r2, sp
|
|
187e: 7013 strb r3, [r2, #0]
|
|
#endif
|
|
config->run_in_standby = false;
|
|
1880: 7214 strb r4, [r2, #8]
|
|
config->output_enable = false;
|
|
1882: 7254 strb r4, [r2, #9]
|
|
system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBC, CONF_CLOCK_APBC_DIVIDER);
|
|
|
|
/* GCLK 0 */
|
|
#if CONF_CLOCK_CONFIGURE_GCLK == true
|
|
/* Configure the main GCLK last as it might depend on other generators */
|
|
_CONF_CLOCK_GCLK_CONFIG(0, ~);
|
|
1884: 4669 mov r1, sp
|
|
1886: 2000 movs r0, #0
|
|
1888: 4b0a ldr r3, [pc, #40] ; (18b4 <system_clock_init+0x90>)
|
|
188a: 4798 blx r3
|
|
188c: 2000 movs r0, #0
|
|
188e: 4b0a ldr r3, [pc, #40] ; (18b8 <system_clock_init+0x94>)
|
|
1890: 4798 blx r3
|
|
#endif
|
|
}
|
|
1892: b005 add sp, #20
|
|
1894: bd30 pop {r4, r5, pc}
|
|
1896: 46c0 nop ; (mov r8, r8)
|
|
1898: 40000800 .word 0x40000800
|
|
189c: 41004000 .word 0x41004000
|
|
18a0: 00001af5 .word 0x00001af5
|
|
18a4: 00001741 .word 0x00001741
|
|
18a8: 0000177d .word 0x0000177d
|
|
18ac: 000018bd .word 0x000018bd
|
|
18b0: 40000400 .word 0x40000400
|
|
18b4: 000018e1 .word 0x000018e1
|
|
18b8: 00001999 .word 0x00001999
|
|
|
|
000018bc <system_gclk_init>:
|
|
PM->APBAMASK.reg |= mask;
|
|
18bc: 4a06 ldr r2, [pc, #24] ; (18d8 <system_gclk_init+0x1c>)
|
|
18be: 6993 ldr r3, [r2, #24]
|
|
18c0: 2108 movs r1, #8
|
|
18c2: 430b orrs r3, r1
|
|
18c4: 6193 str r3, [r2, #24]
|
|
{
|
|
/* Turn on the digital interface clock */
|
|
system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBA, PM_APBAMASK_GCLK);
|
|
|
|
/* Software reset the module to ensure it is re-initialized correctly */
|
|
GCLK->CTRL.reg = GCLK_CTRL_SWRST;
|
|
18c6: 2201 movs r2, #1
|
|
18c8: 4b04 ldr r3, [pc, #16] ; (18dc <system_gclk_init+0x20>)
|
|
18ca: 701a strb r2, [r3, #0]
|
|
while (GCLK->CTRL.reg & GCLK_CTRL_SWRST) {
|
|
18cc: 0019 movs r1, r3
|
|
18ce: 780b ldrb r3, [r1, #0]
|
|
18d0: 4213 tst r3, r2
|
|
18d2: d1fc bne.n 18ce <system_gclk_init+0x12>
|
|
/* Wait for reset to complete */
|
|
}
|
|
}
|
|
18d4: 4770 bx lr
|
|
18d6: 46c0 nop ; (mov r8, r8)
|
|
18d8: 40000400 .word 0x40000400
|
|
18dc: 40000c00 .word 0x40000c00
|
|
|
|
000018e0 <system_gclk_gen_set_config>:
|
|
* \param[in] config Configuration settings for the generator
|
|
*/
|
|
void system_gclk_gen_set_config(
|
|
const uint8_t generator,
|
|
struct system_gclk_gen_config *const config)
|
|
{
|
|
18e0: b570 push {r4, r5, r6, lr}
|
|
18e2: 0006 movs r6, r0
|
|
/* Sanity check arguments */
|
|
Assert(config);
|
|
|
|
/* Cache new register configurations to minimize sync requirements. */
|
|
uint32_t new_genctrl_config = (generator << GCLK_GENCTRL_ID_Pos);
|
|
18e4: 0004 movs r4, r0
|
|
uint32_t new_gendiv_config = (generator << GCLK_GENDIV_ID_Pos);
|
|
|
|
/* Select the requested source clock for the generator */
|
|
new_genctrl_config |= config->source_clock << GCLK_GENCTRL_SRC_Pos;
|
|
18e6: 780d ldrb r5, [r1, #0]
|
|
18e8: 022d lsls r5, r5, #8
|
|
18ea: 4305 orrs r5, r0
|
|
|
|
/* Configure the clock to be either high or low when disabled */
|
|
if (config->high_when_disabled) {
|
|
18ec: 784b ldrb r3, [r1, #1]
|
|
18ee: 2b00 cmp r3, #0
|
|
18f0: d002 beq.n 18f8 <system_gclk_gen_set_config+0x18>
|
|
new_genctrl_config |= GCLK_GENCTRL_OOV;
|
|
18f2: 2380 movs r3, #128 ; 0x80
|
|
18f4: 02db lsls r3, r3, #11
|
|
18f6: 431d orrs r5, r3
|
|
}
|
|
|
|
/* Configure if the clock output to I/O pin should be enabled. */
|
|
if (config->output_enable) {
|
|
18f8: 7a4b ldrb r3, [r1, #9]
|
|
18fa: 2b00 cmp r3, #0
|
|
18fc: d002 beq.n 1904 <system_gclk_gen_set_config+0x24>
|
|
new_genctrl_config |= GCLK_GENCTRL_OE;
|
|
18fe: 2380 movs r3, #128 ; 0x80
|
|
1900: 031b lsls r3, r3, #12
|
|
1902: 431d orrs r5, r3
|
|
}
|
|
|
|
/* Set division factor */
|
|
if (config->division_factor > 1) {
|
|
1904: 6848 ldr r0, [r1, #4]
|
|
1906: 2801 cmp r0, #1
|
|
1908: d910 bls.n 192c <system_gclk_gen_set_config+0x4c>
|
|
/* Check if division is a power of two */
|
|
if (((config->division_factor & (config->division_factor - 1)) == 0)) {
|
|
190a: 1e43 subs r3, r0, #1
|
|
190c: 4218 tst r0, r3
|
|
190e: d134 bne.n 197a <system_gclk_gen_set_config+0x9a>
|
|
* register */
|
|
|
|
uint32_t div2_count = 0;
|
|
|
|
uint32_t mask;
|
|
for (mask = (1UL << 1); mask < config->division_factor;
|
|
1910: 2802 cmp r0, #2
|
|
1912: d930 bls.n 1976 <system_gclk_gen_set_config+0x96>
|
|
1914: 2302 movs r3, #2
|
|
1916: 2200 movs r2, #0
|
|
mask <<= 1) {
|
|
div2_count++;
|
|
1918: 3201 adds r2, #1
|
|
mask <<= 1) {
|
|
191a: 005b lsls r3, r3, #1
|
|
for (mask = (1UL << 1); mask < config->division_factor;
|
|
191c: 4298 cmp r0, r3
|
|
191e: d8fb bhi.n 1918 <system_gclk_gen_set_config+0x38>
|
|
}
|
|
|
|
/* Set binary divider power of 2 division factor */
|
|
new_gendiv_config |= div2_count << GCLK_GENDIV_DIV_Pos;
|
|
1920: 0212 lsls r2, r2, #8
|
|
1922: 4332 orrs r2, r6
|
|
1924: 0014 movs r4, r2
|
|
new_genctrl_config |= GCLK_GENCTRL_DIVSEL;
|
|
1926: 2380 movs r3, #128 ; 0x80
|
|
1928: 035b lsls r3, r3, #13
|
|
192a: 431d orrs r5, r3
|
|
}
|
|
|
|
}
|
|
|
|
/* Enable or disable the clock in standby mode */
|
|
if (config->run_in_standby) {
|
|
192c: 7a0b ldrb r3, [r1, #8]
|
|
192e: 2b00 cmp r3, #0
|
|
1930: d002 beq.n 1938 <system_gclk_gen_set_config+0x58>
|
|
new_genctrl_config |= GCLK_GENCTRL_RUNSTDBY;
|
|
1932: 2380 movs r3, #128 ; 0x80
|
|
1934: 039b lsls r3, r3, #14
|
|
1936: 431d orrs r5, r3
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
1938: 4a13 ldr r2, [pc, #76] ; (1988 <system_gclk_gen_set_config+0xa8>)
|
|
193a: 7853 ldrb r3, [r2, #1]
|
|
}
|
|
|
|
while (system_gclk_is_syncing()) {
|
|
193c: b25b sxtb r3, r3
|
|
193e: 2b00 cmp r3, #0
|
|
1940: dbfb blt.n 193a <system_gclk_gen_set_config+0x5a>
|
|
cpu_irq_enter_critical();
|
|
1942: 4b12 ldr r3, [pc, #72] ; (198c <system_gclk_gen_set_config+0xac>)
|
|
1944: 4798 blx r3
|
|
};
|
|
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Select the correct generator */
|
|
*((uint8_t*)&GCLK->GENDIV.reg) = generator;
|
|
1946: 4b12 ldr r3, [pc, #72] ; (1990 <system_gclk_gen_set_config+0xb0>)
|
|
1948: 701e strb r6, [r3, #0]
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
194a: 4a0f ldr r2, [pc, #60] ; (1988 <system_gclk_gen_set_config+0xa8>)
|
|
194c: 7853 ldrb r3, [r2, #1]
|
|
|
|
/* Write the new generator configuration */
|
|
while (system_gclk_is_syncing()) {
|
|
194e: b25b sxtb r3, r3
|
|
1950: 2b00 cmp r3, #0
|
|
1952: dbfb blt.n 194c <system_gclk_gen_set_config+0x6c>
|
|
/* Wait for synchronization */
|
|
};
|
|
GCLK->GENDIV.reg = new_gendiv_config;
|
|
1954: 4b0c ldr r3, [pc, #48] ; (1988 <system_gclk_gen_set_config+0xa8>)
|
|
1956: 609c str r4, [r3, #8]
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
1958: 001a movs r2, r3
|
|
195a: 7853 ldrb r3, [r2, #1]
|
|
|
|
while (system_gclk_is_syncing()) {
|
|
195c: b25b sxtb r3, r3
|
|
195e: 2b00 cmp r3, #0
|
|
1960: dbfb blt.n 195a <system_gclk_gen_set_config+0x7a>
|
|
/* Wait for synchronization */
|
|
};
|
|
GCLK->GENCTRL.reg = new_genctrl_config | (GCLK->GENCTRL.reg & GCLK_GENCTRL_GENEN);
|
|
1962: 4a09 ldr r2, [pc, #36] ; (1988 <system_gclk_gen_set_config+0xa8>)
|
|
1964: 6853 ldr r3, [r2, #4]
|
|
1966: 2180 movs r1, #128 ; 0x80
|
|
1968: 0249 lsls r1, r1, #9
|
|
196a: 400b ands r3, r1
|
|
196c: 431d orrs r5, r3
|
|
196e: 6055 str r5, [r2, #4]
|
|
cpu_irq_leave_critical();
|
|
1970: 4b08 ldr r3, [pc, #32] ; (1994 <system_gclk_gen_set_config+0xb4>)
|
|
1972: 4798 blx r3
|
|
|
|
system_interrupt_leave_critical_section();
|
|
}
|
|
1974: bd70 pop {r4, r5, r6, pc}
|
|
for (mask = (1UL << 1); mask < config->division_factor;
|
|
1976: 2200 movs r2, #0
|
|
1978: e7d2 b.n 1920 <system_gclk_gen_set_config+0x40>
|
|
(config->division_factor) << GCLK_GENDIV_DIV_Pos;
|
|
197a: 0204 lsls r4, r0, #8
|
|
new_gendiv_config |=
|
|
197c: 4334 orrs r4, r6
|
|
new_genctrl_config |= GCLK_GENCTRL_IDC;
|
|
197e: 2380 movs r3, #128 ; 0x80
|
|
1980: 029b lsls r3, r3, #10
|
|
1982: 431d orrs r5, r3
|
|
1984: e7d2 b.n 192c <system_gclk_gen_set_config+0x4c>
|
|
1986: 46c0 nop ; (mov r8, r8)
|
|
1988: 40000c00 .word 0x40000c00
|
|
198c: 000015e1 .word 0x000015e1
|
|
1990: 40000c08 .word 0x40000c08
|
|
1994: 00001621 .word 0x00001621
|
|
|
|
00001998 <system_gclk_gen_enable>:
|
|
*
|
|
* \param[in] generator Generic Clock Generator index to enable
|
|
*/
|
|
void system_gclk_gen_enable(
|
|
const uint8_t generator)
|
|
{
|
|
1998: b510 push {r4, lr}
|
|
199a: 0004 movs r4, r0
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
199c: 4a0b ldr r2, [pc, #44] ; (19cc <system_gclk_gen_enable+0x34>)
|
|
199e: 7853 ldrb r3, [r2, #1]
|
|
while (system_gclk_is_syncing()) {
|
|
19a0: b25b sxtb r3, r3
|
|
19a2: 2b00 cmp r3, #0
|
|
19a4: dbfb blt.n 199e <system_gclk_gen_enable+0x6>
|
|
cpu_irq_enter_critical();
|
|
19a6: 4b0a ldr r3, [pc, #40] ; (19d0 <system_gclk_gen_enable+0x38>)
|
|
19a8: 4798 blx r3
|
|
};
|
|
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Select the requested generator */
|
|
*((uint8_t*)&GCLK->GENCTRL.reg) = generator;
|
|
19aa: 4b0a ldr r3, [pc, #40] ; (19d4 <system_gclk_gen_enable+0x3c>)
|
|
19ac: 701c strb r4, [r3, #0]
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
19ae: 4a07 ldr r2, [pc, #28] ; (19cc <system_gclk_gen_enable+0x34>)
|
|
19b0: 7853 ldrb r3, [r2, #1]
|
|
while (system_gclk_is_syncing()) {
|
|
19b2: b25b sxtb r3, r3
|
|
19b4: 2b00 cmp r3, #0
|
|
19b6: dbfb blt.n 19b0 <system_gclk_gen_enable+0x18>
|
|
/* Wait for synchronization */
|
|
};
|
|
|
|
/* Enable generator */
|
|
GCLK->GENCTRL.reg |= GCLK_GENCTRL_GENEN;
|
|
19b8: 4a04 ldr r2, [pc, #16] ; (19cc <system_gclk_gen_enable+0x34>)
|
|
19ba: 6851 ldr r1, [r2, #4]
|
|
19bc: 2380 movs r3, #128 ; 0x80
|
|
19be: 025b lsls r3, r3, #9
|
|
19c0: 430b orrs r3, r1
|
|
19c2: 6053 str r3, [r2, #4]
|
|
cpu_irq_leave_critical();
|
|
19c4: 4b04 ldr r3, [pc, #16] ; (19d8 <system_gclk_gen_enable+0x40>)
|
|
19c6: 4798 blx r3
|
|
|
|
system_interrupt_leave_critical_section();
|
|
}
|
|
19c8: bd10 pop {r4, pc}
|
|
19ca: 46c0 nop ; (mov r8, r8)
|
|
19cc: 40000c00 .word 0x40000c00
|
|
19d0: 000015e1 .word 0x000015e1
|
|
19d4: 40000c04 .word 0x40000c04
|
|
19d8: 00001621 .word 0x00001621
|
|
|
|
000019dc <system_gclk_gen_get_hz>:
|
|
*
|
|
* \return The frequency of the generic clock generator, in Hz.
|
|
*/
|
|
uint32_t system_gclk_gen_get_hz(
|
|
const uint8_t generator)
|
|
{
|
|
19dc: b570 push {r4, r5, r6, lr}
|
|
19de: 0004 movs r4, r0
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
19e0: 4a1a ldr r2, [pc, #104] ; (1a4c <system_gclk_gen_get_hz+0x70>)
|
|
19e2: 7853 ldrb r3, [r2, #1]
|
|
while (system_gclk_is_syncing()) {
|
|
19e4: b25b sxtb r3, r3
|
|
19e6: 2b00 cmp r3, #0
|
|
19e8: dbfb blt.n 19e2 <system_gclk_gen_get_hz+0x6>
|
|
cpu_irq_enter_critical();
|
|
19ea: 4b19 ldr r3, [pc, #100] ; (1a50 <system_gclk_gen_get_hz+0x74>)
|
|
19ec: 4798 blx r3
|
|
};
|
|
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Select the appropriate generator */
|
|
*((uint8_t*)&GCLK->GENCTRL.reg) = generator;
|
|
19ee: 4b19 ldr r3, [pc, #100] ; (1a54 <system_gclk_gen_get_hz+0x78>)
|
|
19f0: 701c strb r4, [r3, #0]
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
19f2: 4a16 ldr r2, [pc, #88] ; (1a4c <system_gclk_gen_get_hz+0x70>)
|
|
19f4: 7853 ldrb r3, [r2, #1]
|
|
while (system_gclk_is_syncing()) {
|
|
19f6: b25b sxtb r3, r3
|
|
19f8: 2b00 cmp r3, #0
|
|
19fa: dbfb blt.n 19f4 <system_gclk_gen_get_hz+0x18>
|
|
/* Wait for synchronization */
|
|
};
|
|
|
|
/* Get the frequency of the source connected to the GCLK generator */
|
|
uint32_t gen_input_hz = system_clock_source_get_hz(
|
|
(enum system_clock_source)GCLK->GENCTRL.bit.SRC);
|
|
19fc: 4e13 ldr r6, [pc, #76] ; (1a4c <system_gclk_gen_get_hz+0x70>)
|
|
19fe: 6870 ldr r0, [r6, #4]
|
|
1a00: 04c0 lsls r0, r0, #19
|
|
1a02: 0ec0 lsrs r0, r0, #27
|
|
uint32_t gen_input_hz = system_clock_source_get_hz(
|
|
1a04: 4b14 ldr r3, [pc, #80] ; (1a58 <system_gclk_gen_get_hz+0x7c>)
|
|
1a06: 4798 blx r3
|
|
1a08: 0005 movs r5, r0
|
|
|
|
*((uint8_t*)&GCLK->GENCTRL.reg) = generator;
|
|
1a0a: 4b12 ldr r3, [pc, #72] ; (1a54 <system_gclk_gen_get_hz+0x78>)
|
|
1a0c: 701c strb r4, [r3, #0]
|
|
|
|
uint8_t divsel = GCLK->GENCTRL.bit.DIVSEL;
|
|
1a0e: 6876 ldr r6, [r6, #4]
|
|
1a10: 02f6 lsls r6, r6, #11
|
|
1a12: 0ff6 lsrs r6, r6, #31
|
|
|
|
/* Select the appropriate generator division register */
|
|
*((uint8_t*)&GCLK->GENDIV.reg) = generator;
|
|
1a14: 4b11 ldr r3, [pc, #68] ; (1a5c <system_gclk_gen_get_hz+0x80>)
|
|
1a16: 701c strb r4, [r3, #0]
|
|
if (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY){
|
|
1a18: 4a0c ldr r2, [pc, #48] ; (1a4c <system_gclk_gen_get_hz+0x70>)
|
|
1a1a: 7853 ldrb r3, [r2, #1]
|
|
while (system_gclk_is_syncing()) {
|
|
1a1c: b25b sxtb r3, r3
|
|
1a1e: 2b00 cmp r3, #0
|
|
1a20: dbfb blt.n 1a1a <system_gclk_gen_get_hz+0x3e>
|
|
/* Wait for synchronization */
|
|
};
|
|
|
|
uint32_t divider = GCLK->GENDIV.bit.DIV;
|
|
1a22: 4b0a ldr r3, [pc, #40] ; (1a4c <system_gclk_gen_get_hz+0x70>)
|
|
1a24: 689c ldr r4, [r3, #8]
|
|
1a26: 0224 lsls r4, r4, #8
|
|
1a28: 0c24 lsrs r4, r4, #16
|
|
cpu_irq_leave_critical();
|
|
1a2a: 4b0d ldr r3, [pc, #52] ; (1a60 <system_gclk_gen_get_hz+0x84>)
|
|
1a2c: 4798 blx r3
|
|
|
|
system_interrupt_leave_critical_section();
|
|
|
|
/* Check if the generator is using fractional or binary division */
|
|
if (!divsel && divider > 1) {
|
|
1a2e: 2e00 cmp r6, #0
|
|
1a30: d107 bne.n 1a42 <system_gclk_gen_get_hz+0x66>
|
|
1a32: 2c01 cmp r4, #1
|
|
1a34: d907 bls.n 1a46 <system_gclk_gen_get_hz+0x6a>
|
|
gen_input_hz /= divider;
|
|
1a36: 0021 movs r1, r4
|
|
1a38: 0028 movs r0, r5
|
|
1a3a: 4b0a ldr r3, [pc, #40] ; (1a64 <system_gclk_gen_get_hz+0x88>)
|
|
1a3c: 4798 blx r3
|
|
1a3e: 0005 movs r5, r0
|
|
1a40: e001 b.n 1a46 <system_gclk_gen_get_hz+0x6a>
|
|
} else if (divsel) {
|
|
gen_input_hz >>= (divider+1);
|
|
1a42: 3401 adds r4, #1
|
|
1a44: 40e5 lsrs r5, r4
|
|
}
|
|
|
|
return gen_input_hz;
|
|
}
|
|
1a46: 0028 movs r0, r5
|
|
1a48: bd70 pop {r4, r5, r6, pc}
|
|
1a4a: 46c0 nop ; (mov r8, r8)
|
|
1a4c: 40000c00 .word 0x40000c00
|
|
1a50: 000015e1 .word 0x000015e1
|
|
1a54: 40000c04 .word 0x40000c04
|
|
1a58: 000016ad .word 0x000016ad
|
|
1a5c: 40000c08 .word 0x40000c08
|
|
1a60: 00001621 .word 0x00001621
|
|
1a64: 00001df5 .word 0x00001df5
|
|
|
|
00001a68 <system_gclk_chan_enable>:
|
|
*
|
|
* \param[in] channel Generic Clock channel to enable
|
|
*/
|
|
void system_gclk_chan_enable(
|
|
const uint8_t channel)
|
|
{
|
|
1a68: b510 push {r4, lr}
|
|
1a6a: 0004 movs r4, r0
|
|
cpu_irq_enter_critical();
|
|
1a6c: 4b06 ldr r3, [pc, #24] ; (1a88 <system_gclk_chan_enable+0x20>)
|
|
1a6e: 4798 blx r3
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Select the requested generator channel */
|
|
*((uint8_t*)&GCLK->CLKCTRL.reg) = channel;
|
|
1a70: 4b06 ldr r3, [pc, #24] ; (1a8c <system_gclk_chan_enable+0x24>)
|
|
1a72: 701c strb r4, [r3, #0]
|
|
|
|
/* Enable the generic clock */
|
|
GCLK->CLKCTRL.reg |= GCLK_CLKCTRL_CLKEN;
|
|
1a74: 4a06 ldr r2, [pc, #24] ; (1a90 <system_gclk_chan_enable+0x28>)
|
|
1a76: 8853 ldrh r3, [r2, #2]
|
|
1a78: 2180 movs r1, #128 ; 0x80
|
|
1a7a: 01c9 lsls r1, r1, #7
|
|
1a7c: 430b orrs r3, r1
|
|
1a7e: 8053 strh r3, [r2, #2]
|
|
cpu_irq_leave_critical();
|
|
1a80: 4b04 ldr r3, [pc, #16] ; (1a94 <system_gclk_chan_enable+0x2c>)
|
|
1a82: 4798 blx r3
|
|
|
|
system_interrupt_leave_critical_section();
|
|
}
|
|
1a84: bd10 pop {r4, pc}
|
|
1a86: 46c0 nop ; (mov r8, r8)
|
|
1a88: 000015e1 .word 0x000015e1
|
|
1a8c: 40000c02 .word 0x40000c02
|
|
1a90: 40000c00 .word 0x40000c00
|
|
1a94: 00001621 .word 0x00001621
|
|
|
|
00001a98 <system_gclk_chan_disable>:
|
|
*
|
|
* \param[in] channel Generic Clock channel to disable
|
|
*/
|
|
void system_gclk_chan_disable(
|
|
const uint8_t channel)
|
|
{
|
|
1a98: b510 push {r4, lr}
|
|
1a9a: 0004 movs r4, r0
|
|
cpu_irq_enter_critical();
|
|
1a9c: 4b0f ldr r3, [pc, #60] ; (1adc <system_gclk_chan_disable+0x44>)
|
|
1a9e: 4798 blx r3
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Select the requested generator channel */
|
|
*((uint8_t*)&GCLK->CLKCTRL.reg) = channel;
|
|
1aa0: 4b0f ldr r3, [pc, #60] ; (1ae0 <system_gclk_chan_disable+0x48>)
|
|
1aa2: 701c strb r4, [r3, #0]
|
|
|
|
/* Sanity check WRTLOCK */
|
|
Assert(!GCLK->CLKCTRL.bit.WRTLOCK);
|
|
|
|
/* Switch to known-working source so that the channel can be disabled */
|
|
uint32_t prev_gen_id = GCLK->CLKCTRL.bit.GEN;
|
|
1aa4: 4a0f ldr r2, [pc, #60] ; (1ae4 <system_gclk_chan_disable+0x4c>)
|
|
1aa6: 8853 ldrh r3, [r2, #2]
|
|
1aa8: 051b lsls r3, r3, #20
|
|
1aaa: 0f18 lsrs r0, r3, #28
|
|
GCLK->CLKCTRL.bit.GEN = 0;
|
|
1aac: 8853 ldrh r3, [r2, #2]
|
|
1aae: 490e ldr r1, [pc, #56] ; (1ae8 <system_gclk_chan_disable+0x50>)
|
|
1ab0: 400b ands r3, r1
|
|
1ab2: 8053 strh r3, [r2, #2]
|
|
|
|
/* Disable the generic clock */
|
|
GCLK->CLKCTRL.reg &= ~GCLK_CLKCTRL_CLKEN;
|
|
1ab4: 8853 ldrh r3, [r2, #2]
|
|
1ab6: 490d ldr r1, [pc, #52] ; (1aec <system_gclk_chan_disable+0x54>)
|
|
1ab8: 400b ands r3, r1
|
|
1aba: 8053 strh r3, [r2, #2]
|
|
while (GCLK->CLKCTRL.reg & GCLK_CLKCTRL_CLKEN) {
|
|
1abc: 0011 movs r1, r2
|
|
1abe: 2280 movs r2, #128 ; 0x80
|
|
1ac0: 01d2 lsls r2, r2, #7
|
|
1ac2: 884b ldrh r3, [r1, #2]
|
|
1ac4: 4213 tst r3, r2
|
|
1ac6: d1fc bne.n 1ac2 <system_gclk_chan_disable+0x2a>
|
|
/* Wait for clock to become disabled */
|
|
}
|
|
|
|
/* Restore previous configured clock generator */
|
|
GCLK->CLKCTRL.bit.GEN = prev_gen_id;
|
|
1ac8: 4906 ldr r1, [pc, #24] ; (1ae4 <system_gclk_chan_disable+0x4c>)
|
|
1aca: 884a ldrh r2, [r1, #2]
|
|
1acc: 0203 lsls r3, r0, #8
|
|
1ace: 4806 ldr r0, [pc, #24] ; (1ae8 <system_gclk_chan_disable+0x50>)
|
|
1ad0: 4002 ands r2, r0
|
|
1ad2: 4313 orrs r3, r2
|
|
1ad4: 804b strh r3, [r1, #2]
|
|
cpu_irq_leave_critical();
|
|
1ad6: 4b06 ldr r3, [pc, #24] ; (1af0 <system_gclk_chan_disable+0x58>)
|
|
1ad8: 4798 blx r3
|
|
|
|
system_interrupt_leave_critical_section();
|
|
}
|
|
1ada: bd10 pop {r4, pc}
|
|
1adc: 000015e1 .word 0x000015e1
|
|
1ae0: 40000c02 .word 0x40000c02
|
|
1ae4: 40000c00 .word 0x40000c00
|
|
1ae8: fffff0ff .word 0xfffff0ff
|
|
1aec: ffffbfff .word 0xffffbfff
|
|
1af0: 00001621 .word 0x00001621
|
|
|
|
00001af4 <system_gclk_chan_set_config>:
|
|
{
|
|
1af4: b510 push {r4, lr}
|
|
new_clkctrl_config |= config->source_generator << GCLK_CLKCTRL_GEN_Pos;
|
|
1af6: 780c ldrb r4, [r1, #0]
|
|
1af8: 0224 lsls r4, r4, #8
|
|
1afa: 4304 orrs r4, r0
|
|
system_gclk_chan_disable(channel);
|
|
1afc: 4b02 ldr r3, [pc, #8] ; (1b08 <system_gclk_chan_set_config+0x14>)
|
|
1afe: 4798 blx r3
|
|
GCLK->CLKCTRL.reg = new_clkctrl_config;
|
|
1b00: b2a4 uxth r4, r4
|
|
1b02: 4b02 ldr r3, [pc, #8] ; (1b0c <system_gclk_chan_set_config+0x18>)
|
|
1b04: 805c strh r4, [r3, #2]
|
|
}
|
|
1b06: bd10 pop {r4, pc}
|
|
1b08: 00001a99 .word 0x00001a99
|
|
1b0c: 40000c00 .word 0x40000c00
|
|
|
|
00001b10 <system_gclk_chan_get_hz>:
|
|
*
|
|
* \return The frequency of the generic clock channel, in Hz.
|
|
*/
|
|
uint32_t system_gclk_chan_get_hz(
|
|
const uint8_t channel)
|
|
{
|
|
1b10: b510 push {r4, lr}
|
|
1b12: 0004 movs r4, r0
|
|
cpu_irq_enter_critical();
|
|
1b14: 4b06 ldr r3, [pc, #24] ; (1b30 <system_gclk_chan_get_hz+0x20>)
|
|
1b16: 4798 blx r3
|
|
uint8_t gen_id;
|
|
|
|
system_interrupt_enter_critical_section();
|
|
|
|
/* Select the requested generic clock channel */
|
|
*((uint8_t*)&GCLK->CLKCTRL.reg) = channel;
|
|
1b18: 4b06 ldr r3, [pc, #24] ; (1b34 <system_gclk_chan_get_hz+0x24>)
|
|
1b1a: 701c strb r4, [r3, #0]
|
|
gen_id = GCLK->CLKCTRL.bit.GEN;
|
|
1b1c: 4b06 ldr r3, [pc, #24] ; (1b38 <system_gclk_chan_get_hz+0x28>)
|
|
1b1e: 885c ldrh r4, [r3, #2]
|
|
1b20: 0524 lsls r4, r4, #20
|
|
1b22: 0f24 lsrs r4, r4, #28
|
|
cpu_irq_leave_critical();
|
|
1b24: 4b05 ldr r3, [pc, #20] ; (1b3c <system_gclk_chan_get_hz+0x2c>)
|
|
1b26: 4798 blx r3
|
|
|
|
system_interrupt_leave_critical_section();
|
|
|
|
/* Return the clock speed of the associated GCLK generator */
|
|
return system_gclk_gen_get_hz(gen_id);
|
|
1b28: 0020 movs r0, r4
|
|
1b2a: 4b05 ldr r3, [pc, #20] ; (1b40 <system_gclk_chan_get_hz+0x30>)
|
|
1b2c: 4798 blx r3
|
|
}
|
|
1b2e: bd10 pop {r4, pc}
|
|
1b30: 000015e1 .word 0x000015e1
|
|
1b34: 40000c02 .word 0x40000c02
|
|
1b38: 40000c00 .word 0x40000c00
|
|
1b3c: 00001621 .word 0x00001621
|
|
1b40: 000019dd .word 0x000019dd
|
|
|
|
00001b44 <_system_pinmux_config>:
|
|
*/
|
|
static void _system_pinmux_config(
|
|
PortGroup *const port,
|
|
const uint32_t pin_mask,
|
|
const struct system_pinmux_config *const config)
|
|
{
|
|
1b44: b530 push {r4, r5, lr}
|
|
|
|
/* Track the configuration bits into a temporary variable before writing */
|
|
uint32_t pin_cfg = 0;
|
|
|
|
/* Enabled powersave mode, don't create configuration */
|
|
if (!config->powersave) {
|
|
1b46: 78d3 ldrb r3, [r2, #3]
|
|
1b48: 2b00 cmp r3, #0
|
|
1b4a: d135 bne.n 1bb8 <_system_pinmux_config+0x74>
|
|
/* Enable the pin peripheral MUX flag if non-GPIO selected (pinmux will
|
|
* be written later) and store the new MUX mask */
|
|
if (config->mux_position != SYSTEM_PINMUX_GPIO) {
|
|
1b4c: 7813 ldrb r3, [r2, #0]
|
|
1b4e: 2b80 cmp r3, #128 ; 0x80
|
|
1b50: d029 beq.n 1ba6 <_system_pinmux_config+0x62>
|
|
pin_cfg |= PORT_WRCONFIG_PMUXEN;
|
|
pin_cfg |= (config->mux_position << PORT_WRCONFIG_PMUX_Pos);
|
|
1b52: 061b lsls r3, r3, #24
|
|
1b54: 2480 movs r4, #128 ; 0x80
|
|
1b56: 0264 lsls r4, r4, #9
|
|
1b58: 4323 orrs r3, r4
|
|
}
|
|
|
|
/* Check if the user has requested that the input buffer be enabled */
|
|
if ((config->direction == SYSTEM_PINMUX_PIN_DIR_INPUT) ||
|
|
1b5a: 7854 ldrb r4, [r2, #1]
|
|
1b5c: 2502 movs r5, #2
|
|
1b5e: 43ac bics r4, r5
|
|
1b60: d106 bne.n 1b70 <_system_pinmux_config+0x2c>
|
|
(config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT_WITH_READBACK)) {
|
|
/* Enable input buffer flag */
|
|
pin_cfg |= PORT_WRCONFIG_INEN;
|
|
|
|
/* Enable pull-up/pull-down control flag if requested */
|
|
if (config->input_pull != SYSTEM_PINMUX_PIN_PULL_NONE) {
|
|
1b62: 7894 ldrb r4, [r2, #2]
|
|
1b64: 2c00 cmp r4, #0
|
|
1b66: d120 bne.n 1baa <_system_pinmux_config+0x66>
|
|
pin_cfg |= PORT_WRCONFIG_INEN;
|
|
1b68: 2480 movs r4, #128 ; 0x80
|
|
1b6a: 02a4 lsls r4, r4, #10
|
|
1b6c: 4323 orrs r3, r4
|
|
pin_cfg |= PORT_WRCONFIG_PULLEN;
|
|
}
|
|
|
|
/* Clear the port DIR bits to disable the output buffer */
|
|
port->DIRCLR.reg = pin_mask;
|
|
1b6e: 6041 str r1, [r0, #4]
|
|
}
|
|
|
|
/* Check if the user has requested that the output buffer be enabled */
|
|
if ((config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT) ||
|
|
1b70: 7854 ldrb r4, [r2, #1]
|
|
1b72: 3c01 subs r4, #1
|
|
1b74: 2c01 cmp r4, #1
|
|
1b76: d91c bls.n 1bb2 <_system_pinmux_config+0x6e>
|
|
port->DIRCLR.reg = pin_mask;
|
|
}
|
|
|
|
/* The Write Configuration register (WRCONFIG) requires the
|
|
* pins to to grouped into two 16-bit half-words - split them out here */
|
|
uint32_t lower_pin_mask = (pin_mask & 0xFFFF);
|
|
1b78: 040d lsls r5, r1, #16
|
|
1b7a: 0c2d lsrs r5, r5, #16
|
|
|
|
/* Configure the lower 16-bits of the port to the desired configuration,
|
|
* including the pin peripheral multiplexer just in case it is enabled */
|
|
port->WRCONFIG.reg
|
|
= (lower_pin_mask << PORT_WRCONFIG_PINMASK_Pos) |
|
|
pin_cfg | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG;
|
|
1b7c: 24a0 movs r4, #160 ; 0xa0
|
|
1b7e: 05e4 lsls r4, r4, #23
|
|
1b80: 432c orrs r4, r5
|
|
1b82: 431c orrs r4, r3
|
|
= (lower_pin_mask << PORT_WRCONFIG_PINMASK_Pos) |
|
|
1b84: 6284 str r4, [r0, #40] ; 0x28
|
|
uint32_t upper_pin_mask = (pin_mask >> 16);
|
|
1b86: 0c0d lsrs r5, r1, #16
|
|
|
|
/* Configure the upper 16-bits of the port to the desired configuration,
|
|
* including the pin peripheral multiplexer just in case it is enabled */
|
|
port->WRCONFIG.reg
|
|
= (upper_pin_mask << PORT_WRCONFIG_PINMASK_Pos) |
|
|
pin_cfg | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG |
|
|
1b88: 24d0 movs r4, #208 ; 0xd0
|
|
1b8a: 0624 lsls r4, r4, #24
|
|
1b8c: 432c orrs r4, r5
|
|
1b8e: 431c orrs r4, r3
|
|
= (upper_pin_mask << PORT_WRCONFIG_PINMASK_Pos) |
|
|
1b90: 6284 str r4, [r0, #40] ; 0x28
|
|
PORT_WRCONFIG_HWSEL;
|
|
|
|
if(!config->powersave) {
|
|
1b92: 78d4 ldrb r4, [r2, #3]
|
|
1b94: 2c00 cmp r4, #0
|
|
1b96: d122 bne.n 1bde <_system_pinmux_config+0x9a>
|
|
/* Set the pull-up state once the port pins are configured if one was
|
|
* requested and it does not violate the valid set of port
|
|
* configurations */
|
|
if (pin_cfg & PORT_WRCONFIG_PULLEN) {
|
|
1b98: 035b lsls r3, r3, #13
|
|
1b9a: d51c bpl.n 1bd6 <_system_pinmux_config+0x92>
|
|
/* Set the OUT register bits to enable the pull-up if requested,
|
|
* clear to enable pull-down */
|
|
if (config->input_pull == SYSTEM_PINMUX_PIN_PULL_UP) {
|
|
1b9c: 7893 ldrb r3, [r2, #2]
|
|
1b9e: 2b01 cmp r3, #1
|
|
1ba0: d01e beq.n 1be0 <_system_pinmux_config+0x9c>
|
|
port->OUTSET.reg = pin_mask;
|
|
} else {
|
|
port->OUTCLR.reg = pin_mask;
|
|
1ba2: 6141 str r1, [r0, #20]
|
|
1ba4: e017 b.n 1bd6 <_system_pinmux_config+0x92>
|
|
uint32_t pin_cfg = 0;
|
|
1ba6: 2300 movs r3, #0
|
|
1ba8: e7d7 b.n 1b5a <_system_pinmux_config+0x16>
|
|
pin_cfg |= PORT_WRCONFIG_PULLEN;
|
|
1baa: 24c0 movs r4, #192 ; 0xc0
|
|
1bac: 02e4 lsls r4, r4, #11
|
|
1bae: 4323 orrs r3, r4
|
|
1bb0: e7dd b.n 1b6e <_system_pinmux_config+0x2a>
|
|
pin_cfg &= ~PORT_WRCONFIG_PULLEN;
|
|
1bb2: 4c0d ldr r4, [pc, #52] ; (1be8 <_system_pinmux_config+0xa4>)
|
|
1bb4: 4023 ands r3, r4
|
|
1bb6: e7df b.n 1b78 <_system_pinmux_config+0x34>
|
|
port->DIRCLR.reg = pin_mask;
|
|
1bb8: 6041 str r1, [r0, #4]
|
|
uint32_t lower_pin_mask = (pin_mask & 0xFFFF);
|
|
1bba: 040c lsls r4, r1, #16
|
|
1bbc: 0c24 lsrs r4, r4, #16
|
|
pin_cfg | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG;
|
|
1bbe: 23a0 movs r3, #160 ; 0xa0
|
|
1bc0: 05db lsls r3, r3, #23
|
|
1bc2: 4323 orrs r3, r4
|
|
= (lower_pin_mask << PORT_WRCONFIG_PINMASK_Pos) |
|
|
1bc4: 6283 str r3, [r0, #40] ; 0x28
|
|
uint32_t upper_pin_mask = (pin_mask >> 16);
|
|
1bc6: 0c0c lsrs r4, r1, #16
|
|
pin_cfg | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG |
|
|
1bc8: 23d0 movs r3, #208 ; 0xd0
|
|
1bca: 061b lsls r3, r3, #24
|
|
1bcc: 4323 orrs r3, r4
|
|
= (upper_pin_mask << PORT_WRCONFIG_PINMASK_Pos) |
|
|
1bce: 6283 str r3, [r0, #40] ; 0x28
|
|
if(!config->powersave) {
|
|
1bd0: 78d3 ldrb r3, [r2, #3]
|
|
1bd2: 2b00 cmp r3, #0
|
|
1bd4: d103 bne.n 1bde <_system_pinmux_config+0x9a>
|
|
}
|
|
}
|
|
|
|
/* Check if the user has requested that the output buffer be enabled */
|
|
if ((config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT) ||
|
|
1bd6: 7853 ldrb r3, [r2, #1]
|
|
1bd8: 3b01 subs r3, #1
|
|
1bda: 2b01 cmp r3, #1
|
|
1bdc: d902 bls.n 1be4 <_system_pinmux_config+0xa0>
|
|
(config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT_WITH_READBACK)) {
|
|
/* Set the port DIR bits to enable the output buffer */
|
|
port->DIRSET.reg = pin_mask;
|
|
}
|
|
}
|
|
}
|
|
1bde: bd30 pop {r4, r5, pc}
|
|
port->OUTSET.reg = pin_mask;
|
|
1be0: 6181 str r1, [r0, #24]
|
|
1be2: e7f8 b.n 1bd6 <_system_pinmux_config+0x92>
|
|
port->DIRSET.reg = pin_mask;
|
|
1be4: 6081 str r1, [r0, #8]
|
|
}
|
|
1be6: e7fa b.n 1bde <_system_pinmux_config+0x9a>
|
|
1be8: fffbffff .word 0xfffbffff
|
|
|
|
00001bec <system_pinmux_pin_set_config>:
|
|
* \param[in] config Configuration settings for the pin
|
|
*/
|
|
void system_pinmux_pin_set_config(
|
|
const uint8_t gpio_pin,
|
|
const struct system_pinmux_config *const config)
|
|
{
|
|
1bec: b510 push {r4, lr}
|
|
1bee: 000a movs r2, r1
|
|
uint8_t group_index = (gpio_pin / 32);
|
|
|
|
/* Array of available ports */
|
|
Port *const ports[PORT_INST_NUM] = PORT_INSTS;
|
|
|
|
if (port_index < PORT_INST_NUM) {
|
|
1bf0: 09c1 lsrs r1, r0, #7
|
|
return &(ports[port_index]->Group[group_index]);
|
|
} else {
|
|
Assert(false);
|
|
return NULL;
|
|
1bf2: 2300 movs r3, #0
|
|
if (port_index < PORT_INST_NUM) {
|
|
1bf4: 2900 cmp r1, #0
|
|
1bf6: d104 bne.n 1c02 <system_pinmux_pin_set_config+0x16>
|
|
return &(ports[port_index]->Group[group_index]);
|
|
1bf8: 0943 lsrs r3, r0, #5
|
|
1bfa: 01db lsls r3, r3, #7
|
|
1bfc: 4905 ldr r1, [pc, #20] ; (1c14 <system_pinmux_pin_set_config+0x28>)
|
|
1bfe: 468c mov ip, r1
|
|
1c00: 4463 add r3, ip
|
|
PortGroup *const port = system_pinmux_get_group_from_gpio_pin(gpio_pin);
|
|
uint32_t pin_mask = (1UL << (gpio_pin % 32));
|
|
1c02: 241f movs r4, #31
|
|
1c04: 4020 ands r0, r4
|
|
1c06: 2101 movs r1, #1
|
|
1c08: 4081 lsls r1, r0
|
|
|
|
_system_pinmux_config(port, pin_mask, config);
|
|
1c0a: 0018 movs r0, r3
|
|
1c0c: 4b02 ldr r3, [pc, #8] ; (1c18 <system_pinmux_pin_set_config+0x2c>)
|
|
1c0e: 4798 blx r3
|
|
}
|
|
1c10: bd10 pop {r4, pc}
|
|
1c12: 46c0 nop ; (mov r8, r8)
|
|
1c14: 41004400 .word 0x41004400
|
|
1c18: 00001b45 .word 0x00001b45
|
|
|
|
00001c1c <_system_dummy_init>:
|
|
*/
|
|
void _system_dummy_init(void);
|
|
void _system_dummy_init(void)
|
|
{
|
|
return;
|
|
}
|
|
1c1c: 4770 bx lr
|
|
...
|
|
|
|
00001c20 <system_init>:
|
|
* - Board hardware initialization (via the Board module)
|
|
* - Event system driver initialization (via the EVSYS module)
|
|
* - External Interrupt driver initialization (via the EXTINT module)
|
|
*/
|
|
void system_init(void)
|
|
{
|
|
1c20: b510 push {r4, lr}
|
|
/* Configure GCLK and clock sources according to conf_clocks.h */
|
|
system_clock_init();
|
|
1c22: 4b05 ldr r3, [pc, #20] ; (1c38 <system_init+0x18>)
|
|
1c24: 4798 blx r3
|
|
|
|
/* Initialize board hardware */
|
|
system_board_init();
|
|
1c26: 4b05 ldr r3, [pc, #20] ; (1c3c <system_init+0x1c>)
|
|
1c28: 4798 blx r3
|
|
|
|
/* Initialize EVSYS hardware */
|
|
_system_events_init();
|
|
1c2a: 4b05 ldr r3, [pc, #20] ; (1c40 <system_init+0x20>)
|
|
1c2c: 4798 blx r3
|
|
|
|
/* Initialize External hardware */
|
|
_system_extint_init();
|
|
1c2e: 4b05 ldr r3, [pc, #20] ; (1c44 <system_init+0x24>)
|
|
1c30: 4798 blx r3
|
|
|
|
/* Initialize DIVAS hardware */
|
|
_system_divas_init();
|
|
1c32: 4b05 ldr r3, [pc, #20] ; (1c48 <system_init+0x28>)
|
|
1c34: 4798 blx r3
|
|
}
|
|
1c36: bd10 pop {r4, pc}
|
|
1c38: 00001825 .word 0x00001825
|
|
1c3c: 00001651 .word 0x00001651
|
|
1c40: 00001c1d .word 0x00001c1d
|
|
1c44: 00001c1d .word 0x00001c1d
|
|
1c48: 00001c1d .word 0x00001c1d
|
|
|
|
00001c4c <Dummy_Handler>:
|
|
|
|
/**
|
|
* \brief Default interrupt handler for unused IRQs.
|
|
*/
|
|
void Dummy_Handler(void)
|
|
{
|
|
1c4c: e7fe b.n 1c4c <Dummy_Handler>
|
|
...
|
|
|
|
00001c50 <Reset_Handler>:
|
|
{
|
|
1c50: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
if (pSrc != pDest) {
|
|
1c52: 4a2a ldr r2, [pc, #168] ; (1cfc <Reset_Handler+0xac>)
|
|
1c54: 4b2a ldr r3, [pc, #168] ; (1d00 <Reset_Handler+0xb0>)
|
|
1c56: 429a cmp r2, r3
|
|
1c58: d011 beq.n 1c7e <Reset_Handler+0x2e>
|
|
for (; pDest < &_erelocate;) {
|
|
1c5a: 001a movs r2, r3
|
|
1c5c: 4b29 ldr r3, [pc, #164] ; (1d04 <Reset_Handler+0xb4>)
|
|
1c5e: 429a cmp r2, r3
|
|
1c60: d20d bcs.n 1c7e <Reset_Handler+0x2e>
|
|
1c62: 4a29 ldr r2, [pc, #164] ; (1d08 <Reset_Handler+0xb8>)
|
|
1c64: 3303 adds r3, #3
|
|
1c66: 1a9b subs r3, r3, r2
|
|
1c68: 089b lsrs r3, r3, #2
|
|
1c6a: 3301 adds r3, #1
|
|
1c6c: 009b lsls r3, r3, #2
|
|
1c6e: 2200 movs r2, #0
|
|
*pDest++ = *pSrc++;
|
|
1c70: 4823 ldr r0, [pc, #140] ; (1d00 <Reset_Handler+0xb0>)
|
|
1c72: 4922 ldr r1, [pc, #136] ; (1cfc <Reset_Handler+0xac>)
|
|
1c74: 588c ldr r4, [r1, r2]
|
|
1c76: 5084 str r4, [r0, r2]
|
|
1c78: 3204 adds r2, #4
|
|
for (; pDest < &_erelocate;) {
|
|
1c7a: 429a cmp r2, r3
|
|
1c7c: d1fa bne.n 1c74 <Reset_Handler+0x24>
|
|
for (pDest = &_szero; pDest < &_ezero;) {
|
|
1c7e: 4a23 ldr r2, [pc, #140] ; (1d0c <Reset_Handler+0xbc>)
|
|
1c80: 4b23 ldr r3, [pc, #140] ; (1d10 <Reset_Handler+0xc0>)
|
|
1c82: 429a cmp r2, r3
|
|
1c84: d20a bcs.n 1c9c <Reset_Handler+0x4c>
|
|
1c86: 43d3 mvns r3, r2
|
|
1c88: 4921 ldr r1, [pc, #132] ; (1d10 <Reset_Handler+0xc0>)
|
|
1c8a: 185b adds r3, r3, r1
|
|
1c8c: 2103 movs r1, #3
|
|
1c8e: 438b bics r3, r1
|
|
1c90: 3304 adds r3, #4
|
|
1c92: 189b adds r3, r3, r2
|
|
*pDest++ = 0;
|
|
1c94: 2100 movs r1, #0
|
|
1c96: c202 stmia r2!, {r1}
|
|
for (pDest = &_szero; pDest < &_ezero;) {
|
|
1c98: 4293 cmp r3, r2
|
|
1c9a: d1fc bne.n 1c96 <Reset_Handler+0x46>
|
|
SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);
|
|
1c9c: 4a1d ldr r2, [pc, #116] ; (1d14 <Reset_Handler+0xc4>)
|
|
1c9e: 21ff movs r1, #255 ; 0xff
|
|
1ca0: 4b1d ldr r3, [pc, #116] ; (1d18 <Reset_Handler+0xc8>)
|
|
1ca2: 438b bics r3, r1
|
|
1ca4: 6093 str r3, [r2, #8]
|
|
SBMATRIX->SFR[SBMATRIX_SLAVE_HMCRAMC0].reg = 2;
|
|
1ca6: 39fd subs r1, #253 ; 0xfd
|
|
1ca8: 2390 movs r3, #144 ; 0x90
|
|
1caa: 005b lsls r3, r3, #1
|
|
1cac: 4a1b ldr r2, [pc, #108] ; (1d1c <Reset_Handler+0xcc>)
|
|
1cae: 50d1 str r1, [r2, r3]
|
|
USB->DEVICE.QOSCTRL.bit.CQOS = 2;
|
|
1cb0: 4a1b ldr r2, [pc, #108] ; (1d20 <Reset_Handler+0xd0>)
|
|
1cb2: 78d3 ldrb r3, [r2, #3]
|
|
1cb4: 2503 movs r5, #3
|
|
1cb6: 43ab bics r3, r5
|
|
1cb8: 2402 movs r4, #2
|
|
1cba: 4323 orrs r3, r4
|
|
1cbc: 70d3 strb r3, [r2, #3]
|
|
USB->DEVICE.QOSCTRL.bit.DQOS = 2;
|
|
1cbe: 78d3 ldrb r3, [r2, #3]
|
|
1cc0: 270c movs r7, #12
|
|
1cc2: 43bb bics r3, r7
|
|
1cc4: 2608 movs r6, #8
|
|
1cc6: 4333 orrs r3, r6
|
|
1cc8: 70d3 strb r3, [r2, #3]
|
|
DMAC->QOSCTRL.bit.DQOS = 2;
|
|
1cca: 4b16 ldr r3, [pc, #88] ; (1d24 <Reset_Handler+0xd4>)
|
|
1ccc: 7b98 ldrb r0, [r3, #14]
|
|
1cce: 2230 movs r2, #48 ; 0x30
|
|
1cd0: 4390 bics r0, r2
|
|
1cd2: 2220 movs r2, #32
|
|
1cd4: 4310 orrs r0, r2
|
|
1cd6: 7398 strb r0, [r3, #14]
|
|
DMAC->QOSCTRL.bit.FQOS = 2;
|
|
1cd8: 7b99 ldrb r1, [r3, #14]
|
|
1cda: 43b9 bics r1, r7
|
|
1cdc: 4331 orrs r1, r6
|
|
1cde: 7399 strb r1, [r3, #14]
|
|
DMAC->QOSCTRL.bit.WRBQOS = 2;
|
|
1ce0: 7b9a ldrb r2, [r3, #14]
|
|
1ce2: 43aa bics r2, r5
|
|
1ce4: 4322 orrs r2, r4
|
|
1ce6: 739a strb r2, [r3, #14]
|
|
NVMCTRL->CTRLB.bit.MANW = 1;
|
|
1ce8: 4a0f ldr r2, [pc, #60] ; (1d28 <Reset_Handler+0xd8>)
|
|
1cea: 6853 ldr r3, [r2, #4]
|
|
1cec: 2180 movs r1, #128 ; 0x80
|
|
1cee: 430b orrs r3, r1
|
|
1cf0: 6053 str r3, [r2, #4]
|
|
__libc_init_array();
|
|
1cf2: 4b0e ldr r3, [pc, #56] ; (1d2c <Reset_Handler+0xdc>)
|
|
1cf4: 4798 blx r3
|
|
main();
|
|
1cf6: 4b0e ldr r3, [pc, #56] ; (1d30 <Reset_Handler+0xe0>)
|
|
1cf8: 4798 blx r3
|
|
1cfa: e7fe b.n 1cfa <Reset_Handler+0xaa>
|
|
1cfc: 00003960 .word 0x00003960
|
|
1d00: 20000000 .word 0x20000000
|
|
1d04: 2000007c .word 0x2000007c
|
|
1d08: 20000004 .word 0x20000004
|
|
1d0c: 20000080 .word 0x20000080
|
|
1d10: 200002a0 .word 0x200002a0
|
|
1d14: e000ed00 .word 0xe000ed00
|
|
1d18: 00000000 .word 0x00000000
|
|
1d1c: 41007000 .word 0x41007000
|
|
1d20: 41005000 .word 0x41005000
|
|
1d24: 41004800 .word 0x41004800
|
|
1d28: 41004000 .word 0x41004000
|
|
1d2c: 00002681 .word 0x00002681
|
|
1d30: 00001d71 .word 0x00001d71
|
|
|
|
00001d34 <_sbrk>:
|
|
extern void _exit(int status);
|
|
extern void _kill(int pid, int sig);
|
|
extern int _getpid(void);
|
|
|
|
extern caddr_t _sbrk(int incr)
|
|
{
|
|
1d34: 0003 movs r3, r0
|
|
static unsigned char *heap = NULL;
|
|
unsigned char *prev_heap;
|
|
|
|
if (heap == NULL) {
|
|
1d36: 4a06 ldr r2, [pc, #24] ; (1d50 <_sbrk+0x1c>)
|
|
1d38: 6812 ldr r2, [r2, #0]
|
|
1d3a: 2a00 cmp r2, #0
|
|
1d3c: d004 beq.n 1d48 <_sbrk+0x14>
|
|
heap = (unsigned char *)&_end;
|
|
}
|
|
prev_heap = heap;
|
|
1d3e: 4a04 ldr r2, [pc, #16] ; (1d50 <_sbrk+0x1c>)
|
|
1d40: 6810 ldr r0, [r2, #0]
|
|
|
|
heap += incr;
|
|
1d42: 18c3 adds r3, r0, r3
|
|
1d44: 6013 str r3, [r2, #0]
|
|
|
|
return (caddr_t) prev_heap;
|
|
}
|
|
1d46: 4770 bx lr
|
|
heap = (unsigned char *)&_end;
|
|
1d48: 4902 ldr r1, [pc, #8] ; (1d54 <_sbrk+0x20>)
|
|
1d4a: 4a01 ldr r2, [pc, #4] ; (1d50 <_sbrk+0x1c>)
|
|
1d4c: 6011 str r1, [r2, #0]
|
|
1d4e: e7f6 b.n 1d3e <_sbrk+0xa>
|
|
1d50: 200001cc .word 0x200001cc
|
|
1d54: 200022a0 .word 0x200022a0
|
|
|
|
00001d58 <_close>:
|
|
}
|
|
|
|
extern int _close(int file)
|
|
{
|
|
return -1;
|
|
}
|
|
1d58: 2001 movs r0, #1
|
|
1d5a: 4240 negs r0, r0
|
|
1d5c: 4770 bx lr
|
|
|
|
00001d5e <_fstat>:
|
|
|
|
extern int _fstat(int file, struct stat *st)
|
|
{
|
|
st->st_mode = S_IFCHR;
|
|
1d5e: 2380 movs r3, #128 ; 0x80
|
|
1d60: 019b lsls r3, r3, #6
|
|
1d62: 604b str r3, [r1, #4]
|
|
|
|
return 0;
|
|
}
|
|
1d64: 2000 movs r0, #0
|
|
1d66: 4770 bx lr
|
|
|
|
00001d68 <_isatty>:
|
|
|
|
extern int _isatty(int file)
|
|
{
|
|
return 1;
|
|
}
|
|
1d68: 2001 movs r0, #1
|
|
1d6a: 4770 bx lr
|
|
|
|
00001d6c <_lseek>:
|
|
|
|
extern int _lseek(int file, int ptr, int dir)
|
|
{
|
|
return 0;
|
|
}
|
|
1d6c: 2000 movs r0, #0
|
|
1d6e: 4770 bx lr
|
|
|
|
00001d70 <main>:
|
|
*/
|
|
#include <asf.h>
|
|
#include "pusart.h"
|
|
#include "padc.h"
|
|
int main (void)
|
|
{
|
|
1d70: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
system_init();
|
|
1d72: 4b12 ldr r3, [pc, #72] ; (1dbc <main+0x4c>)
|
|
1d74: 4798 blx r3
|
|
delay_init();
|
|
1d76: 4b12 ldr r3, [pc, #72] ; (1dc0 <main+0x50>)
|
|
1d78: 4798 blx r3
|
|
|
|
pusart_init();
|
|
1d7a: 4b12 ldr r3, [pc, #72] ; (1dc4 <main+0x54>)
|
|
1d7c: 4798 blx r3
|
|
padc_init();
|
|
1d7e: 4b12 ldr r3, [pc, #72] ; (1dc8 <main+0x58>)
|
|
1d80: 4798 blx r3
|
|
padc_start();
|
|
1d82: 4b12 ldr r3, [pc, #72] ; (1dcc <main+0x5c>)
|
|
1d84: 4798 blx r3
|
|
|
|
for (;;)
|
|
{
|
|
float voltage = padc_get_voltage();
|
|
1d86: 4f12 ldr r7, [pc, #72] ; (1dd0 <main+0x60>)
|
|
printf("Voltage: %d.%03d\r\n", (int)voltage, ((int)((voltage - (int)voltage) * 1000)));
|
|
1d88: 4e12 ldr r6, [pc, #72] ; (1dd4 <main+0x64>)
|
|
float voltage = padc_get_voltage();
|
|
1d8a: 47b8 blx r7
|
|
1d8c: 1c05 adds r5, r0, #0
|
|
printf("Voltage: %d.%03d\r\n", (int)voltage, ((int)((voltage - (int)voltage) * 1000)));
|
|
1d8e: 47b0 blx r6
|
|
1d90: 0004 movs r4, r0
|
|
1d92: 4b11 ldr r3, [pc, #68] ; (1dd8 <main+0x68>)
|
|
1d94: 4798 blx r3
|
|
1d96: 1c01 adds r1, r0, #0
|
|
1d98: 1c28 adds r0, r5, #0
|
|
1d9a: 4b10 ldr r3, [pc, #64] ; (1ddc <main+0x6c>)
|
|
1d9c: 4798 blx r3
|
|
1d9e: 4910 ldr r1, [pc, #64] ; (1de0 <main+0x70>)
|
|
1da0: 4b10 ldr r3, [pc, #64] ; (1de4 <main+0x74>)
|
|
1da2: 4798 blx r3
|
|
1da4: 47b0 blx r6
|
|
1da6: 0002 movs r2, r0
|
|
1da8: 0021 movs r1, r4
|
|
1daa: 480f ldr r0, [pc, #60] ; (1de8 <main+0x78>)
|
|
1dac: 4b0f ldr r3, [pc, #60] ; (1dec <main+0x7c>)
|
|
1dae: 4798 blx r3
|
|
delay_ms(500);
|
|
1db0: 20fa movs r0, #250 ; 0xfa
|
|
1db2: 0040 lsls r0, r0, #1
|
|
1db4: 4b0e ldr r3, [pc, #56] ; (1df0 <main+0x80>)
|
|
1db6: 4798 blx r3
|
|
1db8: e7e7 b.n 1d8a <main+0x1a>
|
|
1dba: 46c0 nop ; (mov r8, r8)
|
|
1dbc: 00001c21 .word 0x00001c21
|
|
1dc0: 00001575 .word 0x00001575
|
|
1dc4: 00000e55 .word 0x00000e55
|
|
1dc8: 00000cb9 .word 0x00000cb9
|
|
1dcc: 00000d99 .word 0x00000d99
|
|
1dd0: 00000de9 .word 0x00000de9
|
|
1dd4: 000024d9 .word 0x000024d9
|
|
1dd8: 00002519 .word 0x00002519
|
|
1ddc: 000021a1 .word 0x000021a1
|
|
1de0: 447a0000 .word 0x447a0000
|
|
1de4: 00001f61 .word 0x00001f61
|
|
1de8: 00003854 .word 0x00003854
|
|
1dec: 000026ed .word 0x000026ed
|
|
1df0: 000015b5 .word 0x000015b5
|
|
|
|
00001df4 <__udivsi3>:
|
|
1df4: 2200 movs r2, #0
|
|
1df6: 0843 lsrs r3, r0, #1
|
|
1df8: 428b cmp r3, r1
|
|
1dfa: d374 bcc.n 1ee6 <__udivsi3+0xf2>
|
|
1dfc: 0903 lsrs r3, r0, #4
|
|
1dfe: 428b cmp r3, r1
|
|
1e00: d35f bcc.n 1ec2 <__udivsi3+0xce>
|
|
1e02: 0a03 lsrs r3, r0, #8
|
|
1e04: 428b cmp r3, r1
|
|
1e06: d344 bcc.n 1e92 <__udivsi3+0x9e>
|
|
1e08: 0b03 lsrs r3, r0, #12
|
|
1e0a: 428b cmp r3, r1
|
|
1e0c: d328 bcc.n 1e60 <__udivsi3+0x6c>
|
|
1e0e: 0c03 lsrs r3, r0, #16
|
|
1e10: 428b cmp r3, r1
|
|
1e12: d30d bcc.n 1e30 <__udivsi3+0x3c>
|
|
1e14: 22ff movs r2, #255 ; 0xff
|
|
1e16: 0209 lsls r1, r1, #8
|
|
1e18: ba12 rev r2, r2
|
|
1e1a: 0c03 lsrs r3, r0, #16
|
|
1e1c: 428b cmp r3, r1
|
|
1e1e: d302 bcc.n 1e26 <__udivsi3+0x32>
|
|
1e20: 1212 asrs r2, r2, #8
|
|
1e22: 0209 lsls r1, r1, #8
|
|
1e24: d065 beq.n 1ef2 <__udivsi3+0xfe>
|
|
1e26: 0b03 lsrs r3, r0, #12
|
|
1e28: 428b cmp r3, r1
|
|
1e2a: d319 bcc.n 1e60 <__udivsi3+0x6c>
|
|
1e2c: e000 b.n 1e30 <__udivsi3+0x3c>
|
|
1e2e: 0a09 lsrs r1, r1, #8
|
|
1e30: 0bc3 lsrs r3, r0, #15
|
|
1e32: 428b cmp r3, r1
|
|
1e34: d301 bcc.n 1e3a <__udivsi3+0x46>
|
|
1e36: 03cb lsls r3, r1, #15
|
|
1e38: 1ac0 subs r0, r0, r3
|
|
1e3a: 4152 adcs r2, r2
|
|
1e3c: 0b83 lsrs r3, r0, #14
|
|
1e3e: 428b cmp r3, r1
|
|
1e40: d301 bcc.n 1e46 <__udivsi3+0x52>
|
|
1e42: 038b lsls r3, r1, #14
|
|
1e44: 1ac0 subs r0, r0, r3
|
|
1e46: 4152 adcs r2, r2
|
|
1e48: 0b43 lsrs r3, r0, #13
|
|
1e4a: 428b cmp r3, r1
|
|
1e4c: d301 bcc.n 1e52 <__udivsi3+0x5e>
|
|
1e4e: 034b lsls r3, r1, #13
|
|
1e50: 1ac0 subs r0, r0, r3
|
|
1e52: 4152 adcs r2, r2
|
|
1e54: 0b03 lsrs r3, r0, #12
|
|
1e56: 428b cmp r3, r1
|
|
1e58: d301 bcc.n 1e5e <__udivsi3+0x6a>
|
|
1e5a: 030b lsls r3, r1, #12
|
|
1e5c: 1ac0 subs r0, r0, r3
|
|
1e5e: 4152 adcs r2, r2
|
|
1e60: 0ac3 lsrs r3, r0, #11
|
|
1e62: 428b cmp r3, r1
|
|
1e64: d301 bcc.n 1e6a <__udivsi3+0x76>
|
|
1e66: 02cb lsls r3, r1, #11
|
|
1e68: 1ac0 subs r0, r0, r3
|
|
1e6a: 4152 adcs r2, r2
|
|
1e6c: 0a83 lsrs r3, r0, #10
|
|
1e6e: 428b cmp r3, r1
|
|
1e70: d301 bcc.n 1e76 <__udivsi3+0x82>
|
|
1e72: 028b lsls r3, r1, #10
|
|
1e74: 1ac0 subs r0, r0, r3
|
|
1e76: 4152 adcs r2, r2
|
|
1e78: 0a43 lsrs r3, r0, #9
|
|
1e7a: 428b cmp r3, r1
|
|
1e7c: d301 bcc.n 1e82 <__udivsi3+0x8e>
|
|
1e7e: 024b lsls r3, r1, #9
|
|
1e80: 1ac0 subs r0, r0, r3
|
|
1e82: 4152 adcs r2, r2
|
|
1e84: 0a03 lsrs r3, r0, #8
|
|
1e86: 428b cmp r3, r1
|
|
1e88: d301 bcc.n 1e8e <__udivsi3+0x9a>
|
|
1e8a: 020b lsls r3, r1, #8
|
|
1e8c: 1ac0 subs r0, r0, r3
|
|
1e8e: 4152 adcs r2, r2
|
|
1e90: d2cd bcs.n 1e2e <__udivsi3+0x3a>
|
|
1e92: 09c3 lsrs r3, r0, #7
|
|
1e94: 428b cmp r3, r1
|
|
1e96: d301 bcc.n 1e9c <__udivsi3+0xa8>
|
|
1e98: 01cb lsls r3, r1, #7
|
|
1e9a: 1ac0 subs r0, r0, r3
|
|
1e9c: 4152 adcs r2, r2
|
|
1e9e: 0983 lsrs r3, r0, #6
|
|
1ea0: 428b cmp r3, r1
|
|
1ea2: d301 bcc.n 1ea8 <__udivsi3+0xb4>
|
|
1ea4: 018b lsls r3, r1, #6
|
|
1ea6: 1ac0 subs r0, r0, r3
|
|
1ea8: 4152 adcs r2, r2
|
|
1eaa: 0943 lsrs r3, r0, #5
|
|
1eac: 428b cmp r3, r1
|
|
1eae: d301 bcc.n 1eb4 <__udivsi3+0xc0>
|
|
1eb0: 014b lsls r3, r1, #5
|
|
1eb2: 1ac0 subs r0, r0, r3
|
|
1eb4: 4152 adcs r2, r2
|
|
1eb6: 0903 lsrs r3, r0, #4
|
|
1eb8: 428b cmp r3, r1
|
|
1eba: d301 bcc.n 1ec0 <__udivsi3+0xcc>
|
|
1ebc: 010b lsls r3, r1, #4
|
|
1ebe: 1ac0 subs r0, r0, r3
|
|
1ec0: 4152 adcs r2, r2
|
|
1ec2: 08c3 lsrs r3, r0, #3
|
|
1ec4: 428b cmp r3, r1
|
|
1ec6: d301 bcc.n 1ecc <__udivsi3+0xd8>
|
|
1ec8: 00cb lsls r3, r1, #3
|
|
1eca: 1ac0 subs r0, r0, r3
|
|
1ecc: 4152 adcs r2, r2
|
|
1ece: 0883 lsrs r3, r0, #2
|
|
1ed0: 428b cmp r3, r1
|
|
1ed2: d301 bcc.n 1ed8 <__udivsi3+0xe4>
|
|
1ed4: 008b lsls r3, r1, #2
|
|
1ed6: 1ac0 subs r0, r0, r3
|
|
1ed8: 4152 adcs r2, r2
|
|
1eda: 0843 lsrs r3, r0, #1
|
|
1edc: 428b cmp r3, r1
|
|
1ede: d301 bcc.n 1ee4 <__udivsi3+0xf0>
|
|
1ee0: 004b lsls r3, r1, #1
|
|
1ee2: 1ac0 subs r0, r0, r3
|
|
1ee4: 4152 adcs r2, r2
|
|
1ee6: 1a41 subs r1, r0, r1
|
|
1ee8: d200 bcs.n 1eec <__udivsi3+0xf8>
|
|
1eea: 4601 mov r1, r0
|
|
1eec: 4152 adcs r2, r2
|
|
1eee: 4610 mov r0, r2
|
|
1ef0: 4770 bx lr
|
|
1ef2: e7ff b.n 1ef4 <__udivsi3+0x100>
|
|
1ef4: b501 push {r0, lr}
|
|
1ef6: 2000 movs r0, #0
|
|
1ef8: f000 f806 bl 1f08 <__aeabi_idiv0>
|
|
1efc: bd02 pop {r1, pc}
|
|
1efe: 46c0 nop ; (mov r8, r8)
|
|
|
|
00001f00 <__aeabi_uidivmod>:
|
|
1f00: 2900 cmp r1, #0
|
|
1f02: d0f7 beq.n 1ef4 <__udivsi3+0x100>
|
|
1f04: e776 b.n 1df4 <__udivsi3>
|
|
1f06: 4770 bx lr
|
|
|
|
00001f08 <__aeabi_idiv0>:
|
|
1f08: 4770 bx lr
|
|
1f0a: 46c0 nop ; (mov r8, r8)
|
|
|
|
00001f0c <__aeabi_lmul>:
|
|
1f0c: b5f0 push {r4, r5, r6, r7, lr}
|
|
1f0e: 46ce mov lr, r9
|
|
1f10: 4647 mov r7, r8
|
|
1f12: 0415 lsls r5, r2, #16
|
|
1f14: 0c2d lsrs r5, r5, #16
|
|
1f16: 002e movs r6, r5
|
|
1f18: b580 push {r7, lr}
|
|
1f1a: 0407 lsls r7, r0, #16
|
|
1f1c: 0c14 lsrs r4, r2, #16
|
|
1f1e: 0c3f lsrs r7, r7, #16
|
|
1f20: 4699 mov r9, r3
|
|
1f22: 0c03 lsrs r3, r0, #16
|
|
1f24: 437e muls r6, r7
|
|
1f26: 435d muls r5, r3
|
|
1f28: 4367 muls r7, r4
|
|
1f2a: 4363 muls r3, r4
|
|
1f2c: 197f adds r7, r7, r5
|
|
1f2e: 0c34 lsrs r4, r6, #16
|
|
1f30: 19e4 adds r4, r4, r7
|
|
1f32: 469c mov ip, r3
|
|
1f34: 42a5 cmp r5, r4
|
|
1f36: d903 bls.n 1f40 <__aeabi_lmul+0x34>
|
|
1f38: 2380 movs r3, #128 ; 0x80
|
|
1f3a: 025b lsls r3, r3, #9
|
|
1f3c: 4698 mov r8, r3
|
|
1f3e: 44c4 add ip, r8
|
|
1f40: 464b mov r3, r9
|
|
1f42: 4351 muls r1, r2
|
|
1f44: 4343 muls r3, r0
|
|
1f46: 0436 lsls r6, r6, #16
|
|
1f48: 0c36 lsrs r6, r6, #16
|
|
1f4a: 0c25 lsrs r5, r4, #16
|
|
1f4c: 0424 lsls r4, r4, #16
|
|
1f4e: 4465 add r5, ip
|
|
1f50: 19a4 adds r4, r4, r6
|
|
1f52: 1859 adds r1, r3, r1
|
|
1f54: 1949 adds r1, r1, r5
|
|
1f56: 0020 movs r0, r4
|
|
1f58: bc0c pop {r2, r3}
|
|
1f5a: 4690 mov r8, r2
|
|
1f5c: 4699 mov r9, r3
|
|
1f5e: bdf0 pop {r4, r5, r6, r7, pc}
|
|
|
|
00001f60 <__aeabi_fmul>:
|
|
1f60: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
1f62: 4657 mov r7, sl
|
|
1f64: 464e mov r6, r9
|
|
1f66: 4645 mov r5, r8
|
|
1f68: 46de mov lr, fp
|
|
1f6a: b5e0 push {r5, r6, r7, lr}
|
|
1f6c: 0247 lsls r7, r0, #9
|
|
1f6e: 0046 lsls r6, r0, #1
|
|
1f70: 4688 mov r8, r1
|
|
1f72: 0a7f lsrs r7, r7, #9
|
|
1f74: 0e36 lsrs r6, r6, #24
|
|
1f76: 0fc4 lsrs r4, r0, #31
|
|
1f78: 2e00 cmp r6, #0
|
|
1f7a: d047 beq.n 200c <STACK_SIZE+0xc>
|
|
1f7c: 2eff cmp r6, #255 ; 0xff
|
|
1f7e: d024 beq.n 1fca <__aeabi_fmul+0x6a>
|
|
1f80: 00fb lsls r3, r7, #3
|
|
1f82: 2780 movs r7, #128 ; 0x80
|
|
1f84: 04ff lsls r7, r7, #19
|
|
1f86: 431f orrs r7, r3
|
|
1f88: 2300 movs r3, #0
|
|
1f8a: 4699 mov r9, r3
|
|
1f8c: 469a mov sl, r3
|
|
1f8e: 3e7f subs r6, #127 ; 0x7f
|
|
1f90: 4643 mov r3, r8
|
|
1f92: 025d lsls r5, r3, #9
|
|
1f94: 0058 lsls r0, r3, #1
|
|
1f96: 0fdb lsrs r3, r3, #31
|
|
1f98: 0a6d lsrs r5, r5, #9
|
|
1f9a: 0e00 lsrs r0, r0, #24
|
|
1f9c: 4698 mov r8, r3
|
|
1f9e: d043 beq.n 2028 <STACK_SIZE+0x28>
|
|
1fa0: 28ff cmp r0, #255 ; 0xff
|
|
1fa2: d03b beq.n 201c <STACK_SIZE+0x1c>
|
|
1fa4: 00eb lsls r3, r5, #3
|
|
1fa6: 2580 movs r5, #128 ; 0x80
|
|
1fa8: 2200 movs r2, #0
|
|
1faa: 04ed lsls r5, r5, #19
|
|
1fac: 431d orrs r5, r3
|
|
1fae: 387f subs r0, #127 ; 0x7f
|
|
1fb0: 1836 adds r6, r6, r0
|
|
1fb2: 1c73 adds r3, r6, #1
|
|
1fb4: 4641 mov r1, r8
|
|
1fb6: 469b mov fp, r3
|
|
1fb8: 464b mov r3, r9
|
|
1fba: 4061 eors r1, r4
|
|
1fbc: 4313 orrs r3, r2
|
|
1fbe: 2b0f cmp r3, #15
|
|
1fc0: d864 bhi.n 208c <STACK_SIZE+0x8c>
|
|
1fc2: 4875 ldr r0, [pc, #468] ; (2198 <STACK_SIZE+0x198>)
|
|
1fc4: 009b lsls r3, r3, #2
|
|
1fc6: 58c3 ldr r3, [r0, r3]
|
|
1fc8: 469f mov pc, r3
|
|
1fca: 2f00 cmp r7, #0
|
|
1fcc: d142 bne.n 2054 <STACK_SIZE+0x54>
|
|
1fce: 2308 movs r3, #8
|
|
1fd0: 4699 mov r9, r3
|
|
1fd2: 3b06 subs r3, #6
|
|
1fd4: 26ff movs r6, #255 ; 0xff
|
|
1fd6: 469a mov sl, r3
|
|
1fd8: e7da b.n 1f90 <__aeabi_fmul+0x30>
|
|
1fda: 4641 mov r1, r8
|
|
1fdc: 2a02 cmp r2, #2
|
|
1fde: d028 beq.n 2032 <STACK_SIZE+0x32>
|
|
1fe0: 2a03 cmp r2, #3
|
|
1fe2: d100 bne.n 1fe6 <__aeabi_fmul+0x86>
|
|
1fe4: e0ce b.n 2184 <STACK_SIZE+0x184>
|
|
1fe6: 2a01 cmp r2, #1
|
|
1fe8: d000 beq.n 1fec <__aeabi_fmul+0x8c>
|
|
1fea: e0ac b.n 2146 <STACK_SIZE+0x146>
|
|
1fec: 4011 ands r1, r2
|
|
1fee: 2000 movs r0, #0
|
|
1ff0: 2200 movs r2, #0
|
|
1ff2: b2cc uxtb r4, r1
|
|
1ff4: 0240 lsls r0, r0, #9
|
|
1ff6: 05d2 lsls r2, r2, #23
|
|
1ff8: 0a40 lsrs r0, r0, #9
|
|
1ffa: 07e4 lsls r4, r4, #31
|
|
1ffc: 4310 orrs r0, r2
|
|
1ffe: 4320 orrs r0, r4
|
|
2000: bc3c pop {r2, r3, r4, r5}
|
|
2002: 4690 mov r8, r2
|
|
2004: 4699 mov r9, r3
|
|
2006: 46a2 mov sl, r4
|
|
2008: 46ab mov fp, r5
|
|
200a: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
200c: 2f00 cmp r7, #0
|
|
200e: d115 bne.n 203c <STACK_SIZE+0x3c>
|
|
2010: 2304 movs r3, #4
|
|
2012: 4699 mov r9, r3
|
|
2014: 3b03 subs r3, #3
|
|
2016: 2600 movs r6, #0
|
|
2018: 469a mov sl, r3
|
|
201a: e7b9 b.n 1f90 <__aeabi_fmul+0x30>
|
|
201c: 20ff movs r0, #255 ; 0xff
|
|
201e: 2202 movs r2, #2
|
|
2020: 2d00 cmp r5, #0
|
|
2022: d0c5 beq.n 1fb0 <__aeabi_fmul+0x50>
|
|
2024: 2203 movs r2, #3
|
|
2026: e7c3 b.n 1fb0 <__aeabi_fmul+0x50>
|
|
2028: 2d00 cmp r5, #0
|
|
202a: d119 bne.n 2060 <STACK_SIZE+0x60>
|
|
202c: 2000 movs r0, #0
|
|
202e: 2201 movs r2, #1
|
|
2030: e7be b.n 1fb0 <__aeabi_fmul+0x50>
|
|
2032: 2401 movs r4, #1
|
|
2034: 22ff movs r2, #255 ; 0xff
|
|
2036: 400c ands r4, r1
|
|
2038: 2000 movs r0, #0
|
|
203a: e7db b.n 1ff4 <__aeabi_fmul+0x94>
|
|
203c: 0038 movs r0, r7
|
|
203e: f000 fb01 bl 2644 <__clzsi2>
|
|
2042: 2676 movs r6, #118 ; 0x76
|
|
2044: 1f43 subs r3, r0, #5
|
|
2046: 409f lsls r7, r3
|
|
2048: 2300 movs r3, #0
|
|
204a: 4276 negs r6, r6
|
|
204c: 1a36 subs r6, r6, r0
|
|
204e: 4699 mov r9, r3
|
|
2050: 469a mov sl, r3
|
|
2052: e79d b.n 1f90 <__aeabi_fmul+0x30>
|
|
2054: 230c movs r3, #12
|
|
2056: 4699 mov r9, r3
|
|
2058: 3b09 subs r3, #9
|
|
205a: 26ff movs r6, #255 ; 0xff
|
|
205c: 469a mov sl, r3
|
|
205e: e797 b.n 1f90 <__aeabi_fmul+0x30>
|
|
2060: 0028 movs r0, r5
|
|
2062: f000 faef bl 2644 <__clzsi2>
|
|
2066: 1f43 subs r3, r0, #5
|
|
2068: 409d lsls r5, r3
|
|
206a: 2376 movs r3, #118 ; 0x76
|
|
206c: 425b negs r3, r3
|
|
206e: 1a18 subs r0, r3, r0
|
|
2070: 2200 movs r2, #0
|
|
2072: e79d b.n 1fb0 <__aeabi_fmul+0x50>
|
|
2074: 2080 movs r0, #128 ; 0x80
|
|
2076: 2400 movs r4, #0
|
|
2078: 03c0 lsls r0, r0, #15
|
|
207a: 22ff movs r2, #255 ; 0xff
|
|
207c: e7ba b.n 1ff4 <__aeabi_fmul+0x94>
|
|
207e: 003d movs r5, r7
|
|
2080: 4652 mov r2, sl
|
|
2082: e7ab b.n 1fdc <__aeabi_fmul+0x7c>
|
|
2084: 003d movs r5, r7
|
|
2086: 0021 movs r1, r4
|
|
2088: 4652 mov r2, sl
|
|
208a: e7a7 b.n 1fdc <__aeabi_fmul+0x7c>
|
|
208c: 0c3b lsrs r3, r7, #16
|
|
208e: 469c mov ip, r3
|
|
2090: 042a lsls r2, r5, #16
|
|
2092: 0c12 lsrs r2, r2, #16
|
|
2094: 0c2b lsrs r3, r5, #16
|
|
2096: 0014 movs r4, r2
|
|
2098: 4660 mov r0, ip
|
|
209a: 4665 mov r5, ip
|
|
209c: 043f lsls r7, r7, #16
|
|
209e: 0c3f lsrs r7, r7, #16
|
|
20a0: 437c muls r4, r7
|
|
20a2: 4342 muls r2, r0
|
|
20a4: 435d muls r5, r3
|
|
20a6: 437b muls r3, r7
|
|
20a8: 0c27 lsrs r7, r4, #16
|
|
20aa: 189b adds r3, r3, r2
|
|
20ac: 18ff adds r7, r7, r3
|
|
20ae: 42ba cmp r2, r7
|
|
20b0: d903 bls.n 20ba <STACK_SIZE+0xba>
|
|
20b2: 2380 movs r3, #128 ; 0x80
|
|
20b4: 025b lsls r3, r3, #9
|
|
20b6: 469c mov ip, r3
|
|
20b8: 4465 add r5, ip
|
|
20ba: 0424 lsls r4, r4, #16
|
|
20bc: 043a lsls r2, r7, #16
|
|
20be: 0c24 lsrs r4, r4, #16
|
|
20c0: 1912 adds r2, r2, r4
|
|
20c2: 0193 lsls r3, r2, #6
|
|
20c4: 1e5c subs r4, r3, #1
|
|
20c6: 41a3 sbcs r3, r4
|
|
20c8: 0c3f lsrs r7, r7, #16
|
|
20ca: 0e92 lsrs r2, r2, #26
|
|
20cc: 197d adds r5, r7, r5
|
|
20ce: 431a orrs r2, r3
|
|
20d0: 01ad lsls r5, r5, #6
|
|
20d2: 4315 orrs r5, r2
|
|
20d4: 012b lsls r3, r5, #4
|
|
20d6: d504 bpl.n 20e2 <STACK_SIZE+0xe2>
|
|
20d8: 2301 movs r3, #1
|
|
20da: 465e mov r6, fp
|
|
20dc: 086a lsrs r2, r5, #1
|
|
20de: 401d ands r5, r3
|
|
20e0: 4315 orrs r5, r2
|
|
20e2: 0032 movs r2, r6
|
|
20e4: 327f adds r2, #127 ; 0x7f
|
|
20e6: 2a00 cmp r2, #0
|
|
20e8: dd25 ble.n 2136 <STACK_SIZE+0x136>
|
|
20ea: 076b lsls r3, r5, #29
|
|
20ec: d004 beq.n 20f8 <STACK_SIZE+0xf8>
|
|
20ee: 230f movs r3, #15
|
|
20f0: 402b ands r3, r5
|
|
20f2: 2b04 cmp r3, #4
|
|
20f4: d000 beq.n 20f8 <STACK_SIZE+0xf8>
|
|
20f6: 3504 adds r5, #4
|
|
20f8: 012b lsls r3, r5, #4
|
|
20fa: d503 bpl.n 2104 <STACK_SIZE+0x104>
|
|
20fc: 0032 movs r2, r6
|
|
20fe: 4b27 ldr r3, [pc, #156] ; (219c <STACK_SIZE+0x19c>)
|
|
2100: 3280 adds r2, #128 ; 0x80
|
|
2102: 401d ands r5, r3
|
|
2104: 2afe cmp r2, #254 ; 0xfe
|
|
2106: dc94 bgt.n 2032 <STACK_SIZE+0x32>
|
|
2108: 2401 movs r4, #1
|
|
210a: 01a8 lsls r0, r5, #6
|
|
210c: 0a40 lsrs r0, r0, #9
|
|
210e: b2d2 uxtb r2, r2
|
|
2110: 400c ands r4, r1
|
|
2112: e76f b.n 1ff4 <__aeabi_fmul+0x94>
|
|
2114: 2080 movs r0, #128 ; 0x80
|
|
2116: 03c0 lsls r0, r0, #15
|
|
2118: 4207 tst r7, r0
|
|
211a: d007 beq.n 212c <STACK_SIZE+0x12c>
|
|
211c: 4205 tst r5, r0
|
|
211e: d105 bne.n 212c <STACK_SIZE+0x12c>
|
|
2120: 4328 orrs r0, r5
|
|
2122: 0240 lsls r0, r0, #9
|
|
2124: 0a40 lsrs r0, r0, #9
|
|
2126: 4644 mov r4, r8
|
|
2128: 22ff movs r2, #255 ; 0xff
|
|
212a: e763 b.n 1ff4 <__aeabi_fmul+0x94>
|
|
212c: 4338 orrs r0, r7
|
|
212e: 0240 lsls r0, r0, #9
|
|
2130: 0a40 lsrs r0, r0, #9
|
|
2132: 22ff movs r2, #255 ; 0xff
|
|
2134: e75e b.n 1ff4 <__aeabi_fmul+0x94>
|
|
2136: 2401 movs r4, #1
|
|
2138: 1aa3 subs r3, r4, r2
|
|
213a: 2b1b cmp r3, #27
|
|
213c: dd05 ble.n 214a <STACK_SIZE+0x14a>
|
|
213e: 400c ands r4, r1
|
|
2140: 2200 movs r2, #0
|
|
2142: 2000 movs r0, #0
|
|
2144: e756 b.n 1ff4 <__aeabi_fmul+0x94>
|
|
2146: 465e mov r6, fp
|
|
2148: e7cb b.n 20e2 <STACK_SIZE+0xe2>
|
|
214a: 002a movs r2, r5
|
|
214c: 2020 movs r0, #32
|
|
214e: 40da lsrs r2, r3
|
|
2150: 1ac3 subs r3, r0, r3
|
|
2152: 409d lsls r5, r3
|
|
2154: 002b movs r3, r5
|
|
2156: 1e5d subs r5, r3, #1
|
|
2158: 41ab sbcs r3, r5
|
|
215a: 4313 orrs r3, r2
|
|
215c: 075a lsls r2, r3, #29
|
|
215e: d004 beq.n 216a <STACK_SIZE+0x16a>
|
|
2160: 220f movs r2, #15
|
|
2162: 401a ands r2, r3
|
|
2164: 2a04 cmp r2, #4
|
|
2166: d000 beq.n 216a <STACK_SIZE+0x16a>
|
|
2168: 3304 adds r3, #4
|
|
216a: 015a lsls r2, r3, #5
|
|
216c: d504 bpl.n 2178 <STACK_SIZE+0x178>
|
|
216e: 2401 movs r4, #1
|
|
2170: 2201 movs r2, #1
|
|
2172: 400c ands r4, r1
|
|
2174: 2000 movs r0, #0
|
|
2176: e73d b.n 1ff4 <__aeabi_fmul+0x94>
|
|
2178: 2401 movs r4, #1
|
|
217a: 019b lsls r3, r3, #6
|
|
217c: 0a58 lsrs r0, r3, #9
|
|
217e: 400c ands r4, r1
|
|
2180: 2200 movs r2, #0
|
|
2182: e737 b.n 1ff4 <__aeabi_fmul+0x94>
|
|
2184: 2080 movs r0, #128 ; 0x80
|
|
2186: 2401 movs r4, #1
|
|
2188: 03c0 lsls r0, r0, #15
|
|
218a: 4328 orrs r0, r5
|
|
218c: 0240 lsls r0, r0, #9
|
|
218e: 0a40 lsrs r0, r0, #9
|
|
2190: 400c ands r4, r1
|
|
2192: 22ff movs r2, #255 ; 0xff
|
|
2194: e72e b.n 1ff4 <__aeabi_fmul+0x94>
|
|
2196: 46c0 nop ; (mov r8, r8)
|
|
2198: 00003868 .word 0x00003868
|
|
219c: f7ffffff .word 0xf7ffffff
|
|
|
|
000021a0 <__aeabi_fsub>:
|
|
21a0: b5f0 push {r4, r5, r6, r7, lr}
|
|
21a2: 464f mov r7, r9
|
|
21a4: 46d6 mov lr, sl
|
|
21a6: 4646 mov r6, r8
|
|
21a8: 0044 lsls r4, r0, #1
|
|
21aa: b5c0 push {r6, r7, lr}
|
|
21ac: 0fc2 lsrs r2, r0, #31
|
|
21ae: 0247 lsls r7, r0, #9
|
|
21b0: 0248 lsls r0, r1, #9
|
|
21b2: 0a40 lsrs r0, r0, #9
|
|
21b4: 4684 mov ip, r0
|
|
21b6: 4666 mov r6, ip
|
|
21b8: 0a7b lsrs r3, r7, #9
|
|
21ba: 0048 lsls r0, r1, #1
|
|
21bc: 0fc9 lsrs r1, r1, #31
|
|
21be: 469a mov sl, r3
|
|
21c0: 0e24 lsrs r4, r4, #24
|
|
21c2: 0015 movs r5, r2
|
|
21c4: 00db lsls r3, r3, #3
|
|
21c6: 0e00 lsrs r0, r0, #24
|
|
21c8: 4689 mov r9, r1
|
|
21ca: 00f6 lsls r6, r6, #3
|
|
21cc: 28ff cmp r0, #255 ; 0xff
|
|
21ce: d100 bne.n 21d2 <__aeabi_fsub+0x32>
|
|
21d0: e08f b.n 22f2 <__aeabi_fsub+0x152>
|
|
21d2: 2101 movs r1, #1
|
|
21d4: 464f mov r7, r9
|
|
21d6: 404f eors r7, r1
|
|
21d8: 0039 movs r1, r7
|
|
21da: 4291 cmp r1, r2
|
|
21dc: d066 beq.n 22ac <__aeabi_fsub+0x10c>
|
|
21de: 1a22 subs r2, r4, r0
|
|
21e0: 2a00 cmp r2, #0
|
|
21e2: dc00 bgt.n 21e6 <__aeabi_fsub+0x46>
|
|
21e4: e09d b.n 2322 <__aeabi_fsub+0x182>
|
|
21e6: 2800 cmp r0, #0
|
|
21e8: d13d bne.n 2266 <__aeabi_fsub+0xc6>
|
|
21ea: 2e00 cmp r6, #0
|
|
21ec: d100 bne.n 21f0 <__aeabi_fsub+0x50>
|
|
21ee: e08b b.n 2308 <__aeabi_fsub+0x168>
|
|
21f0: 1e51 subs r1, r2, #1
|
|
21f2: 2900 cmp r1, #0
|
|
21f4: d000 beq.n 21f8 <__aeabi_fsub+0x58>
|
|
21f6: e0b5 b.n 2364 <__aeabi_fsub+0x1c4>
|
|
21f8: 2401 movs r4, #1
|
|
21fa: 1b9b subs r3, r3, r6
|
|
21fc: 015a lsls r2, r3, #5
|
|
21fe: d544 bpl.n 228a <__aeabi_fsub+0xea>
|
|
2200: 019b lsls r3, r3, #6
|
|
2202: 099f lsrs r7, r3, #6
|
|
2204: 0038 movs r0, r7
|
|
2206: f000 fa1d bl 2644 <__clzsi2>
|
|
220a: 3805 subs r0, #5
|
|
220c: 4087 lsls r7, r0
|
|
220e: 4284 cmp r4, r0
|
|
2210: dd00 ble.n 2214 <__aeabi_fsub+0x74>
|
|
2212: e096 b.n 2342 <__aeabi_fsub+0x1a2>
|
|
2214: 1b04 subs r4, r0, r4
|
|
2216: 003a movs r2, r7
|
|
2218: 2020 movs r0, #32
|
|
221a: 3401 adds r4, #1
|
|
221c: 40e2 lsrs r2, r4
|
|
221e: 1b04 subs r4, r0, r4
|
|
2220: 40a7 lsls r7, r4
|
|
2222: 003b movs r3, r7
|
|
2224: 1e5f subs r7, r3, #1
|
|
2226: 41bb sbcs r3, r7
|
|
2228: 2400 movs r4, #0
|
|
222a: 4313 orrs r3, r2
|
|
222c: 075a lsls r2, r3, #29
|
|
222e: d004 beq.n 223a <__aeabi_fsub+0x9a>
|
|
2230: 220f movs r2, #15
|
|
2232: 401a ands r2, r3
|
|
2234: 2a04 cmp r2, #4
|
|
2236: d000 beq.n 223a <__aeabi_fsub+0x9a>
|
|
2238: 3304 adds r3, #4
|
|
223a: 015a lsls r2, r3, #5
|
|
223c: d527 bpl.n 228e <__aeabi_fsub+0xee>
|
|
223e: 3401 adds r4, #1
|
|
2240: 2cff cmp r4, #255 ; 0xff
|
|
2242: d100 bne.n 2246 <__aeabi_fsub+0xa6>
|
|
2244: e079 b.n 233a <__aeabi_fsub+0x19a>
|
|
2246: 2201 movs r2, #1
|
|
2248: 019b lsls r3, r3, #6
|
|
224a: 0a5b lsrs r3, r3, #9
|
|
224c: b2e4 uxtb r4, r4
|
|
224e: 402a ands r2, r5
|
|
2250: 025b lsls r3, r3, #9
|
|
2252: 05e4 lsls r4, r4, #23
|
|
2254: 0a58 lsrs r0, r3, #9
|
|
2256: 07d2 lsls r2, r2, #31
|
|
2258: 4320 orrs r0, r4
|
|
225a: 4310 orrs r0, r2
|
|
225c: bc1c pop {r2, r3, r4}
|
|
225e: 4690 mov r8, r2
|
|
2260: 4699 mov r9, r3
|
|
2262: 46a2 mov sl, r4
|
|
2264: bdf0 pop {r4, r5, r6, r7, pc}
|
|
2266: 2cff cmp r4, #255 ; 0xff
|
|
2268: d0e0 beq.n 222c <__aeabi_fsub+0x8c>
|
|
226a: 2180 movs r1, #128 ; 0x80
|
|
226c: 04c9 lsls r1, r1, #19
|
|
226e: 430e orrs r6, r1
|
|
2270: 2a1b cmp r2, #27
|
|
2272: dc7b bgt.n 236c <__aeabi_fsub+0x1cc>
|
|
2274: 0031 movs r1, r6
|
|
2276: 2020 movs r0, #32
|
|
2278: 40d1 lsrs r1, r2
|
|
227a: 1a82 subs r2, r0, r2
|
|
227c: 4096 lsls r6, r2
|
|
227e: 1e72 subs r2, r6, #1
|
|
2280: 4196 sbcs r6, r2
|
|
2282: 430e orrs r6, r1
|
|
2284: 1b9b subs r3, r3, r6
|
|
2286: 015a lsls r2, r3, #5
|
|
2288: d4ba bmi.n 2200 <__aeabi_fsub+0x60>
|
|
228a: 075a lsls r2, r3, #29
|
|
228c: d1d0 bne.n 2230 <__aeabi_fsub+0x90>
|
|
228e: 2201 movs r2, #1
|
|
2290: 08df lsrs r7, r3, #3
|
|
2292: 402a ands r2, r5
|
|
2294: 2cff cmp r4, #255 ; 0xff
|
|
2296: d133 bne.n 2300 <__aeabi_fsub+0x160>
|
|
2298: 2f00 cmp r7, #0
|
|
229a: d100 bne.n 229e <__aeabi_fsub+0xfe>
|
|
229c: e0a8 b.n 23f0 <__aeabi_fsub+0x250>
|
|
229e: 2380 movs r3, #128 ; 0x80
|
|
22a0: 03db lsls r3, r3, #15
|
|
22a2: 433b orrs r3, r7
|
|
22a4: 025b lsls r3, r3, #9
|
|
22a6: 0a5b lsrs r3, r3, #9
|
|
22a8: 24ff movs r4, #255 ; 0xff
|
|
22aa: e7d1 b.n 2250 <__aeabi_fsub+0xb0>
|
|
22ac: 1a21 subs r1, r4, r0
|
|
22ae: 2900 cmp r1, #0
|
|
22b0: dd4c ble.n 234c <__aeabi_fsub+0x1ac>
|
|
22b2: 2800 cmp r0, #0
|
|
22b4: d02a beq.n 230c <__aeabi_fsub+0x16c>
|
|
22b6: 2cff cmp r4, #255 ; 0xff
|
|
22b8: d0b8 beq.n 222c <__aeabi_fsub+0x8c>
|
|
22ba: 2080 movs r0, #128 ; 0x80
|
|
22bc: 04c0 lsls r0, r0, #19
|
|
22be: 4306 orrs r6, r0
|
|
22c0: 291b cmp r1, #27
|
|
22c2: dd00 ble.n 22c6 <__aeabi_fsub+0x126>
|
|
22c4: e0af b.n 2426 <__aeabi_fsub+0x286>
|
|
22c6: 0030 movs r0, r6
|
|
22c8: 2720 movs r7, #32
|
|
22ca: 40c8 lsrs r0, r1
|
|
22cc: 1a79 subs r1, r7, r1
|
|
22ce: 408e lsls r6, r1
|
|
22d0: 1e71 subs r1, r6, #1
|
|
22d2: 418e sbcs r6, r1
|
|
22d4: 4306 orrs r6, r0
|
|
22d6: 199b adds r3, r3, r6
|
|
22d8: 0159 lsls r1, r3, #5
|
|
22da: d5d6 bpl.n 228a <__aeabi_fsub+0xea>
|
|
22dc: 3401 adds r4, #1
|
|
22de: 2cff cmp r4, #255 ; 0xff
|
|
22e0: d100 bne.n 22e4 <__aeabi_fsub+0x144>
|
|
22e2: e085 b.n 23f0 <__aeabi_fsub+0x250>
|
|
22e4: 2201 movs r2, #1
|
|
22e6: 497a ldr r1, [pc, #488] ; (24d0 <__aeabi_fsub+0x330>)
|
|
22e8: 401a ands r2, r3
|
|
22ea: 085b lsrs r3, r3, #1
|
|
22ec: 400b ands r3, r1
|
|
22ee: 4313 orrs r3, r2
|
|
22f0: e79c b.n 222c <__aeabi_fsub+0x8c>
|
|
22f2: 2e00 cmp r6, #0
|
|
22f4: d000 beq.n 22f8 <__aeabi_fsub+0x158>
|
|
22f6: e770 b.n 21da <__aeabi_fsub+0x3a>
|
|
22f8: e76b b.n 21d2 <__aeabi_fsub+0x32>
|
|
22fa: 1e3b subs r3, r7, #0
|
|
22fc: d1c5 bne.n 228a <__aeabi_fsub+0xea>
|
|
22fe: 2200 movs r2, #0
|
|
2300: 027b lsls r3, r7, #9
|
|
2302: 0a5b lsrs r3, r3, #9
|
|
2304: b2e4 uxtb r4, r4
|
|
2306: e7a3 b.n 2250 <__aeabi_fsub+0xb0>
|
|
2308: 0014 movs r4, r2
|
|
230a: e78f b.n 222c <__aeabi_fsub+0x8c>
|
|
230c: 2e00 cmp r6, #0
|
|
230e: d04d beq.n 23ac <__aeabi_fsub+0x20c>
|
|
2310: 1e48 subs r0, r1, #1
|
|
2312: 2800 cmp r0, #0
|
|
2314: d157 bne.n 23c6 <__aeabi_fsub+0x226>
|
|
2316: 199b adds r3, r3, r6
|
|
2318: 2401 movs r4, #1
|
|
231a: 015a lsls r2, r3, #5
|
|
231c: d5b5 bpl.n 228a <__aeabi_fsub+0xea>
|
|
231e: 2402 movs r4, #2
|
|
2320: e7e0 b.n 22e4 <__aeabi_fsub+0x144>
|
|
2322: 2a00 cmp r2, #0
|
|
2324: d125 bne.n 2372 <__aeabi_fsub+0x1d2>
|
|
2326: 1c62 adds r2, r4, #1
|
|
2328: b2d2 uxtb r2, r2
|
|
232a: 2a01 cmp r2, #1
|
|
232c: dd72 ble.n 2414 <__aeabi_fsub+0x274>
|
|
232e: 1b9f subs r7, r3, r6
|
|
2330: 017a lsls r2, r7, #5
|
|
2332: d535 bpl.n 23a0 <__aeabi_fsub+0x200>
|
|
2334: 1af7 subs r7, r6, r3
|
|
2336: 000d movs r5, r1
|
|
2338: e764 b.n 2204 <__aeabi_fsub+0x64>
|
|
233a: 2201 movs r2, #1
|
|
233c: 2300 movs r3, #0
|
|
233e: 402a ands r2, r5
|
|
2340: e786 b.n 2250 <__aeabi_fsub+0xb0>
|
|
2342: 003b movs r3, r7
|
|
2344: 4a63 ldr r2, [pc, #396] ; (24d4 <__aeabi_fsub+0x334>)
|
|
2346: 1a24 subs r4, r4, r0
|
|
2348: 4013 ands r3, r2
|
|
234a: e76f b.n 222c <__aeabi_fsub+0x8c>
|
|
234c: 2900 cmp r1, #0
|
|
234e: d16c bne.n 242a <__aeabi_fsub+0x28a>
|
|
2350: 1c61 adds r1, r4, #1
|
|
2352: b2c8 uxtb r0, r1
|
|
2354: 2801 cmp r0, #1
|
|
2356: dd4e ble.n 23f6 <__aeabi_fsub+0x256>
|
|
2358: 29ff cmp r1, #255 ; 0xff
|
|
235a: d049 beq.n 23f0 <__aeabi_fsub+0x250>
|
|
235c: 199b adds r3, r3, r6
|
|
235e: 085b lsrs r3, r3, #1
|
|
2360: 000c movs r4, r1
|
|
2362: e763 b.n 222c <__aeabi_fsub+0x8c>
|
|
2364: 2aff cmp r2, #255 ; 0xff
|
|
2366: d041 beq.n 23ec <__aeabi_fsub+0x24c>
|
|
2368: 000a movs r2, r1
|
|
236a: e781 b.n 2270 <__aeabi_fsub+0xd0>
|
|
236c: 2601 movs r6, #1
|
|
236e: 1b9b subs r3, r3, r6
|
|
2370: e789 b.n 2286 <__aeabi_fsub+0xe6>
|
|
2372: 2c00 cmp r4, #0
|
|
2374: d01c beq.n 23b0 <__aeabi_fsub+0x210>
|
|
2376: 28ff cmp r0, #255 ; 0xff
|
|
2378: d021 beq.n 23be <__aeabi_fsub+0x21e>
|
|
237a: 2480 movs r4, #128 ; 0x80
|
|
237c: 04e4 lsls r4, r4, #19
|
|
237e: 4252 negs r2, r2
|
|
2380: 4323 orrs r3, r4
|
|
2382: 2a1b cmp r2, #27
|
|
2384: dd00 ble.n 2388 <__aeabi_fsub+0x1e8>
|
|
2386: e096 b.n 24b6 <__aeabi_fsub+0x316>
|
|
2388: 001c movs r4, r3
|
|
238a: 2520 movs r5, #32
|
|
238c: 40d4 lsrs r4, r2
|
|
238e: 1aaa subs r2, r5, r2
|
|
2390: 4093 lsls r3, r2
|
|
2392: 1e5a subs r2, r3, #1
|
|
2394: 4193 sbcs r3, r2
|
|
2396: 4323 orrs r3, r4
|
|
2398: 1af3 subs r3, r6, r3
|
|
239a: 0004 movs r4, r0
|
|
239c: 000d movs r5, r1
|
|
239e: e72d b.n 21fc <__aeabi_fsub+0x5c>
|
|
23a0: 2f00 cmp r7, #0
|
|
23a2: d000 beq.n 23a6 <__aeabi_fsub+0x206>
|
|
23a4: e72e b.n 2204 <__aeabi_fsub+0x64>
|
|
23a6: 2200 movs r2, #0
|
|
23a8: 2400 movs r4, #0
|
|
23aa: e7a9 b.n 2300 <__aeabi_fsub+0x160>
|
|
23ac: 000c movs r4, r1
|
|
23ae: e73d b.n 222c <__aeabi_fsub+0x8c>
|
|
23b0: 2b00 cmp r3, #0
|
|
23b2: d058 beq.n 2466 <__aeabi_fsub+0x2c6>
|
|
23b4: 43d2 mvns r2, r2
|
|
23b6: 2a00 cmp r2, #0
|
|
23b8: d0ee beq.n 2398 <__aeabi_fsub+0x1f8>
|
|
23ba: 28ff cmp r0, #255 ; 0xff
|
|
23bc: d1e1 bne.n 2382 <__aeabi_fsub+0x1e2>
|
|
23be: 0033 movs r3, r6
|
|
23c0: 24ff movs r4, #255 ; 0xff
|
|
23c2: 000d movs r5, r1
|
|
23c4: e732 b.n 222c <__aeabi_fsub+0x8c>
|
|
23c6: 29ff cmp r1, #255 ; 0xff
|
|
23c8: d010 beq.n 23ec <__aeabi_fsub+0x24c>
|
|
23ca: 0001 movs r1, r0
|
|
23cc: e778 b.n 22c0 <__aeabi_fsub+0x120>
|
|
23ce: 2b00 cmp r3, #0
|
|
23d0: d06e beq.n 24b0 <__aeabi_fsub+0x310>
|
|
23d2: 24ff movs r4, #255 ; 0xff
|
|
23d4: 2e00 cmp r6, #0
|
|
23d6: d100 bne.n 23da <__aeabi_fsub+0x23a>
|
|
23d8: e728 b.n 222c <__aeabi_fsub+0x8c>
|
|
23da: 2280 movs r2, #128 ; 0x80
|
|
23dc: 4651 mov r1, sl
|
|
23de: 03d2 lsls r2, r2, #15
|
|
23e0: 4211 tst r1, r2
|
|
23e2: d003 beq.n 23ec <__aeabi_fsub+0x24c>
|
|
23e4: 4661 mov r1, ip
|
|
23e6: 4211 tst r1, r2
|
|
23e8: d100 bne.n 23ec <__aeabi_fsub+0x24c>
|
|
23ea: 0033 movs r3, r6
|
|
23ec: 24ff movs r4, #255 ; 0xff
|
|
23ee: e71d b.n 222c <__aeabi_fsub+0x8c>
|
|
23f0: 24ff movs r4, #255 ; 0xff
|
|
23f2: 2300 movs r3, #0
|
|
23f4: e72c b.n 2250 <__aeabi_fsub+0xb0>
|
|
23f6: 2c00 cmp r4, #0
|
|
23f8: d1e9 bne.n 23ce <__aeabi_fsub+0x22e>
|
|
23fa: 2b00 cmp r3, #0
|
|
23fc: d063 beq.n 24c6 <__aeabi_fsub+0x326>
|
|
23fe: 2e00 cmp r6, #0
|
|
2400: d100 bne.n 2404 <__aeabi_fsub+0x264>
|
|
2402: e713 b.n 222c <__aeabi_fsub+0x8c>
|
|
2404: 199b adds r3, r3, r6
|
|
2406: 015a lsls r2, r3, #5
|
|
2408: d400 bmi.n 240c <__aeabi_fsub+0x26c>
|
|
240a: e73e b.n 228a <__aeabi_fsub+0xea>
|
|
240c: 4a31 ldr r2, [pc, #196] ; (24d4 <__aeabi_fsub+0x334>)
|
|
240e: 000c movs r4, r1
|
|
2410: 4013 ands r3, r2
|
|
2412: e70b b.n 222c <__aeabi_fsub+0x8c>
|
|
2414: 2c00 cmp r4, #0
|
|
2416: d11e bne.n 2456 <__aeabi_fsub+0x2b6>
|
|
2418: 2b00 cmp r3, #0
|
|
241a: d12f bne.n 247c <__aeabi_fsub+0x2dc>
|
|
241c: 2e00 cmp r6, #0
|
|
241e: d04f beq.n 24c0 <__aeabi_fsub+0x320>
|
|
2420: 0033 movs r3, r6
|
|
2422: 000d movs r5, r1
|
|
2424: e702 b.n 222c <__aeabi_fsub+0x8c>
|
|
2426: 2601 movs r6, #1
|
|
2428: e755 b.n 22d6 <__aeabi_fsub+0x136>
|
|
242a: 2c00 cmp r4, #0
|
|
242c: d11f bne.n 246e <__aeabi_fsub+0x2ce>
|
|
242e: 2b00 cmp r3, #0
|
|
2430: d043 beq.n 24ba <__aeabi_fsub+0x31a>
|
|
2432: 43c9 mvns r1, r1
|
|
2434: 2900 cmp r1, #0
|
|
2436: d00b beq.n 2450 <__aeabi_fsub+0x2b0>
|
|
2438: 28ff cmp r0, #255 ; 0xff
|
|
243a: d039 beq.n 24b0 <__aeabi_fsub+0x310>
|
|
243c: 291b cmp r1, #27
|
|
243e: dc44 bgt.n 24ca <__aeabi_fsub+0x32a>
|
|
2440: 001c movs r4, r3
|
|
2442: 2720 movs r7, #32
|
|
2444: 40cc lsrs r4, r1
|
|
2446: 1a79 subs r1, r7, r1
|
|
2448: 408b lsls r3, r1
|
|
244a: 1e59 subs r1, r3, #1
|
|
244c: 418b sbcs r3, r1
|
|
244e: 4323 orrs r3, r4
|
|
2450: 199b adds r3, r3, r6
|
|
2452: 0004 movs r4, r0
|
|
2454: e740 b.n 22d8 <__aeabi_fsub+0x138>
|
|
2456: 2b00 cmp r3, #0
|
|
2458: d11a bne.n 2490 <__aeabi_fsub+0x2f0>
|
|
245a: 2e00 cmp r6, #0
|
|
245c: d124 bne.n 24a8 <__aeabi_fsub+0x308>
|
|
245e: 2780 movs r7, #128 ; 0x80
|
|
2460: 2200 movs r2, #0
|
|
2462: 03ff lsls r7, r7, #15
|
|
2464: e71b b.n 229e <__aeabi_fsub+0xfe>
|
|
2466: 0033 movs r3, r6
|
|
2468: 0004 movs r4, r0
|
|
246a: 000d movs r5, r1
|
|
246c: e6de b.n 222c <__aeabi_fsub+0x8c>
|
|
246e: 28ff cmp r0, #255 ; 0xff
|
|
2470: d01e beq.n 24b0 <__aeabi_fsub+0x310>
|
|
2472: 2480 movs r4, #128 ; 0x80
|
|
2474: 04e4 lsls r4, r4, #19
|
|
2476: 4249 negs r1, r1
|
|
2478: 4323 orrs r3, r4
|
|
247a: e7df b.n 243c <__aeabi_fsub+0x29c>
|
|
247c: 2e00 cmp r6, #0
|
|
247e: d100 bne.n 2482 <__aeabi_fsub+0x2e2>
|
|
2480: e6d4 b.n 222c <__aeabi_fsub+0x8c>
|
|
2482: 1b9f subs r7, r3, r6
|
|
2484: 017a lsls r2, r7, #5
|
|
2486: d400 bmi.n 248a <__aeabi_fsub+0x2ea>
|
|
2488: e737 b.n 22fa <__aeabi_fsub+0x15a>
|
|
248a: 1af3 subs r3, r6, r3
|
|
248c: 000d movs r5, r1
|
|
248e: e6cd b.n 222c <__aeabi_fsub+0x8c>
|
|
2490: 24ff movs r4, #255 ; 0xff
|
|
2492: 2e00 cmp r6, #0
|
|
2494: d100 bne.n 2498 <__aeabi_fsub+0x2f8>
|
|
2496: e6c9 b.n 222c <__aeabi_fsub+0x8c>
|
|
2498: 2280 movs r2, #128 ; 0x80
|
|
249a: 4650 mov r0, sl
|
|
249c: 03d2 lsls r2, r2, #15
|
|
249e: 4210 tst r0, r2
|
|
24a0: d0a4 beq.n 23ec <__aeabi_fsub+0x24c>
|
|
24a2: 4660 mov r0, ip
|
|
24a4: 4210 tst r0, r2
|
|
24a6: d1a1 bne.n 23ec <__aeabi_fsub+0x24c>
|
|
24a8: 0033 movs r3, r6
|
|
24aa: 000d movs r5, r1
|
|
24ac: 24ff movs r4, #255 ; 0xff
|
|
24ae: e6bd b.n 222c <__aeabi_fsub+0x8c>
|
|
24b0: 0033 movs r3, r6
|
|
24b2: 24ff movs r4, #255 ; 0xff
|
|
24b4: e6ba b.n 222c <__aeabi_fsub+0x8c>
|
|
24b6: 2301 movs r3, #1
|
|
24b8: e76e b.n 2398 <__aeabi_fsub+0x1f8>
|
|
24ba: 0033 movs r3, r6
|
|
24bc: 0004 movs r4, r0
|
|
24be: e6b5 b.n 222c <__aeabi_fsub+0x8c>
|
|
24c0: 2700 movs r7, #0
|
|
24c2: 2200 movs r2, #0
|
|
24c4: e71c b.n 2300 <__aeabi_fsub+0x160>
|
|
24c6: 0033 movs r3, r6
|
|
24c8: e6b0 b.n 222c <__aeabi_fsub+0x8c>
|
|
24ca: 2301 movs r3, #1
|
|
24cc: e7c0 b.n 2450 <__aeabi_fsub+0x2b0>
|
|
24ce: 46c0 nop ; (mov r8, r8)
|
|
24d0: 7dffffff .word 0x7dffffff
|
|
24d4: fbffffff .word 0xfbffffff
|
|
|
|
000024d8 <__aeabi_f2iz>:
|
|
24d8: 0241 lsls r1, r0, #9
|
|
24da: 0043 lsls r3, r0, #1
|
|
24dc: 0fc2 lsrs r2, r0, #31
|
|
24de: 0a49 lsrs r1, r1, #9
|
|
24e0: 0e1b lsrs r3, r3, #24
|
|
24e2: 2000 movs r0, #0
|
|
24e4: 2b7e cmp r3, #126 ; 0x7e
|
|
24e6: dd0d ble.n 2504 <__aeabi_f2iz+0x2c>
|
|
24e8: 2b9d cmp r3, #157 ; 0x9d
|
|
24ea: dc0c bgt.n 2506 <__aeabi_f2iz+0x2e>
|
|
24ec: 2080 movs r0, #128 ; 0x80
|
|
24ee: 0400 lsls r0, r0, #16
|
|
24f0: 4301 orrs r1, r0
|
|
24f2: 2b95 cmp r3, #149 ; 0x95
|
|
24f4: dc0a bgt.n 250c <__aeabi_f2iz+0x34>
|
|
24f6: 2096 movs r0, #150 ; 0x96
|
|
24f8: 1ac3 subs r3, r0, r3
|
|
24fa: 40d9 lsrs r1, r3
|
|
24fc: 4248 negs r0, r1
|
|
24fe: 2a00 cmp r2, #0
|
|
2500: d100 bne.n 2504 <__aeabi_f2iz+0x2c>
|
|
2502: 0008 movs r0, r1
|
|
2504: 4770 bx lr
|
|
2506: 4b03 ldr r3, [pc, #12] ; (2514 <__aeabi_f2iz+0x3c>)
|
|
2508: 18d0 adds r0, r2, r3
|
|
250a: e7fb b.n 2504 <__aeabi_f2iz+0x2c>
|
|
250c: 3b96 subs r3, #150 ; 0x96
|
|
250e: 4099 lsls r1, r3
|
|
2510: e7f4 b.n 24fc <__aeabi_f2iz+0x24>
|
|
2512: 46c0 nop ; (mov r8, r8)
|
|
2514: 7fffffff .word 0x7fffffff
|
|
|
|
00002518 <__aeabi_i2f>:
|
|
2518: b570 push {r4, r5, r6, lr}
|
|
251a: 2800 cmp r0, #0
|
|
251c: d030 beq.n 2580 <__aeabi_i2f+0x68>
|
|
251e: 17c3 asrs r3, r0, #31
|
|
2520: 18c4 adds r4, r0, r3
|
|
2522: 405c eors r4, r3
|
|
2524: 0fc5 lsrs r5, r0, #31
|
|
2526: 0020 movs r0, r4
|
|
2528: f000 f88c bl 2644 <__clzsi2>
|
|
252c: 239e movs r3, #158 ; 0x9e
|
|
252e: 1a1b subs r3, r3, r0
|
|
2530: 2b96 cmp r3, #150 ; 0x96
|
|
2532: dc0d bgt.n 2550 <__aeabi_i2f+0x38>
|
|
2534: 2296 movs r2, #150 ; 0x96
|
|
2536: 1ad2 subs r2, r2, r3
|
|
2538: 4094 lsls r4, r2
|
|
253a: 002a movs r2, r5
|
|
253c: 0264 lsls r4, r4, #9
|
|
253e: 0a64 lsrs r4, r4, #9
|
|
2540: b2db uxtb r3, r3
|
|
2542: 0264 lsls r4, r4, #9
|
|
2544: 05db lsls r3, r3, #23
|
|
2546: 0a60 lsrs r0, r4, #9
|
|
2548: 07d2 lsls r2, r2, #31
|
|
254a: 4318 orrs r0, r3
|
|
254c: 4310 orrs r0, r2
|
|
254e: bd70 pop {r4, r5, r6, pc}
|
|
2550: 2b99 cmp r3, #153 ; 0x99
|
|
2552: dc19 bgt.n 2588 <__aeabi_i2f+0x70>
|
|
2554: 2299 movs r2, #153 ; 0x99
|
|
2556: 1ad2 subs r2, r2, r3
|
|
2558: 2a00 cmp r2, #0
|
|
255a: dd29 ble.n 25b0 <__aeabi_i2f+0x98>
|
|
255c: 4094 lsls r4, r2
|
|
255e: 0022 movs r2, r4
|
|
2560: 4c14 ldr r4, [pc, #80] ; (25b4 <__aeabi_i2f+0x9c>)
|
|
2562: 4014 ands r4, r2
|
|
2564: 0751 lsls r1, r2, #29
|
|
2566: d004 beq.n 2572 <__aeabi_i2f+0x5a>
|
|
2568: 210f movs r1, #15
|
|
256a: 400a ands r2, r1
|
|
256c: 2a04 cmp r2, #4
|
|
256e: d000 beq.n 2572 <__aeabi_i2f+0x5a>
|
|
2570: 3404 adds r4, #4
|
|
2572: 0162 lsls r2, r4, #5
|
|
2574: d413 bmi.n 259e <__aeabi_i2f+0x86>
|
|
2576: 01a4 lsls r4, r4, #6
|
|
2578: 0a64 lsrs r4, r4, #9
|
|
257a: b2db uxtb r3, r3
|
|
257c: 002a movs r2, r5
|
|
257e: e7e0 b.n 2542 <__aeabi_i2f+0x2a>
|
|
2580: 2200 movs r2, #0
|
|
2582: 2300 movs r3, #0
|
|
2584: 2400 movs r4, #0
|
|
2586: e7dc b.n 2542 <__aeabi_i2f+0x2a>
|
|
2588: 2205 movs r2, #5
|
|
258a: 0021 movs r1, r4
|
|
258c: 1a12 subs r2, r2, r0
|
|
258e: 40d1 lsrs r1, r2
|
|
2590: 22b9 movs r2, #185 ; 0xb9
|
|
2592: 1ad2 subs r2, r2, r3
|
|
2594: 4094 lsls r4, r2
|
|
2596: 1e62 subs r2, r4, #1
|
|
2598: 4194 sbcs r4, r2
|
|
259a: 430c orrs r4, r1
|
|
259c: e7da b.n 2554 <__aeabi_i2f+0x3c>
|
|
259e: 4b05 ldr r3, [pc, #20] ; (25b4 <__aeabi_i2f+0x9c>)
|
|
25a0: 002a movs r2, r5
|
|
25a2: 401c ands r4, r3
|
|
25a4: 239f movs r3, #159 ; 0x9f
|
|
25a6: 01a4 lsls r4, r4, #6
|
|
25a8: 1a1b subs r3, r3, r0
|
|
25aa: 0a64 lsrs r4, r4, #9
|
|
25ac: b2db uxtb r3, r3
|
|
25ae: e7c8 b.n 2542 <__aeabi_i2f+0x2a>
|
|
25b0: 0022 movs r2, r4
|
|
25b2: e7d5 b.n 2560 <__aeabi_i2f+0x48>
|
|
25b4: fbffffff .word 0xfbffffff
|
|
|
|
000025b8 <__aeabi_ui2f>:
|
|
25b8: b510 push {r4, lr}
|
|
25ba: 1e04 subs r4, r0, #0
|
|
25bc: d027 beq.n 260e <__aeabi_ui2f+0x56>
|
|
25be: f000 f841 bl 2644 <__clzsi2>
|
|
25c2: 239e movs r3, #158 ; 0x9e
|
|
25c4: 1a1b subs r3, r3, r0
|
|
25c6: 2b96 cmp r3, #150 ; 0x96
|
|
25c8: dc0a bgt.n 25e0 <__aeabi_ui2f+0x28>
|
|
25ca: 2296 movs r2, #150 ; 0x96
|
|
25cc: 1ad2 subs r2, r2, r3
|
|
25ce: 4094 lsls r4, r2
|
|
25d0: 0264 lsls r4, r4, #9
|
|
25d2: 0a64 lsrs r4, r4, #9
|
|
25d4: b2db uxtb r3, r3
|
|
25d6: 0264 lsls r4, r4, #9
|
|
25d8: 05db lsls r3, r3, #23
|
|
25da: 0a60 lsrs r0, r4, #9
|
|
25dc: 4318 orrs r0, r3
|
|
25de: bd10 pop {r4, pc}
|
|
25e0: 2b99 cmp r3, #153 ; 0x99
|
|
25e2: dc17 bgt.n 2614 <__aeabi_ui2f+0x5c>
|
|
25e4: 2299 movs r2, #153 ; 0x99
|
|
25e6: 1ad2 subs r2, r2, r3
|
|
25e8: 2a00 cmp r2, #0
|
|
25ea: dd27 ble.n 263c <__aeabi_ui2f+0x84>
|
|
25ec: 4094 lsls r4, r2
|
|
25ee: 0022 movs r2, r4
|
|
25f0: 4c13 ldr r4, [pc, #76] ; (2640 <__aeabi_ui2f+0x88>)
|
|
25f2: 4014 ands r4, r2
|
|
25f4: 0751 lsls r1, r2, #29
|
|
25f6: d004 beq.n 2602 <__aeabi_ui2f+0x4a>
|
|
25f8: 210f movs r1, #15
|
|
25fa: 400a ands r2, r1
|
|
25fc: 2a04 cmp r2, #4
|
|
25fe: d000 beq.n 2602 <__aeabi_ui2f+0x4a>
|
|
2600: 3404 adds r4, #4
|
|
2602: 0162 lsls r2, r4, #5
|
|
2604: d412 bmi.n 262c <__aeabi_ui2f+0x74>
|
|
2606: 01a4 lsls r4, r4, #6
|
|
2608: 0a64 lsrs r4, r4, #9
|
|
260a: b2db uxtb r3, r3
|
|
260c: e7e3 b.n 25d6 <__aeabi_ui2f+0x1e>
|
|
260e: 2300 movs r3, #0
|
|
2610: 2400 movs r4, #0
|
|
2612: e7e0 b.n 25d6 <__aeabi_ui2f+0x1e>
|
|
2614: 22b9 movs r2, #185 ; 0xb9
|
|
2616: 0021 movs r1, r4
|
|
2618: 1ad2 subs r2, r2, r3
|
|
261a: 4091 lsls r1, r2
|
|
261c: 000a movs r2, r1
|
|
261e: 1e51 subs r1, r2, #1
|
|
2620: 418a sbcs r2, r1
|
|
2622: 2105 movs r1, #5
|
|
2624: 1a09 subs r1, r1, r0
|
|
2626: 40cc lsrs r4, r1
|
|
2628: 4314 orrs r4, r2
|
|
262a: e7db b.n 25e4 <__aeabi_ui2f+0x2c>
|
|
262c: 4b04 ldr r3, [pc, #16] ; (2640 <__aeabi_ui2f+0x88>)
|
|
262e: 401c ands r4, r3
|
|
2630: 239f movs r3, #159 ; 0x9f
|
|
2632: 01a4 lsls r4, r4, #6
|
|
2634: 1a1b subs r3, r3, r0
|
|
2636: 0a64 lsrs r4, r4, #9
|
|
2638: b2db uxtb r3, r3
|
|
263a: e7cc b.n 25d6 <__aeabi_ui2f+0x1e>
|
|
263c: 0022 movs r2, r4
|
|
263e: e7d7 b.n 25f0 <__aeabi_ui2f+0x38>
|
|
2640: fbffffff .word 0xfbffffff
|
|
|
|
00002644 <__clzsi2>:
|
|
2644: 211c movs r1, #28
|
|
2646: 2301 movs r3, #1
|
|
2648: 041b lsls r3, r3, #16
|
|
264a: 4298 cmp r0, r3
|
|
264c: d301 bcc.n 2652 <__clzsi2+0xe>
|
|
264e: 0c00 lsrs r0, r0, #16
|
|
2650: 3910 subs r1, #16
|
|
2652: 0a1b lsrs r3, r3, #8
|
|
2654: 4298 cmp r0, r3
|
|
2656: d301 bcc.n 265c <__clzsi2+0x18>
|
|
2658: 0a00 lsrs r0, r0, #8
|
|
265a: 3908 subs r1, #8
|
|
265c: 091b lsrs r3, r3, #4
|
|
265e: 4298 cmp r0, r3
|
|
2660: d301 bcc.n 2666 <__clzsi2+0x22>
|
|
2662: 0900 lsrs r0, r0, #4
|
|
2664: 3904 subs r1, #4
|
|
2666: a202 add r2, pc, #8 ; (adr r2, 2670 <__clzsi2+0x2c>)
|
|
2668: 5c10 ldrb r0, [r2, r0]
|
|
266a: 1840 adds r0, r0, r1
|
|
266c: 4770 bx lr
|
|
266e: 46c0 nop ; (mov r8, r8)
|
|
2670: 02020304 .word 0x02020304
|
|
2674: 01010101 .word 0x01010101
|
|
...
|
|
|
|
00002680 <__libc_init_array>:
|
|
2680: b570 push {r4, r5, r6, lr}
|
|
2682: 2600 movs r6, #0
|
|
2684: 4d0c ldr r5, [pc, #48] ; (26b8 <__libc_init_array+0x38>)
|
|
2686: 4c0d ldr r4, [pc, #52] ; (26bc <__libc_init_array+0x3c>)
|
|
2688: 1b64 subs r4, r4, r5
|
|
268a: 10a4 asrs r4, r4, #2
|
|
268c: 42a6 cmp r6, r4
|
|
268e: d109 bne.n 26a4 <__libc_init_array+0x24>
|
|
2690: 2600 movs r6, #0
|
|
2692: f001 f955 bl 3940 <_init>
|
|
2696: 4d0a ldr r5, [pc, #40] ; (26c0 <__libc_init_array+0x40>)
|
|
2698: 4c0a ldr r4, [pc, #40] ; (26c4 <__libc_init_array+0x44>)
|
|
269a: 1b64 subs r4, r4, r5
|
|
269c: 10a4 asrs r4, r4, #2
|
|
269e: 42a6 cmp r6, r4
|
|
26a0: d105 bne.n 26ae <__libc_init_array+0x2e>
|
|
26a2: bd70 pop {r4, r5, r6, pc}
|
|
26a4: 00b3 lsls r3, r6, #2
|
|
26a6: 58eb ldr r3, [r5, r3]
|
|
26a8: 4798 blx r3
|
|
26aa: 3601 adds r6, #1
|
|
26ac: e7ee b.n 268c <__libc_init_array+0xc>
|
|
26ae: 00b3 lsls r3, r6, #2
|
|
26b0: 58eb ldr r3, [r5, r3]
|
|
26b2: 4798 blx r3
|
|
26b4: 3601 adds r6, #1
|
|
26b6: e7f2 b.n 269e <__libc_init_array+0x1e>
|
|
26b8: 0000394c .word 0x0000394c
|
|
26bc: 0000394c .word 0x0000394c
|
|
26c0: 0000394c .word 0x0000394c
|
|
26c4: 00003950 .word 0x00003950
|
|
|
|
000026c8 <memcpy>:
|
|
26c8: 2300 movs r3, #0
|
|
26ca: b510 push {r4, lr}
|
|
26cc: 429a cmp r2, r3
|
|
26ce: d100 bne.n 26d2 <memcpy+0xa>
|
|
26d0: bd10 pop {r4, pc}
|
|
26d2: 5ccc ldrb r4, [r1, r3]
|
|
26d4: 54c4 strb r4, [r0, r3]
|
|
26d6: 3301 adds r3, #1
|
|
26d8: e7f8 b.n 26cc <memcpy+0x4>
|
|
|
|
000026da <memset>:
|
|
26da: 0003 movs r3, r0
|
|
26dc: 1882 adds r2, r0, r2
|
|
26de: 4293 cmp r3, r2
|
|
26e0: d100 bne.n 26e4 <memset+0xa>
|
|
26e2: 4770 bx lr
|
|
26e4: 7019 strb r1, [r3, #0]
|
|
26e6: 3301 adds r3, #1
|
|
26e8: e7f9 b.n 26de <memset+0x4>
|
|
...
|
|
|
|
000026ec <iprintf>:
|
|
26ec: b40f push {r0, r1, r2, r3}
|
|
26ee: 4b0b ldr r3, [pc, #44] ; (271c <iprintf+0x30>)
|
|
26f0: b513 push {r0, r1, r4, lr}
|
|
26f2: 681c ldr r4, [r3, #0]
|
|
26f4: 2c00 cmp r4, #0
|
|
26f6: d005 beq.n 2704 <iprintf+0x18>
|
|
26f8: 69a3 ldr r3, [r4, #24]
|
|
26fa: 2b00 cmp r3, #0
|
|
26fc: d102 bne.n 2704 <iprintf+0x18>
|
|
26fe: 0020 movs r0, r4
|
|
2700: f000 f9bc bl 2a7c <__sinit>
|
|
2704: ab05 add r3, sp, #20
|
|
2706: 9a04 ldr r2, [sp, #16]
|
|
2708: 68a1 ldr r1, [r4, #8]
|
|
270a: 0020 movs r0, r4
|
|
270c: 9301 str r3, [sp, #4]
|
|
270e: f000 fb91 bl 2e34 <_vfiprintf_r>
|
|
2712: bc16 pop {r1, r2, r4}
|
|
2714: bc08 pop {r3}
|
|
2716: b004 add sp, #16
|
|
2718: 4718 bx r3
|
|
271a: 46c0 nop ; (mov r8, r8)
|
|
271c: 20000018 .word 0x20000018
|
|
|
|
00002720 <setbuf>:
|
|
2720: 424a negs r2, r1
|
|
2722: 414a adcs r2, r1
|
|
2724: 2380 movs r3, #128 ; 0x80
|
|
2726: b510 push {r4, lr}
|
|
2728: 0052 lsls r2, r2, #1
|
|
272a: 00db lsls r3, r3, #3
|
|
272c: f000 f802 bl 2734 <setvbuf>
|
|
2730: bd10 pop {r4, pc}
|
|
...
|
|
|
|
00002734 <setvbuf>:
|
|
2734: b5f0 push {r4, r5, r6, r7, lr}
|
|
2736: 001d movs r5, r3
|
|
2738: 4b4f ldr r3, [pc, #316] ; (2878 <setvbuf+0x144>)
|
|
273a: b085 sub sp, #20
|
|
273c: 681e ldr r6, [r3, #0]
|
|
273e: 0004 movs r4, r0
|
|
2740: 000f movs r7, r1
|
|
2742: 9200 str r2, [sp, #0]
|
|
2744: 2e00 cmp r6, #0
|
|
2746: d005 beq.n 2754 <setvbuf+0x20>
|
|
2748: 69b3 ldr r3, [r6, #24]
|
|
274a: 2b00 cmp r3, #0
|
|
274c: d102 bne.n 2754 <setvbuf+0x20>
|
|
274e: 0030 movs r0, r6
|
|
2750: f000 f994 bl 2a7c <__sinit>
|
|
2754: 4b49 ldr r3, [pc, #292] ; (287c <setvbuf+0x148>)
|
|
2756: 429c cmp r4, r3
|
|
2758: d150 bne.n 27fc <setvbuf+0xc8>
|
|
275a: 6874 ldr r4, [r6, #4]
|
|
275c: 9b00 ldr r3, [sp, #0]
|
|
275e: 2b02 cmp r3, #2
|
|
2760: d005 beq.n 276e <setvbuf+0x3a>
|
|
2762: 2b01 cmp r3, #1
|
|
2764: d900 bls.n 2768 <setvbuf+0x34>
|
|
2766: e084 b.n 2872 <setvbuf+0x13e>
|
|
2768: 2d00 cmp r5, #0
|
|
276a: da00 bge.n 276e <setvbuf+0x3a>
|
|
276c: e081 b.n 2872 <setvbuf+0x13e>
|
|
276e: 0021 movs r1, r4
|
|
2770: 0030 movs r0, r6
|
|
2772: f000 f915 bl 29a0 <_fflush_r>
|
|
2776: 6b61 ldr r1, [r4, #52] ; 0x34
|
|
2778: 2900 cmp r1, #0
|
|
277a: d008 beq.n 278e <setvbuf+0x5a>
|
|
277c: 0023 movs r3, r4
|
|
277e: 3344 adds r3, #68 ; 0x44
|
|
2780: 4299 cmp r1, r3
|
|
2782: d002 beq.n 278a <setvbuf+0x56>
|
|
2784: 0030 movs r0, r6
|
|
2786: f000 fa85 bl 2c94 <_free_r>
|
|
278a: 2300 movs r3, #0
|
|
278c: 6363 str r3, [r4, #52] ; 0x34
|
|
278e: 2300 movs r3, #0
|
|
2790: 61a3 str r3, [r4, #24]
|
|
2792: 6063 str r3, [r4, #4]
|
|
2794: 89a3 ldrh r3, [r4, #12]
|
|
2796: 061b lsls r3, r3, #24
|
|
2798: d503 bpl.n 27a2 <setvbuf+0x6e>
|
|
279a: 6921 ldr r1, [r4, #16]
|
|
279c: 0030 movs r0, r6
|
|
279e: f000 fa79 bl 2c94 <_free_r>
|
|
27a2: 89a3 ldrh r3, [r4, #12]
|
|
27a4: 4a36 ldr r2, [pc, #216] ; (2880 <setvbuf+0x14c>)
|
|
27a6: 4013 ands r3, r2
|
|
27a8: 81a3 strh r3, [r4, #12]
|
|
27aa: 9b00 ldr r3, [sp, #0]
|
|
27ac: 2b02 cmp r3, #2
|
|
27ae: d05a beq.n 2866 <setvbuf+0x132>
|
|
27b0: ab03 add r3, sp, #12
|
|
27b2: aa02 add r2, sp, #8
|
|
27b4: 0021 movs r1, r4
|
|
27b6: 0030 movs r0, r6
|
|
27b8: f000 f9f6 bl 2ba8 <__swhatbuf_r>
|
|
27bc: 89a3 ldrh r3, [r4, #12]
|
|
27be: 4318 orrs r0, r3
|
|
27c0: 81a0 strh r0, [r4, #12]
|
|
27c2: 2d00 cmp r5, #0
|
|
27c4: d124 bne.n 2810 <setvbuf+0xdc>
|
|
27c6: 9d02 ldr r5, [sp, #8]
|
|
27c8: 0028 movs r0, r5
|
|
27ca: f000 fa59 bl 2c80 <malloc>
|
|
27ce: 9501 str r5, [sp, #4]
|
|
27d0: 1e07 subs r7, r0, #0
|
|
27d2: d142 bne.n 285a <setvbuf+0x126>
|
|
27d4: 9b02 ldr r3, [sp, #8]
|
|
27d6: 9301 str r3, [sp, #4]
|
|
27d8: 42ab cmp r3, r5
|
|
27da: d139 bne.n 2850 <setvbuf+0x11c>
|
|
27dc: 2001 movs r0, #1
|
|
27de: 4240 negs r0, r0
|
|
27e0: 2302 movs r3, #2
|
|
27e2: 89a2 ldrh r2, [r4, #12]
|
|
27e4: 4313 orrs r3, r2
|
|
27e6: 81a3 strh r3, [r4, #12]
|
|
27e8: 2300 movs r3, #0
|
|
27ea: 60a3 str r3, [r4, #8]
|
|
27ec: 0023 movs r3, r4
|
|
27ee: 3347 adds r3, #71 ; 0x47
|
|
27f0: 6023 str r3, [r4, #0]
|
|
27f2: 6123 str r3, [r4, #16]
|
|
27f4: 2301 movs r3, #1
|
|
27f6: 6163 str r3, [r4, #20]
|
|
27f8: b005 add sp, #20
|
|
27fa: bdf0 pop {r4, r5, r6, r7, pc}
|
|
27fc: 4b21 ldr r3, [pc, #132] ; (2884 <setvbuf+0x150>)
|
|
27fe: 429c cmp r4, r3
|
|
2800: d101 bne.n 2806 <setvbuf+0xd2>
|
|
2802: 68b4 ldr r4, [r6, #8]
|
|
2804: e7aa b.n 275c <setvbuf+0x28>
|
|
2806: 4b20 ldr r3, [pc, #128] ; (2888 <setvbuf+0x154>)
|
|
2808: 429c cmp r4, r3
|
|
280a: d1a7 bne.n 275c <setvbuf+0x28>
|
|
280c: 68f4 ldr r4, [r6, #12]
|
|
280e: e7a5 b.n 275c <setvbuf+0x28>
|
|
2810: 2f00 cmp r7, #0
|
|
2812: d0d9 beq.n 27c8 <setvbuf+0x94>
|
|
2814: 69b3 ldr r3, [r6, #24]
|
|
2816: 2b00 cmp r3, #0
|
|
2818: d102 bne.n 2820 <setvbuf+0xec>
|
|
281a: 0030 movs r0, r6
|
|
281c: f000 f92e bl 2a7c <__sinit>
|
|
2820: 9b00 ldr r3, [sp, #0]
|
|
2822: 2b01 cmp r3, #1
|
|
2824: d103 bne.n 282e <setvbuf+0xfa>
|
|
2826: 89a3 ldrh r3, [r4, #12]
|
|
2828: 9a00 ldr r2, [sp, #0]
|
|
282a: 431a orrs r2, r3
|
|
282c: 81a2 strh r2, [r4, #12]
|
|
282e: 2008 movs r0, #8
|
|
2830: 89a3 ldrh r3, [r4, #12]
|
|
2832: 6027 str r7, [r4, #0]
|
|
2834: 6127 str r7, [r4, #16]
|
|
2836: 6165 str r5, [r4, #20]
|
|
2838: 4018 ands r0, r3
|
|
283a: d018 beq.n 286e <setvbuf+0x13a>
|
|
283c: 2001 movs r0, #1
|
|
283e: 4018 ands r0, r3
|
|
2840: 2300 movs r3, #0
|
|
2842: 4298 cmp r0, r3
|
|
2844: d011 beq.n 286a <setvbuf+0x136>
|
|
2846: 426d negs r5, r5
|
|
2848: 60a3 str r3, [r4, #8]
|
|
284a: 61a5 str r5, [r4, #24]
|
|
284c: 0018 movs r0, r3
|
|
284e: e7d3 b.n 27f8 <setvbuf+0xc4>
|
|
2850: 9801 ldr r0, [sp, #4]
|
|
2852: f000 fa15 bl 2c80 <malloc>
|
|
2856: 1e07 subs r7, r0, #0
|
|
2858: d0c0 beq.n 27dc <setvbuf+0xa8>
|
|
285a: 2380 movs r3, #128 ; 0x80
|
|
285c: 89a2 ldrh r2, [r4, #12]
|
|
285e: 9d01 ldr r5, [sp, #4]
|
|
2860: 4313 orrs r3, r2
|
|
2862: 81a3 strh r3, [r4, #12]
|
|
2864: e7d6 b.n 2814 <setvbuf+0xe0>
|
|
2866: 2000 movs r0, #0
|
|
2868: e7ba b.n 27e0 <setvbuf+0xac>
|
|
286a: 60a5 str r5, [r4, #8]
|
|
286c: e7c4 b.n 27f8 <setvbuf+0xc4>
|
|
286e: 60a0 str r0, [r4, #8]
|
|
2870: e7c2 b.n 27f8 <setvbuf+0xc4>
|
|
2872: 2001 movs r0, #1
|
|
2874: 4240 negs r0, r0
|
|
2876: e7bf b.n 27f8 <setvbuf+0xc4>
|
|
2878: 20000018 .word 0x20000018
|
|
287c: 000038cc .word 0x000038cc
|
|
2880: fffff35c .word 0xfffff35c
|
|
2884: 000038ec .word 0x000038ec
|
|
2888: 000038ac .word 0x000038ac
|
|
|
|
0000288c <__sflush_r>:
|
|
288c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
|
|
288e: 898a ldrh r2, [r1, #12]
|
|
2890: 0005 movs r5, r0
|
|
2892: 000c movs r4, r1
|
|
2894: 0713 lsls r3, r2, #28
|
|
2896: d460 bmi.n 295a <__sflush_r+0xce>
|
|
2898: 684b ldr r3, [r1, #4]
|
|
289a: 2b00 cmp r3, #0
|
|
289c: dc04 bgt.n 28a8 <__sflush_r+0x1c>
|
|
289e: 6c0b ldr r3, [r1, #64] ; 0x40
|
|
28a0: 2b00 cmp r3, #0
|
|
28a2: dc01 bgt.n 28a8 <__sflush_r+0x1c>
|
|
28a4: 2000 movs r0, #0
|
|
28a6: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
|
|
28a8: 6ae7 ldr r7, [r4, #44] ; 0x2c
|
|
28aa: 2f00 cmp r7, #0
|
|
28ac: d0fa beq.n 28a4 <__sflush_r+0x18>
|
|
28ae: 2300 movs r3, #0
|
|
28b0: 682e ldr r6, [r5, #0]
|
|
28b2: 602b str r3, [r5, #0]
|
|
28b4: 2380 movs r3, #128 ; 0x80
|
|
28b6: 015b lsls r3, r3, #5
|
|
28b8: 401a ands r2, r3
|
|
28ba: d034 beq.n 2926 <__sflush_r+0x9a>
|
|
28bc: 6d60 ldr r0, [r4, #84] ; 0x54
|
|
28be: 89a3 ldrh r3, [r4, #12]
|
|
28c0: 075b lsls r3, r3, #29
|
|
28c2: d506 bpl.n 28d2 <__sflush_r+0x46>
|
|
28c4: 6863 ldr r3, [r4, #4]
|
|
28c6: 1ac0 subs r0, r0, r3
|
|
28c8: 6b63 ldr r3, [r4, #52] ; 0x34
|
|
28ca: 2b00 cmp r3, #0
|
|
28cc: d001 beq.n 28d2 <__sflush_r+0x46>
|
|
28ce: 6c23 ldr r3, [r4, #64] ; 0x40
|
|
28d0: 1ac0 subs r0, r0, r3
|
|
28d2: 0002 movs r2, r0
|
|
28d4: 6a21 ldr r1, [r4, #32]
|
|
28d6: 2300 movs r3, #0
|
|
28d8: 0028 movs r0, r5
|
|
28da: 6ae7 ldr r7, [r4, #44] ; 0x2c
|
|
28dc: 47b8 blx r7
|
|
28de: 89a1 ldrh r1, [r4, #12]
|
|
28e0: 1c43 adds r3, r0, #1
|
|
28e2: d106 bne.n 28f2 <__sflush_r+0x66>
|
|
28e4: 682b ldr r3, [r5, #0]
|
|
28e6: 2b1d cmp r3, #29
|
|
28e8: d831 bhi.n 294e <__sflush_r+0xc2>
|
|
28ea: 4a2c ldr r2, [pc, #176] ; (299c <__sflush_r+0x110>)
|
|
28ec: 40da lsrs r2, r3
|
|
28ee: 07d3 lsls r3, r2, #31
|
|
28f0: d52d bpl.n 294e <__sflush_r+0xc2>
|
|
28f2: 2300 movs r3, #0
|
|
28f4: 6063 str r3, [r4, #4]
|
|
28f6: 6923 ldr r3, [r4, #16]
|
|
28f8: 6023 str r3, [r4, #0]
|
|
28fa: 04cb lsls r3, r1, #19
|
|
28fc: d505 bpl.n 290a <__sflush_r+0x7e>
|
|
28fe: 1c43 adds r3, r0, #1
|
|
2900: d102 bne.n 2908 <__sflush_r+0x7c>
|
|
2902: 682b ldr r3, [r5, #0]
|
|
2904: 2b00 cmp r3, #0
|
|
2906: d100 bne.n 290a <__sflush_r+0x7e>
|
|
2908: 6560 str r0, [r4, #84] ; 0x54
|
|
290a: 6b61 ldr r1, [r4, #52] ; 0x34
|
|
290c: 602e str r6, [r5, #0]
|
|
290e: 2900 cmp r1, #0
|
|
2910: d0c8 beq.n 28a4 <__sflush_r+0x18>
|
|
2912: 0023 movs r3, r4
|
|
2914: 3344 adds r3, #68 ; 0x44
|
|
2916: 4299 cmp r1, r3
|
|
2918: d002 beq.n 2920 <__sflush_r+0x94>
|
|
291a: 0028 movs r0, r5
|
|
291c: f000 f9ba bl 2c94 <_free_r>
|
|
2920: 2000 movs r0, #0
|
|
2922: 6360 str r0, [r4, #52] ; 0x34
|
|
2924: e7bf b.n 28a6 <__sflush_r+0x1a>
|
|
2926: 2301 movs r3, #1
|
|
2928: 6a21 ldr r1, [r4, #32]
|
|
292a: 0028 movs r0, r5
|
|
292c: 47b8 blx r7
|
|
292e: 1c43 adds r3, r0, #1
|
|
2930: d1c5 bne.n 28be <__sflush_r+0x32>
|
|
2932: 682b ldr r3, [r5, #0]
|
|
2934: 2b00 cmp r3, #0
|
|
2936: d0c2 beq.n 28be <__sflush_r+0x32>
|
|
2938: 2b1d cmp r3, #29
|
|
293a: d001 beq.n 2940 <__sflush_r+0xb4>
|
|
293c: 2b16 cmp r3, #22
|
|
293e: d101 bne.n 2944 <__sflush_r+0xb8>
|
|
2940: 602e str r6, [r5, #0]
|
|
2942: e7af b.n 28a4 <__sflush_r+0x18>
|
|
2944: 2340 movs r3, #64 ; 0x40
|
|
2946: 89a2 ldrh r2, [r4, #12]
|
|
2948: 4313 orrs r3, r2
|
|
294a: 81a3 strh r3, [r4, #12]
|
|
294c: e7ab b.n 28a6 <__sflush_r+0x1a>
|
|
294e: 2340 movs r3, #64 ; 0x40
|
|
2950: 430b orrs r3, r1
|
|
2952: 2001 movs r0, #1
|
|
2954: 81a3 strh r3, [r4, #12]
|
|
2956: 4240 negs r0, r0
|
|
2958: e7a5 b.n 28a6 <__sflush_r+0x1a>
|
|
295a: 690f ldr r7, [r1, #16]
|
|
295c: 2f00 cmp r7, #0
|
|
295e: d0a1 beq.n 28a4 <__sflush_r+0x18>
|
|
2960: 680b ldr r3, [r1, #0]
|
|
2962: 600f str r7, [r1, #0]
|
|
2964: 1bdb subs r3, r3, r7
|
|
2966: 9301 str r3, [sp, #4]
|
|
2968: 2300 movs r3, #0
|
|
296a: 0792 lsls r2, r2, #30
|
|
296c: d100 bne.n 2970 <__sflush_r+0xe4>
|
|
296e: 694b ldr r3, [r1, #20]
|
|
2970: 60a3 str r3, [r4, #8]
|
|
2972: 9b01 ldr r3, [sp, #4]
|
|
2974: 2b00 cmp r3, #0
|
|
2976: dc00 bgt.n 297a <__sflush_r+0xee>
|
|
2978: e794 b.n 28a4 <__sflush_r+0x18>
|
|
297a: 9b01 ldr r3, [sp, #4]
|
|
297c: 003a movs r2, r7
|
|
297e: 6a21 ldr r1, [r4, #32]
|
|
2980: 0028 movs r0, r5
|
|
2982: 6aa6 ldr r6, [r4, #40] ; 0x28
|
|
2984: 47b0 blx r6
|
|
2986: 2800 cmp r0, #0
|
|
2988: dc03 bgt.n 2992 <__sflush_r+0x106>
|
|
298a: 2340 movs r3, #64 ; 0x40
|
|
298c: 89a2 ldrh r2, [r4, #12]
|
|
298e: 4313 orrs r3, r2
|
|
2990: e7df b.n 2952 <__sflush_r+0xc6>
|
|
2992: 9b01 ldr r3, [sp, #4]
|
|
2994: 183f adds r7, r7, r0
|
|
2996: 1a1b subs r3, r3, r0
|
|
2998: 9301 str r3, [sp, #4]
|
|
299a: e7ea b.n 2972 <__sflush_r+0xe6>
|
|
299c: 20400001 .word 0x20400001
|
|
|
|
000029a0 <_fflush_r>:
|
|
29a0: 690b ldr r3, [r1, #16]
|
|
29a2: b570 push {r4, r5, r6, lr}
|
|
29a4: 0005 movs r5, r0
|
|
29a6: 000c movs r4, r1
|
|
29a8: 2b00 cmp r3, #0
|
|
29aa: d101 bne.n 29b0 <_fflush_r+0x10>
|
|
29ac: 2000 movs r0, #0
|
|
29ae: bd70 pop {r4, r5, r6, pc}
|
|
29b0: 2800 cmp r0, #0
|
|
29b2: d004 beq.n 29be <_fflush_r+0x1e>
|
|
29b4: 6983 ldr r3, [r0, #24]
|
|
29b6: 2b00 cmp r3, #0
|
|
29b8: d101 bne.n 29be <_fflush_r+0x1e>
|
|
29ba: f000 f85f bl 2a7c <__sinit>
|
|
29be: 4b0b ldr r3, [pc, #44] ; (29ec <_fflush_r+0x4c>)
|
|
29c0: 429c cmp r4, r3
|
|
29c2: d109 bne.n 29d8 <_fflush_r+0x38>
|
|
29c4: 686c ldr r4, [r5, #4]
|
|
29c6: 220c movs r2, #12
|
|
29c8: 5ea3 ldrsh r3, [r4, r2]
|
|
29ca: 2b00 cmp r3, #0
|
|
29cc: d0ee beq.n 29ac <_fflush_r+0xc>
|
|
29ce: 0021 movs r1, r4
|
|
29d0: 0028 movs r0, r5
|
|
29d2: f7ff ff5b bl 288c <__sflush_r>
|
|
29d6: e7ea b.n 29ae <_fflush_r+0xe>
|
|
29d8: 4b05 ldr r3, [pc, #20] ; (29f0 <_fflush_r+0x50>)
|
|
29da: 429c cmp r4, r3
|
|
29dc: d101 bne.n 29e2 <_fflush_r+0x42>
|
|
29de: 68ac ldr r4, [r5, #8]
|
|
29e0: e7f1 b.n 29c6 <_fflush_r+0x26>
|
|
29e2: 4b04 ldr r3, [pc, #16] ; (29f4 <_fflush_r+0x54>)
|
|
29e4: 429c cmp r4, r3
|
|
29e6: d1ee bne.n 29c6 <_fflush_r+0x26>
|
|
29e8: 68ec ldr r4, [r5, #12]
|
|
29ea: e7ec b.n 29c6 <_fflush_r+0x26>
|
|
29ec: 000038cc .word 0x000038cc
|
|
29f0: 000038ec .word 0x000038ec
|
|
29f4: 000038ac .word 0x000038ac
|
|
|
|
000029f8 <_cleanup_r>:
|
|
29f8: b510 push {r4, lr}
|
|
29fa: 4902 ldr r1, [pc, #8] ; (2a04 <_cleanup_r+0xc>)
|
|
29fc: f000 f8b2 bl 2b64 <_fwalk_reent>
|
|
2a00: bd10 pop {r4, pc}
|
|
2a02: 46c0 nop ; (mov r8, r8)
|
|
2a04: 000029a1 .word 0x000029a1
|
|
|
|
00002a08 <std.isra.0>:
|
|
2a08: 2300 movs r3, #0
|
|
2a0a: b510 push {r4, lr}
|
|
2a0c: 0004 movs r4, r0
|
|
2a0e: 6003 str r3, [r0, #0]
|
|
2a10: 6043 str r3, [r0, #4]
|
|
2a12: 6083 str r3, [r0, #8]
|
|
2a14: 8181 strh r1, [r0, #12]
|
|
2a16: 6643 str r3, [r0, #100] ; 0x64
|
|
2a18: 81c2 strh r2, [r0, #14]
|
|
2a1a: 6103 str r3, [r0, #16]
|
|
2a1c: 6143 str r3, [r0, #20]
|
|
2a1e: 6183 str r3, [r0, #24]
|
|
2a20: 0019 movs r1, r3
|
|
2a22: 2208 movs r2, #8
|
|
2a24: 305c adds r0, #92 ; 0x5c
|
|
2a26: f7ff fe58 bl 26da <memset>
|
|
2a2a: 4b05 ldr r3, [pc, #20] ; (2a40 <std.isra.0+0x38>)
|
|
2a2c: 6224 str r4, [r4, #32]
|
|
2a2e: 6263 str r3, [r4, #36] ; 0x24
|
|
2a30: 4b04 ldr r3, [pc, #16] ; (2a44 <std.isra.0+0x3c>)
|
|
2a32: 62a3 str r3, [r4, #40] ; 0x28
|
|
2a34: 4b04 ldr r3, [pc, #16] ; (2a48 <std.isra.0+0x40>)
|
|
2a36: 62e3 str r3, [r4, #44] ; 0x2c
|
|
2a38: 4b04 ldr r3, [pc, #16] ; (2a4c <std.isra.0+0x44>)
|
|
2a3a: 6323 str r3, [r4, #48] ; 0x30
|
|
2a3c: bd10 pop {r4, pc}
|
|
2a3e: 46c0 nop ; (mov r8, r8)
|
|
2a40: 000033a1 .word 0x000033a1
|
|
2a44: 000033c9 .word 0x000033c9
|
|
2a48: 00003401 .word 0x00003401
|
|
2a4c: 0000342d .word 0x0000342d
|
|
|
|
00002a50 <__sfmoreglue>:
|
|
2a50: b570 push {r4, r5, r6, lr}
|
|
2a52: 2568 movs r5, #104 ; 0x68
|
|
2a54: 1e4a subs r2, r1, #1
|
|
2a56: 4355 muls r5, r2
|
|
2a58: 000e movs r6, r1
|
|
2a5a: 0029 movs r1, r5
|
|
2a5c: 3174 adds r1, #116 ; 0x74
|
|
2a5e: f000 f963 bl 2d28 <_malloc_r>
|
|
2a62: 1e04 subs r4, r0, #0
|
|
2a64: d008 beq.n 2a78 <__sfmoreglue+0x28>
|
|
2a66: 2100 movs r1, #0
|
|
2a68: 002a movs r2, r5
|
|
2a6a: 6001 str r1, [r0, #0]
|
|
2a6c: 6046 str r6, [r0, #4]
|
|
2a6e: 300c adds r0, #12
|
|
2a70: 60a0 str r0, [r4, #8]
|
|
2a72: 3268 adds r2, #104 ; 0x68
|
|
2a74: f7ff fe31 bl 26da <memset>
|
|
2a78: 0020 movs r0, r4
|
|
2a7a: bd70 pop {r4, r5, r6, pc}
|
|
|
|
00002a7c <__sinit>:
|
|
2a7c: 6983 ldr r3, [r0, #24]
|
|
2a7e: b513 push {r0, r1, r4, lr}
|
|
2a80: 0004 movs r4, r0
|
|
2a82: 2b00 cmp r3, #0
|
|
2a84: d128 bne.n 2ad8 <__sinit+0x5c>
|
|
2a86: 6483 str r3, [r0, #72] ; 0x48
|
|
2a88: 64c3 str r3, [r0, #76] ; 0x4c
|
|
2a8a: 6503 str r3, [r0, #80] ; 0x50
|
|
2a8c: 4b13 ldr r3, [pc, #76] ; (2adc <__sinit+0x60>)
|
|
2a8e: 4a14 ldr r2, [pc, #80] ; (2ae0 <__sinit+0x64>)
|
|
2a90: 681b ldr r3, [r3, #0]
|
|
2a92: 6282 str r2, [r0, #40] ; 0x28
|
|
2a94: 9301 str r3, [sp, #4]
|
|
2a96: 4298 cmp r0, r3
|
|
2a98: d101 bne.n 2a9e <__sinit+0x22>
|
|
2a9a: 2301 movs r3, #1
|
|
2a9c: 6183 str r3, [r0, #24]
|
|
2a9e: 0020 movs r0, r4
|
|
2aa0: f000 f820 bl 2ae4 <__sfp>
|
|
2aa4: 6060 str r0, [r4, #4]
|
|
2aa6: 0020 movs r0, r4
|
|
2aa8: f000 f81c bl 2ae4 <__sfp>
|
|
2aac: 60a0 str r0, [r4, #8]
|
|
2aae: 0020 movs r0, r4
|
|
2ab0: f000 f818 bl 2ae4 <__sfp>
|
|
2ab4: 2200 movs r2, #0
|
|
2ab6: 60e0 str r0, [r4, #12]
|
|
2ab8: 2104 movs r1, #4
|
|
2aba: 6860 ldr r0, [r4, #4]
|
|
2abc: f7ff ffa4 bl 2a08 <std.isra.0>
|
|
2ac0: 2201 movs r2, #1
|
|
2ac2: 2109 movs r1, #9
|
|
2ac4: 68a0 ldr r0, [r4, #8]
|
|
2ac6: f7ff ff9f bl 2a08 <std.isra.0>
|
|
2aca: 2202 movs r2, #2
|
|
2acc: 2112 movs r1, #18
|
|
2ace: 68e0 ldr r0, [r4, #12]
|
|
2ad0: f7ff ff9a bl 2a08 <std.isra.0>
|
|
2ad4: 2301 movs r3, #1
|
|
2ad6: 61a3 str r3, [r4, #24]
|
|
2ad8: bd13 pop {r0, r1, r4, pc}
|
|
2ada: 46c0 nop ; (mov r8, r8)
|
|
2adc: 000038a8 .word 0x000038a8
|
|
2ae0: 000029f9 .word 0x000029f9
|
|
|
|
00002ae4 <__sfp>:
|
|
2ae4: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
2ae6: 4b1e ldr r3, [pc, #120] ; (2b60 <__sfp+0x7c>)
|
|
2ae8: 0007 movs r7, r0
|
|
2aea: 681e ldr r6, [r3, #0]
|
|
2aec: 69b3 ldr r3, [r6, #24]
|
|
2aee: 2b00 cmp r3, #0
|
|
2af0: d102 bne.n 2af8 <__sfp+0x14>
|
|
2af2: 0030 movs r0, r6
|
|
2af4: f7ff ffc2 bl 2a7c <__sinit>
|
|
2af8: 3648 adds r6, #72 ; 0x48
|
|
2afa: 68b4 ldr r4, [r6, #8]
|
|
2afc: 6873 ldr r3, [r6, #4]
|
|
2afe: 3b01 subs r3, #1
|
|
2b00: d504 bpl.n 2b0c <__sfp+0x28>
|
|
2b02: 6833 ldr r3, [r6, #0]
|
|
2b04: 2b00 cmp r3, #0
|
|
2b06: d007 beq.n 2b18 <__sfp+0x34>
|
|
2b08: 6836 ldr r6, [r6, #0]
|
|
2b0a: e7f6 b.n 2afa <__sfp+0x16>
|
|
2b0c: 220c movs r2, #12
|
|
2b0e: 5ea5 ldrsh r5, [r4, r2]
|
|
2b10: 2d00 cmp r5, #0
|
|
2b12: d00d beq.n 2b30 <__sfp+0x4c>
|
|
2b14: 3468 adds r4, #104 ; 0x68
|
|
2b16: e7f2 b.n 2afe <__sfp+0x1a>
|
|
2b18: 2104 movs r1, #4
|
|
2b1a: 0038 movs r0, r7
|
|
2b1c: f7ff ff98 bl 2a50 <__sfmoreglue>
|
|
2b20: 6030 str r0, [r6, #0]
|
|
2b22: 2800 cmp r0, #0
|
|
2b24: d1f0 bne.n 2b08 <__sfp+0x24>
|
|
2b26: 230c movs r3, #12
|
|
2b28: 0004 movs r4, r0
|
|
2b2a: 603b str r3, [r7, #0]
|
|
2b2c: 0020 movs r0, r4
|
|
2b2e: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
2b30: 2301 movs r3, #1
|
|
2b32: 0020 movs r0, r4
|
|
2b34: 425b negs r3, r3
|
|
2b36: 81e3 strh r3, [r4, #14]
|
|
2b38: 3302 adds r3, #2
|
|
2b3a: 81a3 strh r3, [r4, #12]
|
|
2b3c: 6665 str r5, [r4, #100] ; 0x64
|
|
2b3e: 6025 str r5, [r4, #0]
|
|
2b40: 60a5 str r5, [r4, #8]
|
|
2b42: 6065 str r5, [r4, #4]
|
|
2b44: 6125 str r5, [r4, #16]
|
|
2b46: 6165 str r5, [r4, #20]
|
|
2b48: 61a5 str r5, [r4, #24]
|
|
2b4a: 2208 movs r2, #8
|
|
2b4c: 0029 movs r1, r5
|
|
2b4e: 305c adds r0, #92 ; 0x5c
|
|
2b50: f7ff fdc3 bl 26da <memset>
|
|
2b54: 6365 str r5, [r4, #52] ; 0x34
|
|
2b56: 63a5 str r5, [r4, #56] ; 0x38
|
|
2b58: 64a5 str r5, [r4, #72] ; 0x48
|
|
2b5a: 64e5 str r5, [r4, #76] ; 0x4c
|
|
2b5c: e7e6 b.n 2b2c <__sfp+0x48>
|
|
2b5e: 46c0 nop ; (mov r8, r8)
|
|
2b60: 000038a8 .word 0x000038a8
|
|
|
|
00002b64 <_fwalk_reent>:
|
|
2b64: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
|
|
2b66: 0004 movs r4, r0
|
|
2b68: 0007 movs r7, r0
|
|
2b6a: 2600 movs r6, #0
|
|
2b6c: 9101 str r1, [sp, #4]
|
|
2b6e: 3448 adds r4, #72 ; 0x48
|
|
2b70: 2c00 cmp r4, #0
|
|
2b72: d101 bne.n 2b78 <_fwalk_reent+0x14>
|
|
2b74: 0030 movs r0, r6
|
|
2b76: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
|
|
2b78: 6863 ldr r3, [r4, #4]
|
|
2b7a: 68a5 ldr r5, [r4, #8]
|
|
2b7c: 9300 str r3, [sp, #0]
|
|
2b7e: 9b00 ldr r3, [sp, #0]
|
|
2b80: 3b01 subs r3, #1
|
|
2b82: 9300 str r3, [sp, #0]
|
|
2b84: d501 bpl.n 2b8a <_fwalk_reent+0x26>
|
|
2b86: 6824 ldr r4, [r4, #0]
|
|
2b88: e7f2 b.n 2b70 <_fwalk_reent+0xc>
|
|
2b8a: 89ab ldrh r3, [r5, #12]
|
|
2b8c: 2b01 cmp r3, #1
|
|
2b8e: d908 bls.n 2ba2 <_fwalk_reent+0x3e>
|
|
2b90: 220e movs r2, #14
|
|
2b92: 5eab ldrsh r3, [r5, r2]
|
|
2b94: 3301 adds r3, #1
|
|
2b96: d004 beq.n 2ba2 <_fwalk_reent+0x3e>
|
|
2b98: 0029 movs r1, r5
|
|
2b9a: 0038 movs r0, r7
|
|
2b9c: 9b01 ldr r3, [sp, #4]
|
|
2b9e: 4798 blx r3
|
|
2ba0: 4306 orrs r6, r0
|
|
2ba2: 3568 adds r5, #104 ; 0x68
|
|
2ba4: e7eb b.n 2b7e <_fwalk_reent+0x1a>
|
|
...
|
|
|
|
00002ba8 <__swhatbuf_r>:
|
|
2ba8: b570 push {r4, r5, r6, lr}
|
|
2baa: 000e movs r6, r1
|
|
2bac: 001d movs r5, r3
|
|
2bae: 230e movs r3, #14
|
|
2bb0: 5ec9 ldrsh r1, [r1, r3]
|
|
2bb2: b090 sub sp, #64 ; 0x40
|
|
2bb4: 0014 movs r4, r2
|
|
2bb6: 2900 cmp r1, #0
|
|
2bb8: da07 bge.n 2bca <__swhatbuf_r+0x22>
|
|
2bba: 2300 movs r3, #0
|
|
2bbc: 602b str r3, [r5, #0]
|
|
2bbe: 89b3 ldrh r3, [r6, #12]
|
|
2bc0: 061b lsls r3, r3, #24
|
|
2bc2: d411 bmi.n 2be8 <__swhatbuf_r+0x40>
|
|
2bc4: 2380 movs r3, #128 ; 0x80
|
|
2bc6: 00db lsls r3, r3, #3
|
|
2bc8: e00f b.n 2bea <__swhatbuf_r+0x42>
|
|
2bca: aa01 add r2, sp, #4
|
|
2bcc: f000 fd26 bl 361c <_fstat_r>
|
|
2bd0: 2800 cmp r0, #0
|
|
2bd2: dbf2 blt.n 2bba <__swhatbuf_r+0x12>
|
|
2bd4: 22f0 movs r2, #240 ; 0xf0
|
|
2bd6: 9b02 ldr r3, [sp, #8]
|
|
2bd8: 0212 lsls r2, r2, #8
|
|
2bda: 4013 ands r3, r2
|
|
2bdc: 4a05 ldr r2, [pc, #20] ; (2bf4 <__swhatbuf_r+0x4c>)
|
|
2bde: 189b adds r3, r3, r2
|
|
2be0: 425a negs r2, r3
|
|
2be2: 4153 adcs r3, r2
|
|
2be4: 602b str r3, [r5, #0]
|
|
2be6: e7ed b.n 2bc4 <__swhatbuf_r+0x1c>
|
|
2be8: 2340 movs r3, #64 ; 0x40
|
|
2bea: 2000 movs r0, #0
|
|
2bec: 6023 str r3, [r4, #0]
|
|
2bee: b010 add sp, #64 ; 0x40
|
|
2bf0: bd70 pop {r4, r5, r6, pc}
|
|
2bf2: 46c0 nop ; (mov r8, r8)
|
|
2bf4: ffffe000 .word 0xffffe000
|
|
|
|
00002bf8 <__smakebuf_r>:
|
|
2bf8: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
|
|
2bfa: 2602 movs r6, #2
|
|
2bfc: 898b ldrh r3, [r1, #12]
|
|
2bfe: 0005 movs r5, r0
|
|
2c00: 000c movs r4, r1
|
|
2c02: 4233 tst r3, r6
|
|
2c04: d006 beq.n 2c14 <__smakebuf_r+0x1c>
|
|
2c06: 0023 movs r3, r4
|
|
2c08: 3347 adds r3, #71 ; 0x47
|
|
2c0a: 6023 str r3, [r4, #0]
|
|
2c0c: 6123 str r3, [r4, #16]
|
|
2c0e: 2301 movs r3, #1
|
|
2c10: 6163 str r3, [r4, #20]
|
|
2c12: bdf7 pop {r0, r1, r2, r4, r5, r6, r7, pc}
|
|
2c14: ab01 add r3, sp, #4
|
|
2c16: 466a mov r2, sp
|
|
2c18: f7ff ffc6 bl 2ba8 <__swhatbuf_r>
|
|
2c1c: 9900 ldr r1, [sp, #0]
|
|
2c1e: 0007 movs r7, r0
|
|
2c20: 0028 movs r0, r5
|
|
2c22: f000 f881 bl 2d28 <_malloc_r>
|
|
2c26: 2800 cmp r0, #0
|
|
2c28: d108 bne.n 2c3c <__smakebuf_r+0x44>
|
|
2c2a: 220c movs r2, #12
|
|
2c2c: 5ea3 ldrsh r3, [r4, r2]
|
|
2c2e: 059a lsls r2, r3, #22
|
|
2c30: d4ef bmi.n 2c12 <__smakebuf_r+0x1a>
|
|
2c32: 2203 movs r2, #3
|
|
2c34: 4393 bics r3, r2
|
|
2c36: 431e orrs r6, r3
|
|
2c38: 81a6 strh r6, [r4, #12]
|
|
2c3a: e7e4 b.n 2c06 <__smakebuf_r+0xe>
|
|
2c3c: 4b0f ldr r3, [pc, #60] ; (2c7c <__smakebuf_r+0x84>)
|
|
2c3e: 62ab str r3, [r5, #40] ; 0x28
|
|
2c40: 2380 movs r3, #128 ; 0x80
|
|
2c42: 89a2 ldrh r2, [r4, #12]
|
|
2c44: 6020 str r0, [r4, #0]
|
|
2c46: 4313 orrs r3, r2
|
|
2c48: 81a3 strh r3, [r4, #12]
|
|
2c4a: 9b00 ldr r3, [sp, #0]
|
|
2c4c: 6120 str r0, [r4, #16]
|
|
2c4e: 6163 str r3, [r4, #20]
|
|
2c50: 9b01 ldr r3, [sp, #4]
|
|
2c52: 2b00 cmp r3, #0
|
|
2c54: d00d beq.n 2c72 <__smakebuf_r+0x7a>
|
|
2c56: 230e movs r3, #14
|
|
2c58: 5ee1 ldrsh r1, [r4, r3]
|
|
2c5a: 0028 movs r0, r5
|
|
2c5c: f000 fcf0 bl 3640 <_isatty_r>
|
|
2c60: 2800 cmp r0, #0
|
|
2c62: d006 beq.n 2c72 <__smakebuf_r+0x7a>
|
|
2c64: 2203 movs r2, #3
|
|
2c66: 89a3 ldrh r3, [r4, #12]
|
|
2c68: 4393 bics r3, r2
|
|
2c6a: 001a movs r2, r3
|
|
2c6c: 2301 movs r3, #1
|
|
2c6e: 4313 orrs r3, r2
|
|
2c70: 81a3 strh r3, [r4, #12]
|
|
2c72: 89a0 ldrh r0, [r4, #12]
|
|
2c74: 4338 orrs r0, r7
|
|
2c76: 81a0 strh r0, [r4, #12]
|
|
2c78: e7cb b.n 2c12 <__smakebuf_r+0x1a>
|
|
2c7a: 46c0 nop ; (mov r8, r8)
|
|
2c7c: 000029f9 .word 0x000029f9
|
|
|
|
00002c80 <malloc>:
|
|
2c80: b510 push {r4, lr}
|
|
2c82: 4b03 ldr r3, [pc, #12] ; (2c90 <malloc+0x10>)
|
|
2c84: 0001 movs r1, r0
|
|
2c86: 6818 ldr r0, [r3, #0]
|
|
2c88: f000 f84e bl 2d28 <_malloc_r>
|
|
2c8c: bd10 pop {r4, pc}
|
|
2c8e: 46c0 nop ; (mov r8, r8)
|
|
2c90: 20000018 .word 0x20000018
|
|
|
|
00002c94 <_free_r>:
|
|
2c94: b570 push {r4, r5, r6, lr}
|
|
2c96: 0005 movs r5, r0
|
|
2c98: 2900 cmp r1, #0
|
|
2c9a: d010 beq.n 2cbe <_free_r+0x2a>
|
|
2c9c: 1f0c subs r4, r1, #4
|
|
2c9e: 6823 ldr r3, [r4, #0]
|
|
2ca0: 2b00 cmp r3, #0
|
|
2ca2: da00 bge.n 2ca6 <_free_r+0x12>
|
|
2ca4: 18e4 adds r4, r4, r3
|
|
2ca6: 0028 movs r0, r5
|
|
2ca8: f000 fcfb bl 36a2 <__malloc_lock>
|
|
2cac: 4a1d ldr r2, [pc, #116] ; (2d24 <_free_r+0x90>)
|
|
2cae: 6813 ldr r3, [r2, #0]
|
|
2cb0: 2b00 cmp r3, #0
|
|
2cb2: d105 bne.n 2cc0 <_free_r+0x2c>
|
|
2cb4: 6063 str r3, [r4, #4]
|
|
2cb6: 6014 str r4, [r2, #0]
|
|
2cb8: 0028 movs r0, r5
|
|
2cba: f000 fcf3 bl 36a4 <__malloc_unlock>
|
|
2cbe: bd70 pop {r4, r5, r6, pc}
|
|
2cc0: 42a3 cmp r3, r4
|
|
2cc2: d909 bls.n 2cd8 <_free_r+0x44>
|
|
2cc4: 6821 ldr r1, [r4, #0]
|
|
2cc6: 1860 adds r0, r4, r1
|
|
2cc8: 4283 cmp r3, r0
|
|
2cca: d1f3 bne.n 2cb4 <_free_r+0x20>
|
|
2ccc: 6818 ldr r0, [r3, #0]
|
|
2cce: 685b ldr r3, [r3, #4]
|
|
2cd0: 1841 adds r1, r0, r1
|
|
2cd2: 6021 str r1, [r4, #0]
|
|
2cd4: e7ee b.n 2cb4 <_free_r+0x20>
|
|
2cd6: 0013 movs r3, r2
|
|
2cd8: 685a ldr r2, [r3, #4]
|
|
2cda: 2a00 cmp r2, #0
|
|
2cdc: d001 beq.n 2ce2 <_free_r+0x4e>
|
|
2cde: 42a2 cmp r2, r4
|
|
2ce0: d9f9 bls.n 2cd6 <_free_r+0x42>
|
|
2ce2: 6819 ldr r1, [r3, #0]
|
|
2ce4: 1858 adds r0, r3, r1
|
|
2ce6: 42a0 cmp r0, r4
|
|
2ce8: d10b bne.n 2d02 <_free_r+0x6e>
|
|
2cea: 6820 ldr r0, [r4, #0]
|
|
2cec: 1809 adds r1, r1, r0
|
|
2cee: 1858 adds r0, r3, r1
|
|
2cf0: 6019 str r1, [r3, #0]
|
|
2cf2: 4282 cmp r2, r0
|
|
2cf4: d1e0 bne.n 2cb8 <_free_r+0x24>
|
|
2cf6: 6810 ldr r0, [r2, #0]
|
|
2cf8: 6852 ldr r2, [r2, #4]
|
|
2cfa: 1841 adds r1, r0, r1
|
|
2cfc: 6019 str r1, [r3, #0]
|
|
2cfe: 605a str r2, [r3, #4]
|
|
2d00: e7da b.n 2cb8 <_free_r+0x24>
|
|
2d02: 42a0 cmp r0, r4
|
|
2d04: d902 bls.n 2d0c <_free_r+0x78>
|
|
2d06: 230c movs r3, #12
|
|
2d08: 602b str r3, [r5, #0]
|
|
2d0a: e7d5 b.n 2cb8 <_free_r+0x24>
|
|
2d0c: 6821 ldr r1, [r4, #0]
|
|
2d0e: 1860 adds r0, r4, r1
|
|
2d10: 4282 cmp r2, r0
|
|
2d12: d103 bne.n 2d1c <_free_r+0x88>
|
|
2d14: 6810 ldr r0, [r2, #0]
|
|
2d16: 6852 ldr r2, [r2, #4]
|
|
2d18: 1841 adds r1, r0, r1
|
|
2d1a: 6021 str r1, [r4, #0]
|
|
2d1c: 6062 str r2, [r4, #4]
|
|
2d1e: 605c str r4, [r3, #4]
|
|
2d20: e7ca b.n 2cb8 <_free_r+0x24>
|
|
2d22: 46c0 nop ; (mov r8, r8)
|
|
2d24: 200001d0 .word 0x200001d0
|
|
|
|
00002d28 <_malloc_r>:
|
|
2d28: 2303 movs r3, #3
|
|
2d2a: b570 push {r4, r5, r6, lr}
|
|
2d2c: 1ccd adds r5, r1, #3
|
|
2d2e: 439d bics r5, r3
|
|
2d30: 3508 adds r5, #8
|
|
2d32: 0006 movs r6, r0
|
|
2d34: 2d0c cmp r5, #12
|
|
2d36: d21e bcs.n 2d76 <_malloc_r+0x4e>
|
|
2d38: 250c movs r5, #12
|
|
2d3a: 42a9 cmp r1, r5
|
|
2d3c: d81d bhi.n 2d7a <_malloc_r+0x52>
|
|
2d3e: 0030 movs r0, r6
|
|
2d40: f000 fcaf bl 36a2 <__malloc_lock>
|
|
2d44: 4a25 ldr r2, [pc, #148] ; (2ddc <_malloc_r+0xb4>)
|
|
2d46: 6814 ldr r4, [r2, #0]
|
|
2d48: 0021 movs r1, r4
|
|
2d4a: 2900 cmp r1, #0
|
|
2d4c: d119 bne.n 2d82 <_malloc_r+0x5a>
|
|
2d4e: 4c24 ldr r4, [pc, #144] ; (2de0 <_malloc_r+0xb8>)
|
|
2d50: 6823 ldr r3, [r4, #0]
|
|
2d52: 2b00 cmp r3, #0
|
|
2d54: d103 bne.n 2d5e <_malloc_r+0x36>
|
|
2d56: 0030 movs r0, r6
|
|
2d58: f000 fb10 bl 337c <_sbrk_r>
|
|
2d5c: 6020 str r0, [r4, #0]
|
|
2d5e: 0029 movs r1, r5
|
|
2d60: 0030 movs r0, r6
|
|
2d62: f000 fb0b bl 337c <_sbrk_r>
|
|
2d66: 1c43 adds r3, r0, #1
|
|
2d68: d12c bne.n 2dc4 <_malloc_r+0x9c>
|
|
2d6a: 230c movs r3, #12
|
|
2d6c: 0030 movs r0, r6
|
|
2d6e: 6033 str r3, [r6, #0]
|
|
2d70: f000 fc98 bl 36a4 <__malloc_unlock>
|
|
2d74: e003 b.n 2d7e <_malloc_r+0x56>
|
|
2d76: 2d00 cmp r5, #0
|
|
2d78: dadf bge.n 2d3a <_malloc_r+0x12>
|
|
2d7a: 230c movs r3, #12
|
|
2d7c: 6033 str r3, [r6, #0]
|
|
2d7e: 2000 movs r0, #0
|
|
2d80: bd70 pop {r4, r5, r6, pc}
|
|
2d82: 680b ldr r3, [r1, #0]
|
|
2d84: 1b5b subs r3, r3, r5
|
|
2d86: d41a bmi.n 2dbe <_malloc_r+0x96>
|
|
2d88: 2b0b cmp r3, #11
|
|
2d8a: d903 bls.n 2d94 <_malloc_r+0x6c>
|
|
2d8c: 600b str r3, [r1, #0]
|
|
2d8e: 18cc adds r4, r1, r3
|
|
2d90: 6025 str r5, [r4, #0]
|
|
2d92: e003 b.n 2d9c <_malloc_r+0x74>
|
|
2d94: 428c cmp r4, r1
|
|
2d96: d10e bne.n 2db6 <_malloc_r+0x8e>
|
|
2d98: 6863 ldr r3, [r4, #4]
|
|
2d9a: 6013 str r3, [r2, #0]
|
|
2d9c: 0030 movs r0, r6
|
|
2d9e: f000 fc81 bl 36a4 <__malloc_unlock>
|
|
2da2: 0020 movs r0, r4
|
|
2da4: 2207 movs r2, #7
|
|
2da6: 300b adds r0, #11
|
|
2da8: 1d23 adds r3, r4, #4
|
|
2daa: 4390 bics r0, r2
|
|
2dac: 1ac3 subs r3, r0, r3
|
|
2dae: d0e7 beq.n 2d80 <_malloc_r+0x58>
|
|
2db0: 425a negs r2, r3
|
|
2db2: 50e2 str r2, [r4, r3]
|
|
2db4: e7e4 b.n 2d80 <_malloc_r+0x58>
|
|
2db6: 684b ldr r3, [r1, #4]
|
|
2db8: 6063 str r3, [r4, #4]
|
|
2dba: 000c movs r4, r1
|
|
2dbc: e7ee b.n 2d9c <_malloc_r+0x74>
|
|
2dbe: 000c movs r4, r1
|
|
2dc0: 6849 ldr r1, [r1, #4]
|
|
2dc2: e7c2 b.n 2d4a <_malloc_r+0x22>
|
|
2dc4: 2303 movs r3, #3
|
|
2dc6: 1cc4 adds r4, r0, #3
|
|
2dc8: 439c bics r4, r3
|
|
2dca: 42a0 cmp r0, r4
|
|
2dcc: d0e0 beq.n 2d90 <_malloc_r+0x68>
|
|
2dce: 1a21 subs r1, r4, r0
|
|
2dd0: 0030 movs r0, r6
|
|
2dd2: f000 fad3 bl 337c <_sbrk_r>
|
|
2dd6: 1c43 adds r3, r0, #1
|
|
2dd8: d1da bne.n 2d90 <_malloc_r+0x68>
|
|
2dda: e7c6 b.n 2d6a <_malloc_r+0x42>
|
|
2ddc: 200001d0 .word 0x200001d0
|
|
2de0: 200001d4 .word 0x200001d4
|
|
|
|
00002de4 <__sfputc_r>:
|
|
2de4: 6893 ldr r3, [r2, #8]
|
|
2de6: b510 push {r4, lr}
|
|
2de8: 3b01 subs r3, #1
|
|
2dea: 6093 str r3, [r2, #8]
|
|
2dec: 2b00 cmp r3, #0
|
|
2dee: da05 bge.n 2dfc <__sfputc_r+0x18>
|
|
2df0: 6994 ldr r4, [r2, #24]
|
|
2df2: 42a3 cmp r3, r4
|
|
2df4: db08 blt.n 2e08 <__sfputc_r+0x24>
|
|
2df6: b2cb uxtb r3, r1
|
|
2df8: 2b0a cmp r3, #10
|
|
2dfa: d005 beq.n 2e08 <__sfputc_r+0x24>
|
|
2dfc: 6813 ldr r3, [r2, #0]
|
|
2dfe: 1c58 adds r0, r3, #1
|
|
2e00: 6010 str r0, [r2, #0]
|
|
2e02: 7019 strb r1, [r3, #0]
|
|
2e04: b2c8 uxtb r0, r1
|
|
2e06: bd10 pop {r4, pc}
|
|
2e08: f000 fb16 bl 3438 <__swbuf_r>
|
|
2e0c: e7fb b.n 2e06 <__sfputc_r+0x22>
|
|
|
|
00002e0e <__sfputs_r>:
|
|
2e0e: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
2e10: 0006 movs r6, r0
|
|
2e12: 000f movs r7, r1
|
|
2e14: 0014 movs r4, r2
|
|
2e16: 18d5 adds r5, r2, r3
|
|
2e18: 42ac cmp r4, r5
|
|
2e1a: d101 bne.n 2e20 <__sfputs_r+0x12>
|
|
2e1c: 2000 movs r0, #0
|
|
2e1e: e007 b.n 2e30 <__sfputs_r+0x22>
|
|
2e20: 7821 ldrb r1, [r4, #0]
|
|
2e22: 003a movs r2, r7
|
|
2e24: 0030 movs r0, r6
|
|
2e26: f7ff ffdd bl 2de4 <__sfputc_r>
|
|
2e2a: 3401 adds r4, #1
|
|
2e2c: 1c43 adds r3, r0, #1
|
|
2e2e: d1f3 bne.n 2e18 <__sfputs_r+0xa>
|
|
2e30: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
...
|
|
|
|
00002e34 <_vfiprintf_r>:
|
|
2e34: b5f0 push {r4, r5, r6, r7, lr}
|
|
2e36: b09f sub sp, #124 ; 0x7c
|
|
2e38: 0006 movs r6, r0
|
|
2e3a: 000f movs r7, r1
|
|
2e3c: 0014 movs r4, r2
|
|
2e3e: 9305 str r3, [sp, #20]
|
|
2e40: 2800 cmp r0, #0
|
|
2e42: d004 beq.n 2e4e <_vfiprintf_r+0x1a>
|
|
2e44: 6983 ldr r3, [r0, #24]
|
|
2e46: 2b00 cmp r3, #0
|
|
2e48: d101 bne.n 2e4e <_vfiprintf_r+0x1a>
|
|
2e4a: f7ff fe17 bl 2a7c <__sinit>
|
|
2e4e: 4b7f ldr r3, [pc, #508] ; (304c <_vfiprintf_r+0x218>)
|
|
2e50: 429f cmp r7, r3
|
|
2e52: d15c bne.n 2f0e <_vfiprintf_r+0xda>
|
|
2e54: 6877 ldr r7, [r6, #4]
|
|
2e56: 89bb ldrh r3, [r7, #12]
|
|
2e58: 071b lsls r3, r3, #28
|
|
2e5a: d562 bpl.n 2f22 <_vfiprintf_r+0xee>
|
|
2e5c: 693b ldr r3, [r7, #16]
|
|
2e5e: 2b00 cmp r3, #0
|
|
2e60: d05f beq.n 2f22 <_vfiprintf_r+0xee>
|
|
2e62: 2300 movs r3, #0
|
|
2e64: ad06 add r5, sp, #24
|
|
2e66: 616b str r3, [r5, #20]
|
|
2e68: 3320 adds r3, #32
|
|
2e6a: 766b strb r3, [r5, #25]
|
|
2e6c: 3310 adds r3, #16
|
|
2e6e: 76ab strb r3, [r5, #26]
|
|
2e70: 9402 str r4, [sp, #8]
|
|
2e72: 9c02 ldr r4, [sp, #8]
|
|
2e74: 7823 ldrb r3, [r4, #0]
|
|
2e76: 2b00 cmp r3, #0
|
|
2e78: d15d bne.n 2f36 <_vfiprintf_r+0x102>
|
|
2e7a: 9b02 ldr r3, [sp, #8]
|
|
2e7c: 1ae3 subs r3, r4, r3
|
|
2e7e: 9304 str r3, [sp, #16]
|
|
2e80: d00d beq.n 2e9e <_vfiprintf_r+0x6a>
|
|
2e82: 9b04 ldr r3, [sp, #16]
|
|
2e84: 9a02 ldr r2, [sp, #8]
|
|
2e86: 0039 movs r1, r7
|
|
2e88: 0030 movs r0, r6
|
|
2e8a: f7ff ffc0 bl 2e0e <__sfputs_r>
|
|
2e8e: 1c43 adds r3, r0, #1
|
|
2e90: d100 bne.n 2e94 <_vfiprintf_r+0x60>
|
|
2e92: e0cc b.n 302e <_vfiprintf_r+0x1fa>
|
|
2e94: 696a ldr r2, [r5, #20]
|
|
2e96: 9b04 ldr r3, [sp, #16]
|
|
2e98: 4694 mov ip, r2
|
|
2e9a: 4463 add r3, ip
|
|
2e9c: 616b str r3, [r5, #20]
|
|
2e9e: 7823 ldrb r3, [r4, #0]
|
|
2ea0: 2b00 cmp r3, #0
|
|
2ea2: d100 bne.n 2ea6 <_vfiprintf_r+0x72>
|
|
2ea4: e0c3 b.n 302e <_vfiprintf_r+0x1fa>
|
|
2ea6: 2201 movs r2, #1
|
|
2ea8: 2300 movs r3, #0
|
|
2eaa: 4252 negs r2, r2
|
|
2eac: 606a str r2, [r5, #4]
|
|
2eae: a902 add r1, sp, #8
|
|
2eb0: 3254 adds r2, #84 ; 0x54
|
|
2eb2: 1852 adds r2, r2, r1
|
|
2eb4: 3401 adds r4, #1
|
|
2eb6: 602b str r3, [r5, #0]
|
|
2eb8: 60eb str r3, [r5, #12]
|
|
2eba: 60ab str r3, [r5, #8]
|
|
2ebc: 7013 strb r3, [r2, #0]
|
|
2ebe: 65ab str r3, [r5, #88] ; 0x58
|
|
2ec0: 7821 ldrb r1, [r4, #0]
|
|
2ec2: 2205 movs r2, #5
|
|
2ec4: 4862 ldr r0, [pc, #392] ; (3050 <_vfiprintf_r+0x21c>)
|
|
2ec6: f000 fbe1 bl 368c <memchr>
|
|
2eca: 1c63 adds r3, r4, #1
|
|
2ecc: 469c mov ip, r3
|
|
2ece: 2800 cmp r0, #0
|
|
2ed0: d135 bne.n 2f3e <_vfiprintf_r+0x10a>
|
|
2ed2: 6829 ldr r1, [r5, #0]
|
|
2ed4: 06cb lsls r3, r1, #27
|
|
2ed6: d504 bpl.n 2ee2 <_vfiprintf_r+0xae>
|
|
2ed8: 2353 movs r3, #83 ; 0x53
|
|
2eda: aa02 add r2, sp, #8
|
|
2edc: 3020 adds r0, #32
|
|
2ede: 189b adds r3, r3, r2
|
|
2ee0: 7018 strb r0, [r3, #0]
|
|
2ee2: 070b lsls r3, r1, #28
|
|
2ee4: d504 bpl.n 2ef0 <_vfiprintf_r+0xbc>
|
|
2ee6: 2353 movs r3, #83 ; 0x53
|
|
2ee8: 202b movs r0, #43 ; 0x2b
|
|
2eea: aa02 add r2, sp, #8
|
|
2eec: 189b adds r3, r3, r2
|
|
2eee: 7018 strb r0, [r3, #0]
|
|
2ef0: 7823 ldrb r3, [r4, #0]
|
|
2ef2: 2b2a cmp r3, #42 ; 0x2a
|
|
2ef4: d02c beq.n 2f50 <_vfiprintf_r+0x11c>
|
|
2ef6: 2000 movs r0, #0
|
|
2ef8: 210a movs r1, #10
|
|
2efa: 9b09 ldr r3, [sp, #36] ; 0x24
|
|
2efc: 7822 ldrb r2, [r4, #0]
|
|
2efe: 3a30 subs r2, #48 ; 0x30
|
|
2f00: 2a09 cmp r2, #9
|
|
2f02: d800 bhi.n 2f06 <_vfiprintf_r+0xd2>
|
|
2f04: e06b b.n 2fde <_vfiprintf_r+0x1aa>
|
|
2f06: 2800 cmp r0, #0
|
|
2f08: d02a beq.n 2f60 <_vfiprintf_r+0x12c>
|
|
2f0a: 9309 str r3, [sp, #36] ; 0x24
|
|
2f0c: e028 b.n 2f60 <_vfiprintf_r+0x12c>
|
|
2f0e: 4b51 ldr r3, [pc, #324] ; (3054 <_vfiprintf_r+0x220>)
|
|
2f10: 429f cmp r7, r3
|
|
2f12: d101 bne.n 2f18 <_vfiprintf_r+0xe4>
|
|
2f14: 68b7 ldr r7, [r6, #8]
|
|
2f16: e79e b.n 2e56 <_vfiprintf_r+0x22>
|
|
2f18: 4b4f ldr r3, [pc, #316] ; (3058 <_vfiprintf_r+0x224>)
|
|
2f1a: 429f cmp r7, r3
|
|
2f1c: d19b bne.n 2e56 <_vfiprintf_r+0x22>
|
|
2f1e: 68f7 ldr r7, [r6, #12]
|
|
2f20: e799 b.n 2e56 <_vfiprintf_r+0x22>
|
|
2f22: 0039 movs r1, r7
|
|
2f24: 0030 movs r0, r6
|
|
2f26: f000 faf1 bl 350c <__swsetup_r>
|
|
2f2a: 2800 cmp r0, #0
|
|
2f2c: d099 beq.n 2e62 <_vfiprintf_r+0x2e>
|
|
2f2e: 2001 movs r0, #1
|
|
2f30: 4240 negs r0, r0
|
|
2f32: b01f add sp, #124 ; 0x7c
|
|
2f34: bdf0 pop {r4, r5, r6, r7, pc}
|
|
2f36: 2b25 cmp r3, #37 ; 0x25
|
|
2f38: d09f beq.n 2e7a <_vfiprintf_r+0x46>
|
|
2f3a: 3401 adds r4, #1
|
|
2f3c: e79a b.n 2e74 <_vfiprintf_r+0x40>
|
|
2f3e: 4b44 ldr r3, [pc, #272] ; (3050 <_vfiprintf_r+0x21c>)
|
|
2f40: 6829 ldr r1, [r5, #0]
|
|
2f42: 1ac0 subs r0, r0, r3
|
|
2f44: 2301 movs r3, #1
|
|
2f46: 4083 lsls r3, r0
|
|
2f48: 430b orrs r3, r1
|
|
2f4a: 602b str r3, [r5, #0]
|
|
2f4c: 4664 mov r4, ip
|
|
2f4e: e7b7 b.n 2ec0 <_vfiprintf_r+0x8c>
|
|
2f50: 9b05 ldr r3, [sp, #20]
|
|
2f52: 1d18 adds r0, r3, #4
|
|
2f54: 681b ldr r3, [r3, #0]
|
|
2f56: 9005 str r0, [sp, #20]
|
|
2f58: 2b00 cmp r3, #0
|
|
2f5a: db3a blt.n 2fd2 <_vfiprintf_r+0x19e>
|
|
2f5c: 9309 str r3, [sp, #36] ; 0x24
|
|
2f5e: 4664 mov r4, ip
|
|
2f60: 7823 ldrb r3, [r4, #0]
|
|
2f62: 2b2e cmp r3, #46 ; 0x2e
|
|
2f64: d10b bne.n 2f7e <_vfiprintf_r+0x14a>
|
|
2f66: 7863 ldrb r3, [r4, #1]
|
|
2f68: 1c62 adds r2, r4, #1
|
|
2f6a: 2b2a cmp r3, #42 ; 0x2a
|
|
2f6c: d13f bne.n 2fee <_vfiprintf_r+0x1ba>
|
|
2f6e: 9b05 ldr r3, [sp, #20]
|
|
2f70: 3402 adds r4, #2
|
|
2f72: 1d1a adds r2, r3, #4
|
|
2f74: 681b ldr r3, [r3, #0]
|
|
2f76: 9205 str r2, [sp, #20]
|
|
2f78: 2b00 cmp r3, #0
|
|
2f7a: db35 blt.n 2fe8 <_vfiprintf_r+0x1b4>
|
|
2f7c: 9307 str r3, [sp, #28]
|
|
2f7e: 7821 ldrb r1, [r4, #0]
|
|
2f80: 2203 movs r2, #3
|
|
2f82: 4836 ldr r0, [pc, #216] ; (305c <_vfiprintf_r+0x228>)
|
|
2f84: f000 fb82 bl 368c <memchr>
|
|
2f88: 2800 cmp r0, #0
|
|
2f8a: d007 beq.n 2f9c <_vfiprintf_r+0x168>
|
|
2f8c: 4b33 ldr r3, [pc, #204] ; (305c <_vfiprintf_r+0x228>)
|
|
2f8e: 682a ldr r2, [r5, #0]
|
|
2f90: 1ac0 subs r0, r0, r3
|
|
2f92: 2340 movs r3, #64 ; 0x40
|
|
2f94: 4083 lsls r3, r0
|
|
2f96: 4313 orrs r3, r2
|
|
2f98: 602b str r3, [r5, #0]
|
|
2f9a: 3401 adds r4, #1
|
|
2f9c: 7821 ldrb r1, [r4, #0]
|
|
2f9e: 1c63 adds r3, r4, #1
|
|
2fa0: 2206 movs r2, #6
|
|
2fa2: 482f ldr r0, [pc, #188] ; (3060 <_vfiprintf_r+0x22c>)
|
|
2fa4: 9302 str r3, [sp, #8]
|
|
2fa6: 7629 strb r1, [r5, #24]
|
|
2fa8: f000 fb70 bl 368c <memchr>
|
|
2fac: 2800 cmp r0, #0
|
|
2fae: d044 beq.n 303a <_vfiprintf_r+0x206>
|
|
2fb0: 4b2c ldr r3, [pc, #176] ; (3064 <_vfiprintf_r+0x230>)
|
|
2fb2: 2b00 cmp r3, #0
|
|
2fb4: d12f bne.n 3016 <_vfiprintf_r+0x1e2>
|
|
2fb6: 6829 ldr r1, [r5, #0]
|
|
2fb8: 9b05 ldr r3, [sp, #20]
|
|
2fba: 2207 movs r2, #7
|
|
2fbc: 05c9 lsls r1, r1, #23
|
|
2fbe: d528 bpl.n 3012 <_vfiprintf_r+0x1de>
|
|
2fc0: 189b adds r3, r3, r2
|
|
2fc2: 4393 bics r3, r2
|
|
2fc4: 3308 adds r3, #8
|
|
2fc6: 9305 str r3, [sp, #20]
|
|
2fc8: 696b ldr r3, [r5, #20]
|
|
2fca: 9a03 ldr r2, [sp, #12]
|
|
2fcc: 189b adds r3, r3, r2
|
|
2fce: 616b str r3, [r5, #20]
|
|
2fd0: e74f b.n 2e72 <_vfiprintf_r+0x3e>
|
|
2fd2: 425b negs r3, r3
|
|
2fd4: 60eb str r3, [r5, #12]
|
|
2fd6: 2302 movs r3, #2
|
|
2fd8: 430b orrs r3, r1
|
|
2fda: 602b str r3, [r5, #0]
|
|
2fdc: e7bf b.n 2f5e <_vfiprintf_r+0x12a>
|
|
2fde: 434b muls r3, r1
|
|
2fe0: 3401 adds r4, #1
|
|
2fe2: 189b adds r3, r3, r2
|
|
2fe4: 2001 movs r0, #1
|
|
2fe6: e789 b.n 2efc <_vfiprintf_r+0xc8>
|
|
2fe8: 2301 movs r3, #1
|
|
2fea: 425b negs r3, r3
|
|
2fec: e7c6 b.n 2f7c <_vfiprintf_r+0x148>
|
|
2fee: 2300 movs r3, #0
|
|
2ff0: 0014 movs r4, r2
|
|
2ff2: 200a movs r0, #10
|
|
2ff4: 001a movs r2, r3
|
|
2ff6: 606b str r3, [r5, #4]
|
|
2ff8: 7821 ldrb r1, [r4, #0]
|
|
2ffa: 3930 subs r1, #48 ; 0x30
|
|
2ffc: 2909 cmp r1, #9
|
|
2ffe: d903 bls.n 3008 <_vfiprintf_r+0x1d4>
|
|
3000: 2b00 cmp r3, #0
|
|
3002: d0bc beq.n 2f7e <_vfiprintf_r+0x14a>
|
|
3004: 9207 str r2, [sp, #28]
|
|
3006: e7ba b.n 2f7e <_vfiprintf_r+0x14a>
|
|
3008: 4342 muls r2, r0
|
|
300a: 3401 adds r4, #1
|
|
300c: 1852 adds r2, r2, r1
|
|
300e: 2301 movs r3, #1
|
|
3010: e7f2 b.n 2ff8 <_vfiprintf_r+0x1c4>
|
|
3012: 3307 adds r3, #7
|
|
3014: e7d5 b.n 2fc2 <_vfiprintf_r+0x18e>
|
|
3016: ab05 add r3, sp, #20
|
|
3018: 9300 str r3, [sp, #0]
|
|
301a: 003a movs r2, r7
|
|
301c: 4b12 ldr r3, [pc, #72] ; (3068 <_vfiprintf_r+0x234>)
|
|
301e: 0029 movs r1, r5
|
|
3020: 0030 movs r0, r6
|
|
3022: e000 b.n 3026 <_vfiprintf_r+0x1f2>
|
|
3024: bf00 nop
|
|
3026: 9003 str r0, [sp, #12]
|
|
3028: 9b03 ldr r3, [sp, #12]
|
|
302a: 3301 adds r3, #1
|
|
302c: d1cc bne.n 2fc8 <_vfiprintf_r+0x194>
|
|
302e: 89bb ldrh r3, [r7, #12]
|
|
3030: 065b lsls r3, r3, #25
|
|
3032: d500 bpl.n 3036 <_vfiprintf_r+0x202>
|
|
3034: e77b b.n 2f2e <_vfiprintf_r+0xfa>
|
|
3036: 980b ldr r0, [sp, #44] ; 0x2c
|
|
3038: e77b b.n 2f32 <_vfiprintf_r+0xfe>
|
|
303a: ab05 add r3, sp, #20
|
|
303c: 9300 str r3, [sp, #0]
|
|
303e: 003a movs r2, r7
|
|
3040: 4b09 ldr r3, [pc, #36] ; (3068 <_vfiprintf_r+0x234>)
|
|
3042: 0029 movs r1, r5
|
|
3044: 0030 movs r0, r6
|
|
3046: f000 f87f bl 3148 <_printf_i>
|
|
304a: e7ec b.n 3026 <_vfiprintf_r+0x1f2>
|
|
304c: 000038cc .word 0x000038cc
|
|
3050: 0000390c .word 0x0000390c
|
|
3054: 000038ec .word 0x000038ec
|
|
3058: 000038ac .word 0x000038ac
|
|
305c: 00003912 .word 0x00003912
|
|
3060: 00003916 .word 0x00003916
|
|
3064: 00000000 .word 0x00000000
|
|
3068: 00002e0f .word 0x00002e0f
|
|
|
|
0000306c <_printf_common>:
|
|
306c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
|
|
306e: 0015 movs r5, r2
|
|
3070: 9301 str r3, [sp, #4]
|
|
3072: 688a ldr r2, [r1, #8]
|
|
3074: 690b ldr r3, [r1, #16]
|
|
3076: 9000 str r0, [sp, #0]
|
|
3078: 000c movs r4, r1
|
|
307a: 4293 cmp r3, r2
|
|
307c: da00 bge.n 3080 <_printf_common+0x14>
|
|
307e: 0013 movs r3, r2
|
|
3080: 0022 movs r2, r4
|
|
3082: 602b str r3, [r5, #0]
|
|
3084: 3243 adds r2, #67 ; 0x43
|
|
3086: 7812 ldrb r2, [r2, #0]
|
|
3088: 2a00 cmp r2, #0
|
|
308a: d001 beq.n 3090 <_printf_common+0x24>
|
|
308c: 3301 adds r3, #1
|
|
308e: 602b str r3, [r5, #0]
|
|
3090: 6823 ldr r3, [r4, #0]
|
|
3092: 069b lsls r3, r3, #26
|
|
3094: d502 bpl.n 309c <_printf_common+0x30>
|
|
3096: 682b ldr r3, [r5, #0]
|
|
3098: 3302 adds r3, #2
|
|
309a: 602b str r3, [r5, #0]
|
|
309c: 2706 movs r7, #6
|
|
309e: 6823 ldr r3, [r4, #0]
|
|
30a0: 401f ands r7, r3
|
|
30a2: d027 beq.n 30f4 <_printf_common+0x88>
|
|
30a4: 0023 movs r3, r4
|
|
30a6: 3343 adds r3, #67 ; 0x43
|
|
30a8: 781b ldrb r3, [r3, #0]
|
|
30aa: 1e5a subs r2, r3, #1
|
|
30ac: 4193 sbcs r3, r2
|
|
30ae: 6822 ldr r2, [r4, #0]
|
|
30b0: 0692 lsls r2, r2, #26
|
|
30b2: d430 bmi.n 3116 <_printf_common+0xaa>
|
|
30b4: 0022 movs r2, r4
|
|
30b6: 9901 ldr r1, [sp, #4]
|
|
30b8: 3243 adds r2, #67 ; 0x43
|
|
30ba: 9800 ldr r0, [sp, #0]
|
|
30bc: 9e08 ldr r6, [sp, #32]
|
|
30be: 47b0 blx r6
|
|
30c0: 1c43 adds r3, r0, #1
|
|
30c2: d025 beq.n 3110 <_printf_common+0xa4>
|
|
30c4: 2306 movs r3, #6
|
|
30c6: 6820 ldr r0, [r4, #0]
|
|
30c8: 682a ldr r2, [r5, #0]
|
|
30ca: 68e1 ldr r1, [r4, #12]
|
|
30cc: 4003 ands r3, r0
|
|
30ce: 2500 movs r5, #0
|
|
30d0: 2b04 cmp r3, #4
|
|
30d2: d103 bne.n 30dc <_printf_common+0x70>
|
|
30d4: 1a8d subs r5, r1, r2
|
|
30d6: 43eb mvns r3, r5
|
|
30d8: 17db asrs r3, r3, #31
|
|
30da: 401d ands r5, r3
|
|
30dc: 68a3 ldr r3, [r4, #8]
|
|
30de: 6922 ldr r2, [r4, #16]
|
|
30e0: 4293 cmp r3, r2
|
|
30e2: dd01 ble.n 30e8 <_printf_common+0x7c>
|
|
30e4: 1a9b subs r3, r3, r2
|
|
30e6: 18ed adds r5, r5, r3
|
|
30e8: 2700 movs r7, #0
|
|
30ea: 42bd cmp r5, r7
|
|
30ec: d120 bne.n 3130 <_printf_common+0xc4>
|
|
30ee: 2000 movs r0, #0
|
|
30f0: e010 b.n 3114 <_printf_common+0xa8>
|
|
30f2: 3701 adds r7, #1
|
|
30f4: 68e3 ldr r3, [r4, #12]
|
|
30f6: 682a ldr r2, [r5, #0]
|
|
30f8: 1a9b subs r3, r3, r2
|
|
30fa: 429f cmp r7, r3
|
|
30fc: dad2 bge.n 30a4 <_printf_common+0x38>
|
|
30fe: 0022 movs r2, r4
|
|
3100: 2301 movs r3, #1
|
|
3102: 3219 adds r2, #25
|
|
3104: 9901 ldr r1, [sp, #4]
|
|
3106: 9800 ldr r0, [sp, #0]
|
|
3108: 9e08 ldr r6, [sp, #32]
|
|
310a: 47b0 blx r6
|
|
310c: 1c43 adds r3, r0, #1
|
|
310e: d1f0 bne.n 30f2 <_printf_common+0x86>
|
|
3110: 2001 movs r0, #1
|
|
3112: 4240 negs r0, r0
|
|
3114: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc}
|
|
3116: 2030 movs r0, #48 ; 0x30
|
|
3118: 18e1 adds r1, r4, r3
|
|
311a: 3143 adds r1, #67 ; 0x43
|
|
311c: 7008 strb r0, [r1, #0]
|
|
311e: 0021 movs r1, r4
|
|
3120: 1c5a adds r2, r3, #1
|
|
3122: 3145 adds r1, #69 ; 0x45
|
|
3124: 7809 ldrb r1, [r1, #0]
|
|
3126: 18a2 adds r2, r4, r2
|
|
3128: 3243 adds r2, #67 ; 0x43
|
|
312a: 3302 adds r3, #2
|
|
312c: 7011 strb r1, [r2, #0]
|
|
312e: e7c1 b.n 30b4 <_printf_common+0x48>
|
|
3130: 0022 movs r2, r4
|
|
3132: 2301 movs r3, #1
|
|
3134: 321a adds r2, #26
|
|
3136: 9901 ldr r1, [sp, #4]
|
|
3138: 9800 ldr r0, [sp, #0]
|
|
313a: 9e08 ldr r6, [sp, #32]
|
|
313c: 47b0 blx r6
|
|
313e: 1c43 adds r3, r0, #1
|
|
3140: d0e6 beq.n 3110 <_printf_common+0xa4>
|
|
3142: 3701 adds r7, #1
|
|
3144: e7d1 b.n 30ea <_printf_common+0x7e>
|
|
...
|
|
|
|
00003148 <_printf_i>:
|
|
3148: b5f0 push {r4, r5, r6, r7, lr}
|
|
314a: b08b sub sp, #44 ; 0x2c
|
|
314c: 9206 str r2, [sp, #24]
|
|
314e: 000a movs r2, r1
|
|
3150: 3243 adds r2, #67 ; 0x43
|
|
3152: 9307 str r3, [sp, #28]
|
|
3154: 9005 str r0, [sp, #20]
|
|
3156: 9204 str r2, [sp, #16]
|
|
3158: 7e0a ldrb r2, [r1, #24]
|
|
315a: 000c movs r4, r1
|
|
315c: 9b10 ldr r3, [sp, #64] ; 0x40
|
|
315e: 2a6e cmp r2, #110 ; 0x6e
|
|
3160: d100 bne.n 3164 <_printf_i+0x1c>
|
|
3162: e08f b.n 3284 <_printf_i+0x13c>
|
|
3164: d817 bhi.n 3196 <_printf_i+0x4e>
|
|
3166: 2a63 cmp r2, #99 ; 0x63
|
|
3168: d02c beq.n 31c4 <_printf_i+0x7c>
|
|
316a: d808 bhi.n 317e <_printf_i+0x36>
|
|
316c: 2a00 cmp r2, #0
|
|
316e: d100 bne.n 3172 <_printf_i+0x2a>
|
|
3170: e099 b.n 32a6 <_printf_i+0x15e>
|
|
3172: 2a58 cmp r2, #88 ; 0x58
|
|
3174: d054 beq.n 3220 <_printf_i+0xd8>
|
|
3176: 0026 movs r6, r4
|
|
3178: 3642 adds r6, #66 ; 0x42
|
|
317a: 7032 strb r2, [r6, #0]
|
|
317c: e029 b.n 31d2 <_printf_i+0x8a>
|
|
317e: 2a64 cmp r2, #100 ; 0x64
|
|
3180: d001 beq.n 3186 <_printf_i+0x3e>
|
|
3182: 2a69 cmp r2, #105 ; 0x69
|
|
3184: d1f7 bne.n 3176 <_printf_i+0x2e>
|
|
3186: 6821 ldr r1, [r4, #0]
|
|
3188: 681a ldr r2, [r3, #0]
|
|
318a: 0608 lsls r0, r1, #24
|
|
318c: d523 bpl.n 31d6 <_printf_i+0x8e>
|
|
318e: 1d11 adds r1, r2, #4
|
|
3190: 6019 str r1, [r3, #0]
|
|
3192: 6815 ldr r5, [r2, #0]
|
|
3194: e025 b.n 31e2 <_printf_i+0x9a>
|
|
3196: 2a73 cmp r2, #115 ; 0x73
|
|
3198: d100 bne.n 319c <_printf_i+0x54>
|
|
319a: e088 b.n 32ae <_printf_i+0x166>
|
|
319c: d808 bhi.n 31b0 <_printf_i+0x68>
|
|
319e: 2a6f cmp r2, #111 ; 0x6f
|
|
31a0: d029 beq.n 31f6 <_printf_i+0xae>
|
|
31a2: 2a70 cmp r2, #112 ; 0x70
|
|
31a4: d1e7 bne.n 3176 <_printf_i+0x2e>
|
|
31a6: 2220 movs r2, #32
|
|
31a8: 6809 ldr r1, [r1, #0]
|
|
31aa: 430a orrs r2, r1
|
|
31ac: 6022 str r2, [r4, #0]
|
|
31ae: e003 b.n 31b8 <_printf_i+0x70>
|
|
31b0: 2a75 cmp r2, #117 ; 0x75
|
|
31b2: d020 beq.n 31f6 <_printf_i+0xae>
|
|
31b4: 2a78 cmp r2, #120 ; 0x78
|
|
31b6: d1de bne.n 3176 <_printf_i+0x2e>
|
|
31b8: 0022 movs r2, r4
|
|
31ba: 2178 movs r1, #120 ; 0x78
|
|
31bc: 3245 adds r2, #69 ; 0x45
|
|
31be: 7011 strb r1, [r2, #0]
|
|
31c0: 4a6c ldr r2, [pc, #432] ; (3374 <_printf_i+0x22c>)
|
|
31c2: e030 b.n 3226 <_printf_i+0xde>
|
|
31c4: 000e movs r6, r1
|
|
31c6: 681a ldr r2, [r3, #0]
|
|
31c8: 3642 adds r6, #66 ; 0x42
|
|
31ca: 1d11 adds r1, r2, #4
|
|
31cc: 6019 str r1, [r3, #0]
|
|
31ce: 6813 ldr r3, [r2, #0]
|
|
31d0: 7033 strb r3, [r6, #0]
|
|
31d2: 2301 movs r3, #1
|
|
31d4: e079 b.n 32ca <_printf_i+0x182>
|
|
31d6: 0649 lsls r1, r1, #25
|
|
31d8: d5d9 bpl.n 318e <_printf_i+0x46>
|
|
31da: 1d11 adds r1, r2, #4
|
|
31dc: 6019 str r1, [r3, #0]
|
|
31de: 2300 movs r3, #0
|
|
31e0: 5ed5 ldrsh r5, [r2, r3]
|
|
31e2: 2d00 cmp r5, #0
|
|
31e4: da03 bge.n 31ee <_printf_i+0xa6>
|
|
31e6: 232d movs r3, #45 ; 0x2d
|
|
31e8: 9a04 ldr r2, [sp, #16]
|
|
31ea: 426d negs r5, r5
|
|
31ec: 7013 strb r3, [r2, #0]
|
|
31ee: 4b62 ldr r3, [pc, #392] ; (3378 <_printf_i+0x230>)
|
|
31f0: 270a movs r7, #10
|
|
31f2: 9303 str r3, [sp, #12]
|
|
31f4: e02f b.n 3256 <_printf_i+0x10e>
|
|
31f6: 6820 ldr r0, [r4, #0]
|
|
31f8: 6819 ldr r1, [r3, #0]
|
|
31fa: 0605 lsls r5, r0, #24
|
|
31fc: d503 bpl.n 3206 <_printf_i+0xbe>
|
|
31fe: 1d08 adds r0, r1, #4
|
|
3200: 6018 str r0, [r3, #0]
|
|
3202: 680d ldr r5, [r1, #0]
|
|
3204: e005 b.n 3212 <_printf_i+0xca>
|
|
3206: 0640 lsls r0, r0, #25
|
|
3208: d5f9 bpl.n 31fe <_printf_i+0xb6>
|
|
320a: 680d ldr r5, [r1, #0]
|
|
320c: 1d08 adds r0, r1, #4
|
|
320e: 6018 str r0, [r3, #0]
|
|
3210: b2ad uxth r5, r5
|
|
3212: 4b59 ldr r3, [pc, #356] ; (3378 <_printf_i+0x230>)
|
|
3214: 2708 movs r7, #8
|
|
3216: 9303 str r3, [sp, #12]
|
|
3218: 2a6f cmp r2, #111 ; 0x6f
|
|
321a: d018 beq.n 324e <_printf_i+0x106>
|
|
321c: 270a movs r7, #10
|
|
321e: e016 b.n 324e <_printf_i+0x106>
|
|
3220: 3145 adds r1, #69 ; 0x45
|
|
3222: 700a strb r2, [r1, #0]
|
|
3224: 4a54 ldr r2, [pc, #336] ; (3378 <_printf_i+0x230>)
|
|
3226: 9203 str r2, [sp, #12]
|
|
3228: 681a ldr r2, [r3, #0]
|
|
322a: 6821 ldr r1, [r4, #0]
|
|
322c: 1d10 adds r0, r2, #4
|
|
322e: 6018 str r0, [r3, #0]
|
|
3230: 6815 ldr r5, [r2, #0]
|
|
3232: 0608 lsls r0, r1, #24
|
|
3234: d522 bpl.n 327c <_printf_i+0x134>
|
|
3236: 07cb lsls r3, r1, #31
|
|
3238: d502 bpl.n 3240 <_printf_i+0xf8>
|
|
323a: 2320 movs r3, #32
|
|
323c: 4319 orrs r1, r3
|
|
323e: 6021 str r1, [r4, #0]
|
|
3240: 2710 movs r7, #16
|
|
3242: 2d00 cmp r5, #0
|
|
3244: d103 bne.n 324e <_printf_i+0x106>
|
|
3246: 2320 movs r3, #32
|
|
3248: 6822 ldr r2, [r4, #0]
|
|
324a: 439a bics r2, r3
|
|
324c: 6022 str r2, [r4, #0]
|
|
324e: 0023 movs r3, r4
|
|
3250: 2200 movs r2, #0
|
|
3252: 3343 adds r3, #67 ; 0x43
|
|
3254: 701a strb r2, [r3, #0]
|
|
3256: 6863 ldr r3, [r4, #4]
|
|
3258: 60a3 str r3, [r4, #8]
|
|
325a: 2b00 cmp r3, #0
|
|
325c: db5c blt.n 3318 <_printf_i+0x1d0>
|
|
325e: 2204 movs r2, #4
|
|
3260: 6821 ldr r1, [r4, #0]
|
|
3262: 4391 bics r1, r2
|
|
3264: 6021 str r1, [r4, #0]
|
|
3266: 2d00 cmp r5, #0
|
|
3268: d158 bne.n 331c <_printf_i+0x1d4>
|
|
326a: 9e04 ldr r6, [sp, #16]
|
|
326c: 2b00 cmp r3, #0
|
|
326e: d064 beq.n 333a <_printf_i+0x1f2>
|
|
3270: 0026 movs r6, r4
|
|
3272: 9b03 ldr r3, [sp, #12]
|
|
3274: 3642 adds r6, #66 ; 0x42
|
|
3276: 781b ldrb r3, [r3, #0]
|
|
3278: 7033 strb r3, [r6, #0]
|
|
327a: e05e b.n 333a <_printf_i+0x1f2>
|
|
327c: 0648 lsls r0, r1, #25
|
|
327e: d5da bpl.n 3236 <_printf_i+0xee>
|
|
3280: b2ad uxth r5, r5
|
|
3282: e7d8 b.n 3236 <_printf_i+0xee>
|
|
3284: 6809 ldr r1, [r1, #0]
|
|
3286: 681a ldr r2, [r3, #0]
|
|
3288: 0608 lsls r0, r1, #24
|
|
328a: d505 bpl.n 3298 <_printf_i+0x150>
|
|
328c: 1d11 adds r1, r2, #4
|
|
328e: 6019 str r1, [r3, #0]
|
|
3290: 6813 ldr r3, [r2, #0]
|
|
3292: 6962 ldr r2, [r4, #20]
|
|
3294: 601a str r2, [r3, #0]
|
|
3296: e006 b.n 32a6 <_printf_i+0x15e>
|
|
3298: 0649 lsls r1, r1, #25
|
|
329a: d5f7 bpl.n 328c <_printf_i+0x144>
|
|
329c: 1d11 adds r1, r2, #4
|
|
329e: 6019 str r1, [r3, #0]
|
|
32a0: 6813 ldr r3, [r2, #0]
|
|
32a2: 8aa2 ldrh r2, [r4, #20]
|
|
32a4: 801a strh r2, [r3, #0]
|
|
32a6: 2300 movs r3, #0
|
|
32a8: 9e04 ldr r6, [sp, #16]
|
|
32aa: 6123 str r3, [r4, #16]
|
|
32ac: e054 b.n 3358 <_printf_i+0x210>
|
|
32ae: 681a ldr r2, [r3, #0]
|
|
32b0: 1d11 adds r1, r2, #4
|
|
32b2: 6019 str r1, [r3, #0]
|
|
32b4: 6816 ldr r6, [r2, #0]
|
|
32b6: 2100 movs r1, #0
|
|
32b8: 6862 ldr r2, [r4, #4]
|
|
32ba: 0030 movs r0, r6
|
|
32bc: f000 f9e6 bl 368c <memchr>
|
|
32c0: 2800 cmp r0, #0
|
|
32c2: d001 beq.n 32c8 <_printf_i+0x180>
|
|
32c4: 1b80 subs r0, r0, r6
|
|
32c6: 6060 str r0, [r4, #4]
|
|
32c8: 6863 ldr r3, [r4, #4]
|
|
32ca: 6123 str r3, [r4, #16]
|
|
32cc: 2300 movs r3, #0
|
|
32ce: 9a04 ldr r2, [sp, #16]
|
|
32d0: 7013 strb r3, [r2, #0]
|
|
32d2: e041 b.n 3358 <_printf_i+0x210>
|
|
32d4: 6923 ldr r3, [r4, #16]
|
|
32d6: 0032 movs r2, r6
|
|
32d8: 9906 ldr r1, [sp, #24]
|
|
32da: 9805 ldr r0, [sp, #20]
|
|
32dc: 9d07 ldr r5, [sp, #28]
|
|
32de: 47a8 blx r5
|
|
32e0: 1c43 adds r3, r0, #1
|
|
32e2: d043 beq.n 336c <_printf_i+0x224>
|
|
32e4: 6823 ldr r3, [r4, #0]
|
|
32e6: 2500 movs r5, #0
|
|
32e8: 079b lsls r3, r3, #30
|
|
32ea: d40f bmi.n 330c <_printf_i+0x1c4>
|
|
32ec: 9b09 ldr r3, [sp, #36] ; 0x24
|
|
32ee: 68e0 ldr r0, [r4, #12]
|
|
32f0: 4298 cmp r0, r3
|
|
32f2: da3d bge.n 3370 <_printf_i+0x228>
|
|
32f4: 0018 movs r0, r3
|
|
32f6: e03b b.n 3370 <_printf_i+0x228>
|
|
32f8: 0022 movs r2, r4
|
|
32fa: 2301 movs r3, #1
|
|
32fc: 3219 adds r2, #25
|
|
32fe: 9906 ldr r1, [sp, #24]
|
|
3300: 9805 ldr r0, [sp, #20]
|
|
3302: 9e07 ldr r6, [sp, #28]
|
|
3304: 47b0 blx r6
|
|
3306: 1c43 adds r3, r0, #1
|
|
3308: d030 beq.n 336c <_printf_i+0x224>
|
|
330a: 3501 adds r5, #1
|
|
330c: 68e3 ldr r3, [r4, #12]
|
|
330e: 9a09 ldr r2, [sp, #36] ; 0x24
|
|
3310: 1a9b subs r3, r3, r2
|
|
3312: 429d cmp r5, r3
|
|
3314: dbf0 blt.n 32f8 <_printf_i+0x1b0>
|
|
3316: e7e9 b.n 32ec <_printf_i+0x1a4>
|
|
3318: 2d00 cmp r5, #0
|
|
331a: d0a9 beq.n 3270 <_printf_i+0x128>
|
|
331c: 9e04 ldr r6, [sp, #16]
|
|
331e: 0028 movs r0, r5
|
|
3320: 0039 movs r1, r7
|
|
3322: f7fe fded bl 1f00 <__aeabi_uidivmod>
|
|
3326: 9b03 ldr r3, [sp, #12]
|
|
3328: 3e01 subs r6, #1
|
|
332a: 5c5b ldrb r3, [r3, r1]
|
|
332c: 0028 movs r0, r5
|
|
332e: 7033 strb r3, [r6, #0]
|
|
3330: 0039 movs r1, r7
|
|
3332: f7fe fd5f bl 1df4 <__udivsi3>
|
|
3336: 1e05 subs r5, r0, #0
|
|
3338: d1f1 bne.n 331e <_printf_i+0x1d6>
|
|
333a: 2f08 cmp r7, #8
|
|
333c: d109 bne.n 3352 <_printf_i+0x20a>
|
|
333e: 6823 ldr r3, [r4, #0]
|
|
3340: 07db lsls r3, r3, #31
|
|
3342: d506 bpl.n 3352 <_printf_i+0x20a>
|
|
3344: 6863 ldr r3, [r4, #4]
|
|
3346: 6922 ldr r2, [r4, #16]
|
|
3348: 4293 cmp r3, r2
|
|
334a: dc02 bgt.n 3352 <_printf_i+0x20a>
|
|
334c: 2330 movs r3, #48 ; 0x30
|
|
334e: 3e01 subs r6, #1
|
|
3350: 7033 strb r3, [r6, #0]
|
|
3352: 9b04 ldr r3, [sp, #16]
|
|
3354: 1b9b subs r3, r3, r6
|
|
3356: 6123 str r3, [r4, #16]
|
|
3358: 9b07 ldr r3, [sp, #28]
|
|
335a: aa09 add r2, sp, #36 ; 0x24
|
|
335c: 9300 str r3, [sp, #0]
|
|
335e: 0021 movs r1, r4
|
|
3360: 9b06 ldr r3, [sp, #24]
|
|
3362: 9805 ldr r0, [sp, #20]
|
|
3364: f7ff fe82 bl 306c <_printf_common>
|
|
3368: 1c43 adds r3, r0, #1
|
|
336a: d1b3 bne.n 32d4 <_printf_i+0x18c>
|
|
336c: 2001 movs r0, #1
|
|
336e: 4240 negs r0, r0
|
|
3370: b00b add sp, #44 ; 0x2c
|
|
3372: bdf0 pop {r4, r5, r6, r7, pc}
|
|
3374: 0000392e .word 0x0000392e
|
|
3378: 0000391d .word 0x0000391d
|
|
|
|
0000337c <_sbrk_r>:
|
|
337c: 2300 movs r3, #0
|
|
337e: b570 push {r4, r5, r6, lr}
|
|
3380: 4c06 ldr r4, [pc, #24] ; (339c <_sbrk_r+0x20>)
|
|
3382: 0005 movs r5, r0
|
|
3384: 0008 movs r0, r1
|
|
3386: 6023 str r3, [r4, #0]
|
|
3388: f7fe fcd4 bl 1d34 <_sbrk>
|
|
338c: 1c43 adds r3, r0, #1
|
|
338e: d103 bne.n 3398 <_sbrk_r+0x1c>
|
|
3390: 6823 ldr r3, [r4, #0]
|
|
3392: 2b00 cmp r3, #0
|
|
3394: d000 beq.n 3398 <_sbrk_r+0x1c>
|
|
3396: 602b str r3, [r5, #0]
|
|
3398: bd70 pop {r4, r5, r6, pc}
|
|
339a: 46c0 nop ; (mov r8, r8)
|
|
339c: 2000029c .word 0x2000029c
|
|
|
|
000033a0 <__sread>:
|
|
33a0: b570 push {r4, r5, r6, lr}
|
|
33a2: 000c movs r4, r1
|
|
33a4: 250e movs r5, #14
|
|
33a6: 5f49 ldrsh r1, [r1, r5]
|
|
33a8: f000 f97e bl 36a8 <_read_r>
|
|
33ac: 2800 cmp r0, #0
|
|
33ae: db03 blt.n 33b8 <__sread+0x18>
|
|
33b0: 6d63 ldr r3, [r4, #84] ; 0x54
|
|
33b2: 181b adds r3, r3, r0
|
|
33b4: 6563 str r3, [r4, #84] ; 0x54
|
|
33b6: bd70 pop {r4, r5, r6, pc}
|
|
33b8: 89a3 ldrh r3, [r4, #12]
|
|
33ba: 4a02 ldr r2, [pc, #8] ; (33c4 <__sread+0x24>)
|
|
33bc: 4013 ands r3, r2
|
|
33be: 81a3 strh r3, [r4, #12]
|
|
33c0: e7f9 b.n 33b6 <__sread+0x16>
|
|
33c2: 46c0 nop ; (mov r8, r8)
|
|
33c4: ffffefff .word 0xffffefff
|
|
|
|
000033c8 <__swrite>:
|
|
33c8: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
33ca: 001f movs r7, r3
|
|
33cc: 898b ldrh r3, [r1, #12]
|
|
33ce: 0005 movs r5, r0
|
|
33d0: 000c movs r4, r1
|
|
33d2: 0016 movs r6, r2
|
|
33d4: 05db lsls r3, r3, #23
|
|
33d6: d505 bpl.n 33e4 <__swrite+0x1c>
|
|
33d8: 230e movs r3, #14
|
|
33da: 5ec9 ldrsh r1, [r1, r3]
|
|
33dc: 2200 movs r2, #0
|
|
33de: 2302 movs r3, #2
|
|
33e0: f000 f940 bl 3664 <_lseek_r>
|
|
33e4: 89a3 ldrh r3, [r4, #12]
|
|
33e6: 4a05 ldr r2, [pc, #20] ; (33fc <__swrite+0x34>)
|
|
33e8: 0028 movs r0, r5
|
|
33ea: 4013 ands r3, r2
|
|
33ec: 81a3 strh r3, [r4, #12]
|
|
33ee: 0032 movs r2, r6
|
|
33f0: 230e movs r3, #14
|
|
33f2: 5ee1 ldrsh r1, [r4, r3]
|
|
33f4: 003b movs r3, r7
|
|
33f6: f000 f875 bl 34e4 <_write_r>
|
|
33fa: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
33fc: ffffefff .word 0xffffefff
|
|
|
|
00003400 <__sseek>:
|
|
3400: b570 push {r4, r5, r6, lr}
|
|
3402: 000c movs r4, r1
|
|
3404: 250e movs r5, #14
|
|
3406: 5f49 ldrsh r1, [r1, r5]
|
|
3408: f000 f92c bl 3664 <_lseek_r>
|
|
340c: 89a3 ldrh r3, [r4, #12]
|
|
340e: 1c42 adds r2, r0, #1
|
|
3410: d103 bne.n 341a <__sseek+0x1a>
|
|
3412: 4a05 ldr r2, [pc, #20] ; (3428 <__sseek+0x28>)
|
|
3414: 4013 ands r3, r2
|
|
3416: 81a3 strh r3, [r4, #12]
|
|
3418: bd70 pop {r4, r5, r6, pc}
|
|
341a: 2280 movs r2, #128 ; 0x80
|
|
341c: 0152 lsls r2, r2, #5
|
|
341e: 4313 orrs r3, r2
|
|
3420: 81a3 strh r3, [r4, #12]
|
|
3422: 6560 str r0, [r4, #84] ; 0x54
|
|
3424: e7f8 b.n 3418 <__sseek+0x18>
|
|
3426: 46c0 nop ; (mov r8, r8)
|
|
3428: ffffefff .word 0xffffefff
|
|
|
|
0000342c <__sclose>:
|
|
342c: b510 push {r4, lr}
|
|
342e: 230e movs r3, #14
|
|
3430: 5ec9 ldrsh r1, [r1, r3]
|
|
3432: f000 f8e1 bl 35f8 <_close_r>
|
|
3436: bd10 pop {r4, pc}
|
|
|
|
00003438 <__swbuf_r>:
|
|
3438: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
343a: 0005 movs r5, r0
|
|
343c: 000e movs r6, r1
|
|
343e: 0014 movs r4, r2
|
|
3440: 2800 cmp r0, #0
|
|
3442: d004 beq.n 344e <__swbuf_r+0x16>
|
|
3444: 6983 ldr r3, [r0, #24]
|
|
3446: 2b00 cmp r3, #0
|
|
3448: d101 bne.n 344e <__swbuf_r+0x16>
|
|
344a: f7ff fb17 bl 2a7c <__sinit>
|
|
344e: 4b22 ldr r3, [pc, #136] ; (34d8 <__swbuf_r+0xa0>)
|
|
3450: 429c cmp r4, r3
|
|
3452: d12d bne.n 34b0 <__swbuf_r+0x78>
|
|
3454: 686c ldr r4, [r5, #4]
|
|
3456: 69a3 ldr r3, [r4, #24]
|
|
3458: 60a3 str r3, [r4, #8]
|
|
345a: 89a3 ldrh r3, [r4, #12]
|
|
345c: 071b lsls r3, r3, #28
|
|
345e: d531 bpl.n 34c4 <__swbuf_r+0x8c>
|
|
3460: 6923 ldr r3, [r4, #16]
|
|
3462: 2b00 cmp r3, #0
|
|
3464: d02e beq.n 34c4 <__swbuf_r+0x8c>
|
|
3466: 6823 ldr r3, [r4, #0]
|
|
3468: 6922 ldr r2, [r4, #16]
|
|
346a: b2f7 uxtb r7, r6
|
|
346c: 1a98 subs r0, r3, r2
|
|
346e: 6963 ldr r3, [r4, #20]
|
|
3470: b2f6 uxtb r6, r6
|
|
3472: 4298 cmp r0, r3
|
|
3474: db05 blt.n 3482 <__swbuf_r+0x4a>
|
|
3476: 0021 movs r1, r4
|
|
3478: 0028 movs r0, r5
|
|
347a: f7ff fa91 bl 29a0 <_fflush_r>
|
|
347e: 2800 cmp r0, #0
|
|
3480: d126 bne.n 34d0 <__swbuf_r+0x98>
|
|
3482: 68a3 ldr r3, [r4, #8]
|
|
3484: 3001 adds r0, #1
|
|
3486: 3b01 subs r3, #1
|
|
3488: 60a3 str r3, [r4, #8]
|
|
348a: 6823 ldr r3, [r4, #0]
|
|
348c: 1c5a adds r2, r3, #1
|
|
348e: 6022 str r2, [r4, #0]
|
|
3490: 701f strb r7, [r3, #0]
|
|
3492: 6963 ldr r3, [r4, #20]
|
|
3494: 4298 cmp r0, r3
|
|
3496: d004 beq.n 34a2 <__swbuf_r+0x6a>
|
|
3498: 89a3 ldrh r3, [r4, #12]
|
|
349a: 07db lsls r3, r3, #31
|
|
349c: d51a bpl.n 34d4 <__swbuf_r+0x9c>
|
|
349e: 2e0a cmp r6, #10
|
|
34a0: d118 bne.n 34d4 <__swbuf_r+0x9c>
|
|
34a2: 0021 movs r1, r4
|
|
34a4: 0028 movs r0, r5
|
|
34a6: f7ff fa7b bl 29a0 <_fflush_r>
|
|
34aa: 2800 cmp r0, #0
|
|
34ac: d012 beq.n 34d4 <__swbuf_r+0x9c>
|
|
34ae: e00f b.n 34d0 <__swbuf_r+0x98>
|
|
34b0: 4b0a ldr r3, [pc, #40] ; (34dc <__swbuf_r+0xa4>)
|
|
34b2: 429c cmp r4, r3
|
|
34b4: d101 bne.n 34ba <__swbuf_r+0x82>
|
|
34b6: 68ac ldr r4, [r5, #8]
|
|
34b8: e7cd b.n 3456 <__swbuf_r+0x1e>
|
|
34ba: 4b09 ldr r3, [pc, #36] ; (34e0 <__swbuf_r+0xa8>)
|
|
34bc: 429c cmp r4, r3
|
|
34be: d1ca bne.n 3456 <__swbuf_r+0x1e>
|
|
34c0: 68ec ldr r4, [r5, #12]
|
|
34c2: e7c8 b.n 3456 <__swbuf_r+0x1e>
|
|
34c4: 0021 movs r1, r4
|
|
34c6: 0028 movs r0, r5
|
|
34c8: f000 f820 bl 350c <__swsetup_r>
|
|
34cc: 2800 cmp r0, #0
|
|
34ce: d0ca beq.n 3466 <__swbuf_r+0x2e>
|
|
34d0: 2601 movs r6, #1
|
|
34d2: 4276 negs r6, r6
|
|
34d4: 0030 movs r0, r6
|
|
34d6: bdf8 pop {r3, r4, r5, r6, r7, pc}
|
|
34d8: 000038cc .word 0x000038cc
|
|
34dc: 000038ec .word 0x000038ec
|
|
34e0: 000038ac .word 0x000038ac
|
|
|
|
000034e4 <_write_r>:
|
|
34e4: b570 push {r4, r5, r6, lr}
|
|
34e6: 0005 movs r5, r0
|
|
34e8: 0008 movs r0, r1
|
|
34ea: 0011 movs r1, r2
|
|
34ec: 2200 movs r2, #0
|
|
34ee: 4c06 ldr r4, [pc, #24] ; (3508 <_write_r+0x24>)
|
|
34f0: 6022 str r2, [r4, #0]
|
|
34f2: 001a movs r2, r3
|
|
34f4: f7fd fbb8 bl c68 <_write>
|
|
34f8: 1c43 adds r3, r0, #1
|
|
34fa: d103 bne.n 3504 <_write_r+0x20>
|
|
34fc: 6823 ldr r3, [r4, #0]
|
|
34fe: 2b00 cmp r3, #0
|
|
3500: d000 beq.n 3504 <_write_r+0x20>
|
|
3502: 602b str r3, [r5, #0]
|
|
3504: bd70 pop {r4, r5, r6, pc}
|
|
3506: 46c0 nop ; (mov r8, r8)
|
|
3508: 2000029c .word 0x2000029c
|
|
|
|
0000350c <__swsetup_r>:
|
|
350c: 4b36 ldr r3, [pc, #216] ; (35e8 <__swsetup_r+0xdc>)
|
|
350e: b570 push {r4, r5, r6, lr}
|
|
3510: 681d ldr r5, [r3, #0]
|
|
3512: 0006 movs r6, r0
|
|
3514: 000c movs r4, r1
|
|
3516: 2d00 cmp r5, #0
|
|
3518: d005 beq.n 3526 <__swsetup_r+0x1a>
|
|
351a: 69ab ldr r3, [r5, #24]
|
|
351c: 2b00 cmp r3, #0
|
|
351e: d102 bne.n 3526 <__swsetup_r+0x1a>
|
|
3520: 0028 movs r0, r5
|
|
3522: f7ff faab bl 2a7c <__sinit>
|
|
3526: 4b31 ldr r3, [pc, #196] ; (35ec <__swsetup_r+0xe0>)
|
|
3528: 429c cmp r4, r3
|
|
352a: d10f bne.n 354c <__swsetup_r+0x40>
|
|
352c: 686c ldr r4, [r5, #4]
|
|
352e: 230c movs r3, #12
|
|
3530: 5ee2 ldrsh r2, [r4, r3]
|
|
3532: b293 uxth r3, r2
|
|
3534: 0719 lsls r1, r3, #28
|
|
3536: d42d bmi.n 3594 <__swsetup_r+0x88>
|
|
3538: 06d9 lsls r1, r3, #27
|
|
353a: d411 bmi.n 3560 <__swsetup_r+0x54>
|
|
353c: 2309 movs r3, #9
|
|
353e: 2001 movs r0, #1
|
|
3540: 6033 str r3, [r6, #0]
|
|
3542: 3337 adds r3, #55 ; 0x37
|
|
3544: 4313 orrs r3, r2
|
|
3546: 81a3 strh r3, [r4, #12]
|
|
3548: 4240 negs r0, r0
|
|
354a: bd70 pop {r4, r5, r6, pc}
|
|
354c: 4b28 ldr r3, [pc, #160] ; (35f0 <__swsetup_r+0xe4>)
|
|
354e: 429c cmp r4, r3
|
|
3550: d101 bne.n 3556 <__swsetup_r+0x4a>
|
|
3552: 68ac ldr r4, [r5, #8]
|
|
3554: e7eb b.n 352e <__swsetup_r+0x22>
|
|
3556: 4b27 ldr r3, [pc, #156] ; (35f4 <__swsetup_r+0xe8>)
|
|
3558: 429c cmp r4, r3
|
|
355a: d1e8 bne.n 352e <__swsetup_r+0x22>
|
|
355c: 68ec ldr r4, [r5, #12]
|
|
355e: e7e6 b.n 352e <__swsetup_r+0x22>
|
|
3560: 075b lsls r3, r3, #29
|
|
3562: d513 bpl.n 358c <__swsetup_r+0x80>
|
|
3564: 6b61 ldr r1, [r4, #52] ; 0x34
|
|
3566: 2900 cmp r1, #0
|
|
3568: d008 beq.n 357c <__swsetup_r+0x70>
|
|
356a: 0023 movs r3, r4
|
|
356c: 3344 adds r3, #68 ; 0x44
|
|
356e: 4299 cmp r1, r3
|
|
3570: d002 beq.n 3578 <__swsetup_r+0x6c>
|
|
3572: 0030 movs r0, r6
|
|
3574: f7ff fb8e bl 2c94 <_free_r>
|
|
3578: 2300 movs r3, #0
|
|
357a: 6363 str r3, [r4, #52] ; 0x34
|
|
357c: 2224 movs r2, #36 ; 0x24
|
|
357e: 89a3 ldrh r3, [r4, #12]
|
|
3580: 4393 bics r3, r2
|
|
3582: 81a3 strh r3, [r4, #12]
|
|
3584: 2300 movs r3, #0
|
|
3586: 6063 str r3, [r4, #4]
|
|
3588: 6923 ldr r3, [r4, #16]
|
|
358a: 6023 str r3, [r4, #0]
|
|
358c: 2308 movs r3, #8
|
|
358e: 89a2 ldrh r2, [r4, #12]
|
|
3590: 4313 orrs r3, r2
|
|
3592: 81a3 strh r3, [r4, #12]
|
|
3594: 6923 ldr r3, [r4, #16]
|
|
3596: 2b00 cmp r3, #0
|
|
3598: d10b bne.n 35b2 <__swsetup_r+0xa6>
|
|
359a: 21a0 movs r1, #160 ; 0xa0
|
|
359c: 2280 movs r2, #128 ; 0x80
|
|
359e: 89a3 ldrh r3, [r4, #12]
|
|
35a0: 0089 lsls r1, r1, #2
|
|
35a2: 0092 lsls r2, r2, #2
|
|
35a4: 400b ands r3, r1
|
|
35a6: 4293 cmp r3, r2
|
|
35a8: d003 beq.n 35b2 <__swsetup_r+0xa6>
|
|
35aa: 0021 movs r1, r4
|
|
35ac: 0030 movs r0, r6
|
|
35ae: f7ff fb23 bl 2bf8 <__smakebuf_r>
|
|
35b2: 2301 movs r3, #1
|
|
35b4: 89a2 ldrh r2, [r4, #12]
|
|
35b6: 4013 ands r3, r2
|
|
35b8: d011 beq.n 35de <__swsetup_r+0xd2>
|
|
35ba: 2300 movs r3, #0
|
|
35bc: 60a3 str r3, [r4, #8]
|
|
35be: 6963 ldr r3, [r4, #20]
|
|
35c0: 425b negs r3, r3
|
|
35c2: 61a3 str r3, [r4, #24]
|
|
35c4: 2000 movs r0, #0
|
|
35c6: 6923 ldr r3, [r4, #16]
|
|
35c8: 4283 cmp r3, r0
|
|
35ca: d1be bne.n 354a <__swsetup_r+0x3e>
|
|
35cc: 230c movs r3, #12
|
|
35ce: 5ee2 ldrsh r2, [r4, r3]
|
|
35d0: 0613 lsls r3, r2, #24
|
|
35d2: d5ba bpl.n 354a <__swsetup_r+0x3e>
|
|
35d4: 2340 movs r3, #64 ; 0x40
|
|
35d6: 4313 orrs r3, r2
|
|
35d8: 81a3 strh r3, [r4, #12]
|
|
35da: 3801 subs r0, #1
|
|
35dc: e7b5 b.n 354a <__swsetup_r+0x3e>
|
|
35de: 0792 lsls r2, r2, #30
|
|
35e0: d400 bmi.n 35e4 <__swsetup_r+0xd8>
|
|
35e2: 6963 ldr r3, [r4, #20]
|
|
35e4: 60a3 str r3, [r4, #8]
|
|
35e6: e7ed b.n 35c4 <__swsetup_r+0xb8>
|
|
35e8: 20000018 .word 0x20000018
|
|
35ec: 000038cc .word 0x000038cc
|
|
35f0: 000038ec .word 0x000038ec
|
|
35f4: 000038ac .word 0x000038ac
|
|
|
|
000035f8 <_close_r>:
|
|
35f8: 2300 movs r3, #0
|
|
35fa: b570 push {r4, r5, r6, lr}
|
|
35fc: 4c06 ldr r4, [pc, #24] ; (3618 <_close_r+0x20>)
|
|
35fe: 0005 movs r5, r0
|
|
3600: 0008 movs r0, r1
|
|
3602: 6023 str r3, [r4, #0]
|
|
3604: f7fe fba8 bl 1d58 <_close>
|
|
3608: 1c43 adds r3, r0, #1
|
|
360a: d103 bne.n 3614 <_close_r+0x1c>
|
|
360c: 6823 ldr r3, [r4, #0]
|
|
360e: 2b00 cmp r3, #0
|
|
3610: d000 beq.n 3614 <_close_r+0x1c>
|
|
3612: 602b str r3, [r5, #0]
|
|
3614: bd70 pop {r4, r5, r6, pc}
|
|
3616: 46c0 nop ; (mov r8, r8)
|
|
3618: 2000029c .word 0x2000029c
|
|
|
|
0000361c <_fstat_r>:
|
|
361c: 2300 movs r3, #0
|
|
361e: b570 push {r4, r5, r6, lr}
|
|
3620: 4c06 ldr r4, [pc, #24] ; (363c <_fstat_r+0x20>)
|
|
3622: 0005 movs r5, r0
|
|
3624: 0008 movs r0, r1
|
|
3626: 0011 movs r1, r2
|
|
3628: 6023 str r3, [r4, #0]
|
|
362a: f7fe fb98 bl 1d5e <_fstat>
|
|
362e: 1c43 adds r3, r0, #1
|
|
3630: d103 bne.n 363a <_fstat_r+0x1e>
|
|
3632: 6823 ldr r3, [r4, #0]
|
|
3634: 2b00 cmp r3, #0
|
|
3636: d000 beq.n 363a <_fstat_r+0x1e>
|
|
3638: 602b str r3, [r5, #0]
|
|
363a: bd70 pop {r4, r5, r6, pc}
|
|
363c: 2000029c .word 0x2000029c
|
|
|
|
00003640 <_isatty_r>:
|
|
3640: 2300 movs r3, #0
|
|
3642: b570 push {r4, r5, r6, lr}
|
|
3644: 4c06 ldr r4, [pc, #24] ; (3660 <_isatty_r+0x20>)
|
|
3646: 0005 movs r5, r0
|
|
3648: 0008 movs r0, r1
|
|
364a: 6023 str r3, [r4, #0]
|
|
364c: f7fe fb8c bl 1d68 <_isatty>
|
|
3650: 1c43 adds r3, r0, #1
|
|
3652: d103 bne.n 365c <_isatty_r+0x1c>
|
|
3654: 6823 ldr r3, [r4, #0]
|
|
3656: 2b00 cmp r3, #0
|
|
3658: d000 beq.n 365c <_isatty_r+0x1c>
|
|
365a: 602b str r3, [r5, #0]
|
|
365c: bd70 pop {r4, r5, r6, pc}
|
|
365e: 46c0 nop ; (mov r8, r8)
|
|
3660: 2000029c .word 0x2000029c
|
|
|
|
00003664 <_lseek_r>:
|
|
3664: b570 push {r4, r5, r6, lr}
|
|
3666: 0005 movs r5, r0
|
|
3668: 0008 movs r0, r1
|
|
366a: 0011 movs r1, r2
|
|
366c: 2200 movs r2, #0
|
|
366e: 4c06 ldr r4, [pc, #24] ; (3688 <_lseek_r+0x24>)
|
|
3670: 6022 str r2, [r4, #0]
|
|
3672: 001a movs r2, r3
|
|
3674: f7fe fb7a bl 1d6c <_lseek>
|
|
3678: 1c43 adds r3, r0, #1
|
|
367a: d103 bne.n 3684 <_lseek_r+0x20>
|
|
367c: 6823 ldr r3, [r4, #0]
|
|
367e: 2b00 cmp r3, #0
|
|
3680: d000 beq.n 3684 <_lseek_r+0x20>
|
|
3682: 602b str r3, [r5, #0]
|
|
3684: bd70 pop {r4, r5, r6, pc}
|
|
3686: 46c0 nop ; (mov r8, r8)
|
|
3688: 2000029c .word 0x2000029c
|
|
|
|
0000368c <memchr>:
|
|
368c: b2c9 uxtb r1, r1
|
|
368e: 1882 adds r2, r0, r2
|
|
3690: 4290 cmp r0, r2
|
|
3692: d101 bne.n 3698 <memchr+0xc>
|
|
3694: 2000 movs r0, #0
|
|
3696: 4770 bx lr
|
|
3698: 7803 ldrb r3, [r0, #0]
|
|
369a: 428b cmp r3, r1
|
|
369c: d0fb beq.n 3696 <memchr+0xa>
|
|
369e: 3001 adds r0, #1
|
|
36a0: e7f6 b.n 3690 <memchr+0x4>
|
|
|
|
000036a2 <__malloc_lock>:
|
|
36a2: 4770 bx lr
|
|
|
|
000036a4 <__malloc_unlock>:
|
|
36a4: 4770 bx lr
|
|
...
|
|
|
|
000036a8 <_read_r>:
|
|
36a8: b570 push {r4, r5, r6, lr}
|
|
36aa: 0005 movs r5, r0
|
|
36ac: 0008 movs r0, r1
|
|
36ae: 0011 movs r1, r2
|
|
36b0: 2200 movs r2, #0
|
|
36b2: 4c06 ldr r4, [pc, #24] ; (36cc <_read_r+0x24>)
|
|
36b4: 6022 str r2, [r4, #0]
|
|
36b6: 001a movs r2, r3
|
|
36b8: f7fd fab4 bl c24 <_read>
|
|
36bc: 1c43 adds r3, r0, #1
|
|
36be: d103 bne.n 36c8 <_read_r+0x20>
|
|
36c0: 6823 ldr r3, [r4, #0]
|
|
36c2: 2b00 cmp r3, #0
|
|
36c4: d000 beq.n 36c8 <_read_r+0x20>
|
|
36c6: 602b str r3, [r5, #0]
|
|
36c8: bd70 pop {r4, r5, r6, pc}
|
|
36ca: 46c0 nop ; (mov r8, r8)
|
|
36cc: 2000029c .word 0x2000029c
|
|
36d0: 000002fa .word 0x000002fa
|
|
36d4: 00000540 .word 0x00000540
|
|
36d8: 00000540 .word 0x00000540
|
|
36dc: 00000540 .word 0x00000540
|
|
36e0: 00000540 .word 0x00000540
|
|
36e4: 00000540 .word 0x00000540
|
|
36e8: 00000540 .word 0x00000540
|
|
36ec: 00000540 .word 0x00000540
|
|
36f0: 00000540 .word 0x00000540
|
|
36f4: 00000540 .word 0x00000540
|
|
36f8: 00000540 .word 0x00000540
|
|
36fc: 00000540 .word 0x00000540
|
|
3700: 00000540 .word 0x00000540
|
|
3704: 00000540 .word 0x00000540
|
|
3708: 00000540 .word 0x00000540
|
|
370c: 00000540 .word 0x00000540
|
|
3710: 000002e2 .word 0x000002e2
|
|
3714: 00000540 .word 0x00000540
|
|
3718: 00000540 .word 0x00000540
|
|
371c: 00000540 .word 0x00000540
|
|
3720: 00000540 .word 0x00000540
|
|
3724: 00000540 .word 0x00000540
|
|
3728: 00000540 .word 0x00000540
|
|
372c: 00000540 .word 0x00000540
|
|
3730: 00000540 .word 0x00000540
|
|
3734: 00000540 .word 0x00000540
|
|
3738: 00000540 .word 0x00000540
|
|
373c: 00000540 .word 0x00000540
|
|
3740: 00000540 .word 0x00000540
|
|
3744: 00000540 .word 0x00000540
|
|
3748: 00000540 .word 0x00000540
|
|
374c: 00000540 .word 0x00000540
|
|
3750: 000002f2 .word 0x000002f2
|
|
3754: 00000540 .word 0x00000540
|
|
3758: 00000540 .word 0x00000540
|
|
375c: 00000540 .word 0x00000540
|
|
3760: 00000540 .word 0x00000540
|
|
3764: 00000540 .word 0x00000540
|
|
3768: 00000540 .word 0x00000540
|
|
376c: 00000540 .word 0x00000540
|
|
3770: 00000540 .word 0x00000540
|
|
3774: 00000540 .word 0x00000540
|
|
3778: 00000540 .word 0x00000540
|
|
377c: 00000540 .word 0x00000540
|
|
3780: 00000540 .word 0x00000540
|
|
3784: 00000540 .word 0x00000540
|
|
3788: 00000540 .word 0x00000540
|
|
378c: 00000540 .word 0x00000540
|
|
3790: 000002ea .word 0x000002ea
|
|
3794: 00000302 .word 0x00000302
|
|
3798: 000002ca .word 0x000002ca
|
|
379c: 000002da .word 0x000002da
|
|
37a0: 000002d2 .word 0x000002d2
|
|
37a4: 00000002 .word 0x00000002
|
|
37a8: 00000003 .word 0x00000003
|
|
37ac: 00000028 .word 0x00000028
|
|
37b0: 00000029 .word 0x00000029
|
|
37b4: 00000004 .word 0x00000004
|
|
37b8: 00000005 .word 0x00000005
|
|
37bc: 00000006 .word 0x00000006
|
|
37c0: 00000007 .word 0x00000007
|
|
37c4: 00000020 .word 0x00000020
|
|
37c8: 00000021 .word 0x00000021
|
|
37cc: 00000022 .word 0x00000022
|
|
37d0: 00000023 .word 0x00000023
|
|
37d4: 00000024 .word 0x00000024
|
|
37d8: 00000025 .word 0x00000025
|
|
37dc: 00000026 .word 0x00000026
|
|
37e0: 00000027 .word 0x00000027
|
|
37e4: 00000008 .word 0x00000008
|
|
37e8: 00000009 .word 0x00000009
|
|
37ec: 0000000a .word 0x0000000a
|
|
37f0: 0000000b .word 0x0000000b
|
|
37f4: 42000800 .word 0x42000800
|
|
37f8: 42000c00 .word 0x42000c00
|
|
37fc: 42001000 .word 0x42001000
|
|
3800: 42001400 .word 0x42001400
|
|
3804: 42001800 .word 0x42001800
|
|
3808: 42001c00 .word 0x42001c00
|
|
380c: 000016be .word 0x000016be
|
|
3810: 000016ba .word 0x000016ba
|
|
3814: 000016ba .word 0x000016ba
|
|
3818: 00001720 .word 0x00001720
|
|
381c: 00001720 .word 0x00001720
|
|
3820: 000016d2 .word 0x000016d2
|
|
3824: 000016c4 .word 0x000016c4
|
|
3828: 000016d8 .word 0x000016d8
|
|
382c: 0000170e .word 0x0000170e
|
|
3830: 000017a8 .word 0x000017a8
|
|
3834: 00001788 .word 0x00001788
|
|
3838: 00001788 .word 0x00001788
|
|
383c: 00001814 .word 0x00001814
|
|
3840: 0000179a .word 0x0000179a
|
|
3844: 000017b6 .word 0x000017b6
|
|
3848: 0000178c .word 0x0000178c
|
|
384c: 000017c4 .word 0x000017c4
|
|
3850: 00001804 .word 0x00001804
|
|
3854: 746c6f56 .word 0x746c6f56
|
|
3858: 3a656761 .word 0x3a656761
|
|
385c: 2e642520 .word 0x2e642520
|
|
3860: 64333025 .word 0x64333025
|
|
3864: 00000a0d .word 0x00000a0d
|
|
3868: 0000208c .word 0x0000208c
|
|
386c: 00001fdc .word 0x00001fdc
|
|
3870: 00001fdc .word 0x00001fdc
|
|
3874: 00001fda .word 0x00001fda
|
|
3878: 0000207e .word 0x0000207e
|
|
387c: 0000207e .word 0x0000207e
|
|
3880: 00002074 .word 0x00002074
|
|
3884: 00001fda .word 0x00001fda
|
|
3888: 0000207e .word 0x0000207e
|
|
388c: 00002074 .word 0x00002074
|
|
3890: 0000207e .word 0x0000207e
|
|
3894: 00001fda .word 0x00001fda
|
|
3898: 00002084 .word 0x00002084
|
|
389c: 00002084 .word 0x00002084
|
|
38a0: 00002084 .word 0x00002084
|
|
38a4: 00002114 .word 0x00002114
|
|
|
|
000038a8 <_global_impure_ptr>:
|
|
38a8: 2000001c ...
|
|
|
|
000038ac <__sf_fake_stderr>:
|
|
...
|
|
|
|
000038cc <__sf_fake_stdin>:
|
|
...
|
|
|
|
000038ec <__sf_fake_stdout>:
|
|
...
|
|
390c: 2b302d23 6c680020 6665004c 47464567 #-0+ .hlL.efgEFG
|
|
391c: 32313000 36353433 41393837 45444342 .0123456789ABCDE
|
|
392c: 31300046 35343332 39383736 64636261 F.0123456789abcd
|
|
393c: 00006665 ef..
|
|
|
|
00003940 <_init>:
|
|
3940: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
3942: 46c0 nop ; (mov r8, r8)
|
|
3944: bcf8 pop {r3, r4, r5, r6, r7}
|
|
3946: bc08 pop {r3}
|
|
3948: 469e mov lr, r3
|
|
394a: 4770 bx lr
|
|
|
|
0000394c <__init_array_start>:
|
|
394c: 000000dd .word 0x000000dd
|
|
|
|
00003950 <_fini>:
|
|
3950: b5f8 push {r3, r4, r5, r6, r7, lr}
|
|
3952: 46c0 nop ; (mov r8, r8)
|
|
3954: bcf8 pop {r3, r4, r5, r6, r7}
|
|
3956: bc08 pop {r3}
|
|
3958: 469e mov lr, r3
|
|
395a: 4770 bx lr
|
|
|
|
0000395c <__fini_array_start>:
|
|
395c: 000000b5 .word 0x000000b5
|