Created
March 13, 2017 20:25
-
-
Save kriegsman/a0fe3dde20c5eb99610044b40bdabdbe to your computer and use it in GitHub Desktop.
Teensy30
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PaulTeensyLCPaletteBugTest.ino.elf: file format elf32-littlearm | |
Disassembly of section .text: | |
00000000 <_VectorsFlash>: | |
0: 00 20 00 20 f9 00 00 00 59 15 00 00 25 15 00 00 . . ....Y...%... | |
10: 25 15 00 00 25 15 00 00 25 15 00 00 25 15 00 00 %...%...%...%... | |
20: 25 15 00 00 25 15 00 00 25 15 00 00 59 15 00 00 %...%...%...Y... | |
30: 59 15 00 00 25 15 00 00 59 15 00 00 15 15 00 00 Y...%...Y....... | |
40: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
50: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
60: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
70: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
80: 61 1b 00 00 59 15 00 00 05 21 00 00 59 15 00 00 a...Y....!..Y... | |
90: a5 25 00 00 59 15 00 00 59 15 00 00 59 15 00 00 .%..Y...Y...Y... | |
a0: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
b0: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
c0: 59 15 00 00 59 15 00 00 59 15 00 00 0d 0a 00 00 Y...Y...Y....... | |
d0: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
e0: 59 15 00 00 59 15 00 00 59 15 00 00 59 15 00 00 Y...Y...Y...Y... | |
f0: 59 15 00 00 59 15 00 00 Y...Y... | |
000000f8 <ResetHandler>: | |
volatile int n; | |
#endif | |
//volatile int count; | |
#ifdef KINETISK | |
WDOG_UNLOCK = WDOG_UNLOCK_SEQ1; | |
f8: 4b54 ldr r3, [pc, #336] ; (24c <ResetHandler+0x154>) | |
fa: f24c 5220 movw r2, #50464 ; 0xc520 | |
__attribute__ ((optimize("-Os"))) | |
#else | |
__attribute__ ((section(".startup"),optimize("-Os"))) | |
#endif | |
void ResetHandler(void) | |
{ | |
fe: b510 push {r4, lr} | |
volatile int n; | |
#endif | |
//volatile int count; | |
#ifdef KINETISK | |
WDOG_UNLOCK = WDOG_UNLOCK_SEQ1; | |
100: 801a strh r2, [r3, #0] | |
WDOG_UNLOCK = WDOG_UNLOCK_SEQ2; | |
102: f64d 1228 movw r2, #55592 ; 0xd928 | |
106: 801a strh r2, [r3, #0] | |
__asm__ volatile ("nop"); | |
108: bf00 nop | |
__asm__ volatile ("nop"); | |
10a: bf00 nop | |
#endif | |
// programs using the watchdog timer or needing to initialize hardware as | |
// early as possible can implement startup_early_hook() | |
startup_early_hook(); | |
10c: f001 fa28 bl 1560 <startup_early_hook> | |
// enable clocks to always-used peripherals | |
#if defined(__MK20DX128__) | |
SIM_SCGC5 = 0x00043F82; // clocks active to all GPIO | |
110: 4b4f ldr r3, [pc, #316] ; (250 <ResetHandler+0x158>) | |
112: 4a50 ldr r2, [pc, #320] ; (254 <ResetHandler+0x15c>) | |
114: 601a str r2, [r3, #0] | |
SIM_SCGC6 = SIM_SCGC6_RTC | SIM_SCGC6_FTM0 | SIM_SCGC6_FTM1 | SIM_SCGC6_ADC0 | SIM_SCGC6_FTFL; | |
116: 4a50 ldr r2, [pc, #320] ; (258 <ResetHandler+0x160>) | |
118: 605a str r2, [r3, #4] | |
UART0_C2 = UART_C2_TE; | |
PORTB_PCR17 = PORT_PCR_MUX(3); | |
#endif | |
#ifdef KINETISK | |
// if the RTC oscillator isn't enabled, get it started early | |
if (!(RTC_CR & RTC_CR_OSCE)) { | |
11a: f5a3 4330 sub.w r3, r3, #45056 ; 0xb000 | |
11e: 3b28 subs r3, #40 ; 0x28 | |
120: 681a ldr r2, [r3, #0] | |
122: f412 7280 ands.w r2, r2, #256 ; 0x100 | |
126: d104 bne.n 132 <ResetHandler+0x3a> | |
RTC_SR = 0; | |
128: 494c ldr r1, [pc, #304] ; (25c <ResetHandler+0x164>) | |
12a: 600a str r2, [r1, #0] | |
RTC_CR = RTC_CR_SC16P | RTC_CR_SC4P | RTC_CR_OSCE; | |
12c: f44f 52a8 mov.w r2, #5376 ; 0x1500 | |
130: 601a str r2, [r3, #0] | |
} | |
#endif | |
// release I/O pins hold, if we woke up from VLLS mode | |
if (PMC_REGSC & PMC_REGSC_ACKISO) PMC_REGSC |= PMC_REGSC_ACKISO; | |
132: 4b4b ldr r3, [pc, #300] ; (260 <ResetHandler+0x168>) | |
134: 781a ldrb r2, [r3, #0] | |
136: 0711 lsls r1, r2, #28 | |
138: d503 bpl.n 142 <ResetHandler+0x4a> | |
13a: 781a ldrb r2, [r3, #0] | |
13c: f042 0208 orr.w r2, r2, #8 | |
140: 701a strb r2, [r3, #0] | |
// since this is a write once register, make it visible to all F_CPU's | |
// so we can into other sleep modes in the future at any speed | |
#if defined(__MK66FX1M0__) | |
SMC_PMPROT = SMC_PMPROT_AHSRUN | SMC_PMPROT_AVLP | SMC_PMPROT_ALLS | SMC_PMPROT_AVLLS; | |
#else | |
SMC_PMPROT = SMC_PMPROT_AVLP | SMC_PMPROT_ALLS | SMC_PMPROT_AVLLS; | |
142: 4b48 ldr r3, [pc, #288] ; (264 <ResetHandler+0x16c>) | |
144: 222a movs r2, #42 ; 0x2a | |
146: 701a strb r2, [r3, #0] | |
#endif | |
// TODO: do this while the PLL is waiting to lock.... | |
while (dest < &_edata) *dest++ = *src++; | |
148: 2300 movs r3, #0 | |
14a: 4a47 ldr r2, [pc, #284] ; (268 <ResetHandler+0x170>) | |
14c: 4947 ldr r1, [pc, #284] ; (26c <ResetHandler+0x174>) | |
14e: 1898 adds r0, r3, r2 | |
150: 4288 cmp r0, r1 | |
152: d204 bcs.n 15e <ResetHandler+0x66> | |
154: 4946 ldr r1, [pc, #280] ; (270 <ResetHandler+0x178>) | |
156: 5859 ldr r1, [r3, r1] | |
158: 5099 str r1, [r3, r2] | |
15a: 3304 adds r3, #4 | |
15c: e7f5 b.n 14a <ResetHandler+0x52> | |
15e: 4a45 ldr r2, [pc, #276] ; (274 <ResetHandler+0x17c>) | |
dest = &_sbss; | |
while (dest < &_ebss) *dest++ = 0; | |
160: 4b45 ldr r3, [pc, #276] ; (278 <ResetHandler+0x180>) | |
162: 429a cmp r2, r3 | |
164: f04f 0300 mov.w r3, #0 | |
168: d202 bcs.n 170 <ResetHandler+0x78> | |
16a: f842 3b04 str.w r3, [r2], #4 | |
16e: e7f7 b.n 160 <ResetHandler+0x68> | |
// default all interrupts to medium priority level | |
for (i=0; i < NVIC_NUM_INTERRUPTS + 16; i++) _VectorsRam[i] = _VectorsFlash[i]; | |
170: 4942 ldr r1, [pc, #264] ; (27c <ResetHandler+0x184>) | |
172: 4a43 ldr r2, [pc, #268] ; (280 <ResetHandler+0x188>) | |
174: 5859 ldr r1, [r3, r1] | |
176: 5099 str r1, [r3, r2] | |
178: 3304 adds r3, #4 | |
17a: 2bf8 cmp r3, #248 ; 0xf8 | |
17c: d1f8 bne.n 170 <ResetHandler+0x78> | |
17e: 4b41 ldr r3, [pc, #260] ; (284 <ResetHandler+0x18c>) | |
for (i=0; i < NVIC_NUM_INTERRUPTS; i++) NVIC_SET_PRIORITY(i, 128); | |
180: 2180 movs r1, #128 ; 0x80 | |
182: f803 1b01 strb.w r1, [r3], #1 | |
186: 4940 ldr r1, [pc, #256] ; (288 <ResetHandler+0x190>) | |
188: 428b cmp r3, r1 | |
18a: d1f9 bne.n 180 <ResetHandler+0x88> | |
SCB_VTOR = (uint32_t)_VectorsRam; // use vector table in RAM | |
18c: 4b3f ldr r3, [pc, #252] ; (28c <ResetHandler+0x194>) | |
18e: 601a str r2, [r3, #0] | |
// C6[PLLS] bit is written to 0 | |
// C2[LP] bit is written to 1 | |
#else | |
#if defined(KINETISK) | |
// enable capacitors for crystal | |
OSC0_CR = OSC_SC8P | OSC_SC2P; | |
190: 4b3f ldr r3, [pc, #252] ; (290 <ResetHandler+0x198>) | |
192: 220a movs r2, #10 | |
194: 701a strb r2, [r3, #0] | |
#elif defined(KINETISL) | |
// enable capacitors for crystal | |
OSC0_CR = OSC_SC8P | OSC_SC2P | OSC_ERCLKEN; | |
#endif | |
// enable osc, 8-32 MHz range, low power mode | |
MCG_C2 = MCG_C2_RANGE0(2) | MCG_C2_EREFS; | |
196: f5a3 5380 sub.w r3, r3, #4096 ; 0x1000 | |
19a: 2224 movs r2, #36 ; 0x24 | |
19c: 705a strb r2, [r3, #1] | |
// switch to crystal as clock source, FLL input = 16 MHz / 512 | |
MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(4); | |
19e: 22a0 movs r2, #160 ; 0xa0 | |
1a0: 701a strb r2, [r3, #0] | |
// wait for crystal oscillator to begin | |
while ((MCG_S & MCG_S_OSCINIT0) == 0) ; | |
1a2: 799a ldrb r2, [r3, #6] | |
1a4: 0792 lsls r2, r2, #30 | |
1a6: d5fc bpl.n 1a2 <ResetHandler+0xaa> | |
// wait for FLL to use oscillator | |
while ((MCG_S & MCG_S_IREFST) != 0) ; | |
1a8: 799a ldrb r2, [r3, #6] | |
1aa: 06d4 lsls r4, r2, #27 | |
1ac: d4fc bmi.n 1a8 <ResetHandler+0xb0> | |
// wait for MCGOUT to use oscillator | |
while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(2)) ; | |
1ae: 4b39 ldr r3, [pc, #228] ; (294 <ResetHandler+0x19c>) | |
1b0: 799a ldrb r2, [r3, #6] | |
1b2: f002 020c and.w r2, r2, #12 | |
1b6: 2a08 cmp r2, #8 | |
1b8: d1f9 bne.n 1ae <ResetHandler+0xb6> | |
#endif | |
#else | |
#if F_CPU == 72000000 | |
MCG_C5 = MCG_C5_PRDIV0(5); // config PLL input for 16 MHz Crystal / 6 = 2.667 Hz | |
#else | |
MCG_C5 = MCG_C5_PRDIV0(3); // config PLL input for 16 MHz Crystal / 4 = 4 MHz | |
1ba: 2203 movs r2, #3 | |
1bc: 711a strb r2, [r3, #4] | |
#elif F_CPU == 120000000 | |
MCG_C6 = MCG_C6_PLLS | MCG_C6_VDIV0(6); // config PLL for 120 MHz output | |
#elif F_CPU == 72000000 | |
MCG_C6 = MCG_C6_PLLS | MCG_C6_VDIV0(3); // config PLL for 72 MHz output | |
#elif F_CPU == 96000000 || F_CPU == 48000000 || F_CPU == 24000000 | |
MCG_C6 = MCG_C6_PLLS | MCG_C6_VDIV0(0); // config PLL for 96 MHz output | |
1be: 2240 movs r2, #64 ; 0x40 | |
1c0: 715a strb r2, [r3, #5] | |
#error "This clock speed isn't supported..." | |
#endif | |
#endif | |
// wait for PLL to start using xtal as its input | |
while (!(MCG_S & MCG_S_PLLST)) ; | |
1c2: 799a ldrb r2, [r3, #6] | |
1c4: 0690 lsls r0, r2, #26 | |
1c6: d5fc bpl.n 1c2 <ResetHandler+0xca> | |
// wait for PLL to lock | |
while (!(MCG_S & MCG_S_LOCK0)) ; | |
1c8: 4b32 ldr r3, [pc, #200] ; (294 <ResetHandler+0x19c>) | |
1ca: 799a ldrb r2, [r3, #6] | |
1cc: 0651 lsls r1, r2, #25 | |
1ce: d5fb bpl.n 1c8 <ResetHandler+0xd0> | |
#endif | |
SIM_CLKDIV2 = SIM_CLKDIV2_USBDIV(4) | SIM_CLKDIV2_USBFRAC; | |
#elif F_CPU == 96000000 | |
// config divisors: 96 MHz core, 48 MHz bus, 24 MHz flash, USB = 96 / 2 | |
#if F_BUS == 48000000 | |
SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(1) | SIM_CLKDIV1_OUTDIV4(3); | |
1d0: 4a31 ldr r2, [pc, #196] ; (298 <ResetHandler+0x1a0>) | |
1d2: 4932 ldr r1, [pc, #200] ; (29c <ResetHandler+0x1a4>) | |
1d4: 6011 str r1, [r2, #0] | |
#elif F_BUS == 96000000 | |
SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(0) | SIM_CLKDIV1_OUTDIV4(3); | |
#else | |
#error "This F_CPU & F_BUS combination is not supported" | |
#endif | |
SIM_CLKDIV2 = SIM_CLKDIV2_USBDIV(1); | |
1d6: 2102 movs r1, #2 | |
1d8: 6051 str r1, [r2, #4] | |
#error "Error, F_CPU must be 192, 180, 168, 144, 120, 96, 72, 48, 24, 16, 8, 4, or 2 MHz" | |
#endif | |
#if F_CPU > 16000000 | |
// switch to PLL as clock source, FLL input = 16 MHz / 512 | |
MCG_C1 = MCG_C1_CLKS(0) | MCG_C1_FRDIV(4); | |
1da: 2220 movs r2, #32 | |
1dc: 701a strb r2, [r3, #0] | |
// wait for PLL clock to be used | |
while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(3)) ; | |
1de: 4b2d ldr r3, [pc, #180] ; (294 <ResetHandler+0x19c>) | |
1e0: 799b ldrb r3, [r3, #6] | |
1e2: f003 030c and.w r3, r3, #12 | |
1e6: 2b0c cmp r3, #12 | |
1e8: d1f9 bne.n 1de <ResetHandler+0xe6> | |
// USB uses PLL clock, trace is CPU clock, CLKOUT=OSCERCLK0 | |
#if defined(KINETISK) | |
#if F_CPU == 216000000 || F_CPU == 180000000 | |
SIM_SOPT2 = SIM_SOPT2_USBSRC | SIM_SOPT2_IRC48SEL | SIM_SOPT2_TRACECLKSEL | SIM_SOPT2_CLKOUTSEL(6); | |
#else | |
SIM_SOPT2 = SIM_SOPT2_USBSRC | SIM_SOPT2_PLLFLLSEL | SIM_SOPT2_TRACECLKSEL | SIM_SOPT2_CLKOUTSEL(6); | |
1ea: 4b2d ldr r3, [pc, #180] ; (2a0 <ResetHandler+0x1a8>) | |
1ec: 4a2d ldr r2, [pc, #180] ; (2a4 <ResetHandler+0x1ac>) | |
1ee: 601a str r2, [r3, #0] | |
// since we are not going into "stop mode" i removed it | |
SMC_PMCTRL = SMC_PMCTRL_RUNM(2); // VLPR mode :-) | |
#endif | |
// initialize the SysTick counter | |
SYST_RVR = (F_CPU / 1000) - 1; | |
1f0: 4b2d ldr r3, [pc, #180] ; (2a8 <ResetHandler+0x1b0>) | |
1f2: 4a2e ldr r2, [pc, #184] ; (2ac <ResetHandler+0x1b4>) | |
1f4: 601a str r2, [r3, #0] | |
SYST_CVR = 0; | |
1f6: 2200 movs r2, #0 | |
1f8: 605a str r2, [r3, #4] | |
SYST_CSR = SYST_CSR_CLKSOURCE | SYST_CSR_TICKINT | SYST_CSR_ENABLE; | |
1fa: 2207 movs r2, #7 | |
1fc: f843 2c04 str.w r2, [r3, #-4] | |
SCB_SHPR3 = 0x20200000; // Systick = priority 32 | |
200: 4a2b ldr r2, [pc, #172] ; (2b0 <ResetHandler+0x1b8>) | |
202: f8c3 2d0c str.w r2, [r3, #3340] ; 0xd0c | |
//init_pins(); | |
__enable_irq(); | |
206: b662 cpsie i | |
_init_Teensyduino_internal_(); | |
208: f000 faf0 bl 7ec <_init_Teensyduino_internal_> | |
#if defined(KINETISK) | |
// RTC initialization | |
if (RTC_SR & RTC_SR_TIF) { | |
20c: 4b13 ldr r3, [pc, #76] ; (25c <ResetHandler+0x164>) | |
20e: 681b ldr r3, [r3, #0] | |
210: 07da lsls r2, r3, #31 | |
212: d505 bpl.n 220 <ResetHandler+0x128> | |
// compiled-in time will be stale. Write a special | |
// flag into the VBAT register file indicating the | |
// RTC is set with known-stale time and should be | |
// updated when fresh time is known. | |
#if ARDUINO >= 10600 | |
rtc_set((uint32_t)&__rtc_localtime); | |
214: 4827 ldr r0, [pc, #156] ; (2b4 <ResetHandler+0x1bc>) | |
216: f000 fa47 bl 6a8 <rtc_set> | |
#else | |
rtc_set(TIME_T); | |
#endif | |
*(uint32_t *)0x4003E01C = 0x5A94C3A5; | |
21a: 4b27 ldr r3, [pc, #156] ; (2b8 <ResetHandler+0x1c0>) | |
21c: 4a27 ldr r2, [pc, #156] ; (2bc <ResetHandler+0x1c4>) | |
21e: 601a str r2, [r3, #0] | |
} | |
if ((RCM_SRS0 & RCM_SRS0_PIN) && (*(uint32_t *)0x4003E01C == 0x5A94C3A5)) { | |
220: 4b27 ldr r3, [pc, #156] ; (2c0 <ResetHandler+0x1c8>) | |
222: 781b ldrb r3, [r3, #0] | |
224: 065b lsls r3, r3, #25 | |
226: d509 bpl.n 23c <ResetHandler+0x144> | |
228: 4c23 ldr r4, [pc, #140] ; (2b8 <ResetHandler+0x1c0>) | |
22a: 4a24 ldr r2, [pc, #144] ; (2bc <ResetHandler+0x1c4>) | |
22c: 6823 ldr r3, [r4, #0] | |
22e: 4293 cmp r3, r2 | |
230: d104 bne.n 23c <ResetHandler+0x144> | |
// Our compiled-in time will be very fresh, so set | |
// the RTC with this, and clear the VBAT resister file | |
// data so we don't mess with the time after it's been | |
// set well. | |
#if ARDUINO >= 10600 | |
rtc_set((uint32_t)&__rtc_localtime); | |
232: 4820 ldr r0, [pc, #128] ; (2b4 <ResetHandler+0x1bc>) | |
234: f000 fa38 bl 6a8 <rtc_set> | |
#else | |
rtc_set(TIME_T); | |
#endif | |
*(uint32_t *)0x4003E01C = 0; | |
238: 2300 movs r3, #0 | |
23a: 6023 str r3, [r4, #0] | |
} | |
#endif | |
__libc_init_array(); | |
23c: f002 fbea bl 2a14 <__libc_init_array> | |
startup_late_hook(); | |
240: f001 f994 bl 156c <startup_late_hook> | |
main(); | |
244: f001 f8d4 bl 13f0 <main> | |
248: e7fe b.n 248 <ResetHandler+0x150> | |
24a: bf00 nop | |
24c: 4005200e .word 0x4005200e | |
250: 40048038 .word 0x40048038 | |
254: 00043f82 .word 0x00043f82 | |
258: 2b000001 .word 0x2b000001 | |
25c: 4003d014 .word 0x4003d014 | |
260: 4007d002 .word 0x4007d002 | |
264: 4007e000 .word 0x4007e000 | |
268: 1fffe560 .word 0x1fffe560 | |
26c: 1fffe608 .word 0x1fffe608 | |
270: 00002d70 .word 0x00002d70 | |
274: 1fffe608 .word 0x1fffe608 | |
278: 1fffe938 .word 0x1fffe938 | |
27c: 00000000 .word 0x00000000 | |
280: 1fffe100 .word 0x1fffe100 | |
284: e000e400 .word 0xe000e400 | |
288: e000e42e .word 0xe000e42e | |
28c: e000ed08 .word 0xe000ed08 | |
290: 40065000 .word 0x40065000 | |
294: 40064000 .word 0x40064000 | |
298: 40048044 .word 0x40048044 | |
29c: 01030000 .word 0x01030000 | |
2a0: 40048004 .word 0x40048004 | |
2a4: 000510c0 .word 0x000510c0 | |
2a8: e000e014 .word 0xe000e014 | |
2ac: 000176ff .word 0x000176ff | |
2b0: 20200000 .word 0x20200000 | |
2b4: 58c6c6a9 .word 0x58c6c6a9 | |
2b8: 4003e01c .word 0x4003e01c | |
2bc: 5a94c3a5 .word 0x5a94c3a5 | |
2c0: 4007f000 .word 0x4007f000 | |
2c4: ffffffff .word 0xffffffff | |
2c8: ffffffff .word 0xffffffff | |
2cc: ffffffff .word 0xffffffff | |
2d0: ffffffff .word 0xffffffff | |
2d4: ffffffff .word 0xffffffff | |
2d8: ffffffff .word 0xffffffff | |
2dc: ffffffff .word 0xffffffff | |
2e0: ffffffff .word 0xffffffff | |
2e4: ffffffff .word 0xffffffff | |
2e8: ffffffff .word 0xffffffff | |
2ec: ffffffff .word 0xffffffff | |
2f0: ffffffff .word 0xffffffff | |
2f4: ffffffff .word 0xffffffff | |
2f8: ffffffff .word 0xffffffff | |
2fc: ffffffff .word 0xffffffff | |
300: ffffffff .word 0xffffffff | |
304: ffffffff .word 0xffffffff | |
308: ffffffff .word 0xffffffff | |
30c: ffffffff .word 0xffffffff | |
310: ffffffff .word 0xffffffff | |
314: ffffffff .word 0xffffffff | |
318: ffffffff .word 0xffffffff | |
31c: ffffffff .word 0xffffffff | |
320: ffffffff .word 0xffffffff | |
324: ffffffff .word 0xffffffff | |
328: ffffffff .word 0xffffffff | |
32c: ffffffff .word 0xffffffff | |
330: ffffffff .word 0xffffffff | |
334: ffffffff .word 0xffffffff | |
338: ffffffff .word 0xffffffff | |
33c: ffffffff .word 0xffffffff | |
340: ffffffff .word 0xffffffff | |
344: ffffffff .word 0xffffffff | |
348: ffffffff .word 0xffffffff | |
34c: ffffffff .word 0xffffffff | |
350: ffffffff .word 0xffffffff | |
354: ffffffff .word 0xffffffff | |
358: ffffffff .word 0xffffffff | |
35c: ffffffff .word 0xffffffff | |
360: ffffffff .word 0xffffffff | |
364: ffffffff .word 0xffffffff | |
368: ffffffff .word 0xffffffff | |
36c: ffffffff .word 0xffffffff | |
370: ffffffff .word 0xffffffff | |
374: ffffffff .word 0xffffffff | |
378: ffffffff .word 0xffffffff | |
37c: ffffffff .word 0xffffffff | |
380: ffffffff .word 0xffffffff | |
384: ffffffff .word 0xffffffff | |
388: ffffffff .word 0xffffffff | |
38c: ffffffff .word 0xffffffff | |
390: ffffffff .word 0xffffffff | |
394: ffffffff .word 0xffffffff | |
398: ffffffff .word 0xffffffff | |
39c: ffffffff .word 0xffffffff | |
3a0: ffffffff .word 0xffffffff | |
3a4: ffffffff .word 0xffffffff | |
3a8: ffffffff .word 0xffffffff | |
3ac: ffffffff .word 0xffffffff | |
3b0: ffffffff .word 0xffffffff | |
3b4: ffffffff .word 0xffffffff | |
3b8: ffffffff .word 0xffffffff | |
3bc: ffffffff .word 0xffffffff | |
3c0: ffffffff .word 0xffffffff | |
3c4: ffffffff .word 0xffffffff | |
3c8: ffffffff .word 0xffffffff | |
3cc: ffffffff .word 0xffffffff | |
3d0: ffffffff .word 0xffffffff | |
3d4: ffffffff .word 0xffffffff | |
3d8: ffffffff .word 0xffffffff | |
3dc: ffffffff .word 0xffffffff | |
3e0: ffffffff .word 0xffffffff | |
3e4: ffffffff .word 0xffffffff | |
3e8: ffffffff .word 0xffffffff | |
3ec: ffffffff .word 0xffffffff | |
3f0: ffffffff .word 0xffffffff | |
3f4: ffffffff .word 0xffffffff | |
3f8: ffffffff .word 0xffffffff | |
3fc: ffffffff .word 0xffffffff | |
00000400 <flashconfigbytes>: | |
400: ffffffff ffffffff ffffffff fffffffe ................ | |
00000410 <__do_global_dtors_aux>: | |
410: b510 push {r4, lr} | |
412: 4c05 ldr r4, [pc, #20] ; (428 <__do_global_dtors_aux+0x18>) | |
414: 7823 ldrb r3, [r4, #0] | |
416: b933 cbnz r3, 426 <__do_global_dtors_aux+0x16> | |
418: 4b04 ldr r3, [pc, #16] ; (42c <__do_global_dtors_aux+0x1c>) | |
41a: b113 cbz r3, 422 <__do_global_dtors_aux+0x12> | |
41c: 4804 ldr r0, [pc, #16] ; (430 <__do_global_dtors_aux+0x20>) | |
41e: f3af 8000 nop.w | |
422: 2301 movs r3, #1 | |
424: 7023 strb r3, [r4, #0] | |
426: bd10 pop {r4, pc} | |
428: 1fffe608 .word 0x1fffe608 | |
42c: 00000000 .word 0x00000000 | |
430: 00002d70 .word 0x00002d70 | |
00000434 <frame_dummy>: | |
434: b508 push {r3, lr} | |
436: 4b06 ldr r3, [pc, #24] ; (450 <frame_dummy+0x1c>) | |
438: b11b cbz r3, 442 <frame_dummy+0xe> | |
43a: 4806 ldr r0, [pc, #24] ; (454 <frame_dummy+0x20>) | |
43c: 4906 ldr r1, [pc, #24] ; (458 <frame_dummy+0x24>) | |
43e: f3af 8000 nop.w | |
442: 4806 ldr r0, [pc, #24] ; (45c <frame_dummy+0x28>) | |
444: 6803 ldr r3, [r0, #0] | |
446: b113 cbz r3, 44e <frame_dummy+0x1a> | |
448: 4b05 ldr r3, [pc, #20] ; (460 <frame_dummy+0x2c>) | |
44a: b103 cbz r3, 44e <frame_dummy+0x1a> | |
44c: 4798 blx r3 | |
44e: bd08 pop {r3, pc} | |
450: 00000000 .word 0x00000000 | |
454: 00002d70 .word 0x00002d70 | |
458: 1fffe60c .word 0x1fffe60c | |
45c: 1fffe608 .word 0x1fffe608 | |
460: 00000000 .word 0x00000000 | |
00000464 <_ZN5Print7printlnEPKc>: | |
size_t print(double n, int digits = 2) { return printFloat(n, digits); } | |
size_t print(const Printable &obj) { return obj.printTo(*this); } | |
size_t println(void); | |
size_t println(const String &s) { return print(s) + println(); } | |
size_t println(char c) { return print(c) + println(); } | |
size_t println(const char s[]) { return print(s) + println(); } | |
464: b538 push {r3, r4, r5, lr} | |
466: 4604 mov r4, r0 | |
class Print | |
{ | |
public: | |
Print() : write_error(0) {} | |
virtual size_t write(uint8_t b) = 0; | |
size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); } | |
468: 4608 mov r0, r1 | |
size_t print(double n, int digits = 2) { return printFloat(n, digits); } | |
size_t print(const Printable &obj) { return obj.printTo(*this); } | |
size_t println(void); | |
size_t println(const String &s) { return print(s) + println(); } | |
size_t println(char c) { return print(c) + println(); } | |
size_t println(const char s[]) { return print(s) + println(); } | |
46a: 460d mov r5, r1 | |
class Print | |
{ | |
public: | |
Print() : write_error(0) {} | |
virtual size_t write(uint8_t b) = 0; | |
size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); } | |
46c: f002 faf8 bl 2a60 <strlen> | |
470: 6823 ldr r3, [r4, #0] | |
472: 4602 mov r2, r0 | |
474: 4629 mov r1, r5 | |
476: 685b ldr r3, [r3, #4] | |
478: 4620 mov r0, r4 | |
47a: 4798 blx r3 | |
47c: 4605 mov r5, r0 | |
size_t print(double n, int digits = 2) { return printFloat(n, digits); } | |
size_t print(const Printable &obj) { return obj.printTo(*this); } | |
size_t println(void); | |
size_t println(const String &s) { return print(s) + println(); } | |
size_t println(char c) { return print(c) + println(); } | |
size_t println(const char s[]) { return print(s) + println(); } | |
47e: 4620 mov r0, r4 | |
480: f000 ff6e bl 1360 <_ZN5Print7printlnEv> | |
484: 4428 add r0, r5 | |
486: bd38 pop {r3, r4, r5, pc} | |
00000488 <_ZN13CRGBPalette16aSEPKh>: | |
// the exact stripe widths at the expense of dropping some colors. | |
CRGBPalette16( TProgmemRGBGradientPalette_bytes progpal ) | |
{ | |
*this = progpal; | |
} | |
CRGBPalette16& operator=( TProgmemRGBGradientPalette_bytes progpal ) | |
488: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} | |
48c: 4607 mov r7, r0 | |
48e: b089 sub sp, #36 ; 0x24 | |
{ | |
TRGBGradientPaletteEntryUnion* progent = (TRGBGradientPaletteEntryUnion*)(progpal); | |
TRGBGradientPaletteEntryUnion u; | |
// Count entries | |
uint16_t count = 0; | |
490: 2400 movs r4, #0 | |
do { | |
u.dword = FL_PGM_READ_DWORD_NEAR(progent + count); | |
492: f851 3024 ldr.w r3, [r1, r4, lsl #2] | |
TRGBGradientPaletteEntryUnion* progent = (TRGBGradientPaletteEntryUnion*)(progpal); | |
TRGBGradientPaletteEntryUnion u; | |
// Count entries | |
uint16_t count = 0; | |
do { | |
496: b2de uxtb r6, r3 | |
u.dword = FL_PGM_READ_DWORD_NEAR(progent + count); | |
count++;; | |
498: 3401 adds r4, #1 | |
TRGBGradientPaletteEntryUnion* progent = (TRGBGradientPaletteEntryUnion*)(progpal); | |
TRGBGradientPaletteEntryUnion u; | |
// Count entries | |
uint16_t count = 0; | |
do { | |
49a: 2eff cmp r6, #255 ; 0xff | |
u.dword = FL_PGM_READ_DWORD_NEAR(progent + count); | |
count++;; | |
49c: b2a4 uxth r4, r4 | |
TRGBGradientPaletteEntryUnion* progent = (TRGBGradientPaletteEntryUnion*)(progpal); | |
TRGBGradientPaletteEntryUnion u; | |
// Count entries | |
uint16_t count = 0; | |
do { | |
49e: d1f8 bne.n 492 <_ZN13CRGBPalette16aSEPKh+0xa> | |
count++;; | |
} while ( u.index != 255); | |
int8_t lastSlotUsed = -1; | |
u.dword = FL_PGM_READ_DWORD_NEAR( progent); | |
4a0: 680b ldr r3, [r1, #0] | |
4a2: 9102 str r1, [sp, #8] | |
CRGB rgbstart( u.r, u.g, u.b); | |
4a4: f3c3 2007 ubfx r0, r3, #8, #8 | |
4a8: f3c3 4207 ubfx r2, r3, #16, #8 | |
4ac: ea4f 6813 mov.w r8, r3, lsr #24 | |
int indexstart = 0; | |
4b0: f04f 0b00 mov.w fp, #0 | |
uint8_t istart8 = 0; | |
uint8_t iend8 = 0; | |
while( indexstart < 255) { | |
progent++; | |
u.dword = FL_PGM_READ_DWORD_NEAR( progent); | |
4b4: 9902 ldr r1, [sp, #8] | |
4b6: f851 3f04 ldr.w r3, [r1, #4]! | |
4ba: 9102 str r1, [sp, #8] | |
int indexend = u.index; | |
CRGB rgbend( u.r, u.g, u.b); | |
4bc: f3c3 2907 ubfx r9, r3, #8, #8 | |
4c0: fa5f f189 uxtb.w r1, r9 | |
4c4: f3c3 4c07 ubfx ip, r3, #16, #8 | |
4c8: f3c3 6e07 ubfx lr, r3, #24, #8 | |
uint8_t istart8 = 0; | |
uint8_t iend8 = 0; | |
while( indexstart < 255) { | |
progent++; | |
u.dword = FL_PGM_READ_DWORD_NEAR( progent); | |
int indexend = u.index; | |
4cc: b2dd uxtb r5, r3 | |
CRGB rgbend( u.r, u.g, u.b); | |
4ce: 9103 str r1, [sp, #12] | |
4d0: fa5f f38e uxtb.w r3, lr | |
4d4: fa5f f18c uxtb.w r1, ip | |
istart8 = indexstart / 16; | |
4d8: ea4f 1b2b mov.w fp, fp, asr #4 | |
iend8 = indexend / 16; | |
if( count < 16) { | |
4dc: 2c0f cmp r4, #15 | |
uint8_t iend8 = 0; | |
while( indexstart < 255) { | |
progent++; | |
u.dword = FL_PGM_READ_DWORD_NEAR( progent); | |
int indexend = u.index; | |
CRGB rgbend( u.r, u.g, u.b); | |
4de: 9105 str r1, [sp, #20] | |
4e0: 9304 str r3, [sp, #16] | |
istart8 = indexstart / 16; | |
4e2: fa5f f18b uxtb.w r1, fp | |
iend8 = indexend / 16; | |
4e6: ea4f 1315 mov.w r3, r5, lsr #4 | |
if( count < 16) { | |
4ea: d80c bhi.n 506 <_ZN13CRGBPalette16aSEPKh+0x7e> | |
if( (istart8 <= lastSlotUsed) && (lastSlotUsed < 15)) { | |
4ec: fa4f fa86 sxtb.w sl, r6 | |
4f0: 45d3 cmp fp, sl | |
4f2: dc07 bgt.n 504 <_ZN13CRGBPalette16aSEPKh+0x7c> | |
4f4: f1ba 0f0e cmp.w sl, #14 | |
4f8: dc04 bgt.n 504 <_ZN13CRGBPalette16aSEPKh+0x7c> | |
istart8 = lastSlotUsed + 1; | |
4fa: 3601 adds r6, #1 | |
4fc: b2f1 uxtb r1, r6 | |
4fe: 4299 cmp r1, r3 | |
500: bf28 it cs | |
502: 460b movcs r3, r1 | |
if( iend8 < istart8) { | |
iend8 = istart8; | |
} | |
} | |
lastSlotUsed = iend8; | |
504: b2de uxtb r6, r3 | |
/// allow copy construction | |
inline CRGB(const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
g = rhs.g; | |
506: f88d 2019 strb.w r2, [sp, #25] | |
} | |
fill_gradient_RGB( &(entries[0]), istart8, rgbstart, iend8, rgbend); | |
50a: aa07 add r2, sp, #28 | |
} | |
/// allow copy construction | |
inline CRGB(const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
50c: f88d 0018 strb.w r0, [sp, #24] | |
510: 9200 str r2, [sp, #0] | |
512: 4638 mov r0, r7 | |
514: aa06 add r2, sp, #24 | |
g = rhs.g; | |
b = rhs.b; | |
516: f88d 801a strb.w r8, [sp, #26] | |
} | |
/// allow copy construction | |
inline CRGB(const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
51a: f88d 901c strb.w r9, [sp, #28] | |
g = rhs.g; | |
51e: f88d c01d strb.w ip, [sp, #29] | |
b = rhs.b; | |
522: f88d e01e strb.w lr, [sp, #30] | |
526: f000 f859 bl 5dc <_Z17fill_gradient_RGBP4CRGBtS_tS_> | |
CRGB rgbstart( u.r, u.g, u.b); | |
int indexstart = 0; | |
uint8_t istart8 = 0; | |
uint8_t iend8 = 0; | |
while( indexstart < 255) { | |
52a: 2dff cmp r5, #255 ; 0xff | |
52c: d005 beq.n 53a <_ZN13CRGBPalette16aSEPKh+0xb2> | |
} | |
/// allow assignment from one RGB struct to another | |
inline CRGB& operator= (const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
52e: 9803 ldr r0, [sp, #12] | |
g = rhs.g; | |
530: 9a05 ldr r2, [sp, #20] | |
b = rhs.b; | |
532: f8dd 8010 ldr.w r8, [sp, #16] | |
} | |
} | |
lastSlotUsed = iend8; | |
} | |
fill_gradient_RGB( &(entries[0]), istart8, rgbstart, iend8, rgbend); | |
indexstart = indexend; | |
536: 46ab mov fp, r5 | |
538: e7bc b.n 4b4 <_ZN13CRGBPalette16aSEPKh+0x2c> | |
rgbstart = rgbend; | |
} | |
return *this; | |
} | |
53a: 4638 mov r0, r7 | |
53c: b009 add sp, #36 ; 0x24 | |
53e: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} | |
542: ffff b508 vabal.u<illegal width 64> <illegal reg q13.5>, d15, d8 | |
00000544 <setup>: | |
// merely having this object created causes the program to crash | |
// comment out this line to get see the 3 Serial.print() output | |
LedsMultitask Bordlys; | |
void setup() { | |
544: b508 push {r3, lr} | |
uint8_t paritytype(void) { return usb_cdc_line_coding[1] >> 8; } // 0=none, 1=odd, 2=even | |
uint8_t numbits(void) { return usb_cdc_line_coding[1] >> 16; } | |
uint8_t dtr(void) { return (usb_cdc_line_rtsdtr & USB_SERIAL_DTR) ? 1 : 0; } | |
uint8_t rts(void) { return (usb_cdc_line_rtsdtr & USB_SERIAL_RTS) ? 1 : 0; } | |
operator bool() { return usb_configuration && | |
(usb_cdc_line_rtsdtr & (USB_SERIAL_DTR | USB_SERIAL_RTS)) && | |
546: 4b12 ldr r3, [pc, #72] ; (590 <setup+0x4c>) | |
548: 781b ldrb r3, [r3, #0] | |
54a: 2b00 cmp r3, #0 | |
54c: d0fb beq.n 546 <setup+0x2> | |
54e: 4b11 ldr r3, [pc, #68] ; (594 <setup+0x50>) | |
550: 781b ldrb r3, [r3, #0] | |
uint8_t stopbits(void) { uint8_t b = usb_cdc_line_coding[1]; if (!b) b = 1; return b; } | |
uint8_t paritytype(void) { return usb_cdc_line_coding[1] >> 8; } // 0=none, 1=odd, 2=even | |
uint8_t numbits(void) { return usb_cdc_line_coding[1] >> 16; } | |
uint8_t dtr(void) { return (usb_cdc_line_rtsdtr & USB_SERIAL_DTR) ? 1 : 0; } | |
uint8_t rts(void) { return (usb_cdc_line_rtsdtr & USB_SERIAL_RTS) ? 1 : 0; } | |
operator bool() { return usb_configuration && | |
552: 079b lsls r3, r3, #30 | |
554: d0f7 beq.n 546 <setup+0x2> | |
(usb_cdc_line_rtsdtr & (USB_SERIAL_DTR | USB_SERIAL_RTS)) && | |
((uint32_t)(systick_millis_count - usb_cdc_line_rtsdtr_millis) >= 25); | |
556: 4b10 ldr r3, [pc, #64] ; (598 <setup+0x54>) | |
558: 681a ldr r2, [r3, #0] | |
55a: 4b10 ldr r3, [pc, #64] ; (59c <setup+0x58>) | |
55c: 681b ldr r3, [r3, #0] | |
55e: 1ad3 subs r3, r2, r3 | |
uint8_t paritytype(void) { return usb_cdc_line_coding[1] >> 8; } // 0=none, 1=odd, 2=even | |
uint8_t numbits(void) { return usb_cdc_line_coding[1] >> 16; } | |
uint8_t dtr(void) { return (usb_cdc_line_rtsdtr & USB_SERIAL_DTR) ? 1 : 0; } | |
uint8_t rts(void) { return (usb_cdc_line_rtsdtr & USB_SERIAL_RTS) ? 1 : 0; } | |
operator bool() { return usb_configuration && | |
(usb_cdc_line_rtsdtr & (USB_SERIAL_DTR | USB_SERIAL_RTS)) && | |
560: 2b18 cmp r3, #24 | |
562: d9f0 bls.n 546 <setup+0x2> | |
while (!Serial) ; // wait for Arduino Serial Monitor | |
delay(10); | |
564: 200a movs r0, #10 | |
566: f000 f92b bl 7c0 <delay> | |
Serial.println("setup begin"); | |
56a: 490d ldr r1, [pc, #52] ; (5a0 <setup+0x5c>) | |
56c: 480d ldr r0, [pc, #52] ; (5a4 <setup+0x60>) | |
56e: f7ff ff79 bl 464 <_ZN5Print7printlnEPKc> | |
Serial.println("setup2"); // must print 2+ strings to reproduce problem | |
572: 490d ldr r1, [pc, #52] ; (5a8 <setup+0x64>) | |
574: 480b ldr r0, [pc, #44] ; (5a4 <setup+0x60>) | |
576: f7ff ff75 bl 464 <_ZN5Print7printlnEPKc> | |
size_t print(const char s[]) { return write(s); } | |
size_t print(const __FlashStringHelper *f) { return write((const char *)f); } | |
size_t print(uint8_t b) { return printNumber(b, 10, 0); } | |
size_t print(int n) { return print((long)n); } | |
size_t print(unsigned int n) { return printNumber(n, 10, 0); } | |
57a: 2300 movs r3, #0 | |
57c: 4809 ldr r0, [pc, #36] ; (5a4 <setup+0x60>) | |
57e: 2130 movs r1, #48 ; 0x30 | |
580: 220a movs r2, #10 | |
582: f000 fefd bl 1380 <_ZN5Print11printNumberEmhh> | |
size_t println(const char s[]) { return print(s) + println(); } | |
size_t println(const __FlashStringHelper *f) { return print(f) + println(); } | |
size_t println(uint8_t b) { return print(b) + println(); } | |
size_t println(int n) { return print(n) + println(); } | |
size_t println(unsigned int n) { return print(n) + println(); } | |
586: 4807 ldr r0, [pc, #28] ; (5a4 <setup+0x60>) | |
Serial.println(sizeof(LedsMultitask)); | |
} | |
588: e8bd 4008 ldmia.w sp!, {r3, lr} | |
58c: f000 bee8 b.w 1360 <_ZN5Print7printlnEv> | |
590: 1fffe747 .word 0x1fffe747 | |
594: 1fffe758 .word 0x1fffe758 | |
598: 1fffe664 .word 0x1fffe664 | |
59c: 1fffe934 .word 0x1fffe934 | |
5a0: 00002a70 .word 0x00002a70 | |
5a4: 1fffe75c .word 0x1fffe75c | |
5a8: 00002a7c .word 0x00002a7c | |
000005ac <loop>: | |
void loop() {} | |
5ac: 4770 bx lr | |
5ae: ffff b508 vabal.u<illegal width 64> <illegal reg q13.5>, d15, d8 | |
000005b0 <_GLOBAL__sub_I_heatmap_gp>: | |
5b0: b508 push {r3, lr} | |
// will be, by definition, different from the widths in the gradient | |
// palette. This code attempts to preserve "all the colors", rather than | |
// the exact stripe widths at the expense of dropping some colors. | |
CRGBPalette16( TProgmemRGBGradientPalette_bytes progpal ) | |
{ | |
*this = progpal; | |
5b2: 4902 ldr r1, [pc, #8] ; (5bc <_GLOBAL__sub_I_heatmap_gp+0xc>) | |
5b4: 4802 ldr r0, [pc, #8] ; (5c0 <_GLOBAL__sub_I_heatmap_gp+0x10>) | |
5b6: f7ff ff67 bl 488 <_ZN13CRGBPalette16aSEPKh> | |
5ba: bd08 pop {r3, pc} | |
5bc: 00002a83 .word 0x00002a83 | |
5c0: 1fffe624 .word 0x1fffe624 | |
000005c4 <_GLOBAL__sub_I_pSmartMatrix>: | |
// uint32_t CRGB::Squant = ((uint32_t)((__TIME__[4]-'0') * 28))<<16 | ((__TIME__[6]-'0')*50)<<8 | ((__TIME__[7]-'0')*28); | |
CFastLED::CFastLED() { | |
// clear out the array of led controllers | |
// m_nControllers = 0; | |
m_Scale = 255; | |
5c4: 4b04 ldr r3, [pc, #16] ; (5d8 <_GLOBAL__sub_I_pSmartMatrix+0x14>) | |
5c6: 22ff movs r2, #255 ; 0xff | |
5c8: 701a strb r2, [r3, #0] | |
m_nFPS = 0; | |
5ca: 2200 movs r2, #0 | |
5cc: 805a strh r2, [r3, #2] | |
m_pPowerFunc = NULL; | |
5ce: 60da str r2, [r3, #12] | |
m_nPowerData = 0xFFFFFFFF; | |
5d0: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff | |
5d4: 609a str r2, [r3, #8] | |
5d6: 4770 bx lr | |
5d8: 1fffe654 .word 0x1fffe654 | |
000005dc <_Z17fill_gradient_RGBP4CRGBtS_tS_>: | |
void fill_gradient_RGB( CRGB* leds, | |
uint16_t startpos, CRGB startcolor, | |
uint16_t endpos, CRGB endcolor ) | |
{ | |
5dc: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} | |
// if the points are in the wrong order, straighten them | |
if( endpos < startpos ) { | |
5e0: 428b cmp r3, r1 | |
void fill_gradient_RGB( CRGB* leds, | |
uint16_t startpos, CRGB startcolor, | |
uint16_t endpos, CRGB endcolor ) | |
{ | |
5e2: 9c08 ldr r4, [sp, #32] | |
// if the points are in the wrong order, straighten them | |
if( endpos < startpos ) { | |
5e4: d214 bcs.n 610 <_Z17fill_gradient_RGBP4CRGBtS_tS_+0x34> | |
} | |
/// allow assignment from one RGB struct to another | |
inline CRGB& operator= (const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
5e6: f892 c000 ldrb.w ip, [r2] | |
/// allow copy construction | |
inline CRGB(const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
g = rhs.g; | |
b = rhs.b; | |
5ea: 78a5 ldrb r5, [r4, #2] | |
} | |
/// allow copy construction | |
inline CRGB(const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
5ec: 7827 ldrb r7, [r4, #0] | |
} | |
/// allow assignment from one RGB struct to another | |
inline CRGB& operator= (const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
5ee: f884 c000 strb.w ip, [r4] | |
g = rhs.g; | |
5f2: f892 c001 ldrb.w ip, [r2, #1] | |
/// allow copy construction | |
inline CRGB(const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
g = rhs.g; | |
5f6: 7866 ldrb r6, [r4, #1] | |
/// allow assignment from one RGB struct to another | |
inline CRGB& operator= (const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
g = rhs.g; | |
5f8: f884 c001 strb.w ip, [r4, #1] | |
b = rhs.b; | |
5fc: f892 c002 ldrb.w ip, [r2, #2] | |
600: 7095 strb r5, [r2, #2] | |
602: 460d mov r5, r1 | |
604: f884 c002 strb.w ip, [r4, #2] | |
608: 4619 mov r1, r3 | |
} | |
/// allow assignment from one RGB struct to another | |
inline CRGB& operator= (const CRGB& rhs) __attribute__((always_inline)) | |
{ | |
r = rhs.r; | |
60a: 7017 strb r7, [r2, #0] | |
g = rhs.g; | |
60c: 7056 strb r6, [r2, #1] | |
60e: 462b mov r3, r5 | |
saccum87 rdistance87; | |
saccum87 gdistance87; | |
saccum87 bdistance87; | |
rdistance87 = (endcolor.r - startcolor.r) << 7; | |
610: f892 c000 ldrb.w ip, [r2] | |
gdistance87 = (endcolor.g - startcolor.g) << 7; | |
614: 7857 ldrb r7, [r2, #1] | |
bdistance87 = (endcolor.b - startcolor.b) << 7; | |
616: 7895 ldrb r5, [r2, #2] | |
saccum87 rdistance87; | |
saccum87 gdistance87; | |
saccum87 bdistance87; | |
rdistance87 = (endcolor.r - startcolor.r) << 7; | |
618: f894 8000 ldrb.w r8, [r4] | |
gdistance87 = (endcolor.g - startcolor.g) << 7; | |
61c: f894 9001 ldrb.w r9, [r4, #1] | |
bdistance87 = (endcolor.b - startcolor.b) << 7; | |
620: 78a2 ldrb r2, [r4, #2] | |
uint16_t pixeldistance = endpos - startpos; | |
622: 1a5e subs r6, r3, r1 | |
saccum87 rdistance87; | |
saccum87 gdistance87; | |
saccum87 bdistance87; | |
rdistance87 = (endcolor.r - startcolor.r) << 7; | |
624: ebcc 0808 rsb r8, ip, r8 | |
gdistance87 = (endcolor.g - startcolor.g) << 7; | |
628: ebc7 0909 rsb r9, r7, r9 | |
bdistance87 = (endcolor.b - startcolor.b) << 7; | |
62c: 1b52 subs r2, r2, r5 | |
uint16_t pixeldistance = endpos - startpos; | |
62e: b2b6 uxth r6, r6 | |
saccum87 rdistance87; | |
saccum87 gdistance87; | |
saccum87 bdistance87; | |
rdistance87 = (endcolor.r - startcolor.r) << 7; | |
630: ea4f 18c8 mov.w r8, r8, lsl #7 | |
gdistance87 = (endcolor.g - startcolor.g) << 7; | |
634: ea4f 19c9 mov.w r9, r9, lsl #7 | |
bdistance87 = (endcolor.b - startcolor.b) << 7; | |
638: 01d2 lsls r2, r2, #7 | |
uint16_t pixeldistance = endpos - startpos; | |
int16_t divisor = pixeldistance ? pixeldistance : 1; | |
63a: b10e cbz r6, 640 <_Z17fill_gradient_RGBP4CRGBtS_tS_+0x64> | |
63c: b2b6 uxth r6, r6 | |
63e: e000 b.n 642 <_Z17fill_gradient_RGBP4CRGBtS_tS_+0x66> | |
640: 2601 movs r6, #1 | |
saccum87 rdelta87 = rdistance87 / divisor; | |
642: b236 sxth r6, r6 | |
644: fb98 f8f6 sdiv r8, r8, r6 | |
saccum87 gdelta87 = gdistance87 / divisor; | |
648: fb99 f9f6 sdiv r9, r9, r6 | |
saccum87 bdelta87 = bdistance87 / divisor; | |
64c: fb92 f6f6 sdiv r6, r2, r6 | |
rdelta87 *= 2; | |
650: ea4f 0848 mov.w r8, r8, lsl #1 | |
gdelta87 *= 2; | |
654: ea4f 0949 mov.w r9, r9, lsl #1 | |
bdelta87 *= 2; | |
658: 0076 lsls r6, r6, #1 | |
saccum87 rdelta87 = rdistance87 / divisor; | |
saccum87 gdelta87 = gdistance87 / divisor; | |
saccum87 bdelta87 = bdistance87 / divisor; | |
rdelta87 *= 2; | |
65a: fa1f f888 uxth.w r8, r8 | |
gdelta87 *= 2; | |
65e: fa1f f989 uxth.w r9, r9 | |
bdelta87 *= 2; | |
662: b2b6 uxth r6, r6 | |
accum88 r88 = startcolor.r << 8; | |
664: ea4f 220c mov.w r2, ip, lsl #8 | |
accum88 g88 = startcolor.g << 8; | |
668: 023c lsls r4, r7, #8 | |
accum88 b88 = startcolor.b << 8; | |
66a: 022d lsls r5, r5, #8 | |
for( uint16_t i = startpos; i <= endpos; i++) { | |
66c: 4299 cmp r1, r3 | |
66e: d818 bhi.n 6a2 <_Z17fill_gradient_RGBP4CRGBtS_tS_+0xc6> | |
leds[i] = CRGB( r88 >> 8, g88 >> 8, b88 >> 8); | |
670: eb01 0c41 add.w ip, r1, r1, lsl #1 | |
674: eb00 070c add.w r7, r0, ip | |
678: ea4f 2a22 mov.w sl, r2, asr #8 | |
67c: f800 a00c strb.w sl, [r0, ip] | |
680: ea4f 2c24 mov.w ip, r4, asr #8 | |
684: f887 c001 strb.w ip, [r7, #1] | |
r88 += rdelta87; | |
688: 4442 add r2, r8 | |
accum88 r88 = startcolor.r << 8; | |
accum88 g88 = startcolor.g << 8; | |
accum88 b88 = startcolor.b << 8; | |
for( uint16_t i = startpos; i <= endpos; i++) { | |
leds[i] = CRGB( r88 >> 8, g88 >> 8, b88 >> 8); | |
68a: ea4f 2c25 mov.w ip, r5, asr #8 | |
r88 += rdelta87; | |
g88 += gdelta87; | |
68e: 444c add r4, r9 | |
b88 += bdelta87; | |
690: 4435 add r5, r6 | |
bdelta87 *= 2; | |
accum88 r88 = startcolor.r << 8; | |
accum88 g88 = startcolor.g << 8; | |
accum88 b88 = startcolor.b << 8; | |
for( uint16_t i = startpos; i <= endpos; i++) { | |
692: 3101 adds r1, #1 | |
leds[i] = CRGB( r88 >> 8, g88 >> 8, b88 >> 8); | |
694: f887 c002 strb.w ip, [r7, #2] | |
r88 += rdelta87; | |
698: b292 uxth r2, r2 | |
g88 += gdelta87; | |
69a: b2a4 uxth r4, r4 | |
b88 += bdelta87; | |
69c: b2ad uxth r5, r5 | |
bdelta87 *= 2; | |
accum88 r88 = startcolor.r << 8; | |
accum88 g88 = startcolor.g << 8; | |
accum88 b88 = startcolor.b << 8; | |
for( uint16_t i = startpos; i <= endpos; i++) { | |
69e: b289 uxth r1, r1 | |
6a0: e7e4 b.n 66c <_Z17fill_gradient_RGBP4CRGBtS_tS_+0x90> | |
leds[i] = CRGB( r88 >> 8, g88 >> 8, b88 >> 8); | |
r88 += rdelta87; | |
g88 += gdelta87; | |
b88 += bdelta87; | |
} | |
} | |
6a2: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} | |
6a6: ffff 4b04 vtbl.8 d20, {d15-d18}, d4 | |
000006a8 <rtc_set>: | |
return RTC_TSR; | |
} | |
void rtc_set(unsigned long t) | |
{ | |
RTC_SR = 0; | |
6a8: 4b04 ldr r3, [pc, #16] ; (6bc <rtc_set+0x14>) | |
RTC_TPR = 0; | |
6aa: 4905 ldr r1, [pc, #20] ; (6c0 <rtc_set+0x18>) | |
return RTC_TSR; | |
} | |
void rtc_set(unsigned long t) | |
{ | |
RTC_SR = 0; | |
6ac: 2200 movs r2, #0 | |
6ae: 601a str r2, [r3, #0] | |
RTC_TPR = 0; | |
6b0: 600a str r2, [r1, #0] | |
RTC_TSR = t; | |
6b2: 4a04 ldr r2, [pc, #16] ; (6c4 <rtc_set+0x1c>) | |
6b4: 6010 str r0, [r2, #0] | |
RTC_SR = RTC_SR_TCE; | |
6b6: 2210 movs r2, #16 | |
6b8: 601a str r2, [r3, #0] | |
6ba: 4770 bx lr | |
6bc: 4003d014 .word 0x4003d014 | |
6c0: 4003d004 .word 0x4003d004 | |
6c4: 4003d000 .word 0x4003d000 | |
000006c8 <digitalWrite>: | |
// TODO: startup code needs to initialize all pins to GPIO mode, input by default | |
void digitalWrite(uint8_t pin, uint8_t val) | |
{ | |
if (pin >= CORE_NUM_DIGITAL) return; | |
6c8: 2821 cmp r0, #33 ; 0x21 | |
// TODO: startup code needs to initialize all pins to GPIO mode, input by default | |
void digitalWrite(uint8_t pin, uint8_t val) | |
{ | |
6ca: b510 push {r4, lr} | |
if (pin >= CORE_NUM_DIGITAL) return; | |
6cc: d818 bhi.n 700 <digitalWrite+0x38> | |
#ifdef KINETISK | |
if (*portModeRegister(pin)) { | |
6ce: 4a0d ldr r2, [pc, #52] ; (704 <digitalWrite+0x3c>) | |
6d0: f852 3030 ldr.w r3, [r2, r0, lsl #3] | |
6d4: f893 4280 ldrb.w r4, [r3, #640] ; 0x280 | |
6d8: b13c cbz r4, 6ea <digitalWrite+0x22> | |
6da: 2201 movs r2, #1 | |
if (val) { | |
6dc: b111 cbz r1, 6e4 <digitalWrite+0x1c> | |
*portSetRegister(pin) = 1; | |
6de: f883 2080 strb.w r2, [r3, #128] ; 0x80 | |
6e2: bd10 pop {r4, pc} | |
} else { | |
*portClearRegister(pin) = 1; | |
6e4: f883 2100 strb.w r2, [r3, #256] ; 0x100 | |
6e8: bd10 pop {r4, pc} | |
} else { | |
*portClearRegister(pin) = digitalPinToBitMask(pin); | |
} | |
#endif | |
} else { | |
volatile uint32_t *config = portConfigRegister(pin); | |
6ea: eb02 00c0 add.w r0, r2, r0, lsl #3 | |
6ee: 6843 ldr r3, [r0, #4] | |
if (val) { | |
// TODO use bitband for atomic read-mod-write | |
*config |= (PORT_PCR_PE | PORT_PCR_PS); | |
6f0: 681a ldr r2, [r3, #0] | |
*portClearRegister(pin) = digitalPinToBitMask(pin); | |
} | |
#endif | |
} else { | |
volatile uint32_t *config = portConfigRegister(pin); | |
if (val) { | |
6f2: b111 cbz r1, 6fa <digitalWrite+0x32> | |
// TODO use bitband for atomic read-mod-write | |
*config |= (PORT_PCR_PE | PORT_PCR_PS); | |
6f4: f042 0203 orr.w r2, r2, #3 | |
6f8: e001 b.n 6fe <digitalWrite+0x36> | |
//*config = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; | |
} else { | |
// TODO use bitband for atomic read-mod-write | |
*config &= ~(PORT_PCR_PE); | |
6fa: f022 0202 bic.w r2, r2, #2 | |
6fe: 601a str r2, [r3, #0] | |
700: bd10 pop {r4, pc} | |
702: bf00 nop | |
704: 00002a94 .word 0x00002a94 | |
00000708 <pinMode>: | |
void pinMode(uint8_t pin, uint8_t mode) | |
{ | |
volatile uint32_t *config; | |
if (pin >= CORE_NUM_DIGITAL) return; | |
708: 2821 cmp r0, #33 ; 0x21 | |
} | |
void pinMode(uint8_t pin, uint8_t mode) | |
{ | |
70a: b510 push {r4, lr} | |
volatile uint32_t *config; | |
if (pin >= CORE_NUM_DIGITAL) return; | |
70c: d837 bhi.n 77e <pinMode+0x76> | |
config = portConfigRegister(pin); | |
70e: 4a1c ldr r2, [pc, #112] ; (780 <pinMode+0x78>) | |
710: eb02 03c0 add.w r3, r2, r0, lsl #3 | |
if (mode == OUTPUT || mode == OUTPUT_OPENDRAIN) { | |
714: 2901 cmp r1, #1 | |
void pinMode(uint8_t pin, uint8_t mode) | |
{ | |
volatile uint32_t *config; | |
if (pin >= CORE_NUM_DIGITAL) return; | |
config = portConfigRegister(pin); | |
716: 685b ldr r3, [r3, #4] | |
718: 4614 mov r4, r2 | |
if (mode == OUTPUT || mode == OUTPUT_OPENDRAIN) { | |
71a: d001 beq.n 720 <pinMode+0x18> | |
71c: 2904 cmp r1, #4 | |
71e: d10f bne.n 740 <pinMode+0x38> | |
#ifdef KINETISK | |
*portModeRegister(pin) = 1; | |
720: f854 2030 ldr.w r2, [r4, r0, lsl #3] | |
724: 2001 movs r0, #1 | |
726: f882 0280 strb.w r0, [r2, #640] ; 0x280 | |
#else | |
*portModeRegister(pin) |= digitalPinToBitMask(pin); // TODO: atomic | |
#endif | |
*config = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); | |
72a: f44f 72a2 mov.w r2, #324 ; 0x144 | |
72e: 601a str r2, [r3, #0] | |
if (mode == OUTPUT_OPENDRAIN) { | |
*config |= PORT_PCR_ODE; | |
730: 681a ldr r2, [r3, #0] | |
*portModeRegister(pin) = 1; | |
#else | |
*portModeRegister(pin) |= digitalPinToBitMask(pin); // TODO: atomic | |
#endif | |
*config = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); | |
if (mode == OUTPUT_OPENDRAIN) { | |
732: 2904 cmp r1, #4 | |
*config |= PORT_PCR_ODE; | |
734: bf0c ite eq | |
736: f042 0220 orreq.w r2, r2, #32 | |
} else { | |
*config &= ~PORT_PCR_ODE; | |
73a: f022 0220 bicne.w r2, r2, #32 | |
73e: e01d b.n 77c <pinMode+0x74> | |
} | |
} else { | |
#ifdef KINETISK | |
*portModeRegister(pin) = 0; | |
740: f852 2030 ldr.w r2, [r2, r0, lsl #3] | |
744: 2000 movs r0, #0 | |
746: f882 0280 strb.w r0, [r2, #640] ; 0x280 | |
#else | |
*portModeRegister(pin) &= ~digitalPinToBitMask(pin); | |
#endif | |
if (mode == INPUT || mode == INPUT_PULLUP || mode == INPUT_PULLDOWN) { | |
74a: b111 cbz r1, 752 <pinMode+0x4a> | |
74c: 1e8a subs r2, r1, #2 | |
74e: 2a01 cmp r2, #1 | |
750: d812 bhi.n 778 <pinMode+0x70> | |
*config = PORT_PCR_MUX(1); | |
752: f44f 7280 mov.w r2, #256 ; 0x100 | |
if (mode == INPUT_PULLUP) { | |
756: 2902 cmp r1, #2 | |
*portModeRegister(pin) = 0; | |
#else | |
*portModeRegister(pin) &= ~digitalPinToBitMask(pin); | |
#endif | |
if (mode == INPUT || mode == INPUT_PULLUP || mode == INPUT_PULLDOWN) { | |
*config = PORT_PCR_MUX(1); | |
758: 601a str r2, [r3, #0] | |
if (mode == INPUT_PULLUP) { | |
75a: d103 bne.n 764 <pinMode+0x5c> | |
*config |= (PORT_PCR_PE | PORT_PCR_PS); // pullup | |
75c: 681a ldr r2, [r3, #0] | |
75e: f042 0203 orr.w r2, r2, #3 | |
762: e00b b.n 77c <pinMode+0x74> | |
} else if (mode == INPUT_PULLDOWN) { | |
764: 2903 cmp r1, #3 | |
766: d10a bne.n 77e <pinMode+0x76> | |
*config |= (PORT_PCR_PE); // pulldown | |
768: 681a ldr r2, [r3, #0] | |
76a: f042 0202 orr.w r2, r2, #2 | |
76e: 601a str r2, [r3, #0] | |
*config &= ~(PORT_PCR_PS); | |
770: 681a ldr r2, [r3, #0] | |
772: f022 0201 bic.w r2, r2, #1 | |
776: e001 b.n 77c <pinMode+0x74> | |
} | |
} else { | |
*config = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; // pullup | |
778: f240 1203 movw r2, #259 ; 0x103 | |
77c: 601a str r2, [r3, #0] | |
77e: bd10 pop {r4, pc} | |
780: 00002a94 .word 0x00002a94 | |
00000784 <micros>: | |
uint32_t micros(void) | |
{ | |
uint32_t count, current, istatus; | |
__disable_irq(); | |
784: b672 cpsid i | |
current = SYST_CVR; | |
786: 4b0b ldr r3, [pc, #44] ; (7b4 <micros+0x30>) | |
count = systick_millis_count; | |
istatus = SCB_ICSR; // bit 26 indicates if systick exception pending | |
788: 490b ldr r1, [pc, #44] ; (7b8 <micros+0x34>) | |
uint32_t micros(void) | |
{ | |
uint32_t count, current, istatus; | |
__disable_irq(); | |
current = SYST_CVR; | |
78a: 681a ldr r2, [r3, #0] | |
count = systick_millis_count; | |
78c: 4b0b ldr r3, [pc, #44] ; (7bc <micros+0x38>) | |
78e: 681b ldr r3, [r3, #0] | |
istatus = SCB_ICSR; // bit 26 indicates if systick exception pending | |
790: 6809 ldr r1, [r1, #0] | |
__enable_irq(); | |
792: b662 cpsie i | |
//systick_current = current; | |
//systick_count = count; | |
//systick_istatus = istatus & SCB_ICSR_PENDSTSET ? 1 : 0; | |
if ((istatus & SCB_ICSR_PENDSTSET) && current > 50) count++; | |
794: 0149 lsls r1, r1, #5 | |
796: d502 bpl.n 79e <micros+0x1a> | |
798: 2a32 cmp r2, #50 ; 0x32 | |
79a: bf88 it hi | |
79c: 3301 addhi r3, #1 | |
current = ((F_CPU / 1000) - 1) - current; | |
79e: f5c2 32bb rsb r2, r2, #95744 ; 0x17600 | |
#if defined(KINETISL) && F_CPU == 48000000 | |
return count * 1000 + ((current * (uint32_t)87381) >> 22); | |
#elif defined(KINETISL) && F_CPU == 24000000 | |
return count * 1000 + ((current * (uint32_t)174763) >> 22); | |
#endif | |
return count * 1000 + current / (F_CPU / 1000000); | |
7a2: 2160 movs r1, #96 ; 0x60 | |
__enable_irq(); | |
//systick_current = current; | |
//systick_count = count; | |
//systick_istatus = istatus & SCB_ICSR_PENDSTSET ? 1 : 0; | |
if ((istatus & SCB_ICSR_PENDSTSET) && current > 50) count++; | |
current = ((F_CPU / 1000) - 1) - current; | |
7a4: 32ff adds r2, #255 ; 0xff | |
#if defined(KINETISL) && F_CPU == 48000000 | |
return count * 1000 + ((current * (uint32_t)87381) >> 22); | |
#elif defined(KINETISL) && F_CPU == 24000000 | |
return count * 1000 + ((current * (uint32_t)174763) >> 22); | |
#endif | |
return count * 1000 + current / (F_CPU / 1000000); | |
7a6: fbb2 f2f1 udiv r2, r2, r1 | |
} | |
7aa: f44f 707a mov.w r0, #1000 ; 0x3e8 | |
7ae: fb00 2003 mla r0, r0, r3, r2 | |
7b2: 4770 bx lr | |
7b4: e000e018 .word 0xe000e018 | |
7b8: e000ed04 .word 0xe000ed04 | |
7bc: 1fffe664 .word 0x1fffe664 | |
000007c0 <delay>: | |
void delay(uint32_t ms) | |
{ | |
7c0: b538 push {r3, r4, r5, lr} | |
7c2: 4604 mov r4, r0 | |
uint32_t start = micros(); | |
7c4: f7ff ffde bl 784 <micros> | |
7c8: 4605 mov r5, r0 | |
if (ms > 0) { | |
7ca: b924 cbnz r4, 7d6 <delay+0x16> | |
7cc: bd38 pop {r3, r4, r5, pc} | |
while (1) { | |
while ((micros() - start) >= 1000) { | |
ms--; | |
if (ms == 0) return; | |
7ce: 3c01 subs r4, #1 | |
7d0: d00a beq.n 7e8 <delay+0x28> | |
start += 1000; | |
7d2: f505 757a add.w r5, r5, #1000 ; 0x3e8 | |
{ | |
uint32_t start = micros(); | |
if (ms > 0) { | |
while (1) { | |
while ((micros() - start) >= 1000) { | |
7d6: f7ff ffd5 bl 784 <micros> | |
7da: 1b40 subs r0, r0, r5 | |
7dc: f5b0 7f7a cmp.w r0, #1000 ; 0x3e8 | |
7e0: d2f5 bcs.n 7ce <delay+0xe> | |
ms--; | |
if (ms == 0) return; | |
start += 1000; | |
} | |
yield(); | |
7e2: f000 fe2d bl 1440 <yield> | |
} | |
7e6: e7f6 b.n 7d6 <delay+0x16> | |
7e8: bd38 pop {r3, r4, r5, pc} | |
7ea: ffff 4b1b ; <UNDEFINED> instruction: 0xffff4b1b | |
000007ec <_init_Teensyduino_internal_>: | |
//void init_pins(void) | |
void _init_Teensyduino_internal_(void) | |
{ | |
#if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
NVIC_ENABLE_IRQ(IRQ_PORTA); | |
7ec: 4b1b ldr r3, [pc, #108] ; (85c <_init_Teensyduino_internal_+0x70>) | |
7ee: f44f 7280 mov.w r2, #256 ; 0x100 | |
#define DEFAULT_FTM_PRESCALE 0 | |
#endif | |
//void init_pins(void) | |
void _init_Teensyduino_internal_(void) | |
{ | |
7f2: b510 push {r4, lr} | |
#if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
NVIC_ENABLE_IRQ(IRQ_PORTA); | |
7f4: 601a str r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_PORTB); | |
7f6: f44f 7200 mov.w r2, #512 ; 0x200 | |
7fa: 601a str r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_PORTC); | |
7fc: f44f 6280 mov.w r2, #1024 ; 0x400 | |
800: 601a str r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_PORTD); | |
802: f44f 6200 mov.w r2, #2048 ; 0x800 | |
806: 601a str r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_PORTE); | |
808: f44f 5280 mov.w r2, #4096 ; 0x1000 | |
80c: 601a str r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_PORTA); | |
NVIC_ENABLE_IRQ(IRQ_PORTCD); | |
#endif | |
//SIM_SCGC6 |= SIM_SCGC6_FTM0; // TODO: use bitband for atomic read-mod-write | |
//SIM_SCGC6 |= SIM_SCGC6_FTM1; | |
FTM0_CNT = 0; | |
80e: 4b14 ldr r3, [pc, #80] ; (860 <_init_Teensyduino_internal_+0x74>) | |
FTM0_MOD = DEFAULT_FTM_MOD; | |
FTM0_C0SC = 0x28; // MSnB:MSnA = 10, ELSnB:ELSnA = 10 | |
810: 4a14 ldr r2, [pc, #80] ; (864 <_init_Teensyduino_internal_+0x78>) | |
FTM3_C4SC = 0x28; | |
FTM3_C5SC = 0x28; | |
FTM3_C6SC = 0x28; | |
FTM3_C7SC = 0x28; | |
#endif | |
FTM0_SC = FTM_SC_CLKS(1) | FTM_SC_PS(DEFAULT_FTM_PRESCALE); | |
812: 4c15 ldr r4, [pc, #84] ; (868 <_init_Teensyduino_internal_+0x7c>) | |
NVIC_ENABLE_IRQ(IRQ_PORTA); | |
NVIC_ENABLE_IRQ(IRQ_PORTCD); | |
#endif | |
//SIM_SCGC6 |= SIM_SCGC6_FTM0; // TODO: use bitband for atomic read-mod-write | |
//SIM_SCGC6 |= SIM_SCGC6_FTM1; | |
FTM0_CNT = 0; | |
814: 2000 movs r0, #0 | |
FTM0_MOD = DEFAULT_FTM_MOD; | |
816: f64b 71ff movw r1, #49151 ; 0xbfff | |
NVIC_ENABLE_IRQ(IRQ_PORTA); | |
NVIC_ENABLE_IRQ(IRQ_PORTCD); | |
#endif | |
//SIM_SCGC6 |= SIM_SCGC6_FTM0; // TODO: use bitband for atomic read-mod-write | |
//SIM_SCGC6 |= SIM_SCGC6_FTM1; | |
FTM0_CNT = 0; | |
81a: 6018 str r0, [r3, #0] | |
FTM0_MOD = DEFAULT_FTM_MOD; | |
81c: 6059 str r1, [r3, #4] | |
FTM0_C0SC = 0x28; // MSnB:MSnA = 10, ELSnB:ELSnA = 10 | |
81e: 2328 movs r3, #40 ; 0x28 | |
820: 6013 str r3, [r2, #0] | |
FTM0_C1SC = 0x28; | |
822: 6093 str r3, [r2, #8] | |
FTM0_C2SC = 0x28; | |
824: 6113 str r3, [r2, #16] | |
FTM0_C3SC = 0x28; | |
826: 6193 str r3, [r2, #24] | |
FTM0_C4SC = 0x28; | |
828: 6213 str r3, [r2, #32] | |
FTM0_C5SC = 0x28; | |
82a: 6293 str r3, [r2, #40] ; 0x28 | |
#if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
FTM0_C6SC = 0x28; | |
82c: 6313 str r3, [r2, #48] ; 0x30 | |
FTM0_C7SC = 0x28; | |
82e: 6393 str r3, [r2, #56] ; 0x38 | |
FTM3_C4SC = 0x28; | |
FTM3_C5SC = 0x28; | |
FTM3_C6SC = 0x28; | |
FTM3_C7SC = 0x28; | |
#endif | |
FTM0_SC = FTM_SC_CLKS(1) | FTM_SC_PS(DEFAULT_FTM_PRESCALE); | |
830: 2209 movs r2, #9 | |
832: 6022 str r2, [r4, #0] | |
FTM1_CNT = 0; | |
834: f504 5480 add.w r4, r4, #4096 ; 0x1000 | |
838: 3404 adds r4, #4 | |
83a: 6020 str r0, [r4, #0] | |
FTM1_MOD = DEFAULT_FTM_MOD; | |
83c: 480b ldr r0, [pc, #44] ; (86c <_init_Teensyduino_internal_+0x80>) | |
83e: 6001 str r1, [r0, #0] | |
FTM1_C0SC = 0x28; | |
840: 490b ldr r1, [pc, #44] ; (870 <_init_Teensyduino_internal_+0x84>) | |
842: 600b str r3, [r1, #0] | |
FTM1_C1SC = 0x28; | |
844: 608b str r3, [r1, #8] | |
FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(DEFAULT_FTM_PRESCALE); | |
846: 4b0b ldr r3, [pc, #44] ; (874 <_init_Teensyduino_internal_+0x88>) | |
848: 601a str r2, [r3, #0] | |
FTM3_MOD = DEFAULT_FTM_MOD; | |
FTM3_C0SC = 0x28; | |
FTM3_C1SC = 0x28; | |
FTM3_SC = FTM_SC_CLKS(1) | FTM_SC_PS(DEFAULT_FTM_PRESCALE); | |
#endif | |
analog_init(); | |
84a: f000 fe19 bl 1480 <analog_init> | |
// for background about this startup delay, please see this conversation | |
// https://forum.pjrc.com/threads/31290-Teensey-3-2-Teensey-Loader-1-24-Issues?p=87273&viewfull=1#post87273 | |
delay(250); | |
84e: 20fa movs r0, #250 ; 0xfa | |
850: f7ff ffb6 bl 7c0 <delay> | |
usb_init(); | |
} | |
854: e8bd 4010 ldmia.w sp!, {r4, lr} | |
#endif | |
analog_init(); | |
// for background about this startup delay, please see this conversation | |
// https://forum.pjrc.com/threads/31290-Teensey-3-2-Teensey-Loader-1-24-Issues?p=87273&viewfull=1#post87273 | |
delay(250); | |
usb_init(); | |
858: f000 bbd6 b.w 1008 <usb_init> | |
85c: e000e104 .word 0xe000e104 | |
860: 40038004 .word 0x40038004 | |
864: 4003800c .word 0x4003800c | |
868: 40038000 .word 0x40038000 | |
86c: 40039008 .word 0x40039008 | |
870: 4003900c .word 0x4003900c | |
874: 40039000 .word 0x40039000 | |
00000878 <endpoint0_transmit>: | |
USB0_ENDPT0 = USB_ENDPT_EPSTALL | USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK; | |
} | |
static void endpoint0_transmit(const void *data, uint32_t len) | |
{ | |
878: b5f0 push {r4, r5, r6, r7, lr} | |
serial_print(","); | |
serial_phex16(len); | |
serial_print(ep0_tx_bdt_bank ? ", odd" : ", even"); | |
serial_print(ep0_tx_data_toggle ? ", d1\n" : ", d0\n"); | |
#endif | |
table[index(0, TX, ep0_tx_bdt_bank)].addr = (void *)data; | |
87a: 4b0c ldr r3, [pc, #48] ; (8ac <endpoint0_transmit+0x34>) | |
87c: 4c0c ldr r4, [pc, #48] ; (8b0 <endpoint0_transmit+0x38>) | |
87e: 781a ldrb r2, [r3, #0] | |
880: f042 0502 orr.w r5, r2, #2 | |
884: eb04 06c5 add.w r6, r4, r5, lsl #3 | |
table[index(0, TX, ep0_tx_bdt_bank)].desc = BDT_DESC(len, ep0_tx_data_toggle); | |
ep0_tx_data_toggle ^= 1; | |
ep0_tx_bdt_bank ^= 1; | |
888: f082 0201 eor.w r2, r2, #1 | |
serial_print(","); | |
serial_phex16(len); | |
serial_print(ep0_tx_bdt_bank ? ", odd" : ", even"); | |
serial_print(ep0_tx_data_toggle ? ", d1\n" : ", d0\n"); | |
#endif | |
table[index(0, TX, ep0_tx_bdt_bank)].addr = (void *)data; | |
88c: 6070 str r0, [r6, #4] | |
table[index(0, TX, ep0_tx_bdt_bank)].desc = BDT_DESC(len, ep0_tx_data_toggle); | |
88e: 4809 ldr r0, [pc, #36] ; (8b4 <endpoint0_transmit+0x3c>) | |
ep0_tx_data_toggle ^= 1; | |
ep0_tx_bdt_bank ^= 1; | |
890: 701a strb r2, [r3, #0] | |
serial_phex16(len); | |
serial_print(ep0_tx_bdt_bank ? ", odd" : ", even"); | |
serial_print(ep0_tx_data_toggle ? ", d1\n" : ", d0\n"); | |
#endif | |
table[index(0, TX, ep0_tx_bdt_bank)].addr = (void *)data; | |
table[index(0, TX, ep0_tx_bdt_bank)].desc = BDT_DESC(len, ep0_tx_data_toggle); | |
892: 7806 ldrb r6, [r0, #0] | |
894: 2e00 cmp r6, #0 | |
896: bf0c ite eq | |
898: 2788 moveq r7, #136 ; 0x88 | |
89a: 27c8 movne r7, #200 ; 0xc8 | |
ep0_tx_data_toggle ^= 1; | |
89c: f086 0601 eor.w r6, r6, #1 | |
serial_phex16(len); | |
serial_print(ep0_tx_bdt_bank ? ", odd" : ", even"); | |
serial_print(ep0_tx_data_toggle ? ", d1\n" : ", d0\n"); | |
#endif | |
table[index(0, TX, ep0_tx_bdt_bank)].addr = (void *)data; | |
table[index(0, TX, ep0_tx_bdt_bank)].desc = BDT_DESC(len, ep0_tx_data_toggle); | |
8a0: ea47 4101 orr.w r1, r7, r1, lsl #16 | |
ep0_tx_data_toggle ^= 1; | |
8a4: 7006 strb r6, [r0, #0] | |
serial_phex16(len); | |
serial_print(ep0_tx_bdt_bank ? ", odd" : ", even"); | |
serial_print(ep0_tx_data_toggle ? ", d1\n" : ", d0\n"); | |
#endif | |
table[index(0, TX, ep0_tx_bdt_bank)].addr = (void *)data; | |
table[index(0, TX, ep0_tx_bdt_bank)].desc = BDT_DESC(len, ep0_tx_data_toggle); | |
8a6: f844 1035 str.w r1, [r4, r5, lsl #3] | |
ep0_tx_data_toggle ^= 1; | |
ep0_tx_bdt_bank ^= 1; | |
8aa: bdf0 pop {r4, r5, r6, r7, pc} | |
8ac: 1fffe6d0 .word 0x1fffe6d0 | |
8b0: 1fffe000 .word 0x1fffe000 | |
8b4: 1fffe748 .word 0x1fffe748 | |
000008b8 <usb_rx>: | |
usb_packet_t *usb_rx(uint32_t endpoint) | |
{ | |
usb_packet_t *ret; | |
endpoint--; | |
8b8: 1e43 subs r3, r0, #1 | |
if (endpoint >= NUM_ENDPOINTS) return NULL; | |
8ba: 2b03 cmp r3, #3 | |
usb_packet_t *usb_rx(uint32_t endpoint) | |
{ | |
8bc: b510 push {r4, lr} | |
usb_packet_t *ret; | |
endpoint--; | |
if (endpoint >= NUM_ENDPOINTS) return NULL; | |
8be: d810 bhi.n 8e2 <usb_rx+0x2a> | |
__disable_irq(); | |
8c0: b672 cpsid i | |
ret = rx_first[endpoint]; | |
8c2: 4a09 ldr r2, [pc, #36] ; (8e8 <usb_rx+0x30>) | |
8c4: f852 0023 ldr.w r0, [r2, r3, lsl #2] | |
if (ret) { | |
8c8: b148 cbz r0, 8de <usb_rx+0x26> | |
rx_first[endpoint] = ret->next; | |
8ca: 6841 ldr r1, [r0, #4] | |
8cc: f842 1023 str.w r1, [r2, r3, lsl #2] | |
usb_rx_byte_count_data[endpoint] -= ret->len; | |
8d0: 4a06 ldr r2, [pc, #24] ; (8ec <usb_rx+0x34>) | |
8d2: 8801 ldrh r1, [r0, #0] | |
8d4: f832 4013 ldrh.w r4, [r2, r3, lsl #1] | |
8d8: 1a61 subs r1, r4, r1 | |
8da: f822 1013 strh.w r1, [r2, r3, lsl #1] | |
} | |
__enable_irq(); | |
8de: b662 cpsie i | |
//serial_print("rx, epidx="); | |
//serial_phex(endpoint); | |
//serial_print(", packet="); | |
//serial_phex32(ret); | |
//serial_print("\n"); | |
return ret; | |
8e0: bd10 pop {r4, pc} | |
usb_packet_t *usb_rx(uint32_t endpoint) | |
{ | |
usb_packet_t *ret; | |
endpoint--; | |
if (endpoint >= NUM_ENDPOINTS) return NULL; | |
8e2: 2000 movs r0, #0 | |
//serial_phex(endpoint); | |
//serial_print(", packet="); | |
//serial_phex32(ret); | |
//serial_print("\n"); | |
return ret; | |
} | |
8e4: bd10 pop {r4, pc} | |
8e6: bf00 nop | |
8e8: 1fffe6c0 .word 0x1fffe6c0 | |
8ec: 1fffe924 .word 0x1fffe924 | |
000008f0 <usb_tx_packet_count>: | |
uint32_t usb_tx_packet_count(uint32_t endpoint) | |
{ | |
const usb_packet_t *p; | |
uint32_t count=0; | |
endpoint--; | |
8f0: 3801 subs r0, #1 | |
if (endpoint >= NUM_ENDPOINTS) return 0; | |
8f2: 2803 cmp r0, #3 | |
8f4: d80a bhi.n 90c <usb_tx_packet_count+0x1c> | |
__disable_irq(); | |
8f6: b672 cpsid i | |
for (p = tx_first[endpoint]; p; p = p->next) count++; | |
8f8: 4b05 ldr r3, [pc, #20] ; (910 <usb_tx_packet_count+0x20>) | |
8fa: f853 3020 ldr.w r3, [r3, r0, lsl #2] | |
} | |
uint32_t usb_tx_packet_count(uint32_t endpoint) | |
{ | |
const usb_packet_t *p; | |
uint32_t count=0; | |
8fe: 2000 movs r0, #0 | |
endpoint--; | |
if (endpoint >= NUM_ENDPOINTS) return 0; | |
__disable_irq(); | |
for (p = tx_first[endpoint]; p; p = p->next) count++; | |
900: b113 cbz r3, 908 <usb_tx_packet_count+0x18> | |
902: 3001 adds r0, #1 | |
904: 685b ldr r3, [r3, #4] | |
906: e7fb b.n 900 <usb_tx_packet_count+0x10> | |
__enable_irq(); | |
908: b662 cpsie i | |
return count; | |
90a: 4770 bx lr | |
{ | |
const usb_packet_t *p; | |
uint32_t count=0; | |
endpoint--; | |
if (endpoint >= NUM_ENDPOINTS) return 0; | |
90c: 2000 movs r0, #0 | |
__disable_irq(); | |
for (p = tx_first[endpoint]; p; p = p->next) count++; | |
__enable_irq(); | |
return count; | |
} | |
90e: 4770 bx lr | |
910: 1fffe714 .word 0x1fffe714 | |
00000914 <usb_rx_memory>: | |
// user is creating data very quickly, their consumption could starve reception | |
// without this prioritization. The packet buffer (input) is assigned to the | |
// first endpoint needing memory. | |
// | |
void usb_rx_memory(usb_packet_t *packet) | |
{ | |
914: b510 push {r4, lr} | |
unsigned int i; | |
const uint8_t *cfg; | |
cfg = usb_endpoint_config_table; | |
//serial_print("rx_mem:"); | |
__disable_irq(); | |
916: b672 cpsid i | |
for (i=1; i <= NUM_ENDPOINTS; i++) { | |
918: 2301 movs r3, #1 | |
91a: 4a17 ldr r2, [pc, #92] ; (978 <usb_rx_memory+0x64>) | |
91c: 441a add r2, r3 | |
#ifdef AUDIO_INTERFACE | |
if (i == AUDIO_RX_ENDPOINT) continue; | |
#endif | |
if (*cfg++ & USB_ENDPT_EPRXEN) { | |
91e: f812 2c01 ldrb.w r2, [r2, #-1] | |
922: 0712 lsls r2, r2, #28 | |
924: d51c bpl.n 960 <usb_rx_memory+0x4c> | |
if (table[index(i, RX, EVEN)].desc == 0) { | |
926: 0099 lsls r1, r3, #2 | |
928: 4a14 ldr r2, [pc, #80] ; (97c <usb_rx_memory+0x68>) | |
92a: f852 4031 ldr.w r4, [r2, r1, lsl #3] | |
92e: b92c cbnz r4, 93c <usb_rx_memory+0x28> | |
table[index(i, RX, EVEN)].addr = packet->buf; | |
930: eb02 1343 add.w r3, r2, r3, lsl #5 | |
934: 3008 adds r0, #8 | |
936: 6058 str r0, [r3, #4] | |
table[index(i, RX, EVEN)].desc = BDT_DESC(64, 0); | |
938: 4b11 ldr r3, [pc, #68] ; (980 <usb_rx_memory+0x6c>) | |
93a: e009 b.n 950 <usb_rx_memory+0x3c> | |
__enable_irq(); | |
//serial_phex(i); | |
//serial_print(",even\n"); | |
return; | |
} | |
if (table[index(i, RX, ODD)].desc == 0) { | |
93c: f041 0101 orr.w r1, r1, #1 | |
940: f852 4031 ldr.w r4, [r2, r1, lsl #3] | |
944: b964 cbnz r4, 960 <usb_rx_memory+0x4c> | |
table[index(i, RX, ODD)].addr = packet->buf; | |
946: eb02 03c1 add.w r3, r2, r1, lsl #3 | |
94a: 3008 adds r0, #8 | |
94c: 6058 str r0, [r3, #4] | |
table[index(i, RX, ODD)].desc = BDT_DESC(64, 1); | |
94e: 4b0d ldr r3, [pc, #52] ; (984 <usb_rx_memory+0x70>) | |
950: f842 3031 str.w r3, [r2, r1, lsl #3] | |
usb_rx_memory_needed--; | |
954: 4b0c ldr r3, [pc, #48] ; (988 <usb_rx_memory+0x74>) | |
956: 781a ldrb r2, [r3, #0] | |
958: 3a01 subs r2, #1 | |
95a: 701a strb r2, [r3, #0] | |
__enable_irq(); | |
95c: b662 cpsie i | |
//serial_phex(i); | |
//serial_print(",odd\n"); | |
return; | |
95e: bd10 pop {r4, pc} | |
const uint8_t *cfg; | |
cfg = usb_endpoint_config_table; | |
//serial_print("rx_mem:"); | |
__disable_irq(); | |
for (i=1; i <= NUM_ENDPOINTS; i++) { | |
960: 3301 adds r3, #1 | |
962: 2b05 cmp r3, #5 | |
964: d1d9 bne.n 91a <usb_rx_memory+0x6> | |
//serial_print(",odd\n"); | |
return; | |
} | |
} | |
} | |
__enable_irq(); | |
966: b662 cpsie i | |
// we should never reach this point. If we get here, it means | |
// usb_rx_memory_needed was set greater than zero, but no memory | |
// was actually needed. | |
usb_rx_memory_needed = 0; | |
968: 4b07 ldr r3, [pc, #28] ; (988 <usb_rx_memory+0x74>) | |
96a: 2200 movs r2, #0 | |
96c: 701a strb r2, [r3, #0] | |
usb_free(packet); | |
return; | |
} | |
96e: e8bd 4010 ldmia.w sp!, {r4, lr} | |
__enable_irq(); | |
// we should never reach this point. If we get here, it means | |
// usb_rx_memory_needed was set greater than zero, but no memory | |
// was actually needed. | |
usb_rx_memory_needed = 0; | |
usb_free(packet); | |
972: f000 bba5 b.w 10c0 <usb_free> | |
976: bf00 nop | |
978: 00002bd0 .word 0x00002bd0 | |
97c: 1fffe000 .word 0x1fffe000 | |
980: 00400088 .word 0x00400088 | |
984: 004000c8 .word 0x004000c8 | |
988: 1fffe73e .word 0x1fffe73e | |
0000098c <usb_tx>: | |
void usb_tx(uint32_t endpoint, usb_packet_t *packet) | |
{ | |
bdt_t *b = &table[index(endpoint, TX, EVEN)]; | |
uint8_t next; | |
endpoint--; | |
98c: 1e43 subs r3, r0, #1 | |
if (endpoint >= NUM_ENDPOINTS) return; | |
98e: 2b03 cmp r3, #3 | |
//#define index(endpoint, tx, odd) (((endpoint) << 2) | ((tx) << 1) | (odd)) | |
//#define stat2bufferdescriptor(stat) (table + ((stat) >> 2)) | |
void usb_tx(uint32_t endpoint, usb_packet_t *packet) | |
{ | |
990: b530 push {r4, r5, lr} | |
bdt_t *b = &table[index(endpoint, TX, EVEN)]; | |
uint8_t next; | |
endpoint--; | |
if (endpoint >= NUM_ENDPOINTS) return; | |
992: d832 bhi.n 9fa <usb_tx+0x6e> | |
//#define index(endpoint, tx, odd) (((endpoint) << 2) | ((tx) << 1) | (odd)) | |
//#define stat2bufferdescriptor(stat) (table + ((stat) >> 2)) | |
void usb_tx(uint32_t endpoint, usb_packet_t *packet) | |
{ | |
bdt_t *b = &table[index(endpoint, TX, EVEN)]; | |
994: 4a19 ldr r2, [pc, #100] ; (9fc <usb_tx+0x70>) | |
996: 0140 lsls r0, r0, #5 | |
998: f040 0010 orr.w r0, r0, #16 | |
99c: 4410 add r0, r2 | |
uint8_t next; | |
endpoint--; | |
if (endpoint >= NUM_ENDPOINTS) return; | |
__disable_irq(); | |
99e: b672 cpsid i | |
//serial_print("txstate="); | |
//serial_phex(tx_state[endpoint]); | |
//serial_print("\n"); | |
switch (tx_state[endpoint]) { | |
9a0: 4c17 ldr r4, [pc, #92] ; (a00 <usb_tx+0x74>) | |
9a2: 5ce2 ldrb r2, [r4, r3] | |
9a4: 2a03 cmp r2, #3 | |
9a6: d809 bhi.n 9bc <usb_tx+0x30> | |
9a8: e8df f002 tbb [pc, r2] | |
9ac: 05180216 .word 0x05180216 | |
case TX_STATE_BOTH_FREE_EVEN_FIRST: | |
next = TX_STATE_ODD_FREE; | |
break; | |
case TX_STATE_BOTH_FREE_ODD_FIRST: | |
b++; | |
9b0: 3008 adds r0, #8 | |
next = TX_STATE_EVEN_FREE; | |
9b2: 2202 movs r2, #2 | |
break; | |
9b4: e013 b.n 9de <usb_tx+0x52> | |
case TX_STATE_EVEN_FREE: | |
next = TX_STATE_NONE_FREE_ODD_FIRST; | |
break; | |
case TX_STATE_ODD_FREE: | |
b++; | |
9b6: 3008 adds r0, #8 | |
next = TX_STATE_NONE_FREE_EVEN_FIRST; | |
9b8: 2204 movs r2, #4 | |
break; | |
9ba: e010 b.n 9de <usb_tx+0x52> | |
default: | |
if (tx_first[endpoint] == NULL) { | |
9bc: 4811 ldr r0, [pc, #68] ; (a04 <usb_tx+0x78>) | |
9be: 4a12 ldr r2, [pc, #72] ; (a08 <usb_tx+0x7c>) | |
9c0: f850 4023 ldr.w r4, [r0, r3, lsl #2] | |
9c4: b914 cbnz r4, 9cc <usb_tx+0x40> | |
tx_first[endpoint] = packet; | |
9c6: f840 1023 str.w r1, [r0, r3, lsl #2] | |
9ca: e002 b.n 9d2 <usb_tx+0x46> | |
} else { | |
tx_last[endpoint]->next = packet; | |
9cc: f852 0023 ldr.w r0, [r2, r3, lsl #2] | |
9d0: 6041 str r1, [r0, #4] | |
} | |
tx_last[endpoint] = packet; | |
9d2: f842 1023 str.w r1, [r2, r3, lsl #2] | |
9d6: e00f b.n 9f8 <usb_tx+0x6c> | |
//serial_print("txstate="); | |
//serial_phex(tx_state[endpoint]); | |
//serial_print("\n"); | |
switch (tx_state[endpoint]) { | |
case TX_STATE_BOTH_FREE_EVEN_FIRST: | |
next = TX_STATE_ODD_FREE; | |
9d8: 2203 movs r2, #3 | |
9da: e000 b.n 9de <usb_tx+0x52> | |
case TX_STATE_BOTH_FREE_ODD_FIRST: | |
b++; | |
next = TX_STATE_EVEN_FREE; | |
break; | |
case TX_STATE_EVEN_FREE: | |
next = TX_STATE_NONE_FREE_ODD_FIRST; | |
9dc: 2205 movs r2, #5 | |
} | |
tx_last[endpoint] = packet; | |
__enable_irq(); | |
return; | |
} | |
tx_state[endpoint] = next; | |
9de: 54e2 strb r2, [r4, r3] | |
b->addr = packet->buf; | |
b->desc = BDT_DESC(packet->len, ((uint32_t)b & 8) ? DATA1 : DATA0); | |
9e0: f010 0f08 tst.w r0, #8 | |
tx_last[endpoint] = packet; | |
__enable_irq(); | |
return; | |
} | |
tx_state[endpoint] = next; | |
b->addr = packet->buf; | |
9e4: f101 0308 add.w r3, r1, #8 | |
b->desc = BDT_DESC(packet->len, ((uint32_t)b & 8) ? DATA1 : DATA0); | |
9e8: 880a ldrh r2, [r1, #0] | |
tx_last[endpoint] = packet; | |
__enable_irq(); | |
return; | |
} | |
tx_state[endpoint] = next; | |
b->addr = packet->buf; | |
9ea: 6043 str r3, [r0, #4] | |
b->desc = BDT_DESC(packet->len, ((uint32_t)b & 8) ? DATA1 : DATA0); | |
9ec: bf0c ite eq | |
9ee: 2388 moveq r3, #136 ; 0x88 | |
9f0: 23c8 movne r3, #200 ; 0xc8 | |
9f2: ea43 4302 orr.w r3, r3, r2, lsl #16 | |
9f6: 6003 str r3, [r0, #0] | |
__enable_irq(); | |
9f8: b662 cpsie i | |
9fa: bd30 pop {r4, r5, pc} | |
9fc: 1fffe000 .word 0x1fffe000 | |
a00: 1fffe67c .word 0x1fffe67c | |
a04: 1fffe714 .word 0x1fffe714 | |
a08: 1fffe724 .word 0x1fffe724 | |
00000a0c <usb_isr>: | |
} | |
void usb_isr(void) | |
{ | |
a0c: e92d 4ff8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} | |
//serial_print("isr"); | |
//status = USB0_ISTAT; | |
//serial_phex(status); | |
//serial_print("\n"); | |
restart: | |
status = USB0_ISTAT; | |
a10: 4fab ldr r7, [pc, #684] ; (cc0 <usb_isr+0x2b4>) | |
a12: 783c ldrb r4, [r7, #0] | |
a14: b2e4 uxtb r4, r4 | |
if ((status & USB_ISTAT_SOFTOK /* 04 */ )) { | |
a16: f014 0f04 tst.w r4, #4 | |
a1a: 463d mov r5, r7 | |
a1c: d019 beq.n a52 <usb_isr+0x46> | |
if (usb_configuration) { | |
a1e: 4ba9 ldr r3, [pc, #676] ; (cc4 <usb_isr+0x2b8>) | |
a20: 781b ldrb r3, [r3, #0] | |
a22: b1a3 cbz r3, a4e <usb_isr+0x42> | |
t = usb_reboot_timer; | |
a24: 4aa8 ldr r2, [pc, #672] ; (cc8 <usb_isr+0x2bc>) | |
a26: 7811 ldrb r1, [r2, #0] | |
if (t) { | |
a28: f001 03ff and.w r3, r1, #255 ; 0xff | |
a2c: b121 cbz r1, a38 <usb_isr+0x2c> | |
usb_reboot_timer = --t; | |
a2e: 3b01 subs r3, #1 | |
a30: b2db uxtb r3, r3 | |
a32: 7013 strb r3, [r2, #0] | |
if (!t) _reboot_Teensyduino_(); | |
a34: b903 cbnz r3, a38 <usb_isr+0x2c> | |
void _reboot_Teensyduino_(void) | |
{ | |
// TODO: initialize R0 with a code.... | |
__asm__ volatile("bkpt"); | |
a36: be00 bkpt 0x0000 | |
if (t) { | |
usb_reboot_timer = --t; | |
if (!t) _reboot_Teensyduino_(); | |
} | |
#ifdef CDC_DATA_INTERFACE | |
t = usb_cdc_transmit_flush_timer; | |
a38: 4aa4 ldr r2, [pc, #656] ; (ccc <usb_isr+0x2c0>) | |
a3a: 7811 ldrb r1, [r2, #0] | |
if (t) { | |
a3c: f001 03ff and.w r3, r1, #255 ; 0xff | |
a40: b129 cbz r1, a4e <usb_isr+0x42> | |
usb_cdc_transmit_flush_timer = --t; | |
a42: 3b01 subs r3, #1 | |
a44: b2db uxtb r3, r3 | |
a46: 7013 strb r3, [r2, #0] | |
if (t == 0) usb_serial_flush_callback(); | |
a48: b90b cbnz r3, a4e <usb_isr+0x42> | |
a4a: f000 fc65 bl 1318 <usb_serial_flush_callback> | |
#endif | |
#ifdef MULTITOUCH_INTERFACE | |
usb_touchscreen_update_callback(); | |
#endif | |
} | |
USB0_ISTAT = USB_ISTAT_SOFTOK; | |
a4e: 2304 movs r3, #4 | |
a50: 703b strb r3, [r7, #0] | |
} | |
if ((status & USB_ISTAT_TOKDNE /* 08 */ )) { | |
a52: f004 0308 and.w r3, r4, #8 | |
a56: f003 02ff and.w r2, r3, #255 ; 0xff | |
a5a: 2b00 cmp r3, #0 | |
a5c: f000 8267 beq.w f2e <usb_isr+0x522> | |
uint8_t endpoint; | |
stat = USB0_STAT; | |
a60: 4b9b ldr r3, [pc, #620] ; (cd0 <usb_isr+0x2c4>) | |
a62: 4c9c ldr r4, [pc, #624] ; (cd4 <usb_isr+0x2c8>) | |
a64: 781a ldrb r2, [r3, #0] | |
a66: b2d2 uxtb r2, r2 | |
//serial_print("token: ep="); | |
//serial_phex(stat >> 4); | |
//serial_print(stat & 0x08 ? ",tx" : ",rx"); | |
//serial_print(stat & 0x04 ? ",odd\n" : ",even\n"); | |
endpoint = stat >> 4; | |
if (endpoint == 0) { | |
a68: 0915 lsrs r5, r2, #4 | |
a6a: ea4f 0892 mov.w r8, r2, lsr #2 | |
a6e: f040 81e4 bne.w e3a <usb_isr+0x42e> | |
bdt_t *b; | |
uint32_t pid, size; | |
uint8_t *buf; | |
const uint8_t *data; | |
b = stat2bufferdescriptor(stat); | |
a72: eb04 03c8 add.w r3, r4, r8, lsl #3 | |
pid = BDT_PID(b->desc); | |
//count = b->desc >> 16; | |
buf = b->addr; | |
a76: 6859 ldr r1, [r3, #4] | |
uint32_t pid, size; | |
uint8_t *buf; | |
const uint8_t *data; | |
b = stat2bufferdescriptor(stat); | |
pid = BDT_PID(b->desc); | |
a78: f854 3038 ldr.w r3, [r4, r8, lsl #3] | |
a7c: f3c3 0383 ubfx r3, r3, #2, #4 | |
//serial_phex(pid); | |
//serial_print(", count:"); | |
//serial_phex(count); | |
//serial_print("\n"); | |
switch (pid) { | |
a80: 3b01 subs r3, #1 | |
a82: 2b0c cmp r3, #12 | |
a84: f200 81d6 bhi.w e34 <usb_isr+0x428> | |
a88: e8df f013 tbh [pc, r3, lsl #1] | |
a8c: 01950195 .word 0x01950195 | |
a90: 01d401d4 .word 0x01d401d4 | |
a94: 01d401d4 .word 0x01d401d4 | |
a98: 01d401d4 .word 0x01d401d4 | |
a9c: 01d401b0 .word 0x01d401b0 | |
aa0: 01d401d4 .word 0x01d401d4 | |
aa4: 000d .short 0x000d | |
case 0x0D: // Setup received from host | |
//serial_print("PID=Setup\n"); | |
//if (count != 8) ; // panic? | |
// grab the 8 byte setup info | |
setup.word1 = *(uint32_t *)(buf); | |
aa6: 4d8c ldr r5, [pc, #560] ; (cd8 <usb_isr+0x2cc>) | |
aa8: 680a ldr r2, [r1, #0] | |
setup.word2 = *(uint32_t *)(buf + 4); | |
aaa: 684b ldr r3, [r1, #4] | |
//serial_print("leftover tx odd\n"); | |
//} | |
table[index(0, TX, EVEN)].desc = 0; | |
table[index(0, TX, ODD)].desc = 0; | |
// first IN after Setup is always DATA1 | |
ep0_tx_data_toggle = 1; | |
aac: 488b ldr r0, [pc, #556] ; (cdc <usb_isr+0x2d0>) | |
case 0x0D: // Setup received from host | |
//serial_print("PID=Setup\n"); | |
//if (count != 8) ; // panic? | |
// grab the 8 byte setup info | |
setup.word1 = *(uint32_t *)(buf); | |
setup.word2 = *(uint32_t *)(buf + 4); | |
aae: 606b str r3, [r5, #4] | |
//serial_print("leftover tx odd\n"); | |
//} | |
table[index(0, TX, EVEN)].desc = 0; | |
table[index(0, TX, ODD)].desc = 0; | |
// first IN after Setup is always DATA1 | |
ep0_tx_data_toggle = 1; | |
ab0: 2101 movs r1, #1 | |
// grab the 8 byte setup info | |
setup.word1 = *(uint32_t *)(buf); | |
setup.word2 = *(uint32_t *)(buf + 4); | |
// give the buffer back | |
b->desc = BDT_DESC(EP0_SIZE, DATA1); | |
ab2: 4b8b ldr r3, [pc, #556] ; (ce0 <usb_isr+0x2d4>) | |
ab4: f844 3038 str.w r3, [r4, r8, lsl #3] | |
switch (pid) { | |
case 0x0D: // Setup received from host | |
//serial_print("PID=Setup\n"); | |
//if (count != 8) ; // panic? | |
// grab the 8 byte setup info | |
setup.word1 = *(uint32_t *)(buf); | |
ab8: 602a str r2, [r5, #0] | |
b->desc = BDT_DESC(EP0_SIZE, DATA1); | |
//table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 1); | |
//table[index(0, RX, ODD)].desc = BDT_DESC(EP0_SIZE, 1); | |
// clear any leftover pending IN transactions | |
ep0_tx_ptr = NULL; | |
aba: f8df 8250 ldr.w r8, [pc, #592] ; d0c <usb_isr+0x300> | |
//serial_print("leftover tx odd\n"); | |
//} | |
table[index(0, TX, EVEN)].desc = 0; | |
table[index(0, TX, ODD)].desc = 0; | |
// first IN after Setup is always DATA1 | |
ep0_tx_data_toggle = 1; | |
abe: 7001 strb r1, [r0, #0] | |
volatile uint8_t *reg; | |
uint8_t epconf; | |
const uint8_t *cfg; | |
int i; | |
switch (setup.wRequestAndType) { | |
ac0: b292 uxth r2, r2 | |
ac2: f240 6081 movw r0, #1665 ; 0x681 | |
b->desc = BDT_DESC(EP0_SIZE, DATA1); | |
//table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 1); | |
//table[index(0, RX, ODD)].desc = BDT_DESC(EP0_SIZE, 1); | |
// clear any leftover pending IN transactions | |
ep0_tx_ptr = NULL; | |
ac6: 2300 movs r3, #0 | |
volatile uint8_t *reg; | |
uint8_t epconf; | |
const uint8_t *cfg; | |
int i; | |
switch (setup.wRequestAndType) { | |
ac8: 4282 cmp r2, r0 | |
b->desc = BDT_DESC(EP0_SIZE, DATA1); | |
//table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 1); | |
//table[index(0, RX, ODD)].desc = BDT_DESC(EP0_SIZE, 1); | |
// clear any leftover pending IN transactions | |
ep0_tx_ptr = NULL; | |
aca: f8c8 3000 str.w r3, [r8] | |
//serial_print("leftover tx even\n"); | |
//} | |
//if (table[index(0, TX, ODD)].desc & 0x80) { | |
//serial_print("leftover tx odd\n"); | |
//} | |
table[index(0, TX, EVEN)].desc = 0; | |
ace: 6123 str r3, [r4, #16] | |
table[index(0, TX, ODD)].desc = 0; | |
ad0: 61a3 str r3, [r4, #24] | |
volatile uint8_t *reg; | |
uint8_t epconf; | |
const uint8_t *cfg; | |
int i; | |
switch (setup.wRequestAndType) { | |
ad2: d817 bhi.n b04 <usb_isr+0xf8> | |
ad4: f5b2 6fd0 cmp.w r2, #1664 ; 0x680 | |
ad8: f080 811e bcs.w d18 <usb_isr+0x30c> | |
adc: f5b2 7f81 cmp.w r2, #258 ; 0x102 | |
ae0: f000 80cf beq.w c82 <usb_isr+0x276> | |
ae4: d806 bhi.n af4 <usb_isr+0xe8> | |
ae6: 2a80 cmp r2, #128 ; 0x80 | |
ae8: f000 80ba beq.w c60 <usb_isr+0x254> | |
aec: 2a82 cmp r2, #130 ; 0x82 | |
aee: f000 80bb beq.w c68 <usb_isr+0x25c> | |
af2: e131 b.n d58 <usb_isr+0x34c> | |
af4: f240 3302 movw r3, #770 ; 0x302 | |
af8: 429a cmp r2, r3 | |
afa: f000 80d1 beq.w ca0 <usb_isr+0x294> | |
afe: f5b2 6fa0 cmp.w r2, #1280 ; 0x500 | |
b02: e01c b.n b3e <usb_isr+0x132> | |
b04: f242 0021 movw r0, #8225 ; 0x2021 | |
b08: 4282 cmp r2, r0 | |
b0a: f000 8151 beq.w db0 <usb_isr+0x3a4> | |
b0e: d80e bhi.n b2e <usb_isr+0x122> | |
b10: f5b2 6f08 cmp.w r2, #2176 ; 0x880 | |
b14: f000 809e beq.w c54 <usb_isr+0x248> | |
b18: f5b2 6f10 cmp.w r2, #2304 ; 0x900 | |
b1c: f040 811c bne.w d58 <usb_isr+0x34c> | |
case 0x0500: // SET_ADDRESS | |
break; | |
case 0x0900: // SET_CONFIGURATION | |
//serial_print("configure\n"); | |
usb_configuration = setup.wValue; | |
b20: 4b68 ldr r3, [pc, #416] ; (cc4 <usb_isr+0x2b8>) | |
b22: 4e6c ldr r6, [pc, #432] ; (cd4 <usb_isr+0x2c8>) | |
b24: 78aa ldrb r2, [r5, #2] | |
b26: 701a strb r2, [r3, #0] | |
b28: f106 0980 add.w r9, r6, #128 ; 0x80 | |
b2c: e00a b.n b44 <usb_isr+0x138> | |
volatile uint8_t *reg; | |
uint8_t epconf; | |
const uint8_t *cfg; | |
int i; | |
switch (setup.wRequestAndType) { | |
b2e: f242 2121 movw r1, #8737 ; 0x2221 | |
b32: 428a cmp r2, r1 | |
b34: f000 8108 beq.w d48 <usb_isr+0x33c> | |
b38: f242 3321 movw r3, #8993 ; 0x2321 | |
b3c: 429a cmp r2, r3 | |
b3e: f000 810f beq.w d60 <usb_isr+0x354> | |
b42: e109 b.n d58 <usb_isr+0x34c> | |
usb_configuration = setup.wValue; | |
reg = &USB0_ENDPT1; | |
cfg = usb_endpoint_config_table; | |
// clear all BDT entries, free any allocated memory... | |
for (i=4; i < (NUM_ENDPOINTS+1)*4; i++) { | |
if (table[i].desc & BDT_OWN) { | |
b44: 6a33 ldr r3, [r6, #32] | |
b46: 061b lsls r3, r3, #24 | |
b48: d503 bpl.n b52 <usb_isr+0x146> | |
usb_free((usb_packet_t *)((uint8_t *)(table[i].addr) - 8)); | |
b4a: 6a70 ldr r0, [r6, #36] ; 0x24 | |
b4c: 3808 subs r0, #8 | |
b4e: f000 fab7 bl 10c0 <usb_free> | |
b52: 3608 adds r6, #8 | |
//serial_print("configure\n"); | |
usb_configuration = setup.wValue; | |
reg = &USB0_ENDPT1; | |
cfg = usb_endpoint_config_table; | |
// clear all BDT entries, free any allocated memory... | |
for (i=4; i < (NUM_ENDPOINTS+1)*4; i++) { | |
b54: 454e cmp r6, r9 | |
b56: d1f5 bne.n b44 <usb_isr+0x138> | |
b58: 2600 movs r6, #0 | |
b5a: 46b1 mov r9, r6 | |
} | |
} | |
// free all queued packets | |
for (i=0; i < NUM_ENDPOINTS; i++) { | |
usb_packet_t *p, *n; | |
p = rx_first[i]; | |
b5c: f8df a1b0 ldr.w sl, [pc, #432] ; d10 <usb_isr+0x304> | |
b60: f856 000a ldr.w r0, [r6, sl] | |
while (p) { | |
b64: b128 cbz r0, b72 <usb_isr+0x166> | |
n = p->next; | |
b66: f8d0 b004 ldr.w fp, [r0, #4] | |
usb_free(p); | |
b6a: f000 faa9 bl 10c0 <usb_free> | |
p = n; | |
b6e: 4658 mov r0, fp | |
b70: e7f8 b.n b64 <usb_isr+0x158> | |
} | |
rx_first[i] = NULL; | |
b72: f84a 0006 str.w r0, [sl, r6] | |
rx_last[i] = NULL; | |
b76: 4b5b ldr r3, [pc, #364] ; (ce4 <usb_isr+0x2d8>) | |
p = tx_first[i]; | |
b78: f8df a198 ldr.w sl, [pc, #408] ; d14 <usb_isr+0x308> | |
n = p->next; | |
usb_free(p); | |
p = n; | |
} | |
rx_first[i] = NULL; | |
rx_last[i] = NULL; | |
b7c: 50f0 str r0, [r6, r3] | |
p = tx_first[i]; | |
b7e: f856 000a ldr.w r0, [r6, sl] | |
while (p) { | |
b82: b128 cbz r0, b90 <usb_isr+0x184> | |
n = p->next; | |
b84: f8d0 b004 ldr.w fp, [r0, #4] | |
usb_free(p); | |
b88: f000 fa9a bl 10c0 <usb_free> | |
p = n; | |
b8c: 4658 mov r0, fp | |
b8e: e7f8 b.n b82 <usb_isr+0x176> | |
} | |
tx_first[i] = NULL; | |
tx_last[i] = NULL; | |
b90: 4b55 ldr r3, [pc, #340] ; (ce8 <usb_isr+0x2dc>) | |
while (p) { | |
n = p->next; | |
usb_free(p); | |
p = n; | |
} | |
tx_first[i] = NULL; | |
b92: f84a 0006 str.w r0, [sl, r6] | |
tx_last[i] = NULL; | |
b96: 50f0 str r0, [r6, r3] | |
usb_rx_byte_count_data[i] = 0; | |
b98: 4b54 ldr r3, [pc, #336] ; (cec <usb_isr+0x2e0>) | |
b9a: f823 0019 strh.w r0, [r3, r9, lsl #1] | |
switch (tx_state[i]) { | |
b9e: 4b54 ldr r3, [pc, #336] ; (cf0 <usb_isr+0x2e4>) | |
ba0: f819 2003 ldrb.w r2, [r9, r3] | |
ba4: 3a02 subs r2, #2 | |
ba6: 2a03 cmp r2, #3 | |
ba8: d808 bhi.n bbc <usb_isr+0x1b0> | |
baa: e8df f002 tbb [pc, r2] | |
bae: 0402 .short 0x0402 | |
bb0: 0402 .short 0x0402 | |
case TX_STATE_EVEN_FREE: | |
case TX_STATE_NONE_FREE_EVEN_FIRST: | |
tx_state[i] = TX_STATE_BOTH_FREE_EVEN_FIRST; | |
bb2: 2200 movs r2, #0 | |
bb4: e000 b.n bb8 <usb_isr+0x1ac> | |
break; | |
case TX_STATE_ODD_FREE: | |
case TX_STATE_NONE_FREE_ODD_FIRST: | |
tx_state[i] = TX_STATE_BOTH_FREE_ODD_FIRST; | |
bb6: 2201 movs r2, #1 | |
bb8: f803 2009 strb.w r2, [r3, r9] | |
if (table[i].desc & BDT_OWN) { | |
usb_free((usb_packet_t *)((uint8_t *)(table[i].addr) - 8)); | |
} | |
} | |
// free all queued packets | |
for (i=0; i < NUM_ENDPOINTS; i++) { | |
bbc: f109 0901 add.w r9, r9, #1 | |
bc0: f1b9 0f04 cmp.w r9, #4 | |
bc4: f106 0604 add.w r6, r6, #4 | |
bc8: d1c8 bne.n b5c <usb_isr+0x150> | |
break; | |
default: | |
break; | |
} | |
} | |
usb_rx_memory_needed = 0; | |
bca: 4b4a ldr r3, [pc, #296] ; (cf4 <usb_isr+0x2e8>) | |
bcc: 2200 movs r2, #0 | |
bce: 701a strb r2, [r3, #0] | |
for (i=1; i <= NUM_ENDPOINTS; i++) { | |
bd0: 2601 movs r6, #1 | |
bd2: 469a mov sl, r3 | |
bd4: 4a48 ldr r2, [pc, #288] ; (cf8 <usb_isr+0x2ec>) | |
bd6: 4b49 ldr r3, [pc, #292] ; (cfc <usb_isr+0x2f0>) | |
bd8: 4432 add r2, r6 | |
bda: 4433 add r3, r6 | |
epconf = *cfg++; | |
bdc: f812 2c01 ldrb.w r2, [r2, #-1] | |
be0: 009b lsls r3, r3, #2 | |
table[index(i, RX, EVEN)].desc = (AUDIO_RX_SIZE<<16) | BDT_OWN; | |
table[index(i, RX, ODD)].addr = usb_audio_receive_buffer; | |
table[index(i, RX, ODD)].desc = (AUDIO_RX_SIZE<<16) | BDT_OWN; | |
} else | |
#endif | |
if (epconf & USB_ENDPT_EPRXEN) { | |
be2: f012 0f08 tst.w r2, #8 | |
} | |
} | |
usb_rx_memory_needed = 0; | |
for (i=1; i <= NUM_ENDPOINTS; i++) { | |
epconf = *cfg++; | |
*reg = epconf; | |
be6: 701a strb r2, [r3, #0] | |
be8: ea4f 0986 mov.w r9, r6, lsl #2 | |
table[index(i, RX, EVEN)].desc = (AUDIO_RX_SIZE<<16) | BDT_OWN; | |
table[index(i, RX, ODD)].addr = usb_audio_receive_buffer; | |
table[index(i, RX, ODD)].desc = (AUDIO_RX_SIZE<<16) | BDT_OWN; | |
} else | |
#endif | |
if (epconf & USB_ENDPT_EPRXEN) { | |
bec: d025 beq.n c3a <usb_isr+0x22e> | |
usb_packet_t *p; | |
p = usb_malloc(); | |
bee: f000 fa49 bl 1084 <usb_malloc> | |
if (p) { | |
bf2: b138 cbz r0, c04 <usb_isr+0x1f8> | |
table[index(i, RX, EVEN)].addr = p->buf; | |
bf4: eb04 1346 add.w r3, r4, r6, lsl #5 | |
bf8: 3008 adds r0, #8 | |
bfa: 6058 str r0, [r3, #4] | |
table[index(i, RX, EVEN)].desc = BDT_DESC(64, 0); | |
bfc: 4b40 ldr r3, [pc, #256] ; (d00 <usb_isr+0x2f4>) | |
bfe: f844 3039 str.w r3, [r4, r9, lsl #3] | |
c02: e006 b.n c12 <usb_isr+0x206> | |
} else { | |
table[index(i, RX, EVEN)].desc = 0; | |
usb_rx_memory_needed++; | |
c04: f89a 3000 ldrb.w r3, [sl] | |
p = usb_malloc(); | |
if (p) { | |
table[index(i, RX, EVEN)].addr = p->buf; | |
table[index(i, RX, EVEN)].desc = BDT_DESC(64, 0); | |
} else { | |
table[index(i, RX, EVEN)].desc = 0; | |
c08: f844 0039 str.w r0, [r4, r9, lsl #3] | |
usb_rx_memory_needed++; | |
c0c: 3301 adds r3, #1 | |
c0e: f88a 3000 strb.w r3, [sl] | |
} | |
p = usb_malloc(); | |
c12: f000 fa37 bl 1084 <usb_malloc> | |
if (p) { | |
table[index(i, RX, ODD)].addr = p->buf; | |
c16: f049 0301 orr.w r3, r9, #1 | |
} else { | |
table[index(i, RX, EVEN)].desc = 0; | |
usb_rx_memory_needed++; | |
} | |
p = usb_malloc(); | |
if (p) { | |
c1a: b138 cbz r0, c2c <usb_isr+0x220> | |
table[index(i, RX, ODD)].addr = p->buf; | |
c1c: eb04 02c3 add.w r2, r4, r3, lsl #3 | |
c20: 3008 adds r0, #8 | |
c22: 6050 str r0, [r2, #4] | |
table[index(i, RX, ODD)].desc = BDT_DESC(64, 1); | |
c24: 4a2e ldr r2, [pc, #184] ; (ce0 <usb_isr+0x2d4>) | |
c26: f844 2033 str.w r2, [r4, r3, lsl #3] | |
c2a: e006 b.n c3a <usb_isr+0x22e> | |
} else { | |
table[index(i, RX, ODD)].desc = 0; | |
c2c: f844 0033 str.w r0, [r4, r3, lsl #3] | |
usb_rx_memory_needed++; | |
c30: f89a 3000 ldrb.w r3, [sl] | |
c34: 3301 adds r3, #1 | |
c36: f88a 3000 strb.w r3, [sl] | |
} | |
} | |
table[index(i, TX, EVEN)].desc = 0; | |
c3a: f049 0202 orr.w r2, r9, #2 | |
default: | |
break; | |
} | |
} | |
usb_rx_memory_needed = 0; | |
for (i=1; i <= NUM_ENDPOINTS; i++) { | |
c3e: 3601 adds r6, #1 | |
table[index(i, RX, ODD)].desc = 0; | |
usb_rx_memory_needed++; | |
} | |
} | |
table[index(i, TX, EVEN)].desc = 0; | |
table[index(i, TX, ODD)].desc = 0; | |
c40: f049 0903 orr.w r9, r9, #3 | |
} else { | |
table[index(i, RX, ODD)].desc = 0; | |
usb_rx_memory_needed++; | |
} | |
} | |
table[index(i, TX, EVEN)].desc = 0; | |
c44: 2300 movs r3, #0 | |
default: | |
break; | |
} | |
} | |
usb_rx_memory_needed = 0; | |
for (i=1; i <= NUM_ENDPOINTS; i++) { | |
c46: 2e05 cmp r6, #5 | |
} else { | |
table[index(i, RX, ODD)].desc = 0; | |
usb_rx_memory_needed++; | |
} | |
} | |
table[index(i, TX, EVEN)].desc = 0; | |
c48: f844 3032 str.w r3, [r4, r2, lsl #3] | |
table[index(i, TX, ODD)].desc = 0; | |
c4c: f844 3039 str.w r3, [r4, r9, lsl #3] | |
default: | |
break; | |
} | |
} | |
usb_rx_memory_needed = 0; | |
for (i=1; i <= NUM_ENDPOINTS; i++) { | |
c50: d1c0 bne.n bd4 <usb_isr+0x1c8> | |
c52: e086 b.n d62 <usb_isr+0x356> | |
} | |
#endif | |
} | |
break; | |
case 0x0880: // GET_CONFIGURATION | |
reply_buffer[0] = usb_configuration; | |
c54: 4b1b ldr r3, [pc, #108] ; (cc4 <usb_isr+0x2b8>) | |
c56: 4c2b ldr r4, [pc, #172] ; (d04 <usb_isr+0x2f8>) | |
c58: 781b ldrb r3, [r3, #0] | |
c5a: 7023 strb r3, [r4, #0] | |
datalen = 1; | |
c5c: 460b mov r3, r1 | |
c5e: e083 b.n d68 <usb_isr+0x35c> | |
data = reply_buffer; | |
break; | |
case 0x0080: // GET_STATUS (device) | |
reply_buffer[0] = 0; | |
c60: 4c28 ldr r4, [pc, #160] ; (d04 <usb_isr+0x2f8>) | |
c62: 7023 strb r3, [r4, #0] | |
reply_buffer[1] = 0; | |
c64: 7063 strb r3, [r4, #1] | |
c66: e07e b.n d66 <usb_isr+0x35a> | |
datalen = 2; | |
data = reply_buffer; | |
break; | |
case 0x0082: // GET_STATUS (endpoint) | |
if (setup.wIndex > NUM_ENDPOINTS) { | |
c68: 88aa ldrh r2, [r5, #4] | |
c6a: 2a04 cmp r2, #4 | |
c6c: d874 bhi.n d58 <usb_isr+0x34c> | |
// TODO: do we need to handle IN vs OUT here? | |
endpoint0_stall(); | |
return; | |
} | |
reply_buffer[0] = 0; | |
c6e: 4c25 ldr r4, [pc, #148] ; (d04 <usb_isr+0x2f8>) | |
reply_buffer[1] = 0; | |
if (*(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4) & 0x02) reply_buffer[0] = 1; | |
c70: 0092 lsls r2, r2, #2 | |
if (setup.wIndex > NUM_ENDPOINTS) { | |
// TODO: do we need to handle IN vs OUT here? | |
endpoint0_stall(); | |
return; | |
} | |
reply_buffer[0] = 0; | |
c72: 7023 strb r3, [r4, #0] | |
reply_buffer[1] = 0; | |
c74: 7063 strb r3, [r4, #1] | |
if (*(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4) & 0x02) reply_buffer[0] = 1; | |
c76: 4b24 ldr r3, [pc, #144] ; (d08 <usb_isr+0x2fc>) | |
c78: 5c9b ldrb r3, [r3, r2] | |
c7a: 079e lsls r6, r3, #30 | |
c7c: d573 bpl.n d66 <usb_isr+0x35a> | |
c7e: 7021 strb r1, [r4, #0] | |
c80: e071 b.n d66 <usb_isr+0x35a> | |
data = reply_buffer; | |
datalen = 2; | |
break; | |
case 0x0102: // CLEAR_FEATURE (endpoint) | |
i = setup.wIndex & 0x7F; | |
c82: 88aa ldrh r2, [r5, #4] | |
c84: f002 027f and.w r2, r2, #127 ; 0x7f | |
if (i > NUM_ENDPOINTS || setup.wValue != 0) { | |
c88: 2a04 cmp r2, #4 | |
c8a: dc65 bgt.n d58 <usb_isr+0x34c> | |
c8c: 886b ldrh r3, [r5, #2] | |
c8e: 2b00 cmp r3, #0 | |
c90: d162 bne.n d58 <usb_isr+0x34c> | |
// TODO: do we need to handle IN vs OUT here? | |
endpoint0_stall(); | |
return; | |
} | |
(*(uint8_t *)(&USB0_ENDPT0 + i * 4)) &= ~0x02; | |
c92: 0091 lsls r1, r2, #2 | |
c94: 4a1c ldr r2, [pc, #112] ; (d08 <usb_isr+0x2fc>) | |
c96: 440a add r2, r1 | |
c98: 7811 ldrb r1, [r2, #0] | |
c9a: f021 0102 bic.w r1, r1, #2 | |
c9e: e059 b.n d54 <usb_isr+0x348> | |
// TODO: do we need to clear the data toggle here? | |
break; | |
case 0x0302: // SET_FEATURE (endpoint) | |
i = setup.wIndex & 0x7F; | |
ca0: 88aa ldrh r2, [r5, #4] | |
ca2: f002 027f and.w r2, r2, #127 ; 0x7f | |
if (i > NUM_ENDPOINTS || setup.wValue != 0) { | |
ca6: 2a04 cmp r2, #4 | |
ca8: dc56 bgt.n d58 <usb_isr+0x34c> | |
caa: 886b ldrh r3, [r5, #2] | |
cac: 2b00 cmp r3, #0 | |
cae: d153 bne.n d58 <usb_isr+0x34c> | |
// TODO: do we need to handle IN vs OUT here? | |
endpoint0_stall(); | |
return; | |
} | |
(*(uint8_t *)(&USB0_ENDPT0 + i * 4)) |= 0x02; | |
cb0: 0091 lsls r1, r2, #2 | |
cb2: 4a15 ldr r2, [pc, #84] ; (d08 <usb_isr+0x2fc>) | |
cb4: 440a add r2, r1 | |
cb6: 7811 ldrb r1, [r2, #0] | |
cb8: f041 0102 orr.w r1, r1, #2 | |
cbc: e04a b.n d54 <usb_isr+0x348> | |
cbe: bf00 nop | |
cc0: 40072080 .word 0x40072080 | |
cc4: 1fffe747 .word 0x1fffe747 | |
cc8: 1fffe6d1 .word 0x1fffe6d1 | |
ccc: 1fffe749 .word 0x1fffe749 | |
cd0: 40072090 .word 0x40072090 | |
cd4: 1fffe000 .word 0x1fffe000 | |
cd8: 1fffe734 .word 0x1fffe734 | |
cdc: 1fffe748 .word 0x1fffe748 | |
ce0: 004000c8 .word 0x004000c8 | |
ce4: 1fffe66c .word 0x1fffe66c | |
ce8: 1fffe724 .word 0x1fffe724 | |
cec: 1fffe924 .word 0x1fffe924 | |
cf0: 1fffe67c .word 0x1fffe67c | |
cf4: 1fffe73e .word 0x1fffe73e | |
cf8: 00002bd0 .word 0x00002bd0 | |
cfc: 1001c830 .word 0x1001c830 | |
d00: 00400088 .word 0x00400088 | |
d04: 1fffe73f .word 0x1fffe73f | |
d08: 400720c0 .word 0x400720c0 | |
d0c: 1fffe668 .word 0x1fffe668 | |
d10: 1fffe6c0 .word 0x1fffe6c0 | |
d14: 1fffe714 .word 0x1fffe714 | |
//serial_print("\n"); | |
for (list = usb_descriptor_list; 1; list++) { | |
if (list->addr == NULL) break; | |
//if (setup.wValue == list->wValue && | |
//(setup.wIndex == list->wIndex) || ((setup.wValue >> 8) == 3)) { | |
if (setup.wValue == list->wValue && setup.wIndex == list->wIndex) { | |
d18: 886a ldrh r2, [r5, #2] | |
d1a: 88a9 ldrh r1, [r5, #4] | |
d1c: 4b9f ldr r3, [pc, #636] ; (f9c <usb_isr+0x590>) | |
case 0x0681: | |
//serial_print("desc:"); | |
//serial_phex16(setup.wValue); | |
//serial_print("\n"); | |
for (list = usb_descriptor_list; 1; list++) { | |
if (list->addr == NULL) break; | |
d1e: f853 4c08 ldr.w r4, [r3, #-8] | |
d22: f1a3 000c sub.w r0, r3, #12 | |
d26: b1bc cbz r4, d58 <usb_isr+0x34c> | |
//if (setup.wValue == list->wValue && | |
//(setup.wIndex == list->wIndex) || ((setup.wValue >> 8) == 3)) { | |
if (setup.wValue == list->wValue && setup.wIndex == list->wIndex) { | |
d28: f833 6c0c ldrh.w r6, [r3, #-12] | |
d2c: 4296 cmp r6, r2 | |
d2e: d109 bne.n d44 <usb_isr+0x338> | |
d30: f833 6c0a ldrh.w r6, [r3, #-10] | |
d34: 428e cmp r6, r1 | |
d36: d105 bne.n d44 <usb_isr+0x338> | |
data = list->addr; | |
if ((setup.wValue >> 8) == 3) { | |
d38: 0a12 lsrs r2, r2, #8 | |
d3a: 2a03 cmp r2, #3 | |
// for string descriptors, use the descriptor's | |
// length field, allowing runtime configured | |
// length. | |
datalen = *(list->addr); | |
d3c: bf0c ite eq | |
d3e: 7823 ldrbeq r3, [r4, #0] | |
} else { | |
datalen = list->length; | |
d40: 8903 ldrhne r3, [r0, #8] | |
d42: e011 b.n d68 <usb_isr+0x35c> | |
d44: 330c adds r3, #12 | |
d46: e7ea b.n d1e <usb_isr+0x312> | |
//serial_print("desc: not found\n"); | |
endpoint0_stall(); | |
return; | |
#if defined(CDC_STATUS_INTERFACE) | |
case 0x2221: // CDC_SET_CONTROL_LINE_STATE | |
usb_cdc_line_rtsdtr_millis = systick_millis_count; | |
d48: 4a95 ldr r2, [pc, #596] ; (fa0 <usb_isr+0x594>) | |
d4a: 6811 ldr r1, [r2, #0] | |
d4c: 4a95 ldr r2, [pc, #596] ; (fa4 <usb_isr+0x598>) | |
d4e: 6011 str r1, [r2, #0] | |
usb_cdc_line_rtsdtr = setup.wValue; | |
d50: 78a9 ldrb r1, [r5, #2] | |
d52: 4a95 ldr r2, [pc, #596] ; (fa8 <usb_isr+0x59c>) | |
d54: 7011 strb r1, [r2, #0] | |
d56: e004 b.n d62 <usb_isr+0x356> | |
volatile uint8_t usb_reboot_timer = 0; | |
static void endpoint0_stall(void) | |
{ | |
USB0_ENDPT0 = USB_ENDPT_EPSTALL | USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK; | |
d58: 4b94 ldr r3, [pc, #592] ; (fac <usb_isr+0x5a0>) | |
d5a: 220f movs r2, #15 | |
d5c: 701a strb r2, [r3, #0] | |
d5e: e027 b.n db0 <usb_isr+0x3a4> | |
static uint8_t reply_buffer[8]; | |
static void usb_setup(void) | |
{ | |
const uint8_t *data = NULL; | |
uint32_t datalen = 0; | |
d60: 2300 movs r3, #0 | |
static uint8_t reply_buffer[8]; | |
static void usb_setup(void) | |
{ | |
const uint8_t *data = NULL; | |
d62: 461c mov r4, r3 | |
d64: e000 b.n d68 <usb_isr+0x35c> | |
} | |
reply_buffer[0] = 0; | |
reply_buffer[1] = 0; | |
if (*(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4) & 0x02) reply_buffer[0] = 1; | |
data = reply_buffer; | |
datalen = 2; | |
d66: 2302 movs r3, #2 | |
//serial_phex32(data); | |
//serial_print(","); | |
//serial_phex16(datalen); | |
//serial_print("\n"); | |
if (datalen > setup.wLength) datalen = setup.wLength; | |
d68: 88ee ldrh r6, [r5, #6] | |
d6a: 42b3 cmp r3, r6 | |
d6c: bf38 it cc | |
d6e: 461e movcc r6, r3 | |
d70: 2e40 cmp r6, #64 ; 0x40 | |
d72: bf34 ite cc | |
d74: 4635 movcc r5, r6 | |
d76: 2540 movcs r5, #64 ; 0x40 | |
size = datalen; | |
if (size > EP0_SIZE) size = EP0_SIZE; | |
endpoint0_transmit(data, size); | |
d78: 4620 mov r0, r4 | |
d7a: 4629 mov r1, r5 | |
d7c: f7ff fd7c bl 878 <endpoint0_transmit> | |
data += size; | |
datalen -= size; | |
if (datalen == 0 && size < EP0_SIZE) return; | |
d80: 1b76 subs r6, r6, r5 | |
if (datalen > setup.wLength) datalen = setup.wLength; | |
size = datalen; | |
if (size > EP0_SIZE) size = EP0_SIZE; | |
endpoint0_transmit(data, size); | |
data += size; | |
d82: 442c add r4, r5 | |
datalen -= size; | |
if (datalen == 0 && size < EP0_SIZE) return; | |
d84: d103 bne.n d8e <usb_isr+0x382> | |
d86: 2d40 cmp r5, #64 ; 0x40 | |
d88: d112 bne.n db0 <usb_isr+0x3a4> | |
d8a: 4635 mov r5, r6 | |
d8c: e003 b.n d96 <usb_isr+0x38a> | |
d8e: 2e40 cmp r6, #64 ; 0x40 | |
d90: bf34 ite cc | |
d92: 4635 movcc r5, r6 | |
d94: 2540 movcs r5, #64 ; 0x40 | |
size = datalen; | |
if (size > EP0_SIZE) size = EP0_SIZE; | |
endpoint0_transmit(data, size); | |
d96: 4620 mov r0, r4 | |
d98: 4629 mov r1, r5 | |
d9a: f7ff fd6d bl 878 <endpoint0_transmit> | |
data += size; | |
datalen -= size; | |
if (datalen == 0 && size < EP0_SIZE) return; | |
d9e: 1b76 subs r6, r6, r5 | |
if (datalen == 0 && size < EP0_SIZE) return; | |
size = datalen; | |
if (size > EP0_SIZE) size = EP0_SIZE; | |
endpoint0_transmit(data, size); | |
data += size; | |
da0: 442c add r4, r5 | |
datalen -= size; | |
if (datalen == 0 && size < EP0_SIZE) return; | |
da2: d101 bne.n da8 <usb_isr+0x39c> | |
da4: 2d40 cmp r5, #64 ; 0x40 | |
da6: d103 bne.n db0 <usb_isr+0x3a4> | |
ep0_tx_ptr = data; | |
ep0_tx_len = datalen; | |
da8: 4a81 ldr r2, [pc, #516] ; (fb0 <usb_isr+0x5a4>) | |
endpoint0_transmit(data, size); | |
data += size; | |
datalen -= size; | |
if (datalen == 0 && size < EP0_SIZE) return; | |
ep0_tx_ptr = data; | |
daa: f8c8 4000 str.w r4, [r8] | |
ep0_tx_len = datalen; | |
dae: 8016 strh r6, [r2, #0] | |
serial_print("\n"); | |
#endif | |
// actually "do" the setup request | |
usb_setup(); | |
// unfreeze the USB, now that we're ready | |
USB0_CTL = USB_CTL_USBENSOFEN; // clear TXSUSPENDTOKENBUSY bit | |
db0: 2201 movs r2, #1 | |
db2: 4b80 ldr r3, [pc, #512] ; (fb4 <usb_isr+0x5a8>) | |
db4: e03d b.n e32 <usb_isr+0x426> | |
break; | |
case 0x01: // OUT transaction received from host | |
case 0x02: | |
//serial_print("PID=OUT\n"); | |
#ifdef CDC_STATUS_INTERFACE | |
if (setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/) { | |
db6: 4b80 ldr r3, [pc, #512] ; (fb8 <usb_isr+0x5ac>) | |
db8: 881a ldrh r2, [r3, #0] | |
dba: f242 0321 movw r3, #8225 ; 0x2021 | |
dbe: 429a cmp r2, r3 | |
dc0: d110 bne.n de4 <usb_isr+0x3d8> | |
dc2: 2300 movs r3, #0 | |
int i; | |
uint8_t *dst = (uint8_t *)usb_cdc_line_coding; | |
//serial_print("set line coding "); | |
for (i=0; i<7; i++) { | |
//serial_phex(*buf); | |
*dst++ = *buf++; | |
dc4: 4a7d ldr r2, [pc, #500] ; (fbc <usb_isr+0x5b0>) | |
dc6: 5cc8 ldrb r0, [r1, r3] | |
dc8: 5498 strb r0, [r3, r2] | |
#ifdef CDC_STATUS_INTERFACE | |
if (setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/) { | |
int i; | |
uint8_t *dst = (uint8_t *)usb_cdc_line_coding; | |
//serial_print("set line coding "); | |
for (i=0; i<7; i++) { | |
dca: 3301 adds r3, #1 | |
dcc: 2b07 cmp r3, #7 | |
dce: d1f9 bne.n dc4 <usb_isr+0x3b8> | |
//serial_phex(*buf); | |
*dst++ = *buf++; | |
} | |
//serial_phex32(usb_cdc_line_coding[0]); | |
//serial_print("\n"); | |
if (usb_cdc_line_coding[0] == 134) usb_reboot_timer = 15; | |
dd0: 6813 ldr r3, [r2, #0] | |
dd2: 2b86 cmp r3, #134 ; 0x86 | |
dd4: d102 bne.n ddc <usb_isr+0x3d0> | |
dd6: 4b7a ldr r3, [pc, #488] ; (fc0 <usb_isr+0x5b4>) | |
dd8: 220f movs r2, #15 | |
dda: 701a strb r2, [r3, #0] | |
endpoint0_transmit(NULL, 0); | |
ddc: 2000 movs r0, #0 | |
dde: 4601 mov r1, r0 | |
de0: f7ff fd4a bl 878 <endpoint0_transmit> | |
if (usb_audio_set_feature(&setup, buf)) { | |
endpoint0_transmit(NULL, 0); | |
} | |
#endif | |
// give the buffer back | |
b->desc = BDT_DESC(EP0_SIZE, DATA1); | |
de4: 4b77 ldr r3, [pc, #476] ; (fc4 <usb_isr+0x5b8>) | |
de6: f844 3038 str.w r3, [r4, r8, lsl #3] | |
dea: e023 b.n e34 <usb_isr+0x428> | |
//serial_print("PID=IN:"); | |
//serial_phex(stat); | |
//serial_print("\n"); | |
// send remaining data, if any... | |
data = ep0_tx_ptr; | |
dec: 4e76 ldr r6, [pc, #472] ; (fc8 <usb_isr+0x5bc>) | |
dee: 6835 ldr r5, [r6, #0] | |
if (data) { | |
df0: b1b5 cbz r5, e20 <usb_isr+0x414> | |
size = ep0_tx_len; | |
df2: f8df 81bc ldr.w r8, [pc, #444] ; fb0 <usb_isr+0x5a4> | |
df6: f8b8 9000 ldrh.w r9, [r8] | |
dfa: f1b9 0f40 cmp.w r9, #64 ; 0x40 | |
dfe: bf34 ite cc | |
e00: 464c movcc r4, r9 | |
e02: 2440 movcs r4, #64 ; 0x40 | |
if (size > EP0_SIZE) size = EP0_SIZE; | |
endpoint0_transmit(data, size); | |
e04: 4628 mov r0, r5 | |
e06: 4621 mov r1, r4 | |
e08: f7ff fd36 bl 878 <endpoint0_transmit> | |
data += size; | |
ep0_tx_len -= size; | |
e0c: ebc4 0309 rsb r3, r4, r9 | |
e10: b29b uxth r3, r3 | |
e12: f8a8 3000 strh.w r3, [r8] | |
ep0_tx_ptr = (ep0_tx_len > 0 || size == EP0_SIZE) ? data : NULL; | |
e16: b90b cbnz r3, e1c <usb_isr+0x410> | |
e18: 2c40 cmp r4, #64 ; 0x40 | |
e1a: d100 bne.n e1e <usb_isr+0x412> | |
data = ep0_tx_ptr; | |
if (data) { | |
size = ep0_tx_len; | |
if (size > EP0_SIZE) size = EP0_SIZE; | |
endpoint0_transmit(data, size); | |
data += size; | |
e1c: 192b adds r3, r5, r4 | |
ep0_tx_len -= size; | |
ep0_tx_ptr = (ep0_tx_len > 0 || size == EP0_SIZE) ? data : NULL; | |
e1e: 6033 str r3, [r6, #0] | |
} | |
if (setup.bRequest == 5 && setup.bmRequestType == 0) { | |
e20: 4b65 ldr r3, [pc, #404] ; (fb8 <usb_isr+0x5ac>) | |
e22: 881a ldrh r2, [r3, #0] | |
e24: f5b2 6fa0 cmp.w r2, #1280 ; 0x500 | |
e28: d104 bne.n e34 <usb_isr+0x428> | |
setup.bRequest = 0; | |
e2a: 2200 movs r2, #0 | |
e2c: 705a strb r2, [r3, #1] | |
//serial_print("set address: "); | |
//serial_phex16(setup.wValue); | |
//serial_print("\n"); | |
USB0_ADDR = setup.wValue; | |
e2e: 789a ldrb r2, [r3, #2] | |
e30: 4b66 ldr r3, [pc, #408] ; (fcc <usb_isr+0x5c0>) | |
e32: 701a strb r2, [r3, #0] | |
//default: | |
//serial_print("PID=unknown:"); | |
//serial_phex(pid); | |
//serial_print("\n"); | |
} | |
USB0_CTL = USB_CTL_USBENSOFEN; // clear TXSUSPENDTOKENBUSY bit | |
e34: 2201 movs r2, #1 | |
e36: 4b5f ldr r3, [pc, #380] ; (fb4 <usb_isr+0x5a8>) | |
e38: e06c b.n f14 <usb_isr+0x508> | |
//serial_print(stat & 0x04 ? ",odd\n" : ",even\n"); | |
endpoint = stat >> 4; | |
if (endpoint == 0) { | |
usb_control(stat); | |
} else { | |
bdt_t *b = stat2bufferdescriptor(stat); | |
e3a: eb04 06c8 add.w r6, r4, r8, lsl #3 | |
serial_print(((uint32_t)b & 8) ? ", odd" : ", even"); | |
serial_print(", count:"); | |
serial_phex(b->desc >> 16); | |
serial_print("\n"); | |
#endif | |
endpoint--; // endpoint is index to zero-based arrays | |
e3e: 3d01 subs r5, #1 | |
endpoint = stat >> 4; | |
if (endpoint == 0) { | |
usb_control(stat); | |
} else { | |
bdt_t *b = stat2bufferdescriptor(stat); | |
usb_packet_t *packet = (usb_packet_t *)((uint8_t *)(b->addr) - 8); | |
e40: 6873 ldr r3, [r6, #4] | |
b->addr = &usb_audio_sync_feedback; | |
b->desc = (3 << 16) | BDT_OWN; | |
tx_state[endpoint] ^= 1; | |
} else | |
#endif | |
if (stat & 0x08) { // transmit | |
e42: f002 0208 and.w r2, r2, #8 | |
endpoint = stat >> 4; | |
if (endpoint == 0) { | |
usb_control(stat); | |
} else { | |
bdt_t *b = stat2bufferdescriptor(stat); | |
usb_packet_t *packet = (usb_packet_t *)((uint8_t *)(b->addr) - 8); | |
e46: f1a3 0008 sub.w r0, r3, #8 | |
serial_print(((uint32_t)b & 8) ? ", odd" : ", even"); | |
serial_print(", count:"); | |
serial_phex(b->desc >> 16); | |
serial_print("\n"); | |
#endif | |
endpoint--; // endpoint is index to zero-based arrays | |
e4a: b2ed uxtb r5, r5 | |
b->addr = &usb_audio_sync_feedback; | |
b->desc = (3 << 16) | BDT_OWN; | |
tx_state[endpoint] ^= 1; | |
} else | |
#endif | |
if (stat & 0x08) { // transmit | |
e4c: f002 01ff and.w r1, r2, #255 ; 0xff | |
e50: 2a00 cmp r2, #0 | |
e52: d036 beq.n ec2 <usb_isr+0x4b6> | |
usb_free(packet); | |
e54: f000 f934 bl 10c0 <usb_free> | |
packet = tx_first[endpoint]; | |
e58: 485d ldr r0, [pc, #372] ; (fd0 <usb_isr+0x5c4>) | |
e5a: 4b5e ldr r3, [pc, #376] ; (fd4 <usb_isr+0x5c8>) | |
e5c: f850 2025 ldr.w r2, [r0, r5, lsl #2] | |
if (packet) { | |
e60: b1ea cbz r2, e9e <usb_isr+0x492> | |
//serial_print("tx packet\n"); | |
tx_first[endpoint] = packet->next; | |
e62: 6851 ldr r1, [r2, #4] | |
e64: f840 1025 str.w r1, [r0, r5, lsl #2] | |
b->addr = packet->buf; | |
e68: f102 0108 add.w r1, r2, #8 | |
e6c: 6071 str r1, [r6, #4] | |
switch (tx_state[endpoint]) { | |
e6e: 5d59 ldrb r1, [r3, r5] | |
e70: 2903 cmp r1, #3 | |
e72: d80b bhi.n e8c <usb_isr+0x480> | |
e74: e8df f001 tbb [pc, r1] | |
e78: 08060402 .word 0x08060402 | |
case TX_STATE_BOTH_FREE_EVEN_FIRST: | |
tx_state[endpoint] = TX_STATE_ODD_FREE; | |
e7c: 2103 movs r1, #3 | |
e7e: e004 b.n e8a <usb_isr+0x47e> | |
break; | |
case TX_STATE_BOTH_FREE_ODD_FIRST: | |
tx_state[endpoint] = TX_STATE_EVEN_FREE; | |
e80: 2102 movs r1, #2 | |
e82: e002 b.n e8a <usb_isr+0x47e> | |
break; | |
case TX_STATE_EVEN_FREE: | |
tx_state[endpoint] = TX_STATE_NONE_FREE_ODD_FIRST; | |
e84: 2105 movs r1, #5 | |
e86: e000 b.n e8a <usb_isr+0x47e> | |
break; | |
case TX_STATE_ODD_FREE: | |
tx_state[endpoint] = TX_STATE_NONE_FREE_EVEN_FIRST; | |
e88: 2104 movs r1, #4 | |
e8a: 5559 strb r1, [r3, r5] | |
break; | |
default: | |
break; | |
} | |
b->desc = BDT_DESC(packet->len, | |
e8c: f016 0f08 tst.w r6, #8 | |
e90: 8812 ldrh r2, [r2, #0] | |
e92: bf0c ite eq | |
e94: 2388 moveq r3, #136 ; 0x88 | |
e96: 23c8 movne r3, #200 ; 0xc8 | |
e98: ea43 4302 orr.w r3, r3, r2, lsl #16 | |
e9c: e042 b.n f24 <usb_isr+0x518> | |
((uint32_t)b & 8) ? DATA1 : DATA0); | |
} else { | |
//serial_print("tx no packet\n"); | |
switch (tx_state[endpoint]) { | |
e9e: 5d5a ldrb r2, [r3, r5] | |
ea0: 2a03 cmp r2, #3 | |
ea2: d807 bhi.n eb4 <usb_isr+0x4a8> | |
ea4: e8df f002 tbb [pc, r2] | |
ea8: 04024040 .word 0x04024040 | |
case TX_STATE_BOTH_FREE_EVEN_FIRST: | |
case TX_STATE_BOTH_FREE_ODD_FIRST: | |
break; | |
case TX_STATE_EVEN_FREE: | |
tx_state[endpoint] = TX_STATE_BOTH_FREE_EVEN_FIRST; | |
eac: 2200 movs r2, #0 | |
eae: e006 b.n ebe <usb_isr+0x4b2> | |
break; | |
case TX_STATE_ODD_FREE: | |
tx_state[endpoint] = TX_STATE_BOTH_FREE_ODD_FIRST; | |
eb0: 2201 movs r2, #1 | |
eb2: e004 b.n ebe <usb_isr+0x4b2> | |
break; | |
default: | |
tx_state[endpoint] = ((uint32_t)b & 8) ? | |
eb4: f016 0f08 tst.w r6, #8 | |
eb8: bf0c ite eq | |
eba: 2202 moveq r2, #2 | |
ebc: 2203 movne r2, #3 | |
ebe: 555a strb r2, [r3, r5] | |
TX_STATE_ODD_FREE : TX_STATE_EVEN_FREE; | |
break; | |
ec0: e032 b.n f28 <usb_isr+0x51c> | |
} | |
} | |
} else { // receive | |
packet->len = b->desc >> 16; | |
ec2: f854 2038 ldr.w r2, [r4, r8, lsl #3] | |
ec6: 0c12 lsrs r2, r2, #16 | |
ec8: f823 2c08 strh.w r2, [r3, #-8] | |
if (packet->len > 0) { | |
ecc: b322 cbz r2, f18 <usb_isr+0x50c> | |
packet->index = 0; | |
packet->next = NULL; | |
if (rx_first[endpoint] == NULL) { | |
ece: f8df e134 ldr.w lr, [pc, #308] ; 1004 <usb_isr+0x5f8> | |
} | |
} | |
} else { // receive | |
packet->len = b->desc >> 16; | |
if (packet->len > 0) { | |
packet->index = 0; | |
ed2: f823 1c06 strh.w r1, [r3, #-6] | |
packet->next = NULL; | |
ed6: f843 1c04 str.w r1, [r3, #-4] | |
if (rx_first[endpoint] == NULL) { | |
eda: f85e 3025 ldr.w r3, [lr, r5, lsl #2] | |
ede: 493e ldr r1, [pc, #248] ; (fd8 <usb_isr+0x5cc>) | |
ee0: b913 cbnz r3, ee8 <usb_isr+0x4dc> | |
//serial_print("rx 1st, epidx="); | |
//serial_phex(endpoint); | |
//serial_print(", packet="); | |
//serial_phex32((uint32_t)packet); | |
//serial_print("\n"); | |
rx_first[endpoint] = packet; | |
ee2: f84e 0025 str.w r0, [lr, r5, lsl #2] | |
ee6: e002 b.n eee <usb_isr+0x4e2> | |
//serial_print("rx Nth, epidx="); | |
//serial_phex(endpoint); | |
//serial_print(", packet="); | |
//serial_phex32((uint32_t)packet); | |
//serial_print("\n"); | |
rx_last[endpoint]->next = packet; | |
ee8: f851 3025 ldr.w r3, [r1, r5, lsl #2] | |
eec: 6058 str r0, [r3, #4] | |
} | |
rx_last[endpoint] = packet; | |
usb_rx_byte_count_data[endpoint] += packet->len; | |
eee: 4b3b ldr r3, [pc, #236] ; (fdc <usb_isr+0x5d0>) | |
//serial_print(", packet="); | |
//serial_phex32((uint32_t)packet); | |
//serial_print("\n"); | |
rx_last[endpoint]->next = packet; | |
} | |
rx_last[endpoint] = packet; | |
ef0: f841 0025 str.w r0, [r1, r5, lsl #2] | |
usb_rx_byte_count_data[endpoint] += packet->len; | |
ef4: f833 1015 ldrh.w r1, [r3, r5, lsl #1] | |
ef8: 440a add r2, r1 | |
efa: f823 2015 strh.w r2, [r3, r5, lsl #1] | |
// TODO: implement a per-endpoint maximum # of allocated | |
// packets, so a flood of incoming data on 1 endpoint | |
// doesn't starve the others if the user isn't reading | |
// it regularly | |
packet = usb_malloc(); | |
efe: f000 f8c1 bl 1084 <usb_malloc> | |
if (packet) { | |
f02: b110 cbz r0, f0a <usb_isr+0x4fe> | |
b->addr = packet->buf; | |
f04: 3008 adds r0, #8 | |
f06: 6070 str r0, [r6, #4] | |
f08: e006 b.n f18 <usb_isr+0x50c> | |
((uint32_t)b & 8) ? DATA1 : DATA0); | |
} else { | |
//serial_print("starving "); | |
//serial_phex(endpoint + 1); | |
b->desc = 0; | |
usb_rx_memory_needed++; | |
f0a: 4b35 ldr r3, [pc, #212] ; (fe0 <usb_isr+0x5d4>) | |
b->desc = BDT_DESC(64, | |
((uint32_t)b & 8) ? DATA1 : DATA0); | |
} else { | |
//serial_print("starving "); | |
//serial_phex(endpoint + 1); | |
b->desc = 0; | |
f0c: f844 0038 str.w r0, [r4, r8, lsl #3] | |
usb_rx_memory_needed++; | |
f10: 781a ldrb r2, [r3, #0] | |
f12: 3201 adds r2, #1 | |
f14: 701a strb r2, [r3, #0] | |
f16: e007 b.n f28 <usb_isr+0x51c> | |
} | |
} else { | |
b->desc = BDT_DESC(64, ((uint32_t)b & 8) ? DATA1 : DATA0); | |
f18: 4b2a ldr r3, [pc, #168] ; (fc4 <usb_isr+0x5b8>) | |
f1a: 4a32 ldr r2, [pc, #200] ; (fe4 <usb_isr+0x5d8>) | |
f1c: f016 0f08 tst.w r6, #8 | |
f20: bf08 it eq | |
f22: 4613 moveq r3, r2 | |
f24: f844 3038 str.w r3, [r4, r8, lsl #3] | |
} | |
} | |
} | |
USB0_ISTAT = USB_ISTAT_TOKDNE; | |
f28: 2308 movs r3, #8 | |
f2a: 703b strb r3, [r7, #0] | |
goto restart; | |
f2c: e570 b.n a10 <usb_isr+0x4> | |
} | |
if (status & USB_ISTAT_USBRST /* 01 */ ) { | |
f2e: 07e0 lsls r0, r4, #31 | |
f30: d51f bpl.n f72 <usb_isr+0x566> | |
//serial_print("reset\n"); | |
// initialize BDT toggle bits | |
USB0_CTL = USB_CTL_ODDRST; | |
f32: 4920 ldr r1, [pc, #128] ; (fb4 <usb_isr+0x5a8>) | |
ep0_tx_bdt_bank = 0; | |
// set up buffers to receive Setup and OUT packets | |
table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 0); | |
f34: 482b ldr r0, [pc, #172] ; (fe4 <usb_isr+0x5d8>) | |
table[index(0, RX, EVEN)].addr = ep0_rx0_buf; | |
f36: 4c2c ldr r4, [pc, #176] ; (fe8 <usb_isr+0x5dc>) | |
if (status & USB_ISTAT_USBRST /* 01 */ ) { | |
//serial_print("reset\n"); | |
// initialize BDT toggle bits | |
USB0_CTL = USB_CTL_ODDRST; | |
f38: 2302 movs r3, #2 | |
f3a: 700b strb r3, [r1, #0] | |
ep0_tx_bdt_bank = 0; | |
f3c: 4b2b ldr r3, [pc, #172] ; (fec <usb_isr+0x5e0>) | |
f3e: 701a strb r2, [r3, #0] | |
// set up buffers to receive Setup and OUT packets | |
table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 0); | |
f40: 4b2b ldr r3, [pc, #172] ; (ff0 <usb_isr+0x5e4>) | |
f42: 6018 str r0, [r3, #0] | |
table[index(0, RX, EVEN)].addr = ep0_rx0_buf; | |
table[index(0, RX, ODD)].desc = BDT_DESC(EP0_SIZE, 0); | |
f44: 6098 str r0, [r3, #8] | |
table[index(0, RX, ODD)].addr = ep0_rx1_buf; | |
f46: 482b ldr r0, [pc, #172] ; (ff4 <usb_isr+0x5e8>) | |
f48: 60d8 str r0, [r3, #12] | |
table[index(0, TX, EVEN)].desc = 0; | |
f4a: 611a str r2, [r3, #16] | |
table[index(0, TX, ODD)].desc = 0; | |
f4c: 619a str r2, [r3, #24] | |
USB0_CTL = USB_CTL_ODDRST; | |
ep0_tx_bdt_bank = 0; | |
// set up buffers to receive Setup and OUT packets | |
table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 0); | |
table[index(0, RX, EVEN)].addr = ep0_rx0_buf; | |
f4e: 605c str r4, [r3, #4] | |
table[index(0, RX, ODD)].addr = ep0_rx1_buf; | |
table[index(0, TX, EVEN)].desc = 0; | |
table[index(0, TX, ODD)].desc = 0; | |
// activate endpoint 0 | |
USB0_ENDPT0 = USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK; | |
f50: 4b16 ldr r3, [pc, #88] ; (fac <usb_isr+0x5a0>) | |
f52: 200d movs r0, #13 | |
f54: 7018 strb r0, [r3, #0] | |
// clear all ending interrupts | |
USB0_ERRSTAT = 0xFF; | |
f56: 4828 ldr r0, [pc, #160] ; (ff8 <usb_isr+0x5ec>) | |
f58: 23ff movs r3, #255 ; 0xff | |
f5a: 7003 strb r3, [r0, #0] | |
USB0_ISTAT = 0xFF; | |
f5c: 702b strb r3, [r5, #0] | |
// set the address to zero during enumeration | |
USB0_ADDR = 0; | |
f5e: 7402 strb r2, [r0, #16] | |
// enable other interrupts | |
USB0_ERREN = 0xFF; | |
f60: 4a26 ldr r2, [pc, #152] ; (ffc <usb_isr+0x5f0>) | |
f62: 7013 strb r3, [r2, #0] | |
USB0_INTEN = USB_INTEN_TOKDNEEN | | |
f64: 4b26 ldr r3, [pc, #152] ; (1000 <usb_isr+0x5f4>) | |
f66: 229f movs r2, #159 ; 0x9f | |
f68: 701a strb r2, [r3, #0] | |
USB_INTEN_ERROREN | | |
USB_INTEN_USBRSTEN | | |
USB_INTEN_SLEEPEN; | |
// is this necessary? | |
USB0_CTL = USB_CTL_USBENSOFEN; | |
f6a: 2301 movs r3, #1 | |
f6c: 700b strb r3, [r1, #0] | |
return; | |
f6e: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} | |
} | |
if ((status & USB_ISTAT_STALL /* 80 */ )) { | |
f72: 0621 lsls r1, r4, #24 | |
f74: d504 bpl.n f80 <usb_isr+0x574> | |
//serial_print("stall:\n"); | |
USB0_ENDPT0 = USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK; | |
f76: 4b0d ldr r3, [pc, #52] ; (fac <usb_isr+0x5a0>) | |
f78: 220d movs r2, #13 | |
f7a: 701a strb r2, [r3, #0] | |
USB0_ISTAT = USB_ISTAT_STALL; | |
f7c: 2380 movs r3, #128 ; 0x80 | |
f7e: 702b strb r3, [r5, #0] | |
} | |
if ((status & USB_ISTAT_ERROR /* 02 */ )) { | |
f80: 07a2 lsls r2, r4, #30 | |
f82: d505 bpl.n f90 <usb_isr+0x584> | |
uint8_t err = USB0_ERRSTAT; | |
f84: 4b1c ldr r3, [pc, #112] ; (ff8 <usb_isr+0x5ec>) | |
f86: 781a ldrb r2, [r3, #0] | |
f88: b2d2 uxtb r2, r2 | |
USB0_ERRSTAT = err; | |
f8a: 701a strb r2, [r3, #0] | |
//serial_print("err:"); | |
//serial_phex(err); | |
//serial_print("\n"); | |
USB0_ISTAT = USB_ISTAT_ERROR; | |
f8c: 2302 movs r3, #2 | |
f8e: 702b strb r3, [r5, #0] | |
} | |
if ((status & USB_ISTAT_SLEEP /* 10 */ )) { | |
f90: 06e3 lsls r3, r4, #27 | |
//serial_print("sleep\n"); | |
USB0_ISTAT = USB_ISTAT_SLEEP; | |
f92: bf44 itt mi | |
f94: 2310 movmi r3, #16 | |
f96: 702b strbmi r3, [r5, #0] | |
f98: e8bd 8ff8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} | |
f9c: 00002be0 .word 0x00002be0 | |
fa0: 1fffe664 .word 0x1fffe664 | |
fa4: 1fffe934 .word 0x1fffe934 | |
fa8: 1fffe758 .word 0x1fffe758 | |
fac: 400720c0 .word 0x400720c0 | |
fb0: 1fffe73c .word 0x1fffe73c | |
fb4: 40072094 .word 0x40072094 | |
fb8: 1fffe734 .word 0x1fffe734 | |
fbc: 1fffe92c .word 0x1fffe92c | |
fc0: 1fffe6d1 .word 0x1fffe6d1 | |
fc4: 004000c8 .word 0x004000c8 | |
fc8: 1fffe668 .word 0x1fffe668 | |
fcc: 40072098 .word 0x40072098 | |
fd0: 1fffe714 .word 0x1fffe714 | |
fd4: 1fffe67c .word 0x1fffe67c | |
fd8: 1fffe66c .word 0x1fffe66c | |
fdc: 1fffe924 .word 0x1fffe924 | |
fe0: 1fffe73e .word 0x1fffe73e | |
fe4: 00400088 .word 0x00400088 | |
fe8: 1fffe680 .word 0x1fffe680 | |
fec: 1fffe6d0 .word 0x1fffe6d0 | |
ff0: 1fffe000 .word 0x1fffe000 | |
ff4: 1fffe6d4 .word 0x1fffe6d4 | |
ff8: 40072088 .word 0x40072088 | |
ffc: 4007208c .word 0x4007208c | |
1000: 40072084 .word 0x40072084 | |
1004: 1fffe6c0 .word 0x1fffe6c0 | |
00001008 <usb_init>: | |
} | |
void usb_init(void) | |
{ | |
1008: b508 push {r3, lr} | |
int i; | |
//serial_begin(BAUD2DIV(115200)); | |
//serial_print("usb_init\n"); | |
usb_init_serialnumber(); | |
100a: f001 fb33 bl 2674 <usb_init_serialnumber> | |
100e: 2200 movs r2, #0 | |
for (i=0; i <= NUM_ENDPOINTS*4; i++) { | |
table[i].desc = 0; | |
1010: 4b18 ldr r3, [pc, #96] ; (1074 <usb_init+0x6c>) | |
1012: 2100 movs r1, #0 | |
1014: 50d1 str r1, [r2, r3] | |
1016: 1898 adds r0, r3, r2 | |
1018: 3208 adds r2, #8 | |
//serial_begin(BAUD2DIV(115200)); | |
//serial_print("usb_init\n"); | |
usb_init_serialnumber(); | |
for (i=0; i <= NUM_ENDPOINTS*4; i++) { | |
101a: 2a88 cmp r2, #136 ; 0x88 | |
table[i].desc = 0; | |
table[i].addr = 0; | |
101c: 6041 str r1, [r0, #4] | |
//serial_begin(BAUD2DIV(115200)); | |
//serial_print("usb_init\n"); | |
usb_init_serialnumber(); | |
for (i=0; i <= NUM_ENDPOINTS*4; i++) { | |
101e: d1f7 bne.n 1010 <usb_init+0x8> | |
// this basically follows the flowchart in the Kinetis | |
// Quick Reference User Guide, Rev. 1, 03/2012, page 141 | |
// assume 48 MHz clock already running | |
// SIM - enable clock | |
SIM_SCGC4 |= SIM_SCGC4_USBOTG; | |
1020: 4a15 ldr r2, [pc, #84] ; (1078 <usb_init+0x70>) | |
1022: 6810 ldr r0, [r2, #0] | |
1024: f440 2080 orr.w r0, r0, #262144 ; 0x40000 | |
1028: 6010 str r0, [r2, #0] | |
// reset USB module | |
//USB0_USBTRC0 = USB_USBTRC_USBRESET; | |
//while ((USB0_USBTRC0 & USB_USBTRC_USBRESET) != 0) ; // wait for reset to end | |
// set desc table base addr | |
USB0_BDTPAGE1 = ((uint32_t)table) >> 8; | |
102a: f502 3228 add.w r2, r2, #172032 ; 0x2a000 | |
102e: 3268 adds r2, #104 ; 0x68 | |
1030: f3c3 2007 ubfx r0, r3, #8, #8 | |
1034: 7010 strb r0, [r2, #0] | |
USB0_BDTPAGE2 = ((uint32_t)table) >> 16; | |
1036: f3c3 4007 ubfx r0, r3, #16, #8 | |
USB0_BDTPAGE3 = ((uint32_t)table) >> 24; | |
103a: 0e1b lsrs r3, r3, #24 | |
//USB0_USBTRC0 = USB_USBTRC_USBRESET; | |
//while ((USB0_USBTRC0 & USB_USBTRC_USBRESET) != 0) ; // wait for reset to end | |
// set desc table base addr | |
USB0_BDTPAGE1 = ((uint32_t)table) >> 8; | |
USB0_BDTPAGE2 = ((uint32_t)table) >> 16; | |
103c: 7510 strb r0, [r2, #20] | |
USB0_BDTPAGE3 = ((uint32_t)table) >> 24; | |
103e: 7613 strb r3, [r2, #24] | |
// clear all ISR flags | |
USB0_ISTAT = 0xFF; | |
1040: 23ff movs r3, #255 ; 0xff | |
1042: f802 3c1c strb.w r3, [r2, #-28] | |
USB0_ERRSTAT = 0xFF; | |
1046: f802 3c14 strb.w r3, [r2, #-20] | |
USB0_OTGISTAT = 0xFF; | |
104a: f802 3c8c strb.w r3, [r2, #-140] | |
//USB0_USBTRC0 |= 0x40; // undocumented bit | |
// enable USB | |
USB0_CTL = USB_CTL_USBENSOFEN; | |
104e: 2301 movs r3, #1 | |
1050: f802 3c08 strb.w r3, [r2, #-8] | |
USB0_USBCTRL = 0; | |
1054: f882 1064 strb.w r1, [r2, #100] ; 0x64 | |
// enable reset interrupt | |
USB0_INTEN = USB_INTEN_USBRSTEN; | |
1058: f802 3c18 strb.w r3, [r2, #-24] | |
// enable interrupt in NVIC... | |
NVIC_SET_PRIORITY(IRQ_USBOTG, 112); | |
105c: 4b07 ldr r3, [pc, #28] ; (107c <usb_init+0x74>) | |
105e: 2270 movs r2, #112 ; 0x70 | |
1060: 701a strb r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_USBOTG); | |
1062: f2a3 331f subw r3, r3, #799 ; 0x31f | |
1066: 2208 movs r2, #8 | |
1068: 601a str r2, [r3, #0] | |
// enable d+ pullup | |
USB0_CONTROL = USB_CONTROL_DPPULLUPNONOTG; | |
106a: 4b05 ldr r3, [pc, #20] ; (1080 <usb_init+0x78>) | |
106c: 2210 movs r2, #16 | |
106e: 701a strb r2, [r3, #0] | |
1070: bd08 pop {r3, pc} | |
1072: bf00 nop | |
1074: 1fffe000 .word 0x1fffe000 | |
1078: 40048034 .word 0x40048034 | |
107c: e000e423 .word 0xe000e423 | |
1080: 40072108 .word 0x40072108 | |
00001084 <usb_malloc>: | |
usb_packet_t * usb_malloc(void) | |
{ | |
unsigned int n, avail; | |
uint8_t *p; | |
__disable_irq(); | |
1084: b672 cpsid i | |
avail = usb_buffer_available; | |
1086: 4a0c ldr r2, [pc, #48] ; (10b8 <usb_malloc+0x34>) | |
1088: 6811 ldr r1, [r2, #0] | |
n = __builtin_clz(avail); // clz = count leading zeros | |
108a: fab1 f381 clz r3, r1 | |
if (n >= NUM_USB_BUFFERS) { | |
108e: 2b0b cmp r3, #11 | |
1090: d902 bls.n 1098 <usb_malloc+0x14> | |
__enable_irq(); | |
1092: b662 cpsie i | |
return NULL; | |
1094: 2000 movs r0, #0 | |
1096: 4770 bx lr | |
} | |
//serial_print("malloc:"); | |
//serial_phex(n); | |
//serial_print("\n"); | |
usb_buffer_available = avail & ~(0x80000000 >> n); | |
1098: f04f 4000 mov.w r0, #2147483648 ; 0x80000000 | |
109c: 40d8 lsrs r0, r3 | |
109e: ea21 0100 bic.w r1, r1, r0 | |
10a2: 6011 str r1, [r2, #0] | |
__enable_irq(); | |
10a4: b662 cpsie i | |
p = usb_buffer_memory + (n * sizeof(usb_packet_t)); | |
10a6: 4905 ldr r1, [pc, #20] ; (10bc <usb_malloc+0x38>) | |
10a8: 2248 movs r2, #72 ; 0x48 | |
10aa: 4353 muls r3, r2 | |
10ac: 18c8 adds r0, r1, r3 | |
//serial_print("malloc:"); | |
//serial_phex32((int)p); | |
//serial_print("\n"); | |
*(uint32_t *)p = 0; | |
10ae: 2200 movs r2, #0 | |
10b0: 50ca str r2, [r1, r3] | |
*(uint32_t *)(p + 4) = 0; | |
10b2: 6042 str r2, [r0, #4] | |
return (usb_packet_t *)p; | |
} | |
10b4: 4770 bx lr | |
10b6: bf00 nop | |
10b8: 1fffe560 .word 0x1fffe560 | |
10bc: 1fffe200 .word 0x1fffe200 | |
000010c0 <usb_free>: | |
void usb_free(usb_packet_t *p) | |
{ | |
unsigned int n, mask; | |
//serial_print("free:"); | |
n = ((uint8_t *)p - usb_buffer_memory) / sizeof(usb_packet_t); | |
10c0: 4b0c ldr r3, [pc, #48] ; (10f4 <usb_free+0x34>) | |
10c2: 2248 movs r2, #72 ; 0x48 | |
10c4: 1ac3 subs r3, r0, r3 | |
10c6: fbb3 f3f2 udiv r3, r3, r2 | |
if (n >= NUM_USB_BUFFERS) return; | |
10ca: 2b0b cmp r3, #11 | |
10cc: d811 bhi.n 10f2 <usb_free+0x32> | |
//serial_phex(n); | |
//serial_print("\n"); | |
// if any endpoints are starving for memory to receive | |
// packets, give this memory to them immediately! | |
if (usb_rx_memory_needed && usb_configuration) { | |
10ce: 4a0a ldr r2, [pc, #40] ; (10f8 <usb_free+0x38>) | |
10d0: 7812 ldrb r2, [r2, #0] | |
10d2: b122 cbz r2, 10de <usb_free+0x1e> | |
10d4: 4a09 ldr r2, [pc, #36] ; (10fc <usb_free+0x3c>) | |
10d6: 7812 ldrb r2, [r2, #0] | |
10d8: b10a cbz r2, 10de <usb_free+0x1e> | |
//serial_print("give to rx:"); | |
//serial_phex32((int)p); | |
//serial_print("\n"); | |
usb_rx_memory(p); | |
10da: f7ff bc1b b.w 914 <usb_rx_memory> | |
return; | |
} | |
mask = (0x80000000 >> n); | |
__disable_irq(); | |
10de: b672 cpsid i | |
usb_buffer_available |= mask; | |
10e0: 4a07 ldr r2, [pc, #28] ; (1100 <usb_free+0x40>) | |
//serial_print("\n"); | |
usb_rx_memory(p); | |
return; | |
} | |
mask = (0x80000000 >> n); | |
10e2: f04f 4100 mov.w r1, #2147483648 ; 0x80000000 | |
10e6: fa21 f303 lsr.w r3, r1, r3 | |
__disable_irq(); | |
usb_buffer_available |= mask; | |
10ea: 6811 ldr r1, [r2, #0] | |
10ec: 4319 orrs r1, r3 | |
10ee: 6011 str r1, [r2, #0] | |
__enable_irq(); | |
10f0: b662 cpsie i | |
10f2: 4770 bx lr | |
10f4: 1fffe200 .word 0x1fffe200 | |
10f8: 1fffe73e .word 0x1fffe73e | |
10fc: 1fffe747 .word 0x1fffe747 | |
1100: 1fffe560 .word 0x1fffe560 | |
00001104 <usb_serial_getchar>: | |
#define TRANSMIT_FLUSH_TIMEOUT 5 /* in milliseconds */ | |
// get the next character, or -1 if nothing received | |
int usb_serial_getchar(void) | |
{ | |
1104: b510 push {r4, lr} | |
unsigned int i; | |
int c; | |
if (!rx_packet) { | |
1106: 4c10 ldr r4, [pc, #64] ; (1148 <usb_serial_getchar+0x44>) | |
1108: 6823 ldr r3, [r4, #0] | |
110a: b16b cbz r3, 1128 <usb_serial_getchar+0x24> | |
if (!usb_configuration) return -1; | |
rx_packet = usb_rx(CDC_RX_ENDPOINT); | |
if (!rx_packet) return -1; | |
} | |
i = rx_packet->index; | |
110c: 6820 ldr r0, [r4, #0] | |
110e: 8842 ldrh r2, [r0, #2] | |
c = rx_packet->buf[i++]; | |
1110: 1c53 adds r3, r2, #1 | |
1112: 4402 add r2, r0 | |
1114: 7a14 ldrb r4, [r2, #8] | |
if (i >= rx_packet->len) { | |
1116: 8802 ldrh r2, [r0, #0] | |
1118: 4293 cmp r3, r2 | |
111a: d312 bcc.n 1142 <usb_serial_getchar+0x3e> | |
usb_free(rx_packet); | |
111c: f7ff ffd0 bl 10c0 <usb_free> | |
rx_packet = NULL; | |
1120: 4b09 ldr r3, [pc, #36] ; (1148 <usb_serial_getchar+0x44>) | |
1122: 2200 movs r2, #0 | |
1124: 601a str r2, [r3, #0] | |
1126: e00d b.n 1144 <usb_serial_getchar+0x40> | |
{ | |
unsigned int i; | |
int c; | |
if (!rx_packet) { | |
if (!usb_configuration) return -1; | |
1128: 4b08 ldr r3, [pc, #32] ; (114c <usb_serial_getchar+0x48>) | |
112a: 781b ldrb r3, [r3, #0] | |
112c: b913 cbnz r3, 1134 <usb_serial_getchar+0x30> | |
112e: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
1132: bd10 pop {r4, pc} | |
rx_packet = usb_rx(CDC_RX_ENDPOINT); | |
1134: 2003 movs r0, #3 | |
1136: f7ff fbbf bl 8b8 <usb_rx> | |
113a: 6020 str r0, [r4, #0] | |
if (!rx_packet) return -1; | |
113c: 2800 cmp r0, #0 | |
113e: d1e5 bne.n 110c <usb_serial_getchar+0x8> | |
1140: e7f5 b.n 112e <usb_serial_getchar+0x2a> | |
c = rx_packet->buf[i++]; | |
if (i >= rx_packet->len) { | |
usb_free(rx_packet); | |
rx_packet = NULL; | |
} else { | |
rx_packet->index = i; | |
1142: 8043 strh r3, [r0, #2] | |
} | |
return c; | |
1144: 4620 mov r0, r4 | |
} | |
1146: bd10 pop {r4, pc} | |
1148: 1fffe754 .word 0x1fffe754 | |
114c: 1fffe747 .word 0x1fffe747 | |
00001150 <usb_serial_peekchar>: | |
// peek at the next character, or -1 if nothing received | |
int usb_serial_peekchar(void) | |
{ | |
1150: b510 push {r4, lr} | |
if (!rx_packet) { | |
1152: 4c0b ldr r4, [pc, #44] ; (1180 <usb_serial_peekchar+0x30>) | |
1154: 6823 ldr r3, [r4, #0] | |
1156: b113 cbz r3, 115e <usb_serial_peekchar+0xe> | |
if (!usb_configuration) return -1; | |
rx_packet = usb_rx(CDC_RX_ENDPOINT); | |
if (!rx_packet) return -1; | |
} | |
if (!rx_packet) return -1; | |
1158: 6823 ldr r3, [r4, #0] | |
115a: b96b cbnz r3, 1178 <usb_serial_peekchar+0x28> | |
115c: e002 b.n 1164 <usb_serial_peekchar+0x14> | |
// peek at the next character, or -1 if nothing received | |
int usb_serial_peekchar(void) | |
{ | |
if (!rx_packet) { | |
if (!usb_configuration) return -1; | |
115e: 4b09 ldr r3, [pc, #36] ; (1184 <usb_serial_peekchar+0x34>) | |
1160: 781b ldrb r3, [r3, #0] | |
1162: b913 cbnz r3, 116a <usb_serial_peekchar+0x1a> | |
1164: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
1168: bd10 pop {r4, pc} | |
rx_packet = usb_rx(CDC_RX_ENDPOINT); | |
116a: 2003 movs r0, #3 | |
116c: f7ff fba4 bl 8b8 <usb_rx> | |
1170: 6020 str r0, [r4, #0] | |
if (!rx_packet) return -1; | |
1172: 2800 cmp r0, #0 | |
1174: d1f0 bne.n 1158 <usb_serial_peekchar+0x8> | |
1176: e7f5 b.n 1164 <usb_serial_peekchar+0x14> | |
} | |
if (!rx_packet) return -1; | |
return rx_packet->buf[rx_packet->index]; | |
1178: 885a ldrh r2, [r3, #2] | |
117a: 4413 add r3, r2 | |
117c: 7a18 ldrb r0, [r3, #8] | |
} | |
117e: bd10 pop {r4, pc} | |
1180: 1fffe754 .word 0x1fffe754 | |
1184: 1fffe747 .word 0x1fffe747 | |
00001188 <usb_serial_available>: | |
static inline uint32_t usb_rx_byte_count(uint32_t endpoint) __attribute__((always_inline)); | |
static inline uint32_t usb_rx_byte_count(uint32_t endpoint) | |
{ | |
endpoint--; | |
if (endpoint >= NUM_ENDPOINTS) return 0; | |
return usb_rx_byte_count_data[endpoint]; | |
1188: 4b04 ldr r3, [pc, #16] ; (119c <usb_serial_available+0x14>) | |
// number of bytes available in the receive buffer | |
int usb_serial_available(void) | |
{ | |
int count; | |
count = usb_rx_byte_count(CDC_RX_ENDPOINT); | |
118a: 8898 ldrh r0, [r3, #4] | |
if (rx_packet) count += rx_packet->len - rx_packet->index; | |
118c: 4b04 ldr r3, [pc, #16] ; (11a0 <usb_serial_available+0x18>) | |
118e: 681b ldr r3, [r3, #0] | |
1190: b11b cbz r3, 119a <usb_serial_available+0x12> | |
1192: 881a ldrh r2, [r3, #0] | |
1194: 885b ldrh r3, [r3, #2] | |
1196: 1ad3 subs r3, r2, r3 | |
1198: 4418 add r0, r3 | |
return count; | |
} | |
119a: 4770 bx lr | |
119c: 1fffe924 .word 0x1fffe924 | |
11a0: 1fffe754 .word 0x1fffe754 | |
000011a4 <usb_serial_flush_input>: | |
return count; | |
} | |
// discard any buffered input | |
void usb_serial_flush_input(void) | |
{ | |
11a4: b510 push {r4, lr} | |
usb_packet_t *rx; | |
if (!usb_configuration) return; | |
11a6: 4b09 ldr r3, [pc, #36] ; (11cc <usb_serial_flush_input+0x28>) | |
11a8: 781b ldrb r3, [r3, #0] | |
11aa: b16b cbz r3, 11c8 <usb_serial_flush_input+0x24> | |
if (rx_packet) { | |
11ac: 4c08 ldr r4, [pc, #32] ; (11d0 <usb_serial_flush_input+0x2c>) | |
11ae: 6820 ldr r0, [r4, #0] | |
11b0: b118 cbz r0, 11ba <usb_serial_flush_input+0x16> | |
usb_free(rx_packet); | |
11b2: f7ff ff85 bl 10c0 <usb_free> | |
rx_packet = NULL; | |
11b6: 2300 movs r3, #0 | |
11b8: 6023 str r3, [r4, #0] | |
} | |
while (1) { | |
rx = usb_rx(CDC_RX_ENDPOINT); | |
11ba: 2003 movs r0, #3 | |
11bc: f7ff fb7c bl 8b8 <usb_rx> | |
if (!rx) break; | |
11c0: b110 cbz r0, 11c8 <usb_serial_flush_input+0x24> | |
usb_free(rx); | |
11c2: f7ff ff7d bl 10c0 <usb_free> | |
} | |
11c6: e7f8 b.n 11ba <usb_serial_flush_input+0x16> | |
11c8: bd10 pop {r4, pc} | |
11ca: bf00 nop | |
11cc: 1fffe747 .word 0x1fffe747 | |
11d0: 1fffe754 .word 0x1fffe754 | |
000011d4 <usb_serial_write>: | |
return usb_serial_write(&c, 1); | |
} | |
int usb_serial_write(const void *buffer, uint32_t size) | |
{ | |
11d4: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} | |
uint32_t len; | |
uint32_t wait_count; | |
const uint8_t *src = (const uint8_t *)buffer; | |
uint8_t *dest; | |
tx_noautoflush = 1; | |
11d8: 4e2d ldr r6, [pc, #180] ; (1290 <usb_serial_write+0xbc>) | |
11da: 2301 movs r3, #1 | |
return usb_serial_write(&c, 1); | |
} | |
int usb_serial_write(const void *buffer, uint32_t size) | |
{ | |
11dc: 4607 mov r7, r0 | |
11de: 460c mov r4, r1 | |
uint32_t len; | |
uint32_t wait_count; | |
const uint8_t *src = (const uint8_t *)buffer; | |
uint8_t *dest; | |
tx_noautoflush = 1; | |
11e0: 7033 strb r3, [r6, #0] | |
while (size > 0) { | |
11e2: 2c00 cmp r4, #0 | |
11e4: d04f beq.n 1286 <usb_serial_write+0xb2> | |
if (!tx_packet) { | |
11e6: 4d2b ldr r5, [pc, #172] ; (1294 <usb_serial_write+0xc0>) | |
11e8: 682b ldr r3, [r5, #0] | |
11ea: 46a9 mov r9, r5 | |
11ec: bb2b cbnz r3, 123a <usb_serial_write+0x66> | |
11ee: f24a 28f9 movw r8, #41721 ; 0xa2f9 | |
wait_count = 0; | |
while (1) { | |
if (!usb_configuration) { | |
11f2: 4b29 ldr r3, [pc, #164] ; (1298 <usb_serial_write+0xc4>) | |
11f4: 781b ldrb r3, [r3, #0] | |
11f6: f003 02ff and.w r2, r3, #255 ; 0xff | |
11fa: b90b cbnz r3, 1200 <usb_serial_write+0x2c> | |
tx_noautoflush = 0; | |
11fc: 7032 strb r2, [r6, #0] | |
11fe: e015 b.n 122c <usb_serial_write+0x58> | |
return -1; | |
} | |
if (usb_tx_packet_count(CDC_TX_ENDPOINT) < TX_PACKET_LIMIT) { | |
1200: 2004 movs r0, #4 | |
1202: f7ff fb75 bl 8f0 <usb_tx_packet_count> | |
1206: 2807 cmp r0, #7 | |
1208: d808 bhi.n 121c <usb_serial_write+0x48> | |
tx_noautoflush = 1; | |
120a: 2301 movs r3, #1 | |
120c: 7033 strb r3, [r6, #0] | |
tx_packet = usb_malloc(); | |
120e: f7ff ff39 bl 1084 <usb_malloc> | |
1212: f8c9 0000 str.w r0, [r9] | |
if (tx_packet) break; | |
1216: b980 cbnz r0, 123a <usb_serial_write+0x66> | |
tx_noautoflush = 0; | |
1218: 4b1d ldr r3, [pc, #116] ; (1290 <usb_serial_write+0xbc>) | |
121a: 7018 strb r0, [r3, #0] | |
} | |
if (++wait_count > TX_TIMEOUT || transmit_previous_timeout) { | |
121c: f1b8 0801 subs.w r8, r8, #1 | |
1220: 4b1e ldr r3, [pc, #120] ; (129c <usb_serial_write+0xc8>) | |
1222: d001 beq.n 1228 <usb_serial_write+0x54> | |
1224: 781a ldrb r2, [r3, #0] | |
1226: b12a cbz r2, 1234 <usb_serial_write+0x60> | |
transmit_previous_timeout = 1; | |
1228: 2201 movs r2, #1 | |
122a: 701a strb r2, [r3, #0] | |
return -1; | |
122c: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
1230: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} | |
} | |
yield(); | |
1234: f000 f904 bl 1440 <yield> | |
} | |
1238: e7db b.n 11f2 <usb_serial_write+0x1e> | |
} | |
transmit_previous_timeout = 0; | |
len = CDC_TX_SIZE - tx_packet->index; | |
123a: 6829 ldr r1, [r5, #0] | |
return -1; | |
} | |
yield(); | |
} | |
} | |
transmit_previous_timeout = 0; | |
123c: 4a17 ldr r2, [pc, #92] ; (129c <usb_serial_write+0xc8>) | |
len = CDC_TX_SIZE - tx_packet->index; | |
123e: 8848 ldrh r0, [r1, #2] | |
return -1; | |
} | |
yield(); | |
} | |
} | |
transmit_previous_timeout = 0; | |
1240: 2300 movs r3, #0 | |
1242: 7013 strb r3, [r2, #0] | |
len = CDC_TX_SIZE - tx_packet->index; | |
1244: f1c0 0240 rsb r2, r0, #64 ; 0x40 | |
1248: 4294 cmp r4, r2 | |
124a: bf38 it cc | |
124c: 4622 movcc r2, r4 | |
if (len > size) len = size; | |
dest = tx_packet->buf + tx_packet->index; | |
124e: f100 0c08 add.w ip, r0, #8 | |
tx_packet->index += len; | |
1252: 4410 add r0, r2 | |
} | |
} | |
transmit_previous_timeout = 0; | |
len = CDC_TX_SIZE - tx_packet->index; | |
if (len > size) len = size; | |
dest = tx_packet->buf + tx_packet->index; | |
1254: 448c add ip, r1 | |
tx_packet->index += len; | |
1256: 8048 strh r0, [r1, #2] | |
size -= len; | |
1258: 1aa4 subs r4, r4, r2 | |
while (len-- > 0) *dest++ = *src++; | |
125a: 4293 cmp r3, r2 | |
125c: d004 beq.n 1268 <usb_serial_write+0x94> | |
125e: 5cf8 ldrb r0, [r7, r3] | |
1260: f80c 0003 strb.w r0, [ip, r3] | |
1264: 3301 adds r3, #1 | |
1266: e7f8 b.n 125a <usb_serial_write+0x86> | |
1268: 441f add r7, r3 | |
if (tx_packet->index >= CDC_TX_SIZE) { | |
126a: 884b ldrh r3, [r1, #2] | |
126c: 2b3f cmp r3, #63 ; 0x3f | |
126e: d906 bls.n 127e <usb_serial_write+0xaa> | |
tx_packet->len = CDC_TX_SIZE; | |
1270: 2340 movs r3, #64 ; 0x40 | |
1272: 800b strh r3, [r1, #0] | |
usb_tx(CDC_TX_ENDPOINT, tx_packet); | |
1274: 2004 movs r0, #4 | |
1276: f7ff fb89 bl 98c <usb_tx> | |
tx_packet = NULL; | |
127a: 2300 movs r3, #0 | |
127c: 602b str r3, [r5, #0] | |
} | |
usb_cdc_transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT; | |
127e: 4b08 ldr r3, [pc, #32] ; (12a0 <usb_serial_write+0xcc>) | |
1280: 2205 movs r2, #5 | |
1282: 701a strb r2, [r3, #0] | |
1284: e7ad b.n 11e2 <usb_serial_write+0xe> | |
} | |
tx_noautoflush = 0; | |
1286: 7034 strb r4, [r6, #0] | |
return 0; | |
1288: 4620 mov r0, r4 | |
} | |
128a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} | |
128e: bf00 nop | |
1290: 1fffe74a .word 0x1fffe74a | |
1294: 1fffe74c .word 0x1fffe74c | |
1298: 1fffe747 .word 0x1fffe747 | |
129c: 1fffe750 .word 0x1fffe750 | |
12a0: 1fffe749 .word 0x1fffe749 | |
000012a4 <usb_serial_putchar>: | |
static uint8_t transmit_previous_timeout=0; | |
// transmit a character. 0 returned on success, -1 on error | |
int usb_serial_putchar(uint8_t c) | |
{ | |
12a4: b507 push {r0, r1, r2, lr} | |
12a6: ab02 add r3, sp, #8 | |
return usb_serial_write(&c, 1); | |
12a8: 2101 movs r1, #1 | |
static uint8_t transmit_previous_timeout=0; | |
// transmit a character. 0 returned on success, -1 on error | |
int usb_serial_putchar(uint8_t c) | |
{ | |
12aa: f803 0d01 strb.w r0, [r3, #-1]! | |
return usb_serial_write(&c, 1); | |
12ae: 4618 mov r0, r3 | |
12b0: f7ff ff90 bl 11d4 <usb_serial_write> | |
} | |
12b4: b003 add sp, #12 | |
12b6: f85d fb04 ldr.w pc, [sp], #4 | |
12ba: ffff e92d vtbl.8 d30, {d15-d16}, d29 | |
000012bc <usb_serial_flush_output>: | |
tx_noautoflush = 0; | |
return len; | |
} | |
void usb_serial_flush_output(void) | |
{ | |
12bc: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} | |
if (!usb_configuration) return; | |
12c0: 4b11 ldr r3, [pc, #68] ; (1308 <usb_serial_flush_output+0x4c>) | |
12c2: 781b ldrb r3, [r3, #0] | |
12c4: b1f3 cbz r3, 1304 <usb_serial_flush_output+0x48> | |
tx_noautoflush = 1; | |
if (tx_packet) { | |
12c6: 4e11 ldr r6, [pc, #68] ; (130c <usb_serial_flush_output+0x50>) | |
} | |
void usb_serial_flush_output(void) | |
{ | |
if (!usb_configuration) return; | |
tx_noautoflush = 1; | |
12c8: 4b11 ldr r3, [pc, #68] ; (1310 <usb_serial_flush_output+0x54>) | |
if (tx_packet) { | |
12ca: 6834 ldr r4, [r6, #0] | |
12cc: 4d11 ldr r5, [pc, #68] ; (1314 <usb_serial_flush_output+0x58>) | |
} | |
void usb_serial_flush_output(void) | |
{ | |
if (!usb_configuration) return; | |
tx_noautoflush = 1; | |
12ce: 2701 movs r7, #1 | |
12d0: 701f strb r7, [r3, #0] | |
12d2: 4698 mov r8, r3 | |
if (tx_packet) { | |
12d4: b14c cbz r4, 12ea <usb_serial_flush_output+0x2e> | |
usb_cdc_transmit_flush_timer = 0; | |
12d6: 2700 movs r7, #0 | |
tx_packet->len = tx_packet->index; | |
12d8: 8863 ldrh r3, [r4, #2] | |
void usb_serial_flush_output(void) | |
{ | |
if (!usb_configuration) return; | |
tx_noautoflush = 1; | |
if (tx_packet) { | |
usb_cdc_transmit_flush_timer = 0; | |
12da: 702f strb r7, [r5, #0] | |
tx_packet->len = tx_packet->index; | |
usb_tx(CDC_TX_ENDPOINT, tx_packet); | |
12dc: 2004 movs r0, #4 | |
{ | |
if (!usb_configuration) return; | |
tx_noautoflush = 1; | |
if (tx_packet) { | |
usb_cdc_transmit_flush_timer = 0; | |
tx_packet->len = tx_packet->index; | |
12de: 8023 strh r3, [r4, #0] | |
usb_tx(CDC_TX_ENDPOINT, tx_packet); | |
12e0: 4621 mov r1, r4 | |
12e2: f7ff fb53 bl 98c <usb_tx> | |
tx_packet = NULL; | |
12e6: 6037 str r7, [r6, #0] | |
12e8: e009 b.n 12fe <usb_serial_flush_output+0x42> | |
} else { | |
usb_packet_t *tx = usb_malloc(); | |
12ea: f7ff fecb bl 1084 <usb_malloc> | |
if (tx) { | |
12ee: 4601 mov r1, r0 | |
12f0: b120 cbz r0, 12fc <usb_serial_flush_output+0x40> | |
usb_cdc_transmit_flush_timer = 0; | |
usb_tx(CDC_TX_ENDPOINT, tx); | |
12f2: 2004 movs r0, #4 | |
usb_tx(CDC_TX_ENDPOINT, tx_packet); | |
tx_packet = NULL; | |
} else { | |
usb_packet_t *tx = usb_malloc(); | |
if (tx) { | |
usb_cdc_transmit_flush_timer = 0; | |
12f4: 702c strb r4, [r5, #0] | |
usb_tx(CDC_TX_ENDPOINT, tx); | |
12f6: f7ff fb49 bl 98c <usb_tx> | |
12fa: e000 b.n 12fe <usb_serial_flush_output+0x42> | |
} else { | |
usb_cdc_transmit_flush_timer = 1; | |
12fc: 702f strb r7, [r5, #0] | |
} | |
} | |
tx_noautoflush = 0; | |
12fe: 2300 movs r3, #0 | |
1300: f888 3000 strb.w r3, [r8] | |
1304: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} | |
1308: 1fffe747 .word 0x1fffe747 | |
130c: 1fffe74c .word 0x1fffe74c | |
1310: 1fffe74a .word 0x1fffe74a | |
1314: 1fffe749 .word 0x1fffe749 | |
00001318 <usb_serial_flush_callback>: | |
} | |
void usb_serial_flush_callback(void) | |
{ | |
1318: b538 push {r3, r4, r5, lr} | |
if (tx_noautoflush) return; | |
131a: 4b0e ldr r3, [pc, #56] ; (1354 <usb_serial_flush_callback+0x3c>) | |
131c: 781b ldrb r3, [r3, #0] | |
131e: f003 05ff and.w r5, r3, #255 ; 0xff | |
1322: b9ab cbnz r3, 1350 <usb_serial_flush_callback+0x38> | |
if (tx_packet) { | |
1324: 4c0c ldr r4, [pc, #48] ; (1358 <usb_serial_flush_callback+0x40>) | |
1326: 6821 ldr r1, [r4, #0] | |
1328: b131 cbz r1, 1338 <usb_serial_flush_callback+0x20> | |
tx_packet->len = tx_packet->index; | |
132a: 884b ldrh r3, [r1, #2] | |
132c: 800b strh r3, [r1, #0] | |
usb_tx(CDC_TX_ENDPOINT, tx_packet); | |
132e: 2004 movs r0, #4 | |
1330: f7ff fb2c bl 98c <usb_tx> | |
tx_packet = NULL; | |
1334: 6025 str r5, [r4, #0] | |
1336: bd38 pop {r3, r4, r5, pc} | |
} else { | |
usb_packet_t *tx = usb_malloc(); | |
1338: f7ff fea4 bl 1084 <usb_malloc> | |
if (tx) { | |
133c: 4601 mov r1, r0 | |
133e: b120 cbz r0, 134a <usb_serial_flush_callback+0x32> | |
usb_tx(CDC_TX_ENDPOINT, tx); | |
1340: 2004 movs r0, #4 | |
} else { | |
usb_cdc_transmit_flush_timer = 1; | |
} | |
} | |
} | |
1342: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr} | |
usb_tx(CDC_TX_ENDPOINT, tx_packet); | |
tx_packet = NULL; | |
} else { | |
usb_packet_t *tx = usb_malloc(); | |
if (tx) { | |
usb_tx(CDC_TX_ENDPOINT, tx); | |
1346: f7ff bb21 b.w 98c <usb_tx> | |
} else { | |
usb_cdc_transmit_flush_timer = 1; | |
134a: 4b04 ldr r3, [pc, #16] ; (135c <usb_serial_flush_callback+0x44>) | |
134c: 2201 movs r2, #1 | |
134e: 701a strb r2, [r3, #0] | |
1350: bd38 pop {r3, r4, r5, pc} | |
1352: bf00 nop | |
1354: 1fffe74a .word 0x1fffe74a | |
1358: 1fffe74c .word 0x1fffe74c | |
135c: 1fffe749 .word 0x1fffe749 | |
00001360 <_ZN5Print7printlnEv>: | |
return printNumber(n, 10, sign); | |
} | |
size_t Print::println(void) | |
{ | |
1360: b507 push {r0, r1, r2, lr} | |
uint8_t buf[2]={'\r', '\n'}; | |
1362: 4b06 ldr r3, [pc, #24] ; (137c <_ZN5Print7printlnEv+0x1c>) | |
1364: 881b ldrh r3, [r3, #0] | |
1366: f8ad 3004 strh.w r3, [sp, #4] | |
return write(buf, 2); | |
136a: 6803 ldr r3, [r0, #0] | |
136c: a901 add r1, sp, #4 | |
136e: 685b ldr r3, [r3, #4] | |
1370: 2202 movs r2, #2 | |
1372: 4798 blx r3 | |
} | |
1374: b003 add sp, #12 | |
1376: f85d fb04 ldr.w pc, [sp], #4 | |
137a: bf00 nop | |
137c: 00002ba4 .word 0x00002ba4 | |
00001380 <_ZN5Print11printNumberEmhh>: | |
} | |
#else | |
size_t Print::printNumber(unsigned long n, uint8_t base, uint8_t sign) | |
{ | |
1380: b570 push {r4, r5, r6, lr} | |
1382: 4605 mov r5, r0 | |
1384: b08a sub sp, #40 ; 0x28 | |
uint8_t digit, i; | |
// TODO: make these checks as inline, since base is | |
// almost always a constant. base = 0 (BYTE) should | |
// inline as a call directly to write() | |
if (base == 0) { | |
1386: b922 cbnz r2, 1392 <_ZN5Print11printNumberEmhh+0x12> | |
return write((uint8_t)n); | |
1388: 6803 ldr r3, [r0, #0] | |
138a: b2c9 uxtb r1, r1 | |
138c: 681b ldr r3, [r3, #0] | |
138e: 4798 blx r3 | |
1390: e02c b.n 13ec <_ZN5Print11printNumberEmhh+0x6c> | |
} else if (base == 1) { | |
base = 10; | |
1392: 2a01 cmp r2, #1 | |
1394: bf08 it eq | |
1396: 220a moveq r2, #10 | |
} | |
if (n == 0) { | |
1398: b921 cbnz r1, 13a4 <_ZN5Print11printNumberEmhh+0x24> | |
buf[sizeof(buf) - 1] = '0'; | |
139a: 2230 movs r2, #48 ; 0x30 | |
139c: f88d 2025 strb.w r2, [sp, #37] ; 0x25 | |
i = sizeof(buf) - 1; | |
13a0: 2421 movs r4, #33 ; 0x21 | |
13a2: e013 b.n 13cc <_ZN5Print11printNumberEmhh+0x4c> | |
} else if (base == 1) { | |
base = 10; | |
} | |
if (n == 0) { | |
13a4: 2421 movs r4, #33 ; 0x21 | |
buf[sizeof(buf) - 1] = '0'; | |
i = sizeof(buf) - 1; | |
} else { | |
i = sizeof(buf) - 1; | |
while (1) { | |
digit = n % base; | |
13a6: fbb1 f0f2 udiv r0, r1, r2 | |
13aa: fb02 1110 mls r1, r2, r0, r1 | |
13ae: b2c9 uxtb r1, r1 | |
buf[i] = ((digit < 10) ? '0' + digit : 'A' + digit - 10); | |
13b0: 2909 cmp r1, #9 | |
13b2: ae0a add r6, sp, #40 ; 0x28 | |
13b4: bf94 ite ls | |
13b6: 3130 addls r1, #48 ; 0x30 | |
13b8: 3137 addhi r1, #55 ; 0x37 | |
13ba: 4426 add r6, r4 | |
13bc: b2c9 uxtb r1, r1 | |
13be: f806 1c24 strb.w r1, [r6, #-36] | |
n /= base; | |
if (n == 0) break; | |
13c2: 4601 mov r1, r0 | |
13c4: b110 cbz r0, 13cc <_ZN5Print11printNumberEmhh+0x4c> | |
i--; | |
13c6: 3c01 subs r4, #1 | |
13c8: b2e4 uxtb r4, r4 | |
} else if (base == 1) { | |
base = 10; | |
} | |
if (n == 0) { | |
13ca: e7ec b.n 13a6 <_ZN5Print11printNumberEmhh+0x26> | |
n /= base; | |
if (n == 0) break; | |
i--; | |
} | |
} | |
if (sign) { | |
13cc: b133 cbz r3, 13dc <_ZN5Print11printNumberEmhh+0x5c> | |
i--; | |
13ce: 3c01 subs r4, #1 | |
13d0: b2e4 uxtb r4, r4 | |
buf[i] = '-'; | |
13d2: ab0a add r3, sp, #40 ; 0x28 | |
13d4: 4423 add r3, r4 | |
13d6: 222d movs r2, #45 ; 0x2d | |
13d8: f803 2c24 strb.w r2, [r3, #-36] | |
} | |
return write(buf + i, sizeof(buf) - i); | |
13dc: 682b ldr r3, [r5, #0] | |
13de: a901 add r1, sp, #4 | |
13e0: 685b ldr r3, [r3, #4] | |
13e2: 4628 mov r0, r5 | |
13e4: 4421 add r1, r4 | |
13e6: f1c4 0222 rsb r2, r4, #34 ; 0x22 | |
13ea: 4798 blx r3 | |
} | |
13ec: b00a add sp, #40 ; 0x28 | |
13ee: bd70 pop {r4, r5, r6, pc} | |
000013f0 <main>: | |
#include "WProgram.h" | |
extern "C" int main(void) | |
{ | |
13f0: b508 push {r3, lr} | |
} | |
#else | |
// Arduino's main() function just calls setup() and loop().... | |
setup(); | |
13f2: f7ff f8a7 bl 544 <setup> | |
while (1) { | |
loop(); | |
13f6: f7ff f8d9 bl 5ac <loop> | |
yield(); | |
13fa: f000 f821 bl 1440 <yield> | |
13fe: e7fa b.n 13f6 <main+0x6> | |
00001400 <_ZN16usb_serial_class9availableEv>: | |
class usb_serial_class : public Stream | |
{ | |
public: | |
void begin(long) { /* TODO: call a function that tries to wait for enumeration */ }; | |
void end() { /* TODO: flush output and shut down USB port */ }; | |
virtual int available() { return usb_serial_available(); } | |
1400: f7ff bec2 b.w 1188 <usb_serial_available> | |
00001404 <_ZN16usb_serial_class4readEv>: | |
virtual int read() { return usb_serial_getchar(); } | |
1404: f7ff be7e b.w 1104 <usb_serial_getchar> | |
00001408 <_ZN16usb_serial_class4peekEv>: | |
virtual int peek() { return usb_serial_peekchar(); } | |
1408: f7ff bea2 b.w 1150 <usb_serial_peekchar> | |
0000140c <_ZN16usb_serial_class5flushEv>: | |
virtual void flush() { usb_serial_flush_output(); } // TODO: actually wait for data to leave USB... | |
140c: f7ff bf56 b.w 12bc <usb_serial_flush_output> | |
00001410 <_ZN16usb_serial_class5clearEv>: | |
virtual void clear(void) { usb_serial_flush_input(); } | |
1410: f7ff bec8 b.w 11a4 <usb_serial_flush_input> | |
00001414 <_ZN16usb_serial_class5writeEh>: | |
virtual size_t write(uint8_t c) { return usb_serial_putchar(c); } | |
1414: 4608 mov r0, r1 | |
1416: f7ff bf45 b.w 12a4 <usb_serial_putchar> | |
0000141a <_ZN16usb_serial_class5writeEPKhj>: | |
virtual size_t write(const uint8_t *buffer, size_t size) { return usb_serial_write(buffer, size); } | |
141a: 4608 mov r0, r1 | |
141c: 4611 mov r1, r2 | |
141e: f7ff bed9 b.w 11d4 <usb_serial_write> | |
00001422 <_Z11serialEventv>: | |
#endif | |
#endif // F_CPU | |
void serialEvent() __attribute__((weak)); | |
void serialEvent() {} | |
1422: 4770 bx lr | |
00001424 <_GLOBAL__sub_I_Serial>: | |
class __FlashStringHelper; | |
class Print | |
{ | |
public: | |
Print() : write_error(0) {} | |
1424: 4b04 ldr r3, [pc, #16] ; (1438 <_GLOBAL__sub_I_Serial+0x14>) | |
1426: 2200 movs r2, #0 | |
1428: 711a strb r2, [r3, #4] | |
#include "Print.h" | |
class Stream : public Print | |
{ | |
public: | |
Stream() : _timeout(1000), read_error(0) {} | |
142a: f44f 717a mov.w r1, #1000 ; 0x3e8 | |
142e: 731a strb r2, [r3, #12] | |
#define USB_SERIAL_RTS 0x02 | |
// C++ interface | |
#ifdef __cplusplus | |
#include "Stream.h" | |
class usb_serial_class : public Stream | |
1430: 4a02 ldr r2, [pc, #8] ; (143c <_GLOBAL__sub_I_Serial+0x18>) | |
1432: 6099 str r1, [r3, #8] | |
1434: 601a str r2, [r3, #0] | |
1436: 4770 bx lr | |
1438: 1fffe75c .word 0x1fffe75c | |
143c: 00002bb0 .word 0x00002bb0 | |
00001440 <yield>: | |
#include "usb_serial.h" | |
#include "usb_seremu.h" | |
void yield(void) __attribute__ ((weak)); | |
void yield(void) | |
{ | |
1440: b510 push {r4, lr} | |
static uint8_t running=0; | |
if (running) return; // TODO: does this need to be atomic? | |
1442: 4c0e ldr r4, [pc, #56] ; (147c <yield+0x3c>) | |
1444: 7823 ldrb r3, [r4, #0] | |
1446: b9bb cbnz r3, 1478 <yield+0x38> | |
running = 1; | |
1448: 2301 movs r3, #1 | |
144a: 7023 strb r3, [r4, #0] | |
{ | |
public: | |
void begin(long) { /* TODO: call a function that tries to wait for enumeration */ }; | |
void end() { /* TODO: flush output and shut down USB port */ }; | |
virtual int available() { return usb_serial_available(); } | |
144c: f7ff fe9c bl 1188 <usb_serial_available> | |
if (Serial.available()) serialEvent(); | |
1450: b108 cbz r0, 1456 <yield+0x16> | |
1452: f7ff ffe6 bl 1422 <_Z11serialEventv> | |
virtual void transmitterEnable(uint8_t pin) { serial_set_transmit_pin(pin); } | |
virtual void setRX(uint8_t pin) { serial_set_rx(pin); } | |
virtual void setTX(uint8_t pin, bool opendrain=false) { serial_set_tx(pin, opendrain); } | |
virtual bool attachRts(uint8_t pin) { return serial_set_rts(pin); } | |
virtual bool attachCts(uint8_t pin) { return serial_set_cts(pin); } | |
virtual int available(void) { return serial_available(); } | |
1456: f000 fb0d bl 1a74 <serial_available> | |
if (Serial1.available()) serialEvent1(); | |
145a: b108 cbz r0, 1460 <yield+0x20> | |
145c: f001 f9bb bl 27d6 <_Z12serialEvent1v> | |
virtual void transmitterEnable(uint8_t pin) { serial2_set_transmit_pin(pin); } | |
virtual void setRX(uint8_t pin) { serial2_set_rx(pin); } | |
virtual void setTX(uint8_t pin, bool opendrain=false) { serial2_set_tx(pin, opendrain); } | |
virtual bool attachRts(uint8_t pin) { return serial2_set_rts(pin); } | |
virtual bool attachCts(uint8_t pin) { return serial2_set_cts(pin); } | |
virtual int available(void) { return serial2_available(); } | |
1460: f000 fdec bl 203c <serial2_available> | |
if (Serial2.available()) serialEvent2(); | |
1464: b108 cbz r0, 146a <yield+0x2a> | |
1466: f001 fa3e bl 28e6 <_Z12serialEvent2v> | |
virtual void transmitterEnable(uint8_t pin) { serial3_set_transmit_pin(pin); } | |
virtual void setRX(uint8_t pin) { serial3_set_rx(pin); } | |
virtual void setTX(uint8_t pin, bool opendrain=false) { serial3_set_tx(pin, opendrain); } | |
virtual bool attachRts(uint8_t pin) { return serial3_set_rts(pin); } | |
virtual bool attachCts(uint8_t pin) { return serial3_set_cts(pin); } | |
virtual int available(void) { return serial3_available(); } | |
146a: f001 f837 bl 24dc <serial3_available> | |
if (Serial3.available()) serialEvent3(); | |
146e: b108 cbz r0, 1474 <yield+0x34> | |
1470: f001 fac1 bl 29f6 <_Z12serialEvent3v> | |
if (Serial4.available()) serialEvent4(); | |
#endif | |
#ifdef HAS_KINETISK_UART4 | |
if (Serial5.available()) serialEvent5(); | |
#endif | |
running = 0; | |
1474: 2300 movs r3, #0 | |
1476: 7023 strb r3, [r4, #0] | |
1478: bd10 pop {r4, pc} | |
147a: bf00 nop | |
147c: 1fffe76c .word 0x1fffe76c | |
00001480 <analog_init>: | |
void analog_init(void) | |
{ | |
uint32_t num; | |
#if defined(__MK20DX128__) || defined(__MK20DX256__) | |
VREF_TRM = 0x60; | |
1480: 4b1b ldr r3, [pc, #108] ; (14f0 <analog_init+0x70>) | |
1482: 2260 movs r2, #96 ; 0x60 | |
1484: 701a strb r2, [r3, #0] | |
VREF_SC = 0xE1; // enable 1.2 volt ref | |
1486: 22e1 movs r2, #225 ; 0xe1 | |
1488: 705a strb r2, [r3, #1] | |
#endif | |
if (analog_config_bits == 8) { | |
148a: 4b1a ldr r3, [pc, #104] ; (14f4 <analog_init+0x74>) | |
148c: 4a1a ldr r2, [pc, #104] ; (14f8 <analog_init+0x78>) | |
148e: 7819 ldrb r1, [r3, #0] | |
1490: 4b1a ldr r3, [pc, #104] ; (14fc <analog_init+0x7c>) | |
1492: 2908 cmp r1, #8 | |
1494: d101 bne.n 149a <analog_init+0x1a> | |
ADC0_CFG1 = ADC_CFG1_8BIT + ADC_CFG1_MODE(0); | |
1496: 2101 movs r1, #1 | |
1498: e002 b.n 14a0 <analog_init+0x20> | |
ADC0_CFG2 = ADC_CFG2_MUXSEL + ADC_CFG2_ADLSTS(3); | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_CFG1 = ADC_CFG1_8BIT + ADC_CFG1_MODE(0); | |
ADC1_CFG2 = ADC_CFG2_MUXSEL + ADC_CFG2_ADLSTS(3); | |
#endif | |
} else if (analog_config_bits == 10) { | |
149a: 290a cmp r1, #10 | |
149c: d103 bne.n 14a6 <analog_init+0x26> | |
ADC0_CFG1 = ADC_CFG1_10BIT + ADC_CFG1_MODE(2) + ADC_CFG1_ADLSMP; | |
149e: 2139 movs r1, #57 ; 0x39 | |
14a0: 6011 str r1, [r2, #0] | |
ADC0_CFG2 = ADC_CFG2_MUXSEL + ADC_CFG2_ADLSTS(3); | |
14a2: 2213 movs r2, #19 | |
14a4: e005 b.n 14b2 <analog_init+0x32> | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_CFG1 = ADC_CFG1_10BIT + ADC_CFG1_MODE(2) + ADC_CFG1_ADLSMP; | |
ADC1_CFG2 = ADC_CFG2_MUXSEL + ADC_CFG2_ADLSTS(3); | |
#endif | |
} else if (analog_config_bits == 12) { | |
14a6: 290c cmp r1, #12 | |
ADC0_CFG1 = ADC_CFG1_12BIT + ADC_CFG1_MODE(1) + ADC_CFG1_ADLSMP; | |
14a8: bf0c ite eq | |
14aa: 2135 moveq r1, #53 ; 0x35 | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_CFG1 = ADC_CFG1_12BIT + ADC_CFG1_MODE(1) + ADC_CFG1_ADLSMP; | |
ADC1_CFG2 = ADC_CFG2_MUXSEL + ADC_CFG2_ADLSTS(2); | |
#endif | |
} else { | |
ADC0_CFG1 = ADC_CFG1_16BIT + ADC_CFG1_MODE(3) + ADC_CFG1_ADLSMP; | |
14ac: 213d movne r1, #61 ; 0x3d | |
14ae: 6011 str r1, [r2, #0] | |
ADC0_CFG2 = ADC_CFG2_MUXSEL + ADC_CFG2_ADLSTS(2); | |
14b0: 2212 movs r2, #18 | |
14b2: 601a str r2, [r3, #0] | |
ADC1_CFG2 = ADC_CFG2_MUXSEL + ADC_CFG2_ADLSTS(2); | |
#endif | |
} | |
#if defined(__MK20DX128__) | |
if (analog_reference_internal) { | |
14b4: 4b12 ldr r3, [pc, #72] ; (1500 <analog_init+0x80>) | |
14b6: 781a ldrb r2, [r3, #0] | |
14b8: 4b12 ldr r3, [pc, #72] ; (1504 <analog_init+0x84>) | |
14ba: b102 cbz r2, 14be <analog_init+0x3e> | |
ADC0_SC2 = ADC_SC2_REFSEL(1); // 1.2V ref | |
14bc: 2201 movs r2, #1 | |
} else { | |
ADC0_SC2 = ADC_SC2_REFSEL(0); // vcc/ext ref | |
14be: 601a str r2, [r3, #0] | |
} else { | |
ADC0_SC2 = ADC_SC2_REFSEL(1); // vcc | |
} | |
#endif | |
num = analog_num_average; | |
14c0: 4b11 ldr r3, [pc, #68] ; (1508 <analog_init+0x88>) | |
14c2: 781a ldrb r2, [r3, #0] | |
14c4: 4b11 ldr r3, [pc, #68] ; (150c <analog_init+0x8c>) | |
if (num <= 1) { | |
14c6: 2a01 cmp r2, #1 | |
14c8: d801 bhi.n 14ce <analog_init+0x4e> | |
ADC0_SC3 = ADC_SC3_CAL; // begin cal | |
14ca: 2280 movs r2, #128 ; 0x80 | |
14cc: e00b b.n 14e6 <analog_init+0x66> | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_SC3 = ADC_SC3_CAL; // begin cal | |
#endif | |
} else if (num <= 4) { | |
14ce: 2a04 cmp r2, #4 | |
14d0: d801 bhi.n 14d6 <analog_init+0x56> | |
ADC0_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(0); | |
14d2: 2284 movs r2, #132 ; 0x84 | |
14d4: e007 b.n 14e6 <analog_init+0x66> | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(0); | |
#endif | |
} else if (num <= 8) { | |
14d6: 2a08 cmp r2, #8 | |
14d8: d801 bhi.n 14de <analog_init+0x5e> | |
ADC0_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(1); | |
14da: 2285 movs r2, #133 ; 0x85 | |
14dc: e003 b.n 14e6 <analog_init+0x66> | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(1); | |
#endif | |
} else if (num <= 16) { | |
14de: 2a10 cmp r2, #16 | |
ADC0_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(2); | |
14e0: bf94 ite ls | |
14e2: 2286 movls r2, #134 ; 0x86 | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(2); | |
#endif | |
} else { | |
ADC0_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(3); | |
14e4: 2287 movhi r2, #135 ; 0x87 | |
14e6: 601a str r2, [r3, #0] | |
#ifdef HAS_KINETIS_ADC1 | |
ADC1_SC3 = ADC_SC3_CAL + ADC_SC3_AVGE + ADC_SC3_AVGS(3); | |
#endif | |
} | |
calibrating = 1; | |
14e8: 4b09 ldr r3, [pc, #36] ; (1510 <analog_init+0x90>) | |
14ea: 2201 movs r2, #1 | |
14ec: 701a strb r2, [r3, #0] | |
14ee: 4770 bx lr | |
14f0: 40074000 .word 0x40074000 | |
14f4: 1fffe564 .word 0x1fffe564 | |
14f8: 4003b008 .word 0x4003b008 | |
14fc: 4003b00c .word 0x4003b00c | |
1500: 1fffe76e .word 0x1fffe76e | |
1504: 4003b020 .word 0x4003b020 | |
1508: 1fffe565 .word 0x1fffe565 | |
150c: 4003b024 .word 0x4003b024 | |
1510: 1fffe76d .word 0x1fffe76d | |
00001514 <systick_default_isr>: | |
} | |
extern volatile uint32_t systick_millis_count; | |
void systick_default_isr(void) | |
{ | |
systick_millis_count++; | |
1514: 4b02 ldr r3, [pc, #8] ; (1520 <systick_default_isr+0xc>) | |
1516: 681a ldr r2, [r3, #0] | |
1518: 3201 adds r2, #1 | |
151a: 601a str r2, [r3, #0] | |
151c: 4770 bx lr | |
151e: bf00 nop | |
1520: 1fffe664 .word 0x1fffe664 | |
00001524 <fault_isr>: | |
void _init_Teensyduino_internal_(void); | |
void __libc_init_array(void); | |
void fault_isr(void) | |
{ | |
1524: b508 push {r3, lr} | |
asm("ldr %0, [sp, #0]" : "=r" (addr) ::); | |
#endif | |
while (1) { | |
// keep polling some communication while in fault | |
// mode, so we don't completely die. | |
if (SIM_SCGC4 & SIM_SCGC4_USBOTG) usb_isr(); | |
1526: 4c0b ldr r4, [pc, #44] ; (1554 <fault_isr+0x30>) | |
1528: 6823 ldr r3, [r4, #0] | |
152a: 0358 lsls r0, r3, #13 | |
152c: d501 bpl.n 1532 <fault_isr+0xe> | |
152e: f7ff fa6d bl a0c <usb_isr> | |
if (SIM_SCGC4 & SIM_SCGC4_UART0) uart0_status_isr(); | |
1532: 6823 ldr r3, [r4, #0] | |
1534: 0559 lsls r1, r3, #21 | |
1536: d501 bpl.n 153c <fault_isr+0x18> | |
1538: f000 fb12 bl 1b60 <uart0_status_isr> | |
if (SIM_SCGC4 & SIM_SCGC4_UART1) uart1_status_isr(); | |
153c: 6823 ldr r3, [r4, #0] | |
153e: 051a lsls r2, r3, #20 | |
1540: d501 bpl.n 1546 <fault_isr+0x22> | |
1542: f000 fddf bl 2104 <uart1_status_isr> | |
if (SIM_SCGC4 & SIM_SCGC4_UART2) uart2_status_isr(); | |
1546: 6823 ldr r3, [r4, #0] | |
1548: 04db lsls r3, r3, #19 | |
154a: d5ec bpl.n 1526 <fault_isr+0x2> | |
154c: f001 f82a bl 25a4 <uart2_status_isr> | |
1550: e7e9 b.n 1526 <fault_isr+0x2> | |
1552: bf00 nop | |
1554: 40048034 .word 0x40048034 | |
00001558 <unused_isr>: | |
} | |
} | |
void unused_isr(void) | |
{ | |
1558: b508 push {r3, lr} | |
fault_isr(); | |
155a: f7ff ffe3 bl 1524 <fault_isr> | |
155e: ffff 4b01 vtbl.8 d20, {d15-d18}, d1 | |
00001560 <startup_early_hook>: | |
extern void rtc_set(unsigned long t); | |
static void startup_default_early_hook(void) { | |
#if defined(KINETISK) | |
WDOG_STCTRLH = WDOG_STCTRLH_ALLOWUPDATE; | |
1560: 4b01 ldr r3, [pc, #4] ; (1568 <startup_early_hook+0x8>) | |
1562: 2210 movs r2, #16 | |
1564: 801a strh r2, [r3, #0] | |
1566: 4770 bx lr | |
1568: 40052000 .word 0x40052000 | |
0000156c <startup_late_hook>: | |
#elif defined(KINETISL) | |
SIM_COPC = 0; // disable the watchdog | |
#endif | |
} | |
static void startup_default_late_hook(void) {} | |
156c: 4770 bx lr | |
156e: ffff f3ef ; <UNDEFINED> instruction: 0xfffff3ef | |
00001570 <nvic_execution_priority>: | |
int priority=256; | |
uint32_t primask, faultmask, basepri, ipsr; | |
// full algorithm in ARM DDI0403D, page B1-639 | |
// this isn't quite complete, but hopefully good enough | |
__asm__ volatile("mrs %0, faultmask\n" : "=r" (faultmask)::); | |
1570: f3ef 8313 mrs r3, FAULTMASK | |
if (faultmask) return -1; | |
1574: b99b cbnz r3, 159e <nvic_execution_priority+0x2e> | |
__asm__ volatile("mrs %0, primask\n" : "=r" (primask)::); | |
1576: f3ef 8010 mrs r0, PRIMASK | |
if (primask) return 0; | |
157a: b998 cbnz r0, 15a4 <nvic_execution_priority+0x34> | |
__asm__ volatile("mrs %0, ipsr\n" : "=r" (ipsr)::); | |
157c: f3ef 8305 mrs r3, IPSR | |
if (ipsr) { | |
1580: b123 cbz r3, 158c <nvic_execution_priority+0x1c> | |
if (ipsr < 16) priority = 0; // could be non-zero | |
1582: 2b0f cmp r3, #15 | |
1584: d904 bls.n 1590 <nvic_execution_priority+0x20> | |
else priority = NVIC_GET_PRIORITY(ipsr - 16); | |
1586: 4a08 ldr r2, [pc, #32] ; (15a8 <nvic_execution_priority+0x38>) | |
1588: 5c98 ldrb r0, [r3, r2] | |
158a: e001 b.n 1590 <nvic_execution_priority+0x20> | |
*g = 1; | |
} | |
int nvic_execution_priority(void) | |
{ | |
int priority=256; | |
158c: f44f 7080 mov.w r0, #256 ; 0x100 | |
__asm__ volatile("mrs %0, ipsr\n" : "=r" (ipsr)::); | |
if (ipsr) { | |
if (ipsr < 16) priority = 0; // could be non-zero | |
else priority = NVIC_GET_PRIORITY(ipsr - 16); | |
} | |
__asm__ volatile("mrs %0, basepri\n" : "=r" (basepri)::); | |
1590: f3ef 8311 mrs r3, BASEPRI | |
if (basepri > 0 && basepri < priority) priority = basepri; | |
1594: b13b cbz r3, 15a6 <nvic_execution_priority+0x36> | |
1596: 4283 cmp r3, r0 | |
1598: bf38 it cc | |
159a: 4618 movcc r0, r3 | |
159c: 4770 bx lr | |
uint32_t primask, faultmask, basepri, ipsr; | |
// full algorithm in ARM DDI0403D, page B1-639 | |
// this isn't quite complete, but hopefully good enough | |
__asm__ volatile("mrs %0, faultmask\n" : "=r" (faultmask)::); | |
if (faultmask) return -1; | |
159e: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
15a2: 4770 bx lr | |
__asm__ volatile("mrs %0, primask\n" : "=r" (primask)::); | |
if (primask) return 0; | |
15a4: 4618 mov r0, r3 | |
else priority = NVIC_GET_PRIORITY(ipsr - 16); | |
} | |
__asm__ volatile("mrs %0, basepri\n" : "=r" (basepri)::); | |
if (basepri > 0 && basepri < priority) priority = basepri; | |
return priority; | |
} | |
15a6: 4770 bx lr | |
15a8: e000e3f0 .word 0xe000e3f0 | |
000015ac <ultoa>: | |
#include <string.h> | |
#include <stdlib.h> | |
char * ultoa(unsigned long val, char *buf, int radix) | |
{ | |
15ac: b510 push {r4, lr} | |
unsigned digit; | |
int i=0, j; | |
15ae: 2300 movs r3, #0 | |
char t; | |
while (1) { | |
digit = val % radix; | |
15b0: fbb0 f4f2 udiv r4, r0, r2 | |
15b4: fb02 0014 mls r0, r2, r4, r0 | |
buf[i] = ((digit < 10) ? '0' + digit : 'A' + digit - 10); | |
15b8: 2809 cmp r0, #9 | |
15ba: bf94 ite ls | |
15bc: 3030 addls r0, #48 ; 0x30 | |
15be: 3037 addhi r0, #55 ; 0x37 | |
15c0: b2c0 uxtb r0, r0 | |
15c2: 54c8 strb r0, [r1, r3] | |
val /= radix; | |
if (val == 0) break; | |
15c4: 4620 mov r0, r4 | |
15c6: b10c cbz r4, 15cc <ultoa+0x20> | |
i++; | |
15c8: 3301 adds r3, #1 | |
} | |
15ca: e7f1 b.n 15b0 <ultoa+0x4> | |
buf[i + 1] = 0; | |
15cc: 18ca adds r2, r1, r3 | |
15ce: 7054 strb r4, [r2, #1] | |
for (j=0; j < i; j++, i--) { | |
15d0: 4622 mov r2, r4 | |
15d2: 429a cmp r2, r3 | |
15d4: da06 bge.n 15e4 <ultoa+0x38> | |
t = buf[j]; | |
15d6: 5c88 ldrb r0, [r1, r2] | |
buf[j] = buf[i]; | |
15d8: 5ccc ldrb r4, [r1, r3] | |
15da: 548c strb r4, [r1, r2] | |
buf[i] = t; | |
15dc: 54c8 strb r0, [r1, r3] | |
val /= radix; | |
if (val == 0) break; | |
i++; | |
} | |
buf[i + 1] = 0; | |
for (j=0; j < i; j++, i--) { | |
15de: 3201 adds r2, #1 | |
15e0: 3b01 subs r3, #1 | |
15e2: e7f6 b.n 15d2 <ultoa+0x26> | |
t = buf[j]; | |
buf[j] = buf[i]; | |
buf[i] = t; | |
} | |
return buf; | |
} | |
15e4: 4608 mov r0, r1 | |
15e6: bd10 pop {r4, pc} | |
000015e8 <serial_begin>: | |
#define C2_TX_COMPLETING C2_ENABLE | UART_C2_TCIE | |
#define C2_TX_INACTIVE C2_ENABLE | |
void serial_begin(uint32_t divisor) | |
{ | |
SIM_SCGC4 |= SIM_SCGC4_UART0; // turn on clock, TODO: use bitband | |
15e8: 4b23 ldr r3, [pc, #140] ; (1678 <serial_begin+0x90>) | |
15ea: 681a ldr r2, [r3, #0] | |
15ec: f442 6280 orr.w r2, r2, #1024 ; 0x400 | |
15f0: 601a str r2, [r3, #0] | |
rx_buffer_head = 0; | |
15f2: 4a22 ldr r2, [pc, #136] ; (167c <serial_begin+0x94>) | |
15f4: 2300 movs r3, #0 | |
15f6: 7013 strb r3, [r2, #0] | |
rx_buffer_tail = 0; | |
15f8: 4a21 ldr r2, [pc, #132] ; (1680 <serial_begin+0x98>) | |
15fa: 7013 strb r3, [r2, #0] | |
tx_buffer_head = 0; | |
15fc: 4a21 ldr r2, [pc, #132] ; (1684 <serial_begin+0x9c>) | |
15fe: 7013 strb r3, [r2, #0] | |
tx_buffer_tail = 0; | |
1600: 4a21 ldr r2, [pc, #132] ; (1688 <serial_begin+0xa0>) | |
1602: 7013 strb r3, [r2, #0] | |
transmitting = 0; | |
1604: 4a21 ldr r2, [pc, #132] ; (168c <serial_begin+0xa4>) | |
1606: 7013 strb r3, [r2, #0] | |
switch (rx_pin_num) { | |
1608: 4b21 ldr r3, [pc, #132] ; (1690 <serial_begin+0xa8>) | |
160a: 781b ldrb r3, [r3, #0] | |
160c: b12b cbz r3, 161a <serial_begin+0x32> | |
160e: 2b15 cmp r3, #21 | |
1610: d107 bne.n 1622 <serial_begin+0x3a> | |
case 0: CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
case 21: CORE_PIN21_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1612: f240 3213 movw r2, #787 ; 0x313 | |
1616: 4b1f ldr r3, [pc, #124] ; (1694 <serial_begin+0xac>) | |
1618: e002 b.n 1620 <serial_begin+0x38> | |
rx_buffer_tail = 0; | |
tx_buffer_head = 0; | |
tx_buffer_tail = 0; | |
transmitting = 0; | |
switch (rx_pin_num) { | |
case 0: CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
161a: 4b1f ldr r3, [pc, #124] ; (1698 <serial_begin+0xb0>) | |
161c: f240 3213 movw r2, #787 ; 0x313 | |
case 21: CORE_PIN21_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1620: 601a str r2, [r3, #0] | |
#if defined(KINETISL) | |
case 3: CORE_PIN3_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(2); break; | |
#endif | |
} | |
switch (tx_pin_num) { | |
1622: 4b1e ldr r3, [pc, #120] ; (169c <serial_begin+0xb4>) | |
1624: 781b ldrb r3, [r3, #0] | |
1626: 2b01 cmp r3, #1 | |
1628: d005 beq.n 1636 <serial_begin+0x4e> | |
162a: 2b05 cmp r3, #5 | |
162c: d107 bne.n 163e <serial_begin+0x56> | |
case 1: CORE_PIN1_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
case 5: CORE_PIN5_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
162e: f44f 7251 mov.w r2, #836 ; 0x344 | |
1632: 4b1b ldr r3, [pc, #108] ; (16a0 <serial_begin+0xb8>) | |
1634: e002 b.n 163c <serial_begin+0x54> | |
#if defined(KINETISL) | |
case 3: CORE_PIN3_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(2); break; | |
#endif | |
} | |
switch (tx_pin_num) { | |
case 1: CORE_PIN1_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
1636: 4b1b ldr r3, [pc, #108] ; (16a4 <serial_begin+0xbc>) | |
1638: f44f 7251 mov.w r2, #836 ; 0x344 | |
case 5: CORE_PIN5_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
163c: 601a str r2, [r3, #0] | |
#if defined(KINETISL) | |
case 4: CORE_PIN4_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(2); break; | |
#endif | |
} | |
#if defined(HAS_KINETISK_UART0) | |
UART0_BDH = (divisor >> 13) & 0x1F; | |
163e: 4b1a ldr r3, [pc, #104] ; (16a8 <serial_begin+0xc0>) | |
1640: f3c0 3244 ubfx r2, r0, #13, #5 | |
1644: 701a strb r2, [r3, #0] | |
UART0_BDL = (divisor >> 5) & 0xFF; | |
1646: f3c0 1247 ubfx r2, r0, #5, #8 | |
164a: 705a strb r2, [r3, #1] | |
UART0_C4 = divisor & 0x1F; | |
164c: f000 001f and.w r0, r0, #31 | |
#ifdef HAS_KINETISK_UART0_FIFO | |
UART0_C1 = UART_C1_ILT; | |
1650: 2204 movs r2, #4 | |
UART0_TWFIFO = 2; // tx watermark, causes S1_TDRE to set | |
1652: 2102 movs r1, #2 | |
#endif | |
} | |
#if defined(HAS_KINETISK_UART0) | |
UART0_BDH = (divisor >> 13) & 0x1F; | |
UART0_BDL = (divisor >> 5) & 0xFF; | |
UART0_C4 = divisor & 0x1F; | |
1654: 7298 strb r0, [r3, #10] | |
#ifdef HAS_KINETISK_UART0_FIFO | |
UART0_C1 = UART_C1_ILT; | |
1656: 709a strb r2, [r3, #2] | |
UART0_TWFIFO = 2; // tx watermark, causes S1_TDRE to set | |
1658: 74d9 strb r1, [r3, #19] | |
UART0_RWFIFO = 4; // rx watermark, causes S1_RDRF to set | |
165a: 755a strb r2, [r3, #21] | |
UART0_PFIFO = UART_PFIFO_TXFE | UART_PFIFO_RXFE; | |
165c: 2288 movs r2, #136 ; 0x88 | |
165e: 741a strb r2, [r3, #16] | |
#elif defined(HAS_KINETISL_UART0) | |
UART0_BDH = (divisor >> 8) & 0x1F; | |
UART0_BDL = divisor & 0xFF; | |
UART0_C1 = 0; | |
#endif | |
UART0_C2 = C2_TX_INACTIVE; | |
1660: 223c movs r2, #60 ; 0x3c | |
1662: 70da strb r2, [r3, #3] | |
NVIC_SET_PRIORITY(IRQ_UART0_STATUS, IRQ_PRIORITY); | |
1664: 4b11 ldr r3, [pc, #68] ; (16ac <serial_begin+0xc4>) | |
1666: 2240 movs r2, #64 ; 0x40 | |
1668: 701a strb r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_UART0_STATUS); | |
166a: f5a3 7344 sub.w r3, r3, #784 ; 0x310 | |
166e: f44f 3280 mov.w r2, #65536 ; 0x10000 | |
1672: 601a str r2, [r3, #0] | |
1674: 4770 bx lr | |
1676: bf00 nop | |
1678: 40048034 .word 0x40048034 | |
167c: 1fffe7f7 .word 0x1fffe7f7 | |
1680: 1fffe775 .word 0x1fffe775 | |
1684: 1fffe800 .word 0x1fffe800 | |
1688: 1fffe7f8 .word 0x1fffe7f8 | |
168c: 1fffe774 .word 0x1fffe774 | |
1690: 1fffe7b6 .word 0x1fffe7b6 | |
1694: 4004c018 .word 0x4004c018 | |
1698: 4004a040 .word 0x4004a040 | |
169c: 1fffe566 .word 0x1fffe566 | |
16a0: 4004c01c .word 0x4004c01c | |
16a4: 4004a044 .word 0x4004a044 | |
16a8: 4006a000 .word 0x4006a000 | |
16ac: e000e410 .word 0xe000e410 | |
000016b0 <serial_format>: | |
void serial_format(uint32_t format) | |
{ | |
uint8_t c; | |
c = UART0_C1; | |
16b0: 4a13 ldr r2, [pc, #76] ; (1700 <serial_format+0x50>) | |
16b2: 7893 ldrb r3, [r2, #2] | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
16b4: f000 0103 and.w r1, r0, #3 | |
16b8: f003 03ec and.w r3, r3, #236 ; 0xec | |
16bc: 430b orrs r3, r1 | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
16be: 0741 lsls r1, r0, #29 | |
16c0: bf48 it mi | |
16c2: f043 0310 orrmi.w r3, r3, #16 | |
UART0_C1 = c; | |
16c6: 7093 strb r3, [r2, #2] | |
if ((format & 0x0F) == 0x04) UART0_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
16c8: f000 030f and.w r3, r0, #15 | |
16cc: 2b04 cmp r3, #4 | |
uint8_t c; | |
c = UART0_C1; | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART0_C1 = c; | |
16ce: 490c ldr r1, [pc, #48] ; (1700 <serial_format+0x50>) | |
if ((format & 0x0F) == 0x04) UART0_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
16d0: d103 bne.n 16da <serial_format+0x2a> | |
16d2: 798b ldrb r3, [r1, #6] | |
16d4: f043 0340 orr.w r3, r3, #64 ; 0x40 | |
16d8: 718b strb r3, [r1, #6] | |
c = UART0_S2 & ~0x10; | |
16da: 7953 ldrb r3, [r2, #5] | |
if (format & 0x10) c |= 0x10; // rx invert | |
16dc: 06c2 lsls r2, r0, #27 | |
c = UART0_C1; | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART0_C1 = c; | |
if ((format & 0x0F) == 0x04) UART0_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART0_S2 & ~0x10; | |
16de: f003 03ef and.w r3, r3, #239 ; 0xef | |
if (format & 0x10) c |= 0x10; // rx invert | |
UART0_S2 = c; | |
16e2: 4a07 ldr r2, [pc, #28] ; (1700 <serial_format+0x50>) | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART0_C1 = c; | |
if ((format & 0x0F) == 0x04) UART0_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART0_S2 & ~0x10; | |
if (format & 0x10) c |= 0x10; // rx invert | |
16e4: bf48 it mi | |
16e6: f043 0310 orrmi.w r3, r3, #16 | |
UART0_S2 = c; | |
16ea: 7153 strb r3, [r2, #5] | |
c = UART0_C3 & ~0x10; | |
16ec: 7993 ldrb r3, [r2, #6] | |
if (format & 0x20) c |= 0x10; // tx invert | |
16ee: 0681 lsls r1, r0, #26 | |
UART0_C1 = c; | |
if ((format & 0x0F) == 0x04) UART0_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART0_S2 & ~0x10; | |
if (format & 0x10) c |= 0x10; // rx invert | |
UART0_S2 = c; | |
c = UART0_C3 & ~0x10; | |
16f0: f003 03ef and.w r3, r3, #239 ; 0xef | |
if (format & 0x20) c |= 0x10; // tx invert | |
16f4: bf48 it mi | |
16f6: f043 0310 orrmi.w r3, r3, #16 | |
UART0_C3 = c; | |
16fa: 7193 strb r3, [r2, #6] | |
16fc: 4770 bx lr | |
16fe: bf00 nop | |
1700: 4006a000 .word 0x4006a000 | |
00001704 <serial_end>: | |
use9Bits = format & 0x80; | |
#endif | |
} | |
void serial_end(void) | |
{ | |
1704: b508 push {r3, lr} | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
1706: 4b11 ldr r3, [pc, #68] ; (174c <serial_end+0x48>) | |
1708: 681b ldr r3, [r3, #0] | |
170a: 055b lsls r3, r3, #21 | |
170c: d400 bmi.n 1710 <serial_end+0xc> | |
170e: bd08 pop {r3, pc} | |
while (transmitting) yield(); // wait for buffered data to send | |
1710: 4b0f ldr r3, [pc, #60] ; (1750 <serial_end+0x4c>) | |
1712: 781a ldrb r2, [r3, #0] | |
1714: f002 03ff and.w r3, r2, #255 ; 0xff | |
1718: b112 cbz r2, 1720 <serial_end+0x1c> | |
171a: f7ff fe91 bl 1440 <yield> | |
171e: e7f7 b.n 1710 <serial_end+0xc> | |
NVIC_DISABLE_IRQ(IRQ_UART0_STATUS); | |
1720: 4a0c ldr r2, [pc, #48] ; (1754 <serial_end+0x50>) | |
1722: f44f 3180 mov.w r1, #65536 ; 0x10000 | |
1726: 6011 str r1, [r2, #0] | |
UART0_C2 = 0; | |
1728: 4a0b ldr r2, [pc, #44] ; (1758 <serial_end+0x54>) | |
CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
172a: 490c ldr r1, [pc, #48] ; (175c <serial_end+0x58>) | |
void serial_end(void) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
while (transmitting) yield(); // wait for buffered data to send | |
NVIC_DISABLE_IRQ(IRQ_UART0_STATUS); | |
UART0_C2 = 0; | |
172c: 70d3 strb r3, [r2, #3] | |
CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
172e: f240 1203 movw r2, #259 ; 0x103 | |
1732: 600a str r2, [r1, #0] | |
CORE_PIN1_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
1734: 604a str r2, [r1, #4] | |
rx_buffer_head = 0; | |
1736: 4a0a ldr r2, [pc, #40] ; (1760 <serial_end+0x5c>) | |
1738: 7013 strb r3, [r2, #0] | |
rx_buffer_tail = 0; | |
173a: 4a0a ldr r2, [pc, #40] ; (1764 <serial_end+0x60>) | |
173c: 7013 strb r3, [r2, #0] | |
if (rts_pin) rts_deassert(); | |
173e: 4b0a ldr r3, [pc, #40] ; (1768 <serial_end+0x64>) | |
1740: 681b ldr r3, [r3, #0] | |
1742: b10b cbz r3, 1748 <serial_end+0x44> | |
1744: 2201 movs r2, #1 | |
1746: 701a strb r2, [r3, #0] | |
1748: bd08 pop {r3, pc} | |
174a: bf00 nop | |
174c: 40048034 .word 0x40048034 | |
1750: 1fffe774 .word 0x1fffe774 | |
1754: e000e180 .word 0xe000e180 | |
1758: 4006a000 .word 0x4006a000 | |
175c: 4004a040 .word 0x4004a040 | |
1760: 1fffe7f7 .word 0x1fffe7f7 | |
1764: 1fffe775 .word 0x1fffe775 | |
1768: 1fffe770 .word 0x1fffe770 | |
0000176c <serial_set_transmit_pin>: | |
} | |
void serial_set_transmit_pin(uint8_t pin) | |
{ | |
176c: b538 push {r3, r4, r5, lr} | |
176e: 4604 mov r4, r0 | |
while (transmitting) ; | |
1770: 4b09 ldr r3, [pc, #36] ; (1798 <serial_set_transmit_pin+0x2c>) | |
1772: 781b ldrb r3, [r3, #0] | |
1774: f003 05ff and.w r5, r3, #255 ; 0xff | |
1778: 2b00 cmp r3, #0 | |
177a: d1f9 bne.n 1770 <serial_set_transmit_pin+0x4> | |
pinMode(pin, OUTPUT); | |
177c: 4620 mov r0, r4 | |
177e: 2101 movs r1, #1 | |
1780: f7fe ffc2 bl 708 <pinMode> | |
digitalWrite(pin, LOW); | |
1784: 4620 mov r0, r4 | |
1786: 4629 mov r1, r5 | |
1788: f7fe ff9e bl 6c8 <digitalWrite> | |
transmit_pin = portOutputRegister(pin); | |
178c: 4b03 ldr r3, [pc, #12] ; (179c <serial_set_transmit_pin+0x30>) | |
178e: f853 2034 ldr.w r2, [r3, r4, lsl #3] | |
1792: 4b03 ldr r3, [pc, #12] ; (17a0 <serial_set_transmit_pin+0x34>) | |
1794: 601a str r2, [r3, #0] | |
1796: bd38 pop {r3, r4, r5, pc} | |
1798: 1fffe774 .word 0x1fffe774 | |
179c: 00002a94 .word 0x00002a94 | |
17a0: 1fffe7fc .word 0x1fffe7fc | |
000017a4 <serial_set_tx>: | |
transmit_mask = digitalPinToBitMask(pin); | |
#endif | |
} | |
void serial_set_tx(uint8_t pin, uint8_t opendrain) | |
{ | |
17a4: b510 push {r4, lr} | |
uint32_t cfg; | |
if (opendrain) pin |= 128; | |
17a6: b109 cbz r1, 17ac <serial_set_tx+0x8> | |
17a8: f040 0080 orr.w r0, r0, #128 ; 0x80 | |
if (pin == tx_pin_num) return; | |
17ac: 4a14 ldr r2, [pc, #80] ; (1800 <serial_set_tx+0x5c>) | |
17ae: 7813 ldrb r3, [r2, #0] | |
17b0: 4298 cmp r0, r3 | |
17b2: 4614 mov r4, r2 | |
17b4: d022 beq.n 17fc <serial_set_tx+0x58> | |
if ((SIM_SCGC4 & SIM_SCGC4_UART0)) { | |
17b6: 4a13 ldr r2, [pc, #76] ; (1804 <serial_set_tx+0x60>) | |
17b8: 6812 ldr r2, [r2, #0] | |
17ba: 0552 lsls r2, r2, #21 | |
17bc: d51d bpl.n 17fa <serial_set_tx+0x56> | |
switch (tx_pin_num & 127) { | |
17be: f003 037f and.w r3, r3, #127 ; 0x7f | |
17c2: 2b01 cmp r3, #1 | |
17c4: d004 beq.n 17d0 <serial_set_tx+0x2c> | |
17c6: 2b05 cmp r3, #5 | |
17c8: d105 bne.n 17d6 <serial_set_tx+0x32> | |
case 1: CORE_PIN1_CONFIG = 0; break; // PTB17 | |
case 5: CORE_PIN5_CONFIG = 0; break; // PTD7 | |
17ca: 2200 movs r2, #0 | |
17cc: 4b0e ldr r3, [pc, #56] ; (1808 <serial_set_tx+0x64>) | |
17ce: e001 b.n 17d4 <serial_set_tx+0x30> | |
if (opendrain) pin |= 128; | |
if (pin == tx_pin_num) return; | |
if ((SIM_SCGC4 & SIM_SCGC4_UART0)) { | |
switch (tx_pin_num & 127) { | |
case 1: CORE_PIN1_CONFIG = 0; break; // PTB17 | |
17d0: 4b0e ldr r3, [pc, #56] ; (180c <serial_set_tx+0x68>) | |
17d2: 2200 movs r2, #0 | |
case 5: CORE_PIN5_CONFIG = 0; break; // PTD7 | |
17d4: 601a str r2, [r3, #0] | |
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
case 26: CORE_PIN26_CONFIG = 0; break; //PTA14 | |
#endif | |
} | |
if (opendrain) { | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
17d6: 2900 cmp r1, #0 | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
17d8: f000 027f and.w r2, r0, #127 ; 0x7f | |
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
case 26: CORE_PIN26_CONFIG = 0; break; //PTA14 | |
#endif | |
} | |
if (opendrain) { | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
17dc: bf0c ite eq | |
17de: 2344 moveq r3, #68 ; 0x44 | |
17e0: 2360 movne r3, #96 ; 0x60 | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
17e2: 2a01 cmp r2, #1 | |
17e4: d005 beq.n 17f2 <serial_set_tx+0x4e> | |
17e6: 2a05 cmp r2, #5 | |
17e8: d107 bne.n 17fa <serial_set_tx+0x56> | |
case 1: CORE_PIN1_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
case 5: CORE_PIN5_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
17ea: f443 7340 orr.w r3, r3, #768 ; 0x300 | |
17ee: 4a06 ldr r2, [pc, #24] ; (1808 <serial_set_tx+0x64>) | |
17f0: e002 b.n 17f8 <serial_set_tx+0x54> | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
case 1: CORE_PIN1_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
17f2: 4a06 ldr r2, [pc, #24] ; (180c <serial_set_tx+0x68>) | |
17f4: f443 7340 orr.w r3, r3, #768 ; 0x300 | |
case 5: CORE_PIN5_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
17f8: 6013 str r3, [r2, #0] | |
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
case 26: CORE_PIN26_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
#endif | |
} | |
} | |
tx_pin_num = pin; | |
17fa: 7020 strb r0, [r4, #0] | |
17fc: bd10 pop {r4, pc} | |
17fe: bf00 nop | |
1800: 1fffe566 .word 0x1fffe566 | |
1804: 40048034 .word 0x40048034 | |
1808: 4004c01c .word 0x4004c01c | |
180c: 4004a044 .word 0x4004a044 | |
00001810 <serial_set_rx>: | |
} | |
void serial_set_rx(uint8_t pin) | |
{ | |
if (pin == rx_pin_num) return; | |
1810: 4a0e ldr r2, [pc, #56] ; (184c <serial_set_rx+0x3c>) | |
1812: 7813 ldrb r3, [r2, #0] | |
1814: 4298 cmp r0, r3 | |
1816: d018 beq.n 184a <serial_set_rx+0x3a> | |
if ((SIM_SCGC4 & SIM_SCGC4_UART0)) { | |
1818: 490d ldr r1, [pc, #52] ; (1850 <serial_set_rx+0x40>) | |
181a: 6809 ldr r1, [r1, #0] | |
181c: 0549 lsls r1, r1, #21 | |
181e: d513 bpl.n 1848 <serial_set_rx+0x38> | |
switch (rx_pin_num) { | |
1820: b12b cbz r3, 182e <serial_set_rx+0x1e> | |
1822: 2b15 cmp r3, #21 | |
1824: d105 bne.n 1832 <serial_set_rx+0x22> | |
case 0: CORE_PIN0_CONFIG = 0; break; // PTB16 | |
case 21: CORE_PIN21_CONFIG = 0; break; // PTD6 | |
1826: 4b0b ldr r3, [pc, #44] ; (1854 <serial_set_rx+0x44>) | |
1828: 2100 movs r1, #0 | |
182a: 6019 str r1, [r3, #0] | |
182c: e001 b.n 1832 <serial_set_rx+0x22> | |
void serial_set_rx(uint8_t pin) | |
{ | |
if (pin == rx_pin_num) return; | |
if ((SIM_SCGC4 & SIM_SCGC4_UART0)) { | |
switch (rx_pin_num) { | |
case 0: CORE_PIN0_CONFIG = 0; break; // PTB16 | |
182e: 490a ldr r1, [pc, #40] ; (1858 <serial_set_rx+0x48>) | |
1830: 600b str r3, [r1, #0] | |
#endif | |
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
case 27: CORE_PIN27_CONFIG = 0; break; // PTA15 | |
#endif | |
} | |
switch (pin) { | |
1832: b128 cbz r0, 1840 <serial_set_rx+0x30> | |
1834: 2815 cmp r0, #21 | |
1836: d107 bne.n 1848 <serial_set_rx+0x38> | |
case 0: CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
case 21: CORE_PIN21_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1838: f240 3113 movw r1, #787 ; 0x313 | |
183c: 4b05 ldr r3, [pc, #20] ; (1854 <serial_set_rx+0x44>) | |
183e: e002 b.n 1846 <serial_set_rx+0x36> | |
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
case 27: CORE_PIN27_CONFIG = 0; break; // PTA15 | |
#endif | |
} | |
switch (pin) { | |
case 0: CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1840: 4b05 ldr r3, [pc, #20] ; (1858 <serial_set_rx+0x48>) | |
1842: f240 3113 movw r1, #787 ; 0x313 | |
case 21: CORE_PIN21_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1846: 6019 str r1, [r3, #0] | |
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) | |
case 27: CORE_PIN27_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
#endif | |
} | |
} | |
rx_pin_num = pin; | |
1848: 7010 strb r0, [r2, #0] | |
184a: 4770 bx lr | |
184c: 1fffe7b6 .word 0x1fffe7b6 | |
1850: 40048034 .word 0x40048034 | |
1854: 4004c018 .word 0x4004c018 | |
1858: 4004a040 .word 0x4004a040 | |
0000185c <serial_set_rts>: | |
int serial_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return 0; | |
185c: 4a0d ldr r2, [pc, #52] ; (1894 <serial_set_rts+0x38>) | |
} | |
int serial_set_rts(uint8_t pin) | |
{ | |
185e: b538 push {r3, r4, r5, lr} | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return 0; | |
1860: 6814 ldr r4, [r2, #0] | |
1862: f414 6280 ands.w r2, r4, #1024 ; 0x400 | |
1866: f04f 0400 mov.w r4, #0 | |
186a: d010 beq.n 188e <serial_set_rts+0x32> | |
if (pin < CORE_NUM_DIGITAL) { | |
186c: 2821 cmp r0, #33 ; 0x21 | |
186e: 4d0a ldr r5, [pc, #40] ; (1898 <serial_set_rts+0x3c>) | |
1870: d80a bhi.n 1888 <serial_set_rts+0x2c> | |
rts_pin = portOutputRegister(pin); | |
1872: 4a0a ldr r2, [pc, #40] ; (189c <serial_set_rts+0x40>) | |
#if defined(KINETISL) | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
1874: 2101 movs r1, #1 | |
int serial_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return 0; | |
if (pin < CORE_NUM_DIGITAL) { | |
rts_pin = portOutputRegister(pin); | |
1876: f852 3030 ldr.w r3, [r2, r0, lsl #3] | |
187a: 602b str r3, [r5, #0] | |
#if defined(KINETISL) | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
187c: f7fe ff44 bl 708 <pinMode> | |
rts_assert(); | |
1880: 682b ldr r3, [r5, #0] | |
1882: 701c strb r4, [r3, #0] | |
UART0_MODEM &= ~UART_MODEM_RXRTSE; | |
return 0; | |
} | |
UART0_MODEM |= UART_MODEM_RXRTSE; | |
*/ | |
return 1; | |
1884: 2001 movs r0, #1 | |
1886: bd38 pop {r3, r4, r5, pc} | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
rts_assert(); | |
} else { | |
rts_pin = NULL; | |
1888: 602c str r4, [r5, #0] | |
return 0; | |
188a: 4620 mov r0, r4 | |
188c: bd38 pop {r3, r4, r5, pc} | |
int serial_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return 0; | |
188e: 4610 mov r0, r2 | |
return 0; | |
} | |
UART0_MODEM |= UART_MODEM_RXRTSE; | |
*/ | |
return 1; | |
} | |
1890: bd38 pop {r3, r4, r5, pc} | |
1892: bf00 nop | |
1894: 40048034 .word 0x40048034 | |
1898: 1fffe770 .word 0x1fffe770 | |
189c: 00002a94 .word 0x00002a94 | |
000018a0 <serial_set_cts>: | |
int serial_set_cts(uint8_t pin) | |
{ | |
#if defined(KINETISK) | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return 0; | |
18a0: 4b0e ldr r3, [pc, #56] ; (18dc <serial_set_cts+0x3c>) | |
18a2: 681b ldr r3, [r3, #0] | |
18a4: f413 6380 ands.w r3, r3, #1024 ; 0x400 | |
18a8: d016 beq.n 18d8 <serial_set_cts+0x38> | |
if (pin == 18) { | |
18aa: 2812 cmp r0, #18 | |
18ac: 4b0c ldr r3, [pc, #48] ; (18e0 <serial_set_cts+0x40>) | |
18ae: d103 bne.n 18b8 <serial_set_cts+0x18> | |
CORE_PIN18_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
18b0: f240 3102 movw r1, #770 ; 0x302 | |
18b4: 4a0b ldr r2, [pc, #44] ; (18e4 <serial_set_cts+0x44>) | |
18b6: e004 b.n 18c2 <serial_set_cts+0x22> | |
} else if (pin == 20) { | |
18b8: 2814 cmp r0, #20 | |
18ba: d109 bne.n 18d0 <serial_set_cts+0x30> | |
CORE_PIN20_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
18bc: 4a0a ldr r2, [pc, #40] ; (18e8 <serial_set_cts+0x48>) | |
18be: f240 3102 movw r1, #770 ; 0x302 | |
18c2: 6011 str r1, [r2, #0] | |
} else { | |
UART0_MODEM &= ~UART_MODEM_TXCTSE; | |
return 0; | |
} | |
UART0_MODEM |= UART_MODEM_TXCTSE; | |
18c4: 7b5a ldrb r2, [r3, #13] | |
18c6: f042 0201 orr.w r2, r2, #1 | |
18ca: 735a strb r2, [r3, #13] | |
return 1; | |
18cc: 2001 movs r0, #1 | |
18ce: 4770 bx lr | |
if (pin == 18) { | |
CORE_PIN18_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
} else if (pin == 20) { | |
CORE_PIN20_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
} else { | |
UART0_MODEM &= ~UART_MODEM_TXCTSE; | |
18d0: 7b5a ldrb r2, [r3, #13] | |
18d2: f002 02fe and.w r2, r2, #254 ; 0xfe | |
18d6: 735a strb r2, [r3, #13] | |
return 0; | |
18d8: 2000 movs r0, #0 | |
18da: 4770 bx lr | |
18dc: 40048034 .word 0x40048034 | |
18e0: 4006a000 .word 0x4006a000 | |
18e4: 4004a00c .word 0x4004a00c | |
18e8: 4004c014 .word 0x4004c014 | |
000018ec <serial_putchar>: | |
return 0; | |
#endif | |
} | |
void serial_putchar(uint32_t c) | |
{ | |
18ec: b5f8 push {r3, r4, r5, r6, r7, lr} | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
18ee: 4b1d ldr r3, [pc, #116] ; (1964 <serial_putchar+0x78>) | |
18f0: 681b ldr r3, [r3, #0] | |
18f2: 055a lsls r2, r3, #21 | |
return 0; | |
#endif | |
} | |
void serial_putchar(uint32_t c) | |
{ | |
18f4: 4606 mov r6, r0 | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
18f6: d533 bpl.n 1960 <serial_putchar+0x74> | |
if (transmit_pin) transmit_assert(); | |
18f8: 4b1b ldr r3, [pc, #108] ; (1968 <serial_putchar+0x7c>) | |
18fa: 681b ldr r3, [r3, #0] | |
18fc: b10b cbz r3, 1902 <serial_putchar+0x16> | |
18fe: 2201 movs r2, #1 | |
1900: 701a strb r2, [r3, #0] | |
head = tx_buffer_head; | |
1902: 4b1a ldr r3, [pc, #104] ; (196c <serial_putchar+0x80>) | |
1904: 781c ldrb r4, [r3, #0] | |
if (++head >= TX_BUFFER_SIZE) head = 0; | |
1906: 3401 adds r4, #1 | |
1908: 2c40 cmp r4, #64 ; 0x40 | |
190a: 461f mov r7, r3 | |
190c: bf28 it cs | |
190e: 2400 movcs r4, #0 | |
while (tx_buffer_tail == head) { | |
1910: 4d17 ldr r5, [pc, #92] ; (1970 <serial_putchar+0x84>) | |
1912: 782b ldrb r3, [r5, #0] | |
1914: 42a3 cmp r3, r4 | |
1916: d118 bne.n 194a <serial_putchar+0x5e> | |
int priority = nvic_execution_priority(); | |
1918: f7ff fe2a bl 1570 <nvic_execution_priority> | |
if (priority <= IRQ_PRIORITY) { | |
191c: 2840 cmp r0, #64 ; 0x40 | |
191e: dc0f bgt.n 1940 <serial_putchar+0x54> | |
if ((UART0_S1 & UART_S1_TDRE)) { | |
1920: 4a14 ldr r2, [pc, #80] ; (1974 <serial_putchar+0x88>) | |
1922: 7913 ldrb r3, [r2, #4] | |
1924: 061b lsls r3, r3, #24 | |
1926: d5f3 bpl.n 1910 <serial_putchar+0x24> | |
uint32_t tail = tx_buffer_tail; | |
1928: 782b ldrb r3, [r5, #0] | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
192a: 4913 ldr r1, [pc, #76] ; (1978 <serial_putchar+0x8c>) | |
while (tx_buffer_tail == head) { | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART0_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
192c: 3301 adds r3, #1 | |
192e: 2b40 cmp r3, #64 ; 0x40 | |
1930: bf28 it cs | |
1932: 2300 movcs r3, #0 | |
n = tx_buffer[tail]; | |
1934: 5cc9 ldrb r1, [r1, r3] | |
if (use9Bits) UART0_C3 = (UART0_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART0_D = n; | |
tx_buffer_tail = tail; | |
1936: b2db uxtb r3, r3 | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART0_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
1938: b2c9 uxtb r1, r1 | |
if (use9Bits) UART0_C3 = (UART0_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART0_D = n; | |
193a: 71d1 strb r1, [r2, #7] | |
tx_buffer_tail = tail; | |
193c: 702b strb r3, [r5, #0] | |
193e: e7e7 b.n 1910 <serial_putchar+0x24> | |
} | |
} else if (priority >= 256) { | |
1940: 28ff cmp r0, #255 ; 0xff | |
1942: dde5 ble.n 1910 <serial_putchar+0x24> | |
yield(); | |
1944: f7ff fd7c bl 1440 <yield> | |
1948: e7e2 b.n 1910 <serial_putchar+0x24> | |
} | |
} | |
tx_buffer[head] = c; | |
194a: 4b0b ldr r3, [pc, #44] ; (1978 <serial_putchar+0x8c>) | |
194c: b2f6 uxtb r6, r6 | |
194e: 551e strb r6, [r3, r4] | |
transmitting = 1; | |
1950: 4b0a ldr r3, [pc, #40] ; (197c <serial_putchar+0x90>) | |
1952: 2201 movs r2, #1 | |
1954: 701a strb r2, [r3, #0] | |
tx_buffer_head = head; | |
UART0_C2 = C2_TX_ACTIVE; | |
1956: 4b07 ldr r3, [pc, #28] ; (1974 <serial_putchar+0x88>) | |
yield(); | |
} | |
} | |
tx_buffer[head] = c; | |
transmitting = 1; | |
tx_buffer_head = head; | |
1958: b2e4 uxtb r4, r4 | |
UART0_C2 = C2_TX_ACTIVE; | |
195a: 22bc movs r2, #188 ; 0xbc | |
yield(); | |
} | |
} | |
tx_buffer[head] = c; | |
transmitting = 1; | |
tx_buffer_head = head; | |
195c: 703c strb r4, [r7, #0] | |
UART0_C2 = C2_TX_ACTIVE; | |
195e: 70da strb r2, [r3, #3] | |
1960: bdf8 pop {r3, r4, r5, r6, r7, pc} | |
1962: bf00 nop | |
1964: 40048034 .word 0x40048034 | |
1968: 1fffe7fc .word 0x1fffe7fc | |
196c: 1fffe800 .word 0x1fffe800 | |
1970: 1fffe7f8 .word 0x1fffe7f8 | |
1974: 4006a000 .word 0x4006a000 | |
1978: 1fffe776 .word 0x1fffe776 | |
197c: 1fffe774 .word 0x1fffe774 | |
00001980 <serial_write>: | |
{ | |
const uint8_t *p = (const uint8_t *)buf; | |
const uint8_t *end = p + count; | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
1980: 4b27 ldr r3, [pc, #156] ; (1a20 <serial_write+0xa0>) | |
1982: 681b ldr r3, [r3, #0] | |
1984: 055a lsls r2, r3, #21 | |
UART0_C2 = C2_TX_ACTIVE; | |
} | |
#ifdef HAS_KINETISK_UART0_FIFO | |
void serial_write(const void *buf, unsigned int count) | |
{ | |
1986: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} | |
198a: 4607 mov r7, r0 | |
198c: 468a mov sl, r1 | |
const uint8_t *p = (const uint8_t *)buf; | |
const uint8_t *end = p + count; | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
198e: d544 bpl.n 1a1a <serial_write+0x9a> | |
if (transmit_pin) transmit_assert(); | |
1990: 4b24 ldr r3, [pc, #144] ; (1a24 <serial_write+0xa4>) | |
1992: 681b ldr r3, [r3, #0] | |
1994: b10b cbz r3, 199a <serial_write+0x1a> | |
1996: 2201 movs r2, #1 | |
1998: 701a strb r2, [r3, #0] | |
do { | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART0_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
199a: 463d mov r5, r7 | |
#ifdef HAS_KINETISK_UART0_FIFO | |
void serial_write(const void *buf, unsigned int count) | |
{ | |
const uint8_t *p = (const uint8_t *)buf; | |
const uint8_t *end = p + count; | |
199c: eb07 030a add.w r3, r7, sl | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
if (transmit_pin) transmit_assert(); | |
while (p < end) { | |
19a0: 429d cmp r5, r3 | |
19a2: d237 bcs.n 1a14 <serial_write+0x94> | |
head = tx_buffer_head; | |
19a4: f8df 8090 ldr.w r8, [pc, #144] ; 1a38 <serial_write+0xb8> | |
if (++head >= TX_BUFFER_SIZE) head = 0; | |
if (tx_buffer_tail == head) { | |
19a8: 4e1f ldr r6, [pc, #124] ; (1a28 <serial_write+0xa8>) | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
if (transmit_pin) transmit_assert(); | |
while (p < end) { | |
head = tx_buffer_head; | |
19aa: f898 4000 ldrb.w r4, [r8] | |
if (++head >= TX_BUFFER_SIZE) head = 0; | |
if (tx_buffer_tail == head) { | |
19ae: f896 9000 ldrb.w r9, [r6] | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
if (transmit_pin) transmit_assert(); | |
while (p < end) { | |
head = tx_buffer_head; | |
if (++head >= TX_BUFFER_SIZE) head = 0; | |
19b2: 3401 adds r4, #1 | |
19b4: 2c40 cmp r4, #64 ; 0x40 | |
19b6: bf28 it cs | |
19b8: 2400 movcs r4, #0 | |
if (tx_buffer_tail == head) { | |
19ba: fa5f f989 uxtb.w r9, r9 | |
19be: 45a1 cmp r9, r4 | |
19c0: d11d bne.n 19fe <serial_write+0x7e> | |
UART0_C2 = C2_TX_ACTIVE; | |
19c2: 4b1a ldr r3, [pc, #104] ; (1a2c <serial_write+0xac>) | |
19c4: 22bc movs r2, #188 ; 0xbc | |
19c6: 70da strb r2, [r3, #3] | |
do { | |
int priority = nvic_execution_priority(); | |
19c8: f7ff fdd2 bl 1570 <nvic_execution_priority> | |
if (priority <= IRQ_PRIORITY) { | |
19cc: 2840 cmp r0, #64 ; 0x40 | |
19ce: dc0f bgt.n 19f0 <serial_write+0x70> | |
if ((UART0_S1 & UART_S1_TDRE)) { | |
19d0: 4a16 ldr r2, [pc, #88] ; (1a2c <serial_write+0xac>) | |
19d2: 7913 ldrb r3, [r2, #4] | |
19d4: 061b lsls r3, r3, #24 | |
19d6: d50f bpl.n 19f8 <serial_write+0x78> | |
uint32_t tail = tx_buffer_tail; | |
19d8: 7833 ldrb r3, [r6, #0] | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
19da: 4915 ldr r1, [pc, #84] ; (1a30 <serial_write+0xb0>) | |
do { | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART0_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
19dc: 3301 adds r3, #1 | |
19de: 2b40 cmp r3, #64 ; 0x40 | |
19e0: bf28 it cs | |
19e2: 2300 movcs r3, #0 | |
n = tx_buffer[tail]; | |
19e4: 5cc9 ldrb r1, [r1, r3] | |
if (use9Bits) UART0_C3 = (UART0_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART0_D = n; | |
tx_buffer_tail = tail; | |
19e6: b2db uxtb r3, r3 | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART0_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
19e8: b2c9 uxtb r1, r1 | |
if (use9Bits) UART0_C3 = (UART0_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART0_D = n; | |
19ea: 71d1 strb r1, [r2, #7] | |
tx_buffer_tail = tail; | |
19ec: 7033 strb r3, [r6, #0] | |
19ee: e003 b.n 19f8 <serial_write+0x78> | |
} | |
} else if (priority >= 256) { | |
19f0: 28ff cmp r0, #255 ; 0xff | |
19f2: dd01 ble.n 19f8 <serial_write+0x78> | |
yield(); | |
19f4: f7ff fd24 bl 1440 <yield> | |
} | |
} while (tx_buffer_tail == head); | |
19f8: 7833 ldrb r3, [r6, #0] | |
19fa: 454b cmp r3, r9 | |
19fc: d0e4 beq.n 19c8 <serial_write+0x48> | |
} | |
tx_buffer[head] = *p++; | |
19fe: 4b0c ldr r3, [pc, #48] ; (1a30 <serial_write+0xb0>) | |
1a00: f815 2b01 ldrb.w r2, [r5], #1 | |
1a04: 551a strb r2, [r3, r4] | |
transmitting = 1; | |
1a06: 4b0b ldr r3, [pc, #44] ; (1a34 <serial_write+0xb4>) | |
1a08: 2201 movs r2, #1 | |
tx_buffer_head = head; | |
1a0a: b2e4 uxtb r4, r4 | |
yield(); | |
} | |
} while (tx_buffer_tail == head); | |
} | |
tx_buffer[head] = *p++; | |
transmitting = 1; | |
1a0c: 701a strb r2, [r3, #0] | |
tx_buffer_head = head; | |
1a0e: f888 4000 strb.w r4, [r8] | |
1a12: e7c3 b.n 199c <serial_write+0x1c> | |
} | |
UART0_C2 = C2_TX_ACTIVE; | |
1a14: 4b05 ldr r3, [pc, #20] ; (1a2c <serial_write+0xac>) | |
1a16: 22bc movs r2, #188 ; 0xbc | |
1a18: 70da strb r2, [r3, #3] | |
1a1a: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} | |
1a1e: bf00 nop | |
1a20: 40048034 .word 0x40048034 | |
1a24: 1fffe7fc .word 0x1fffe7fc | |
1a28: 1fffe7f8 .word 0x1fffe7f8 | |
1a2c: 4006a000 .word 0x4006a000 | |
1a30: 1fffe776 .word 0x1fffe776 | |
1a34: 1fffe774 .word 0x1fffe774 | |
1a38: 1fffe800 .word 0x1fffe800 | |
00001a3c <serial_flush>: | |
while (count-- > 0) serial_putchar(*p++); | |
} | |
#endif | |
void serial_flush(void) | |
{ | |
1a3c: b508 push {r3, lr} | |
while (transmitting) yield(); // wait | |
1a3e: 4b03 ldr r3, [pc, #12] ; (1a4c <serial_flush+0x10>) | |
1a40: 781b ldrb r3, [r3, #0] | |
1a42: b113 cbz r3, 1a4a <serial_flush+0xe> | |
1a44: f7ff fcfc bl 1440 <yield> | |
1a48: e7f9 b.n 1a3e <serial_flush+0x2> | |
} | |
1a4a: bd08 pop {r3, pc} | |
1a4c: 1fffe774 .word 0x1fffe774 | |
00001a50 <serial_write_buffer_free>: | |
int serial_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
tail = tx_buffer_tail; | |
1a50: 4a06 ldr r2, [pc, #24] ; (1a6c <serial_write_buffer_free+0x1c>) | |
int serial_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
1a52: 4b07 ldr r3, [pc, #28] ; (1a70 <serial_write_buffer_free+0x20>) | |
1a54: 781b ldrb r3, [r3, #0] | |
tail = tx_buffer_tail; | |
1a56: 7810 ldrb r0, [r2, #0] | |
int serial_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
1a58: b2db uxtb r3, r3 | |
tail = tx_buffer_tail; | |
1a5a: b2c0 uxtb r0, r0 | |
if (head >= tail) return TX_BUFFER_SIZE - 1 - head + tail; | |
1a5c: 4283 cmp r3, r0 | |
1a5e: bf2c ite cs | |
1a60: 303f addcs r0, #63 ; 0x3f | |
return tail - head - 1; | |
1a62: f100 30ff addcc.w r0, r0, #4294967295 ; 0xffffffff | |
1a66: 1ac0 subs r0, r0, r3 | |
} | |
1a68: 4770 bx lr | |
1a6a: bf00 nop | |
1a6c: 1fffe7f8 .word 0x1fffe7f8 | |
1a70: 1fffe800 .word 0x1fffe800 | |
00001a74 <serial_available>: | |
int serial_available(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
1a74: 4b05 ldr r3, [pc, #20] ; (1a8c <serial_available+0x18>) | |
1a76: 7818 ldrb r0, [r3, #0] | |
tail = rx_buffer_tail; | |
1a78: 4b05 ldr r3, [pc, #20] ; (1a90 <serial_available+0x1c>) | |
1a7a: 781b ldrb r3, [r3, #0] | |
int serial_available(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
1a7c: b2c0 uxtb r0, r0 | |
tail = rx_buffer_tail; | |
1a7e: b2db uxtb r3, r3 | |
if (head >= tail) return head - tail; | |
1a80: 4298 cmp r0, r3 | |
return RX_BUFFER_SIZE + head - tail; | |
1a82: bf38 it cc | |
1a84: 3040 addcc r0, #64 ; 0x40 | |
1a86: 1ac0 subs r0, r0, r3 | |
} | |
1a88: 4770 bx lr | |
1a8a: bf00 nop | |
1a8c: 1fffe7f7 .word 0x1fffe7f7 | |
1a90: 1fffe775 .word 0x1fffe775 | |
00001a94 <serial_getchar>: | |
int serial_getchar(void) | |
{ | |
1a94: b510 push {r4, lr} | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
1a96: 4b10 ldr r3, [pc, #64] ; (1ad8 <serial_getchar+0x44>) | |
tail = rx_buffer_tail; | |
1a98: 4910 ldr r1, [pc, #64] ; (1adc <serial_getchar+0x48>) | |
int serial_getchar(void) | |
{ | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
1a9a: 781a ldrb r2, [r3, #0] | |
tail = rx_buffer_tail; | |
1a9c: 780b ldrb r3, [r1, #0] | |
int serial_getchar(void) | |
{ | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
1a9e: b2d2 uxtb r2, r2 | |
tail = rx_buffer_tail; | |
1aa0: b2db uxtb r3, r3 | |
if (head == tail) return -1; | |
1aa2: 429a cmp r2, r3 | |
1aa4: d014 beq.n 1ad0 <serial_getchar+0x3c> | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
1aa6: 3301 adds r3, #1 | |
1aa8: 2b40 cmp r3, #64 ; 0x40 | |
1aaa: bf28 it cs | |
1aac: 2300 movcs r3, #0 | |
c = rx_buffer[tail]; | |
1aae: 480c ldr r0, [pc, #48] ; (1ae0 <serial_getchar+0x4c>) | |
rx_buffer_tail = tail; | |
1ab0: b2dc uxtb r4, r3 | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
c = rx_buffer[tail]; | |
1ab2: 5cc0 ldrb r0, [r0, r3] | |
rx_buffer_tail = tail; | |
1ab4: 700c strb r4, [r1, #0] | |
if (rts_pin) { | |
1ab6: 490b ldr r1, [pc, #44] ; (1ae4 <serial_getchar+0x50>) | |
1ab8: 6809 ldr r1, [r1, #0] | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
c = rx_buffer[tail]; | |
1aba: b2c0 uxtb r0, r0 | |
rx_buffer_tail = tail; | |
if (rts_pin) { | |
1abc: b151 cbz r1, 1ad4 <serial_getchar+0x40> | |
int avail; | |
if (head >= tail) avail = head - tail; | |
1abe: 429a cmp r2, r3 | |
else avail = RX_BUFFER_SIZE + head - tail; | |
1ac0: bf38 it cc | |
1ac2: 3240 addcc r2, #64 ; 0x40 | |
1ac4: 1ad3 subs r3, r2, r3 | |
if (avail <= RTS_LOW_WATERMARK) rts_assert(); | |
1ac6: 2b1a cmp r3, #26 | |
1ac8: dc04 bgt.n 1ad4 <serial_getchar+0x40> | |
1aca: 2300 movs r3, #0 | |
1acc: 700b strb r3, [r1, #0] | |
1ace: bd10 pop {r4, pc} | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
1ad0: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
if (head >= tail) avail = head - tail; | |
else avail = RX_BUFFER_SIZE + head - tail; | |
if (avail <= RTS_LOW_WATERMARK) rts_assert(); | |
} | |
return c; | |
} | |
1ad4: bd10 pop {r4, pc} | |
1ad6: bf00 nop | |
1ad8: 1fffe7f7 .word 0x1fffe7f7 | |
1adc: 1fffe775 .word 0x1fffe775 | |
1ae0: 1fffe7b7 .word 0x1fffe7b7 | |
1ae4: 1fffe770 .word 0x1fffe770 | |
00001ae8 <serial_peek>: | |
int serial_peek(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
1ae8: 4b08 ldr r3, [pc, #32] ; (1b0c <serial_peek+0x24>) | |
1aea: 781a ldrb r2, [r3, #0] | |
tail = rx_buffer_tail; | |
1aec: 4b08 ldr r3, [pc, #32] ; (1b10 <serial_peek+0x28>) | |
1aee: 781b ldrb r3, [r3, #0] | |
1af0: b2db uxtb r3, r3 | |
if (head == tail) return -1; | |
1af2: 429a cmp r2, r3 | |
1af4: d007 beq.n 1b06 <serial_peek+0x1e> | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
1af6: 3301 adds r3, #1 | |
1af8: 2b40 cmp r3, #64 ; 0x40 | |
1afa: bf28 it cs | |
1afc: 2300 movcs r3, #0 | |
return rx_buffer[tail]; | |
1afe: 4a05 ldr r2, [pc, #20] ; (1b14 <serial_peek+0x2c>) | |
1b00: 5cd0 ldrb r0, [r2, r3] | |
1b02: b2c0 uxtb r0, r0 | |
1b04: 4770 bx lr | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
1b06: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
return rx_buffer[tail]; | |
} | |
1b0a: 4770 bx lr | |
1b0c: 1fffe7f7 .word 0x1fffe7f7 | |
1b10: 1fffe775 .word 0x1fffe775 | |
1b14: 1fffe7b7 .word 0x1fffe7b7 | |
00001b18 <serial_clear>: | |
void serial_clear(void) | |
{ | |
#ifdef HAS_KINETISK_UART0_FIFO | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | |
1b18: 4b0c ldr r3, [pc, #48] ; (1b4c <serial_clear+0x34>) | |
1b1a: 681b ldr r3, [r3, #0] | |
1b1c: 055b lsls r3, r3, #21 | |
1b1e: d514 bpl.n 1b4a <serial_clear+0x32> | |
UART0_C2 &= ~(UART_C2_RE | UART_C2_RIE | UART_C2_ILIE); | |
1b20: 4b0b ldr r3, [pc, #44] ; (1b50 <serial_clear+0x38>) | |
1b22: 78da ldrb r2, [r3, #3] | |
1b24: f002 02cb and.w r2, r2, #203 ; 0xcb | |
1b28: 70da strb r2, [r3, #3] | |
UART0_CFIFO = UART_CFIFO_RXFLUSH; | |
1b2a: 2240 movs r2, #64 ; 0x40 | |
1b2c: 745a strb r2, [r3, #17] | |
UART0_C2 |= (UART_C2_RE | UART_C2_RIE | UART_C2_ILIE); | |
1b2e: 78da ldrb r2, [r3, #3] | |
1b30: f042 0234 orr.w r2, r2, #52 ; 0x34 | |
1b34: 70da strb r2, [r3, #3] | |
#endif | |
rx_buffer_head = rx_buffer_tail; | |
1b36: 4b07 ldr r3, [pc, #28] ; (1b54 <serial_clear+0x3c>) | |
1b38: 781a ldrb r2, [r3, #0] | |
1b3a: 4b07 ldr r3, [pc, #28] ; (1b58 <serial_clear+0x40>) | |
1b3c: b2d2 uxtb r2, r2 | |
1b3e: 701a strb r2, [r3, #0] | |
if (rts_pin) rts_assert(); | |
1b40: 4b06 ldr r3, [pc, #24] ; (1b5c <serial_clear+0x44>) | |
1b42: 681b ldr r3, [r3, #0] | |
1b44: b10b cbz r3, 1b4a <serial_clear+0x32> | |
1b46: 2200 movs r2, #0 | |
1b48: 701a strb r2, [r3, #0] | |
1b4a: 4770 bx lr | |
1b4c: 40048034 .word 0x40048034 | |
1b50: 4006a000 .word 0x4006a000 | |
1b54: 1fffe775 .word 0x1fffe775 | |
1b58: 1fffe7f7 .word 0x1fffe7f7 | |
1b5c: 1fffe770 .word 0x1fffe770 | |
00001b60 <uart0_status_isr>: | |
// Receive data above watermark UART_S1_RDRF | |
// LIN break detect UART_S2_LBKDIF | |
// RxD pin active edge UART_S2_RXEDGIF | |
void uart0_status_isr(void) | |
{ | |
1b60: b530 push {r4, r5, lr} | |
uint8_t c; | |
#ifdef HAS_KINETISK_UART0_FIFO | |
uint32_t newhead; | |
uint8_t avail; | |
if (UART0_S1 & (UART_S1_RDRF | UART_S1_IDLE)) { | |
1b62: 4b37 ldr r3, [pc, #220] ; (1c40 <uart0_status_isr+0xe0>) | |
1b64: 791a ldrb r2, [r3, #4] | |
1b66: f012 0f30 tst.w r2, #48 ; 0x30 | |
1b6a: d031 beq.n 1bd0 <uart0_status_isr+0x70> | |
__disable_irq(); | |
1b6c: b672 cpsid i | |
avail = UART0_RCFIFO; | |
1b6e: 7d9a ldrb r2, [r3, #22] | |
if (avail == 0) { | |
1b70: f002 00ff and.w r0, r2, #255 ; 0xff | |
1b74: b922 cbnz r2, 1b80 <uart0_status_isr+0x20> | |
// to read the data register. But reading with no | |
// data causes a FIFO underrun, which causes the | |
// FIFO to return corrupted data. If anyone from | |
// Freescale reads this, what a poor design! There | |
// write should be a write-1-to-clear for IDLE. | |
c = UART0_D; | |
1b76: 79da ldrb r2, [r3, #7] | |
// the chance, interrupts are disabled so a higher | |
// priority interrupt (hopefully) doesn't delay. | |
// TODO: change this to disabling the IDLE interrupt | |
// which won't be simple, since we already manage | |
// which transmit interrupts are enabled. | |
UART0_CFIFO = UART_CFIFO_RXFLUSH; | |
1b78: 2240 movs r2, #64 ; 0x40 | |
1b7a: 745a strb r2, [r3, #17] | |
__enable_irq(); | |
1b7c: b662 cpsie i | |
1b7e: e027 b.n 1bd0 <uart0_status_isr+0x70> | |
} else { | |
__enable_irq(); | |
1b80: b662 cpsie i | |
head = rx_buffer_head; | |
1b82: 4a30 ldr r2, [pc, #192] ; (1c44 <uart0_status_isr+0xe4>) | |
tail = rx_buffer_tail; | |
1b84: 4930 ldr r1, [pc, #192] ; (1c48 <uart0_status_isr+0xe8>) | |
// which transmit interrupts are enabled. | |
UART0_CFIFO = UART_CFIFO_RXFLUSH; | |
__enable_irq(); | |
} else { | |
__enable_irq(); | |
head = rx_buffer_head; | |
1b86: 7813 ldrb r3, [r2, #0] | |
tail = rx_buffer_tail; | |
1b88: 7809 ldrb r1, [r1, #0] | |
// which transmit interrupts are enabled. | |
UART0_CFIFO = UART_CFIFO_RXFLUSH; | |
__enable_irq(); | |
} else { | |
__enable_irq(); | |
head = rx_buffer_head; | |
1b8a: b2db uxtb r3, r3 | |
tail = rx_buffer_tail; | |
1b8c: b2c9 uxtb r1, r1 | |
1b8e: 4614 mov r4, r2 | |
do { | |
if (use9Bits && (UART0_C3 & 0x80)) { | |
n = UART0_D | 0x100; | |
} else { | |
n = UART0_D; | |
1b90: 4a2b ldr r2, [pc, #172] ; (1c40 <uart0_status_isr+0xe0>) | |
1b92: 79d5 ldrb r5, [r2, #7] | |
} | |
newhead = head + 1; | |
1b94: 1c5a adds r2, r3, #1 | |
if (newhead >= RX_BUFFER_SIZE) newhead = 0; | |
1b96: 2a40 cmp r2, #64 ; 0x40 | |
1b98: bf28 it cs | |
1b9a: 2200 movcs r2, #0 | |
if (newhead != tail) { | |
1b9c: 428a cmp r2, r1 | |
tail = rx_buffer_tail; | |
do { | |
if (use9Bits && (UART0_C3 & 0x80)) { | |
n = UART0_D | 0x100; | |
} else { | |
n = UART0_D; | |
1b9e: b2ed uxtb r5, r5 | |
} | |
newhead = head + 1; | |
if (newhead >= RX_BUFFER_SIZE) newhead = 0; | |
if (newhead != tail) { | |
1ba0: d002 beq.n 1ba8 <uart0_status_isr+0x48> | |
head = newhead; | |
rx_buffer[head] = n; | |
1ba2: 4b2a ldr r3, [pc, #168] ; (1c4c <uart0_status_isr+0xec>) | |
1ba4: 549d strb r5, [r3, r2] | |
1ba6: 4613 mov r3, r2 | |
} | |
} while (--avail > 0); | |
1ba8: 1e42 subs r2, r0, #1 | |
1baa: f012 00ff ands.w r0, r2, #255 ; 0xff | |
1bae: d1ef bne.n 1b90 <uart0_status_isr+0x30> | |
rx_buffer_head = head; | |
1bb0: b2da uxtb r2, r3 | |
1bb2: 7022 strb r2, [r4, #0] | |
if (rts_pin) { | |
1bb4: 4a26 ldr r2, [pc, #152] ; (1c50 <uart0_status_isr+0xf0>) | |
1bb6: 6812 ldr r2, [r2, #0] | |
1bb8: b152 cbz r2, 1bd0 <uart0_status_isr+0x70> | |
int avail; | |
if (head >= tail) avail = head - tail; | |
1bba: 428b cmp r3, r1 | |
else avail = RX_BUFFER_SIZE + head - tail; | |
1bbc: bf36 itet cc | |
1bbe: f1c1 0140 rsbcc r1, r1, #64 ; 0x40 | |
} | |
} while (--avail > 0); | |
rx_buffer_head = head; | |
if (rts_pin) { | |
int avail; | |
if (head >= tail) avail = head - tail; | |
1bc2: ebc1 0303 rsbcs r3, r1, r3 | |
else avail = RX_BUFFER_SIZE + head - tail; | |
1bc6: 185b addcc r3, r3, r1 | |
if (avail >= RTS_HIGH_WATERMARK) rts_deassert(); | |
1bc8: 2b27 cmp r3, #39 ; 0x27 | |
1bca: bfc4 itt gt | |
1bcc: 2301 movgt r3, #1 | |
1bce: 7013 strbgt r3, [r2, #0] | |
} | |
} | |
} | |
c = UART0_C2; | |
1bd0: 4b1b ldr r3, [pc, #108] ; (1c40 <uart0_status_isr+0xe0>) | |
1bd2: 78d9 ldrb r1, [r3, #3] | |
1bd4: b2c9 uxtb r1, r1 | |
if ((c & UART_C2_TIE) && (UART0_S1 & UART_S1_TDRE)) { | |
1bd6: 060c lsls r4, r1, #24 | |
1bd8: d520 bpl.n 1c1c <uart0_status_isr+0xbc> | |
1bda: 791b ldrb r3, [r3, #4] | |
1bdc: 0618 lsls r0, r3, #24 | |
1bde: d51d bpl.n 1c1c <uart0_status_isr+0xbc> | |
head = tx_buffer_head; | |
1be0: 4b1c ldr r3, [pc, #112] ; (1c54 <uart0_status_isr+0xf4>) | |
tail = tx_buffer_tail; | |
1be2: 4a1d ldr r2, [pc, #116] ; (1c58 <uart0_status_isr+0xf8>) | |
} | |
} | |
} | |
c = UART0_C2; | |
if ((c & UART_C2_TIE) && (UART0_S1 & UART_S1_TDRE)) { | |
head = tx_buffer_head; | |
1be4: 781d ldrb r5, [r3, #0] | |
tail = tx_buffer_tail; | |
1be6: 7813 ldrb r3, [r2, #0] | |
} | |
} | |
} | |
c = UART0_C2; | |
if ((c & UART_C2_TIE) && (UART0_S1 & UART_S1_TDRE)) { | |
head = tx_buffer_head; | |
1be8: b2ed uxtb r5, r5 | |
tail = tx_buffer_tail; | |
1bea: b2db uxtb r3, r3 | |
1bec: 4610 mov r0, r2 | |
do { | |
if (tail == head) break; | |
1bee: 42ab cmp r3, r5 | |
1bf0: d00c beq.n 1c0c <uart0_status_isr+0xac> | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
avail = UART0_S1; | |
1bf2: 4a13 ldr r2, [pc, #76] ; (1c40 <uart0_status_isr+0xe0>) | |
if ((c & UART_C2_TIE) && (UART0_S1 & UART_S1_TDRE)) { | |
head = tx_buffer_head; | |
tail = tx_buffer_tail; | |
do { | |
if (tail == head) break; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
1bf4: 3301 adds r3, #1 | |
1bf6: 2b40 cmp r3, #64 ; 0x40 | |
avail = UART0_S1; | |
1bf8: 7914 ldrb r4, [r2, #4] | |
n = tx_buffer[tail]; | |
1bfa: 4c18 ldr r4, [pc, #96] ; (1c5c <uart0_status_isr+0xfc>) | |
if ((c & UART_C2_TIE) && (UART0_S1 & UART_S1_TDRE)) { | |
head = tx_buffer_head; | |
tail = tx_buffer_tail; | |
do { | |
if (tail == head) break; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
1bfc: bf28 it cs | |
1bfe: 2300 movcs r3, #0 | |
avail = UART0_S1; | |
n = tx_buffer[tail]; | |
1c00: 5ce4 ldrb r4, [r4, r3] | |
1c02: b2e4 uxtb r4, r4 | |
if (use9Bits) UART0_C3 = (UART0_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART0_D = n; | |
1c04: 71d4 strb r4, [r2, #7] | |
} while (UART0_TCFIFO < 8); | |
1c06: 7d12 ldrb r2, [r2, #20] | |
1c08: 2a07 cmp r2, #7 | |
1c0a: d9f0 bls.n 1bee <uart0_status_isr+0x8e> | |
tx_buffer_tail = tail; | |
1c0c: b2db uxtb r3, r3 | |
1c0e: 7003 strb r3, [r0, #0] | |
if (UART0_S1 & UART_S1_TDRE) UART0_C2 = C2_TX_COMPLETING; | |
1c10: 4b0b ldr r3, [pc, #44] ; (1c40 <uart0_status_isr+0xe0>) | |
1c12: 791a ldrb r2, [r3, #4] | |
1c14: 0612 lsls r2, r2, #24 | |
1c16: bf44 itt mi | |
1c18: 227c movmi r2, #124 ; 0x7c | |
1c1a: 70da strbmi r2, [r3, #3] | |
UART0_D = n; | |
tx_buffer_tail = tail; | |
} | |
} | |
#endif | |
if ((c & UART_C2_TCIE) && (UART0_S1 & UART_S1_TC)) { | |
1c1c: 064b lsls r3, r1, #25 | |
1c1e: d50e bpl.n 1c3e <uart0_status_isr+0xde> | |
1c20: 4b07 ldr r3, [pc, #28] ; (1c40 <uart0_status_isr+0xe0>) | |
1c22: 791a ldrb r2, [r3, #4] | |
1c24: f012 0f40 tst.w r2, #64 ; 0x40 | |
1c28: 4619 mov r1, r3 | |
1c2a: d008 beq.n 1c3e <uart0_status_isr+0xde> | |
transmitting = 0; | |
1c2c: 4b0c ldr r3, [pc, #48] ; (1c60 <uart0_status_isr+0x100>) | |
1c2e: 2200 movs r2, #0 | |
1c30: 701a strb r2, [r3, #0] | |
if (transmit_pin) transmit_deassert(); | |
1c32: 4b0c ldr r3, [pc, #48] ; (1c64 <uart0_status_isr+0x104>) | |
1c34: 681b ldr r3, [r3, #0] | |
1c36: b103 cbz r3, 1c3a <uart0_status_isr+0xda> | |
1c38: 701a strb r2, [r3, #0] | |
UART0_C2 = C2_TX_INACTIVE; | |
1c3a: 233c movs r3, #60 ; 0x3c | |
1c3c: 70cb strb r3, [r1, #3] | |
1c3e: bd30 pop {r4, r5, pc} | |
1c40: 4006a000 .word 0x4006a000 | |
1c44: 1fffe7f7 .word 0x1fffe7f7 | |
1c48: 1fffe775 .word 0x1fffe775 | |
1c4c: 1fffe7b7 .word 0x1fffe7b7 | |
1c50: 1fffe770 .word 0x1fffe770 | |
1c54: 1fffe800 .word 0x1fffe800 | |
1c58: 1fffe7f8 .word 0x1fffe7f8 | |
1c5c: 1fffe776 .word 0x1fffe776 | |
1c60: 1fffe774 .word 0x1fffe774 | |
1c64: 1fffe7fc .word 0x1fffe7fc | |
00001c68 <serial2_begin>: | |
#define C2_TX_COMPLETING C2_ENABLE | UART_C2_TCIE | |
#define C2_TX_INACTIVE C2_ENABLE | |
void serial2_begin(uint32_t divisor) | |
{ | |
SIM_SCGC4 |= SIM_SCGC4_UART1; // turn on clock, TODO: use bitband | |
1c68: 4b21 ldr r3, [pc, #132] ; (1cf0 <serial2_begin+0x88>) | |
1c6a: 681a ldr r2, [r3, #0] | |
1c6c: f442 6200 orr.w r2, r2, #2048 ; 0x800 | |
1c70: 601a str r2, [r3, #0] | |
rx_buffer_head = 0; | |
1c72: 4a20 ldr r2, [pc, #128] ; (1cf4 <serial2_begin+0x8c>) | |
1c74: 2300 movs r3, #0 | |
1c76: 7013 strb r3, [r2, #0] | |
rx_buffer_tail = 0; | |
1c78: 4a1f ldr r2, [pc, #124] ; (1cf8 <serial2_begin+0x90>) | |
1c7a: 7013 strb r3, [r2, #0] | |
tx_buffer_head = 0; | |
1c7c: 4a1f ldr r2, [pc, #124] ; (1cfc <serial2_begin+0x94>) | |
1c7e: 7013 strb r3, [r2, #0] | |
tx_buffer_tail = 0; | |
1c80: 4a1f ldr r2, [pc, #124] ; (1d00 <serial2_begin+0x98>) | |
1c82: 7013 strb r3, [r2, #0] | |
transmitting = 0; | |
1c84: 4a1f ldr r2, [pc, #124] ; (1d04 <serial2_begin+0x9c>) | |
1c86: 7013 strb r3, [r2, #0] | |
#if defined(KINETISK) | |
switch (rx_pin_num) { | |
1c88: 4b1f ldr r3, [pc, #124] ; (1d08 <serial2_begin+0xa0>) | |
1c8a: 781b ldrb r3, [r3, #0] | |
1c8c: 2b09 cmp r3, #9 | |
1c8e: d005 beq.n 1c9c <serial2_begin+0x34> | |
1c90: 2b1a cmp r3, #26 | |
1c92: d107 bne.n 1ca4 <serial2_begin+0x3c> | |
case 9: CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
case 26: CORE_PIN26_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1c94: f240 3213 movw r2, #787 ; 0x313 | |
1c98: 4b1c ldr r3, [pc, #112] ; (1d0c <serial2_begin+0xa4>) | |
1c9a: e002 b.n 1ca2 <serial2_begin+0x3a> | |
tx_buffer_head = 0; | |
tx_buffer_tail = 0; | |
transmitting = 0; | |
#if defined(KINETISK) | |
switch (rx_pin_num) { | |
case 9: CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1c9c: 4b1c ldr r3, [pc, #112] ; (1d10 <serial2_begin+0xa8>) | |
1c9e: f240 3213 movw r2, #787 ; 0x313 | |
case 26: CORE_PIN26_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1ca2: 601a str r2, [r3, #0] | |
} | |
switch (tx_pin_num) { | |
1ca4: 4b1b ldr r3, [pc, #108] ; (1d14 <serial2_begin+0xac>) | |
1ca6: 781b ldrb r3, [r3, #0] | |
1ca8: 2b0a cmp r3, #10 | |
1caa: d005 beq.n 1cb8 <serial2_begin+0x50> | |
1cac: 2b1f cmp r3, #31 | |
1cae: d107 bne.n 1cc0 <serial2_begin+0x58> | |
case 10: CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
case 31: CORE_PIN31_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
1cb0: f44f 7251 mov.w r2, #836 ; 0x344 | |
1cb4: 4b18 ldr r3, [pc, #96] ; (1d18 <serial2_begin+0xb0>) | |
1cb6: e002 b.n 1cbe <serial2_begin+0x56> | |
switch (rx_pin_num) { | |
case 9: CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
case 26: CORE_PIN26_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
} | |
switch (tx_pin_num) { | |
case 10: CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
1cb8: 4b18 ldr r3, [pc, #96] ; (1d1c <serial2_begin+0xb4>) | |
1cba: f44f 7251 mov.w r2, #836 ; 0x344 | |
case 31: CORE_PIN31_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
1cbe: 601a str r2, [r3, #0] | |
#elif defined(KINETISL) | |
CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); | |
CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | |
#endif | |
#if defined(HAS_KINETISK_UART1) | |
UART1_BDH = (divisor >> 13) & 0x1F; | |
1cc0: 4b17 ldr r3, [pc, #92] ; (1d20 <serial2_begin+0xb8>) | |
1cc2: f3c0 3244 ubfx r2, r0, #13, #5 | |
1cc6: 701a strb r2, [r3, #0] | |
UART1_BDL = (divisor >> 5) & 0xFF; | |
1cc8: f3c0 1247 ubfx r2, r0, #5, #8 | |
1ccc: 705a strb r2, [r3, #1] | |
UART1_C4 = divisor & 0x1F; | |
1cce: f000 001f and.w r0, r0, #31 | |
UART1_C1 = UART_C1_ILT; | |
UART1_TWFIFO = 2; // tx watermark, causes S1_TDRE to set | |
UART1_RWFIFO = 4; // rx watermark, causes S1_RDRF to set | |
UART1_PFIFO = UART_PFIFO_TXFE | UART_PFIFO_RXFE; | |
#else | |
UART1_C1 = 0; | |
1cd2: 2200 movs r2, #0 | |
CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | |
#endif | |
#if defined(HAS_KINETISK_UART1) | |
UART1_BDH = (divisor >> 13) & 0x1F; | |
UART1_BDL = (divisor >> 5) & 0xFF; | |
UART1_C4 = divisor & 0x1F; | |
1cd4: 7298 strb r0, [r3, #10] | |
UART1_C1 = UART_C1_ILT; | |
UART1_TWFIFO = 2; // tx watermark, causes S1_TDRE to set | |
UART1_RWFIFO = 4; // rx watermark, causes S1_RDRF to set | |
UART1_PFIFO = UART_PFIFO_TXFE | UART_PFIFO_RXFE; | |
#else | |
UART1_C1 = 0; | |
1cd6: 709a strb r2, [r3, #2] | |
UART1_PFIFO = 0; | |
1cd8: 741a strb r2, [r3, #16] | |
#elif defined(HAS_KINETISL_UART1) | |
UART1_BDH = (divisor >> 8) & 0x1F; | |
UART1_BDL = divisor & 0xFF; | |
UART1_C1 = 0; | |
#endif | |
UART1_C2 = C2_TX_INACTIVE; | |
1cda: 222c movs r2, #44 ; 0x2c | |
1cdc: 70da strb r2, [r3, #3] | |
NVIC_SET_PRIORITY(IRQ_UART1_STATUS, IRQ_PRIORITY); | |
1cde: 4b11 ldr r3, [pc, #68] ; (1d24 <serial2_begin+0xbc>) | |
1ce0: 2240 movs r2, #64 ; 0x40 | |
1ce2: 701a strb r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_UART1_STATUS); | |
1ce4: f2a3 3312 subw r3, r3, #786 ; 0x312 | |
1ce8: f44f 2280 mov.w r2, #262144 ; 0x40000 | |
1cec: 601a str r2, [r3, #0] | |
1cee: 4770 bx lr | |
1cf0: 40048034 .word 0x40048034 | |
1cf4: 1fffe872 .word 0x1fffe872 | |
1cf8: 1fffe809 .word 0x1fffe809 | |
1cfc: 1fffe878 .word 0x1fffe878 | |
1d00: 1fffe873 .word 0x1fffe873 | |
1d04: 1fffe808 .word 0x1fffe808 | |
1d08: 1fffe567 .word 0x1fffe567 | |
1d0c: 4004d004 .word 0x4004d004 | |
1d10: 4004b00c .word 0x4004b00c | |
1d14: 1fffe568 .word 0x1fffe568 | |
1d18: 4004d000 .word 0x4004d000 | |
1d1c: 4004b010 .word 0x4004b010 | |
1d20: 4006b000 .word 0x4006b000 | |
1d24: e000e412 .word 0xe000e412 | |
00001d28 <serial2_format>: | |
void serial2_format(uint32_t format) | |
{ | |
uint8_t c; | |
c = UART1_C1; | |
1d28: 4a13 ldr r2, [pc, #76] ; (1d78 <serial2_format+0x50>) | |
1d2a: 7893 ldrb r3, [r2, #2] | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
1d2c: f000 0103 and.w r1, r0, #3 | |
1d30: f003 03ec and.w r3, r3, #236 ; 0xec | |
1d34: 430b orrs r3, r1 | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
1d36: 0741 lsls r1, r0, #29 | |
1d38: bf48 it mi | |
1d3a: f043 0310 orrmi.w r3, r3, #16 | |
UART1_C1 = c; | |
1d3e: 7093 strb r3, [r2, #2] | |
if ((format & 0x0F) == 0x04) UART1_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
1d40: f000 030f and.w r3, r0, #15 | |
1d44: 2b04 cmp r3, #4 | |
uint8_t c; | |
c = UART1_C1; | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART1_C1 = c; | |
1d46: 490c ldr r1, [pc, #48] ; (1d78 <serial2_format+0x50>) | |
if ((format & 0x0F) == 0x04) UART1_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
1d48: d103 bne.n 1d52 <serial2_format+0x2a> | |
1d4a: 798b ldrb r3, [r1, #6] | |
1d4c: f043 0340 orr.w r3, r3, #64 ; 0x40 | |
1d50: 718b strb r3, [r1, #6] | |
c = UART1_S2 & ~0x10; | |
1d52: 7953 ldrb r3, [r2, #5] | |
if (format & 0x10) c |= 0x10; // rx invert | |
1d54: 06c2 lsls r2, r0, #27 | |
c = UART1_C1; | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART1_C1 = c; | |
if ((format & 0x0F) == 0x04) UART1_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART1_S2 & ~0x10; | |
1d56: f003 03ef and.w r3, r3, #239 ; 0xef | |
if (format & 0x10) c |= 0x10; // rx invert | |
UART1_S2 = c; | |
1d5a: 4a07 ldr r2, [pc, #28] ; (1d78 <serial2_format+0x50>) | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART1_C1 = c; | |
if ((format & 0x0F) == 0x04) UART1_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART1_S2 & ~0x10; | |
if (format & 0x10) c |= 0x10; // rx invert | |
1d5c: bf48 it mi | |
1d5e: f043 0310 orrmi.w r3, r3, #16 | |
UART1_S2 = c; | |
1d62: 7153 strb r3, [r2, #5] | |
c = UART1_C3 & ~0x10; | |
1d64: 7993 ldrb r3, [r2, #6] | |
if (format & 0x20) c |= 0x10; // tx invert | |
1d66: 0681 lsls r1, r0, #26 | |
UART1_C1 = c; | |
if ((format & 0x0F) == 0x04) UART1_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART1_S2 & ~0x10; | |
if (format & 0x10) c |= 0x10; // rx invert | |
UART1_S2 = c; | |
c = UART1_C3 & ~0x10; | |
1d68: f003 03ef and.w r3, r3, #239 ; 0xef | |
if (format & 0x20) c |= 0x10; // tx invert | |
1d6c: bf48 it mi | |
1d6e: f043 0310 orrmi.w r3, r3, #16 | |
UART1_C3 = c; | |
1d72: 7193 strb r3, [r2, #6] | |
1d74: 4770 bx lr | |
1d76: bf00 nop | |
1d78: 4006b000 .word 0x4006b000 | |
00001d7c <serial2_end>: | |
// UART1_C3.4 = txinv, 0=normal, 1=inverted | |
// UART1_S2.4 = rxinv, 0=normal, 1=inverted | |
} | |
void serial2_end(void) | |
{ | |
1d7c: b508 push {r3, lr} | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return; | |
1d7e: 4b11 ldr r3, [pc, #68] ; (1dc4 <serial2_end+0x48>) | |
1d80: 681b ldr r3, [r3, #0] | |
1d82: 051b lsls r3, r3, #20 | |
1d84: d400 bmi.n 1d88 <serial2_end+0xc> | |
1d86: bd08 pop {r3, pc} | |
while (transmitting) yield(); // wait for buffered data to send | |
1d88: 4b0f ldr r3, [pc, #60] ; (1dc8 <serial2_end+0x4c>) | |
1d8a: 781a ldrb r2, [r3, #0] | |
1d8c: f002 03ff and.w r3, r2, #255 ; 0xff | |
1d90: b112 cbz r2, 1d98 <serial2_end+0x1c> | |
1d92: f7ff fb55 bl 1440 <yield> | |
1d96: e7f7 b.n 1d88 <serial2_end+0xc> | |
NVIC_DISABLE_IRQ(IRQ_UART1_STATUS); | |
1d98: 4a0c ldr r2, [pc, #48] ; (1dcc <serial2_end+0x50>) | |
1d9a: f44f 2180 mov.w r1, #262144 ; 0x40000 | |
1d9e: 6011 str r1, [r2, #0] | |
UART1_C2 = 0; | |
1da0: 4a0b ldr r2, [pc, #44] ; (1dd0 <serial2_end+0x54>) | |
CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
1da2: 490c ldr r1, [pc, #48] ; (1dd4 <serial2_end+0x58>) | |
void serial2_end(void) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return; | |
while (transmitting) yield(); // wait for buffered data to send | |
NVIC_DISABLE_IRQ(IRQ_UART1_STATUS); | |
UART1_C2 = 0; | |
1da4: 70d3 strb r3, [r2, #3] | |
CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
1da6: f240 1203 movw r2, #259 ; 0x103 | |
1daa: 600a str r2, [r1, #0] | |
CORE_PIN10_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
1dac: 604a str r2, [r1, #4] | |
rx_buffer_head = 0; | |
1dae: 4a0a ldr r2, [pc, #40] ; (1dd8 <serial2_end+0x5c>) | |
1db0: 7013 strb r3, [r2, #0] | |
rx_buffer_tail = 0; | |
1db2: 4a0a ldr r2, [pc, #40] ; (1ddc <serial2_end+0x60>) | |
1db4: 7013 strb r3, [r2, #0] | |
if (rts_pin) rts_deassert(); | |
1db6: 4b0a ldr r3, [pc, #40] ; (1de0 <serial2_end+0x64>) | |
1db8: 681b ldr r3, [r3, #0] | |
1dba: b10b cbz r3, 1dc0 <serial2_end+0x44> | |
1dbc: 2201 movs r2, #1 | |
1dbe: 701a strb r2, [r3, #0] | |
1dc0: bd08 pop {r3, pc} | |
1dc2: bf00 nop | |
1dc4: 40048034 .word 0x40048034 | |
1dc8: 1fffe808 .word 0x1fffe808 | |
1dcc: e000e180 .word 0xe000e180 | |
1dd0: 4006b000 .word 0x4006b000 | |
1dd4: 4004b00c .word 0x4004b00c | |
1dd8: 1fffe872 .word 0x1fffe872 | |
1ddc: 1fffe809 .word 0x1fffe809 | |
1de0: 1fffe804 .word 0x1fffe804 | |
00001de4 <serial2_set_transmit_pin>: | |
} | |
void serial2_set_transmit_pin(uint8_t pin) | |
{ | |
1de4: b538 push {r3, r4, r5, lr} | |
1de6: 4604 mov r4, r0 | |
while (transmitting) ; | |
1de8: 4b09 ldr r3, [pc, #36] ; (1e10 <serial2_set_transmit_pin+0x2c>) | |
1dea: 781b ldrb r3, [r3, #0] | |
1dec: f003 05ff and.w r5, r3, #255 ; 0xff | |
1df0: 2b00 cmp r3, #0 | |
1df2: d1f9 bne.n 1de8 <serial2_set_transmit_pin+0x4> | |
pinMode(pin, OUTPUT); | |
1df4: 4620 mov r0, r4 | |
1df6: 2101 movs r1, #1 | |
1df8: f7fe fc86 bl 708 <pinMode> | |
digitalWrite(pin, LOW); | |
1dfc: 4620 mov r0, r4 | |
1dfe: 4629 mov r1, r5 | |
1e00: f7fe fc62 bl 6c8 <digitalWrite> | |
transmit_pin = portOutputRegister(pin); | |
1e04: 4b03 ldr r3, [pc, #12] ; (1e14 <serial2_set_transmit_pin+0x30>) | |
1e06: f853 2034 ldr.w r2, [r3, r4, lsl #3] | |
1e0a: 4b03 ldr r3, [pc, #12] ; (1e18 <serial2_set_transmit_pin+0x34>) | |
1e0c: 601a str r2, [r3, #0] | |
1e0e: bd38 pop {r3, r4, r5, pc} | |
1e10: 1fffe808 .word 0x1fffe808 | |
1e14: 00002a94 .word 0x00002a94 | |
1e18: 1fffe874 .word 0x1fffe874 | |
00001e1c <serial2_set_tx>: | |
transmit_mask = digitalPinToBitMask(pin); | |
#endif | |
} | |
void serial2_set_tx(uint8_t pin, uint8_t opendrain) | |
{ | |
1e1c: b510 push {r4, lr} | |
#if defined(KINETISK) | |
uint32_t cfg; | |
if (opendrain) pin |= 128; | |
1e1e: b109 cbz r1, 1e24 <serial2_set_tx+0x8> | |
1e20: f040 0080 orr.w r0, r0, #128 ; 0x80 | |
if (pin == tx_pin_num) return; | |
1e24: 4a14 ldr r2, [pc, #80] ; (1e78 <serial2_set_tx+0x5c>) | |
1e26: 7813 ldrb r3, [r2, #0] | |
1e28: 4298 cmp r0, r3 | |
1e2a: 4614 mov r4, r2 | |
1e2c: d022 beq.n 1e74 <serial2_set_tx+0x58> | |
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |
1e2e: 4a13 ldr r2, [pc, #76] ; (1e7c <serial2_set_tx+0x60>) | |
1e30: 6812 ldr r2, [r2, #0] | |
1e32: 04d2 lsls r2, r2, #19 | |
1e34: d51d bpl.n 1e72 <serial2_set_tx+0x56> | |
switch (tx_pin_num & 127) { | |
1e36: f003 037f and.w r3, r3, #127 ; 0x7f | |
1e3a: 2b0a cmp r3, #10 | |
1e3c: d004 beq.n 1e48 <serial2_set_tx+0x2c> | |
1e3e: 2b1f cmp r3, #31 | |
1e40: d105 bne.n 1e4e <serial2_set_tx+0x32> | |
case 10: CORE_PIN10_CONFIG = 0; break; // PTC4 | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 31: CORE_PIN31_CONFIG = 0; break; // PTE0 | |
1e42: 2200 movs r2, #0 | |
1e44: 4b0e ldr r3, [pc, #56] ; (1e80 <serial2_set_tx+0x64>) | |
1e46: e001 b.n 1e4c <serial2_set_tx+0x30> | |
if (opendrain) pin |= 128; | |
if (pin == tx_pin_num) return; | |
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |
switch (tx_pin_num & 127) { | |
case 10: CORE_PIN10_CONFIG = 0; break; // PTC4 | |
1e48: 4b0e ldr r3, [pc, #56] ; (1e84 <serial2_set_tx+0x68>) | |
1e4a: 2200 movs r2, #0 | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 31: CORE_PIN31_CONFIG = 0; break; // PTE0 | |
1e4c: 601a str r2, [r3, #0] | |
#endif | |
} | |
if (opendrain) { | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
1e4e: 2900 cmp r1, #0 | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
1e50: f000 027f and.w r2, r0, #127 ; 0x7f | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 31: CORE_PIN31_CONFIG = 0; break; // PTE0 | |
#endif | |
} | |
if (opendrain) { | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
1e54: bf0c ite eq | |
1e56: 2344 moveq r3, #68 ; 0x44 | |
1e58: 2360 movne r3, #96 ; 0x60 | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
1e5a: 2a0a cmp r2, #10 | |
1e5c: d005 beq.n 1e6a <serial2_set_tx+0x4e> | |
1e5e: 2a1f cmp r2, #31 | |
1e60: d107 bne.n 1e72 <serial2_set_tx+0x56> | |
case 10: CORE_PIN10_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 31: CORE_PIN31_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
1e62: f443 7340 orr.w r3, r3, #768 ; 0x300 | |
1e66: 4a06 ldr r2, [pc, #24] ; (1e80 <serial2_set_tx+0x64>) | |
1e68: e002 b.n 1e70 <serial2_set_tx+0x54> | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
case 10: CORE_PIN10_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
1e6a: 4a06 ldr r2, [pc, #24] ; (1e84 <serial2_set_tx+0x68>) | |
1e6c: f443 7340 orr.w r3, r3, #768 ; 0x300 | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 31: CORE_PIN31_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
1e70: 6013 str r3, [r2, #0] | |
#endif | |
} | |
} | |
tx_pin_num = pin; | |
1e72: 7020 strb r0, [r4, #0] | |
1e74: bd10 pop {r4, pc} | |
1e76: bf00 nop | |
1e78: 1fffe568 .word 0x1fffe568 | |
1e7c: 40048034 .word 0x40048034 | |
1e80: 4004d000 .word 0x4004d000 | |
1e84: 4004b010 .word 0x4004b010 | |
00001e88 <serial2_set_rx>: | |
} | |
void serial2_set_rx(uint8_t pin) | |
{ | |
#if defined(KINETISK) | |
if (pin == rx_pin_num) return; | |
1e88: 4a0f ldr r2, [pc, #60] ; (1ec8 <serial2_set_rx+0x40>) | |
1e8a: 7813 ldrb r3, [r2, #0] | |
1e8c: 4298 cmp r0, r3 | |
1e8e: d01a beq.n 1ec6 <serial2_set_rx+0x3e> | |
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |
1e90: 490e ldr r1, [pc, #56] ; (1ecc <serial2_set_rx+0x44>) | |
1e92: 6809 ldr r1, [r1, #0] | |
1e94: 04c9 lsls r1, r1, #19 | |
1e96: d515 bpl.n 1ec4 <serial2_set_rx+0x3c> | |
switch (rx_pin_num) { | |
1e98: 2b09 cmp r3, #9 | |
1e9a: d004 beq.n 1ea6 <serial2_set_rx+0x1e> | |
1e9c: 2b1a cmp r3, #26 | |
1e9e: d105 bne.n 1eac <serial2_set_rx+0x24> | |
case 9: CORE_PIN9_CONFIG = 0; break; // PTC3 | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 26: CORE_PIN26_CONFIG = 0; break; // PTE1 | |
1ea0: 2100 movs r1, #0 | |
1ea2: 4b0b ldr r3, [pc, #44] ; (1ed0 <serial2_set_rx+0x48>) | |
1ea4: e001 b.n 1eaa <serial2_set_rx+0x22> | |
{ | |
#if defined(KINETISK) | |
if (pin == rx_pin_num) return; | |
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |
switch (rx_pin_num) { | |
case 9: CORE_PIN9_CONFIG = 0; break; // PTC3 | |
1ea6: 4b0b ldr r3, [pc, #44] ; (1ed4 <serial2_set_rx+0x4c>) | |
1ea8: 2100 movs r1, #0 | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 26: CORE_PIN26_CONFIG = 0; break; // PTE1 | |
1eaa: 6019 str r1, [r3, #0] | |
#endif | |
} | |
switch (pin) { | |
1eac: 2809 cmp r0, #9 | |
1eae: d005 beq.n 1ebc <serial2_set_rx+0x34> | |
1eb0: 281a cmp r0, #26 | |
1eb2: d107 bne.n 1ec4 <serial2_set_rx+0x3c> | |
case 9: CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 26: CORE_PIN26_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1eb4: f240 3113 movw r1, #787 ; 0x313 | |
1eb8: 4b05 ldr r3, [pc, #20] ; (1ed0 <serial2_set_rx+0x48>) | |
1eba: e002 b.n 1ec2 <serial2_set_rx+0x3a> | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 26: CORE_PIN26_CONFIG = 0; break; // PTE1 | |
#endif | |
} | |
switch (pin) { | |
case 9: CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1ebc: 4b05 ldr r3, [pc, #20] ; (1ed4 <serial2_set_rx+0x4c>) | |
1ebe: f240 3113 movw r1, #787 ; 0x313 | |
#if !(defined(__MK64FX512__) || defined(__MK66FX1M0__)) // not on T3.4 or T3.5 | |
case 26: CORE_PIN26_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |
1ec2: 6019 str r1, [r3, #0] | |
#endif | |
} | |
} | |
rx_pin_num = pin; | |
1ec4: 7010 strb r0, [r2, #0] | |
1ec6: 4770 bx lr | |
1ec8: 1fffe567 .word 0x1fffe567 | |
1ecc: 40048034 .word 0x40048034 | |
1ed0: 4004d004 .word 0x4004d004 | |
1ed4: 4004b00c .word 0x4004b00c | |
00001ed8 <serial2_set_rts>: | |
#endif | |
} | |
int serial2_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; | |
1ed8: 4a0d ldr r2, [pc, #52] ; (1f10 <serial2_set_rts+0x38>) | |
rx_pin_num = pin; | |
#endif | |
} | |
int serial2_set_rts(uint8_t pin) | |
{ | |
1eda: b538 push {r3, r4, r5, lr} | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; | |
1edc: 6814 ldr r4, [r2, #0] | |
1ede: f414 6200 ands.w r2, r4, #2048 ; 0x800 | |
1ee2: f04f 0400 mov.w r4, #0 | |
1ee6: d010 beq.n 1f0a <serial2_set_rts+0x32> | |
if (pin < CORE_NUM_DIGITAL) { | |
1ee8: 2821 cmp r0, #33 ; 0x21 | |
1eea: 4d0a ldr r5, [pc, #40] ; (1f14 <serial2_set_rts+0x3c>) | |
1eec: d80a bhi.n 1f04 <serial2_set_rts+0x2c> | |
rts_pin = portOutputRegister(pin); | |
1eee: 4a0a ldr r2, [pc, #40] ; (1f18 <serial2_set_rts+0x40>) | |
#if defined(KINETISL) | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
1ef0: 2101 movs r1, #1 | |
int serial2_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; | |
if (pin < CORE_NUM_DIGITAL) { | |
rts_pin = portOutputRegister(pin); | |
1ef2: f852 3030 ldr.w r3, [r2, r0, lsl #3] | |
1ef6: 602b str r3, [r5, #0] | |
#if defined(KINETISL) | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
1ef8: f7fe fc06 bl 708 <pinMode> | |
rts_assert(); | |
1efc: 682b ldr r3, [r5, #0] | |
1efe: 701c strb r4, [r3, #0] | |
UART1_MODEM &= ~UART_MODEM_RXRTSE; | |
return 0; | |
} | |
UART1_MODEM |= UART_MODEM_RXRTSE; | |
*/ | |
return 1; | |
1f00: 2001 movs r0, #1 | |
1f02: bd38 pop {r3, r4, r5, pc} | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
rts_assert(); | |
} else { | |
rts_pin = NULL; | |
1f04: 602c str r4, [r5, #0] | |
return 0; | |
1f06: 4620 mov r0, r4 | |
1f08: bd38 pop {r3, r4, r5, pc} | |
#endif | |
} | |
int serial2_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; | |
1f0a: 4610 mov r0, r2 | |
return 0; | |
} | |
UART1_MODEM |= UART_MODEM_RXRTSE; | |
*/ | |
return 1; | |
} | |
1f0c: bd38 pop {r3, r4, r5, pc} | |
1f0e: bf00 nop | |
1f10: 40048034 .word 0x40048034 | |
1f14: 1fffe804 .word 0x1fffe804 | |
1f18: 00002a94 .word 0x00002a94 | |
00001f1c <serial2_set_cts>: | |
int serial2_set_cts(uint8_t pin) | |
{ | |
#if defined(KINETISK) | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; | |
1f1c: 4b0b ldr r3, [pc, #44] ; (1f4c <serial2_set_cts+0x30>) | |
1f1e: 681b ldr r3, [r3, #0] | |
1f20: f413 6300 ands.w r3, r3, #2048 ; 0x800 | |
1f24: d010 beq.n 1f48 <serial2_set_cts+0x2c> | |
if (pin == 23) { | |
1f26: 2817 cmp r0, #23 | |
1f28: 4b09 ldr r3, [pc, #36] ; (1f50 <serial2_set_cts+0x34>) | |
1f2a: d109 bne.n 1f40 <serial2_set_cts+0x24> | |
CORE_PIN23_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
1f2c: 4a09 ldr r2, [pc, #36] ; (1f54 <serial2_set_cts+0x38>) | |
1f2e: f240 3102 movw r1, #770 ; 0x302 | |
1f32: 6011 str r1, [r2, #0] | |
} else { | |
UART1_MODEM &= ~UART_MODEM_TXCTSE; | |
return 0; | |
} | |
UART1_MODEM |= UART_MODEM_TXCTSE; | |
1f34: 7b5a ldrb r2, [r3, #13] | |
1f36: f042 0201 orr.w r2, r2, #1 | |
1f3a: 735a strb r2, [r3, #13] | |
return 1; | |
1f3c: 2001 movs r0, #1 | |
1f3e: 4770 bx lr | |
#if defined(KINETISK) | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; | |
if (pin == 23) { | |
CORE_PIN23_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
} else { | |
UART1_MODEM &= ~UART_MODEM_TXCTSE; | |
1f40: 7b5a ldrb r2, [r3, #13] | |
1f42: f002 02fe and.w r2, r2, #254 ; 0xfe | |
1f46: 735a strb r2, [r3, #13] | |
return 0; | |
1f48: 2000 movs r0, #0 | |
1f4a: 4770 bx lr | |
1f4c: 40048034 .word 0x40048034 | |
1f50: 4006b000 .word 0x4006b000 | |
1f54: 4004b008 .word 0x4004b008 | |
00001f58 <serial2_putchar>: | |
return 0; | |
#endif | |
} | |
void serial2_putchar(uint32_t c) | |
{ | |
1f58: b5f8 push {r3, r4, r5, r6, r7, lr} | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return; | |
1f5a: 4b1d ldr r3, [pc, #116] ; (1fd0 <serial2_putchar+0x78>) | |
1f5c: 681b ldr r3, [r3, #0] | |
1f5e: 051a lsls r2, r3, #20 | |
return 0; | |
#endif | |
} | |
void serial2_putchar(uint32_t c) | |
{ | |
1f60: 4606 mov r6, r0 | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return; | |
1f62: d533 bpl.n 1fcc <serial2_putchar+0x74> | |
if (transmit_pin) transmit_assert(); | |
1f64: 4b1b ldr r3, [pc, #108] ; (1fd4 <serial2_putchar+0x7c>) | |
1f66: 681b ldr r3, [r3, #0] | |
1f68: b10b cbz r3, 1f6e <serial2_putchar+0x16> | |
1f6a: 2201 movs r2, #1 | |
1f6c: 701a strb r2, [r3, #0] | |
head = tx_buffer_head; | |
1f6e: 4b1a ldr r3, [pc, #104] ; (1fd8 <serial2_putchar+0x80>) | |
1f70: 781c ldrb r4, [r3, #0] | |
if (++head >= TX_BUFFER_SIZE) head = 0; | |
1f72: 3401 adds r4, #1 | |
1f74: 2c28 cmp r4, #40 ; 0x28 | |
1f76: 461f mov r7, r3 | |
1f78: bf28 it cs | |
1f7a: 2400 movcs r4, #0 | |
while (tx_buffer_tail == head) { | |
1f7c: 4d17 ldr r5, [pc, #92] ; (1fdc <serial2_putchar+0x84>) | |
1f7e: 782b ldrb r3, [r5, #0] | |
1f80: 42a3 cmp r3, r4 | |
1f82: d118 bne.n 1fb6 <serial2_putchar+0x5e> | |
int priority = nvic_execution_priority(); | |
1f84: f7ff faf4 bl 1570 <nvic_execution_priority> | |
if (priority <= IRQ_PRIORITY) { | |
1f88: 2840 cmp r0, #64 ; 0x40 | |
1f8a: dc0f bgt.n 1fac <serial2_putchar+0x54> | |
if ((UART1_S1 & UART_S1_TDRE)) { | |
1f8c: 4a14 ldr r2, [pc, #80] ; (1fe0 <serial2_putchar+0x88>) | |
1f8e: 7913 ldrb r3, [r2, #4] | |
1f90: 061b lsls r3, r3, #24 | |
1f92: d5f3 bpl.n 1f7c <serial2_putchar+0x24> | |
uint32_t tail = tx_buffer_tail; | |
1f94: 782b ldrb r3, [r5, #0] | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
1f96: 4913 ldr r1, [pc, #76] ; (1fe4 <serial2_putchar+0x8c>) | |
while (tx_buffer_tail == head) { | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART1_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
1f98: 3301 adds r3, #1 | |
1f9a: 2b28 cmp r3, #40 ; 0x28 | |
1f9c: bf28 it cs | |
1f9e: 2300 movcs r3, #0 | |
n = tx_buffer[tail]; | |
1fa0: 5cc9 ldrb r1, [r1, r3] | |
if (use9Bits) UART1_C3 = (UART1_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART1_D = n; | |
tx_buffer_tail = tail; | |
1fa2: b2db uxtb r3, r3 | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART1_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
1fa4: b2c9 uxtb r1, r1 | |
if (use9Bits) UART1_C3 = (UART1_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART1_D = n; | |
1fa6: 71d1 strb r1, [r2, #7] | |
tx_buffer_tail = tail; | |
1fa8: 702b strb r3, [r5, #0] | |
1faa: e7e7 b.n 1f7c <serial2_putchar+0x24> | |
} | |
} else if (priority >= 256) { | |
1fac: 28ff cmp r0, #255 ; 0xff | |
1fae: dde5 ble.n 1f7c <serial2_putchar+0x24> | |
yield(); // wait | |
1fb0: f7ff fa46 bl 1440 <yield> | |
1fb4: e7e2 b.n 1f7c <serial2_putchar+0x24> | |
} | |
} | |
tx_buffer[head] = c; | |
1fb6: 4b0b ldr r3, [pc, #44] ; (1fe4 <serial2_putchar+0x8c>) | |
1fb8: b2f6 uxtb r6, r6 | |
1fba: 551e strb r6, [r3, r4] | |
transmitting = 1; | |
1fbc: 4b0a ldr r3, [pc, #40] ; (1fe8 <serial2_putchar+0x90>) | |
1fbe: 2201 movs r2, #1 | |
1fc0: 701a strb r2, [r3, #0] | |
tx_buffer_head = head; | |
UART1_C2 = C2_TX_ACTIVE; | |
1fc2: 4b07 ldr r3, [pc, #28] ; (1fe0 <serial2_putchar+0x88>) | |
yield(); // wait | |
} | |
} | |
tx_buffer[head] = c; | |
transmitting = 1; | |
tx_buffer_head = head; | |
1fc4: b2e4 uxtb r4, r4 | |
UART1_C2 = C2_TX_ACTIVE; | |
1fc6: 22ac movs r2, #172 ; 0xac | |
yield(); // wait | |
} | |
} | |
tx_buffer[head] = c; | |
transmitting = 1; | |
tx_buffer_head = head; | |
1fc8: 703c strb r4, [r7, #0] | |
UART1_C2 = C2_TX_ACTIVE; | |
1fca: 70da strb r2, [r3, #3] | |
1fcc: bdf8 pop {r3, r4, r5, r6, r7, pc} | |
1fce: bf00 nop | |
1fd0: 40048034 .word 0x40048034 | |
1fd4: 1fffe874 .word 0x1fffe874 | |
1fd8: 1fffe878 .word 0x1fffe878 | |
1fdc: 1fffe873 .word 0x1fffe873 | |
1fe0: 4006b000 .word 0x4006b000 | |
1fe4: 1fffe80a .word 0x1fffe80a | |
1fe8: 1fffe808 .word 0x1fffe808 | |
00001fec <serial2_write>: | |
} | |
UART1_C2 = C2_TX_ACTIVE; | |
} | |
#else | |
void serial2_write(const void *buf, unsigned int count) | |
{ | |
1fec: b538 push {r3, r4, r5, lr} | |
1fee: 4604 mov r4, r0 | |
1ff0: 1845 adds r5, r0, r1 | |
const uint8_t *p = (const uint8_t *)buf; | |
while (count-- > 0) serial2_putchar(*p++); | |
1ff2: 42ac cmp r4, r5 | |
1ff4: d004 beq.n 2000 <serial2_write+0x14> | |
1ff6: f814 0b01 ldrb.w r0, [r4], #1 | |
1ffa: f7ff ffad bl 1f58 <serial2_putchar> | |
1ffe: e7f8 b.n 1ff2 <serial2_write+0x6> | |
} | |
2000: bd38 pop {r3, r4, r5, pc} | |
2002: ffff b508 vabal.u<illegal width 64> <illegal reg q13.5>, d15, d8 | |
00002004 <serial2_flush>: | |
#endif | |
void serial2_flush(void) | |
{ | |
2004: b508 push {r3, lr} | |
while (transmitting) yield(); // wait | |
2006: 4b03 ldr r3, [pc, #12] ; (2014 <serial2_flush+0x10>) | |
2008: 781b ldrb r3, [r3, #0] | |
200a: b113 cbz r3, 2012 <serial2_flush+0xe> | |
200c: f7ff fa18 bl 1440 <yield> | |
2010: e7f9 b.n 2006 <serial2_flush+0x2> | |
} | |
2012: bd08 pop {r3, pc} | |
2014: 1fffe808 .word 0x1fffe808 | |
00002018 <serial2_write_buffer_free>: | |
int serial2_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
tail = tx_buffer_tail; | |
2018: 4a06 ldr r2, [pc, #24] ; (2034 <serial2_write_buffer_free+0x1c>) | |
int serial2_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
201a: 4b07 ldr r3, [pc, #28] ; (2038 <serial2_write_buffer_free+0x20>) | |
201c: 781b ldrb r3, [r3, #0] | |
tail = tx_buffer_tail; | |
201e: 7810 ldrb r0, [r2, #0] | |
int serial2_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
2020: b2db uxtb r3, r3 | |
tail = tx_buffer_tail; | |
2022: b2c0 uxtb r0, r0 | |
if (head >= tail) return TX_BUFFER_SIZE - 1 - head + tail; | |
2024: 4283 cmp r3, r0 | |
2026: bf2c ite cs | |
2028: 3027 addcs r0, #39 ; 0x27 | |
return tail - head - 1; | |
202a: f100 30ff addcc.w r0, r0, #4294967295 ; 0xffffffff | |
202e: 1ac0 subs r0, r0, r3 | |
} | |
2030: 4770 bx lr | |
2032: bf00 nop | |
2034: 1fffe873 .word 0x1fffe873 | |
2038: 1fffe878 .word 0x1fffe878 | |
0000203c <serial2_available>: | |
int serial2_available(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
203c: 4b05 ldr r3, [pc, #20] ; (2054 <serial2_available+0x18>) | |
203e: 7818 ldrb r0, [r3, #0] | |
tail = rx_buffer_tail; | |
2040: 4b05 ldr r3, [pc, #20] ; (2058 <serial2_available+0x1c>) | |
2042: 781b ldrb r3, [r3, #0] | |
int serial2_available(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
2044: b2c0 uxtb r0, r0 | |
tail = rx_buffer_tail; | |
2046: b2db uxtb r3, r3 | |
if (head >= tail) return head - tail; | |
2048: 4298 cmp r0, r3 | |
return RX_BUFFER_SIZE + head - tail; | |
204a: bf38 it cc | |
204c: 3040 addcc r0, #64 ; 0x40 | |
204e: 1ac0 subs r0, r0, r3 | |
} | |
2050: 4770 bx lr | |
2052: bf00 nop | |
2054: 1fffe872 .word 0x1fffe872 | |
2058: 1fffe809 .word 0x1fffe809 | |
0000205c <serial2_getchar>: | |
int serial2_getchar(void) | |
{ | |
205c: b510 push {r4, lr} | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
205e: 4b10 ldr r3, [pc, #64] ; (20a0 <serial2_getchar+0x44>) | |
tail = rx_buffer_tail; | |
2060: 4910 ldr r1, [pc, #64] ; (20a4 <serial2_getchar+0x48>) | |
int serial2_getchar(void) | |
{ | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
2062: 781a ldrb r2, [r3, #0] | |
tail = rx_buffer_tail; | |
2064: 780b ldrb r3, [r1, #0] | |
int serial2_getchar(void) | |
{ | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
2066: b2d2 uxtb r2, r2 | |
tail = rx_buffer_tail; | |
2068: b2db uxtb r3, r3 | |
if (head == tail) return -1; | |
206a: 429a cmp r2, r3 | |
206c: d014 beq.n 2098 <serial2_getchar+0x3c> | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
206e: 3301 adds r3, #1 | |
2070: 2b40 cmp r3, #64 ; 0x40 | |
2072: bf28 it cs | |
2074: 2300 movcs r3, #0 | |
c = rx_buffer[tail]; | |
2076: 480c ldr r0, [pc, #48] ; (20a8 <serial2_getchar+0x4c>) | |
rx_buffer_tail = tail; | |
2078: b2dc uxtb r4, r3 | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
c = rx_buffer[tail]; | |
207a: 5cc0 ldrb r0, [r0, r3] | |
rx_buffer_tail = tail; | |
207c: 700c strb r4, [r1, #0] | |
if (rts_pin) { | |
207e: 490b ldr r1, [pc, #44] ; (20ac <serial2_getchar+0x50>) | |
2080: 6809 ldr r1, [r1, #0] | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
c = rx_buffer[tail]; | |
2082: b2c0 uxtb r0, r0 | |
rx_buffer_tail = tail; | |
if (rts_pin) { | |
2084: b151 cbz r1, 209c <serial2_getchar+0x40> | |
int avail; | |
if (head >= tail) avail = head - tail; | |
2086: 429a cmp r2, r3 | |
else avail = RX_BUFFER_SIZE + head - tail; | |
2088: bf38 it cc | |
208a: 3240 addcc r2, #64 ; 0x40 | |
208c: 1ad3 subs r3, r2, r3 | |
if (avail <= RTS_LOW_WATERMARK) rts_assert(); | |
208e: 2b1a cmp r3, #26 | |
2090: dc04 bgt.n 209c <serial2_getchar+0x40> | |
2092: 2300 movs r3, #0 | |
2094: 700b strb r3, [r1, #0] | |
2096: bd10 pop {r4, pc} | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
2098: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
if (head >= tail) avail = head - tail; | |
else avail = RX_BUFFER_SIZE + head - tail; | |
if (avail <= RTS_LOW_WATERMARK) rts_assert(); | |
} | |
return c; | |
} | |
209c: bd10 pop {r4, pc} | |
209e: bf00 nop | |
20a0: 1fffe872 .word 0x1fffe872 | |
20a4: 1fffe809 .word 0x1fffe809 | |
20a8: 1fffe832 .word 0x1fffe832 | |
20ac: 1fffe804 .word 0x1fffe804 | |
000020b0 <serial2_peek>: | |
int serial2_peek(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
20b0: 4b08 ldr r3, [pc, #32] ; (20d4 <serial2_peek+0x24>) | |
20b2: 781a ldrb r2, [r3, #0] | |
tail = rx_buffer_tail; | |
20b4: 4b08 ldr r3, [pc, #32] ; (20d8 <serial2_peek+0x28>) | |
20b6: 781b ldrb r3, [r3, #0] | |
20b8: b2db uxtb r3, r3 | |
if (head == tail) return -1; | |
20ba: 429a cmp r2, r3 | |
20bc: d007 beq.n 20ce <serial2_peek+0x1e> | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
20be: 3301 adds r3, #1 | |
20c0: 2b40 cmp r3, #64 ; 0x40 | |
20c2: bf28 it cs | |
20c4: 2300 movcs r3, #0 | |
return rx_buffer[tail]; | |
20c6: 4a05 ldr r2, [pc, #20] ; (20dc <serial2_peek+0x2c>) | |
20c8: 5cd0 ldrb r0, [r2, r3] | |
20ca: b2c0 uxtb r0, r0 | |
20cc: 4770 bx lr | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
20ce: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
return rx_buffer[tail]; | |
} | |
20d2: 4770 bx lr | |
20d4: 1fffe872 .word 0x1fffe872 | |
20d8: 1fffe809 .word 0x1fffe809 | |
20dc: 1fffe832 .word 0x1fffe832 | |
000020e0 <serial2_clear>: | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return; | |
UART1_C2 &= ~(UART_C2_RE | UART_C2_RIE | UART_C2_ILIE); | |
UART1_CFIFO = UART_CFIFO_RXFLUSH; | |
UART1_C2 |= (UART_C2_RE | UART_C2_RIE | UART_C2_ILIE); | |
#endif | |
rx_buffer_head = rx_buffer_tail; | |
20e0: 4b05 ldr r3, [pc, #20] ; (20f8 <serial2_clear+0x18>) | |
20e2: 781a ldrb r2, [r3, #0] | |
20e4: 4b05 ldr r3, [pc, #20] ; (20fc <serial2_clear+0x1c>) | |
20e6: b2d2 uxtb r2, r2 | |
20e8: 701a strb r2, [r3, #0] | |
if (rts_pin) rts_assert(); | |
20ea: 4b05 ldr r3, [pc, #20] ; (2100 <serial2_clear+0x20>) | |
20ec: 681b ldr r3, [r3, #0] | |
20ee: b10b cbz r3, 20f4 <serial2_clear+0x14> | |
20f0: 2200 movs r2, #0 | |
20f2: 701a strb r2, [r3, #0] | |
20f4: 4770 bx lr | |
20f6: bf00 nop | |
20f8: 1fffe809 .word 0x1fffe809 | |
20fc: 1fffe872 .word 0x1fffe872 | |
2100: 1fffe804 .word 0x1fffe804 | |
00002104 <uart1_status_isr>: | |
// Receive data above watermark UART_S1_RDRF | |
// LIN break detect UART_S2_LBKDIF | |
// RxD pin active edge UART_S2_RXEDGIF | |
void uart1_status_isr(void) | |
{ | |
2104: b510 push {r4, lr} | |
} while (UART1_TCFIFO < 8); | |
tx_buffer_tail = tail; | |
if (UART1_S1 & UART_S1_TDRE) UART1_C2 = C2_TX_COMPLETING; | |
} | |
#else | |
if (UART1_S1 & UART_S1_RDRF) { | |
2106: 4b21 ldr r3, [pc, #132] ; (218c <uart1_status_isr+0x88>) | |
2108: 791a ldrb r2, [r3, #4] | |
210a: 0692 lsls r2, r2, #26 | |
210c: d50f bpl.n 212e <uart1_status_isr+0x2a> | |
n = UART1_D; | |
if (use9Bits && (UART1_C3 & 0x80)) n |= 0x100; | |
head = rx_buffer_head + 1; | |
210e: 4a20 ldr r2, [pc, #128] ; (2190 <uart1_status_isr+0x8c>) | |
tx_buffer_tail = tail; | |
if (UART1_S1 & UART_S1_TDRE) UART1_C2 = C2_TX_COMPLETING; | |
} | |
#else | |
if (UART1_S1 & UART_S1_RDRF) { | |
n = UART1_D; | |
2110: 79d8 ldrb r0, [r3, #7] | |
if (use9Bits && (UART1_C3 & 0x80)) n |= 0x100; | |
head = rx_buffer_head + 1; | |
2112: 7813 ldrb r3, [r2, #0] | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
if (head != rx_buffer_tail) { | |
2114: 491f ldr r1, [pc, #124] ; (2194 <uart1_status_isr+0x90>) | |
} | |
#else | |
if (UART1_S1 & UART_S1_RDRF) { | |
n = UART1_D; | |
if (use9Bits && (UART1_C3 & 0x80)) n |= 0x100; | |
head = rx_buffer_head + 1; | |
2116: 3301 adds r3, #1 | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
2118: 2b40 cmp r3, #64 ; 0x40 | |
if (head != rx_buffer_tail) { | |
211a: 7809 ldrb r1, [r1, #0] | |
#else | |
if (UART1_S1 & UART_S1_RDRF) { | |
n = UART1_D; | |
if (use9Bits && (UART1_C3 & 0x80)) n |= 0x100; | |
head = rx_buffer_head + 1; | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
211c: bf28 it cs | |
211e: 2300 movcs r3, #0 | |
if (head != rx_buffer_tail) { | |
2120: 428b cmp r3, r1 | |
tx_buffer_tail = tail; | |
if (UART1_S1 & UART_S1_TDRE) UART1_C2 = C2_TX_COMPLETING; | |
} | |
#else | |
if (UART1_S1 & UART_S1_RDRF) { | |
n = UART1_D; | |
2122: b2c0 uxtb r0, r0 | |
if (use9Bits && (UART1_C3 & 0x80)) n |= 0x100; | |
head = rx_buffer_head + 1; | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
if (head != rx_buffer_tail) { | |
2124: d003 beq.n 212e <uart1_status_isr+0x2a> | |
rx_buffer[head] = n; | |
2126: 491c ldr r1, [pc, #112] ; (2198 <uart1_status_isr+0x94>) | |
2128: 54c8 strb r0, [r1, r3] | |
rx_buffer_head = head; | |
212a: b2db uxtb r3, r3 | |
212c: 7013 strb r3, [r2, #0] | |
} | |
} | |
c = UART1_C2; | |
212e: 4a17 ldr r2, [pc, #92] ; (218c <uart1_status_isr+0x88>) | |
2130: 78d1 ldrb r1, [r2, #3] | |
2132: b2c9 uxtb r1, r1 | |
if ((c & UART_C2_TIE) && (UART1_S1 & UART_S1_TDRE)) { | |
2134: 060c lsls r4, r1, #24 | |
2136: d516 bpl.n 2166 <uart1_status_isr+0x62> | |
2138: 7913 ldrb r3, [r2, #4] | |
213a: 0618 lsls r0, r3, #24 | |
213c: d513 bpl.n 2166 <uart1_status_isr+0x62> | |
head = tx_buffer_head; | |
213e: 4b17 ldr r3, [pc, #92] ; (219c <uart1_status_isr+0x98>) | |
tail = tx_buffer_tail; | |
2140: 4817 ldr r0, [pc, #92] ; (21a0 <uart1_status_isr+0x9c>) | |
rx_buffer_head = head; | |
} | |
} | |
c = UART1_C2; | |
if ((c & UART_C2_TIE) && (UART1_S1 & UART_S1_TDRE)) { | |
head = tx_buffer_head; | |
2142: 781c ldrb r4, [r3, #0] | |
tail = tx_buffer_tail; | |
2144: 7803 ldrb r3, [r0, #0] | |
2146: b2db uxtb r3, r3 | |
if (head == tail) { | |
2148: 429c cmp r4, r3 | |
214a: d102 bne.n 2152 <uart1_status_isr+0x4e> | |
UART1_C2 = C2_TX_COMPLETING; | |
214c: 236c movs r3, #108 ; 0x6c | |
214e: 70d3 strb r3, [r2, #3] | |
2150: e009 b.n 2166 <uart1_status_isr+0x62> | |
} else { | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
2152: 3301 adds r3, #1 | |
2154: 2b28 cmp r3, #40 ; 0x28 | |
2156: bf28 it cs | |
2158: 2300 movcs r3, #0 | |
n = tx_buffer[tail]; | |
215a: 4c12 ldr r4, [pc, #72] ; (21a4 <uart1_status_isr+0xa0>) | |
215c: 5ce4 ldrb r4, [r4, r3] | |
if (use9Bits) UART1_C3 = (UART1_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART1_D = n; | |
tx_buffer_tail = tail; | |
215e: b2db uxtb r3, r3 | |
tail = tx_buffer_tail; | |
if (head == tail) { | |
UART1_C2 = C2_TX_COMPLETING; | |
} else { | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
2160: b2e4 uxtb r4, r4 | |
if (use9Bits) UART1_C3 = (UART1_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART1_D = n; | |
2162: 71d4 strb r4, [r2, #7] | |
tx_buffer_tail = tail; | |
2164: 7003 strb r3, [r0, #0] | |
} | |
} | |
#endif | |
if ((c & UART_C2_TCIE) && (UART1_S1 & UART_S1_TC)) { | |
2166: 064b lsls r3, r1, #25 | |
2168: d50e bpl.n 2188 <uart1_status_isr+0x84> | |
216a: 4b08 ldr r3, [pc, #32] ; (218c <uart1_status_isr+0x88>) | |
216c: 791a ldrb r2, [r3, #4] | |
216e: f012 0f40 tst.w r2, #64 ; 0x40 | |
2172: 4619 mov r1, r3 | |
2174: d008 beq.n 2188 <uart1_status_isr+0x84> | |
transmitting = 0; | |
2176: 4b0c ldr r3, [pc, #48] ; (21a8 <uart1_status_isr+0xa4>) | |
2178: 2200 movs r2, #0 | |
217a: 701a strb r2, [r3, #0] | |
if (transmit_pin) transmit_deassert(); | |
217c: 4b0b ldr r3, [pc, #44] ; (21ac <uart1_status_isr+0xa8>) | |
217e: 681b ldr r3, [r3, #0] | |
2180: b103 cbz r3, 2184 <uart1_status_isr+0x80> | |
2182: 701a strb r2, [r3, #0] | |
UART1_C2 = C2_TX_INACTIVE; | |
2184: 232c movs r3, #44 ; 0x2c | |
2186: 70cb strb r3, [r1, #3] | |
2188: bd10 pop {r4, pc} | |
218a: bf00 nop | |
218c: 4006b000 .word 0x4006b000 | |
2190: 1fffe872 .word 0x1fffe872 | |
2194: 1fffe809 .word 0x1fffe809 | |
2198: 1fffe832 .word 0x1fffe832 | |
219c: 1fffe878 .word 0x1fffe878 | |
21a0: 1fffe873 .word 0x1fffe873 | |
21a4: 1fffe80a .word 0x1fffe80a | |
21a8: 1fffe808 .word 0x1fffe808 | |
21ac: 1fffe874 .word 0x1fffe874 | |
000021b0 <serial3_begin>: | |
#define C2_TX_COMPLETING C2_ENABLE | UART_C2_TCIE | |
#define C2_TX_INACTIVE C2_ENABLE | |
void serial3_begin(uint32_t divisor) | |
{ | |
SIM_SCGC4 |= SIM_SCGC4_UART2; // turn on clock, TODO: use bitband | |
21b0: 4b16 ldr r3, [pc, #88] ; (220c <serial3_begin+0x5c>) | |
21b2: 681a ldr r2, [r3, #0] | |
21b4: f442 5280 orr.w r2, r2, #4096 ; 0x1000 | |
21b8: 601a str r2, [r3, #0] | |
rx_buffer_head = 0; | |
21ba: 4a15 ldr r2, [pc, #84] ; (2210 <serial3_begin+0x60>) | |
21bc: 2300 movs r3, #0 | |
21be: 7013 strb r3, [r2, #0] | |
rx_buffer_tail = 0; | |
21c0: 4a14 ldr r2, [pc, #80] ; (2214 <serial3_begin+0x64>) | |
21c2: 7013 strb r3, [r2, #0] | |
tx_buffer_head = 0; | |
21c4: 4a14 ldr r2, [pc, #80] ; (2218 <serial3_begin+0x68>) | |
21c6: 7013 strb r3, [r2, #0] | |
tx_buffer_tail = 0; | |
21c8: 4a14 ldr r2, [pc, #80] ; (221c <serial3_begin+0x6c>) | |
21ca: 7013 strb r3, [r2, #0] | |
transmitting = 0; | |
21cc: 4a14 ldr r2, [pc, #80] ; (2220 <serial3_begin+0x70>) | |
21ce: 7013 strb r3, [r2, #0] | |
#if defined(KINETISK) | |
CORE_PIN7_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); | |
21d0: 4a14 ldr r2, [pc, #80] ; (2224 <serial3_begin+0x74>) | |
21d2: f240 3113 movw r1, #787 ; 0x313 | |
21d6: 6011 str r1, [r2, #0] | |
CORE_PIN8_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | |
21d8: f44f 7151 mov.w r1, #836 ; 0x344 | |
21dc: 6051 str r1, [r2, #4] | |
case 8: CORE_PIN8_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
case 20: CORE_PIN20_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
} | |
#endif | |
#if defined(HAS_KINETISK_UART2) | |
UART2_BDH = (divisor >> 13) & 0x1F; | |
21de: 4a12 ldr r2, [pc, #72] ; (2228 <serial3_begin+0x78>) | |
21e0: f3c0 3144 ubfx r1, r0, #13, #5 | |
21e4: 7011 strb r1, [r2, #0] | |
UART2_BDL = (divisor >> 5) & 0xFF; | |
21e6: f3c0 1147 ubfx r1, r0, #5, #8 | |
UART2_C4 = divisor & 0x1F; | |
21ea: f000 001f and.w r0, r0, #31 | |
case 20: CORE_PIN20_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |
} | |
#endif | |
#if defined(HAS_KINETISK_UART2) | |
UART2_BDH = (divisor >> 13) & 0x1F; | |
UART2_BDL = (divisor >> 5) & 0xFF; | |
21ee: 7051 strb r1, [r2, #1] | |
UART2_C4 = divisor & 0x1F; | |
21f0: 7290 strb r0, [r2, #10] | |
UART2_C1 = 0; | |
21f2: 7093 strb r3, [r2, #2] | |
UART2_PFIFO = 0; | |
21f4: 7413 strb r3, [r2, #16] | |
#elif defined(HAS_KINETISL_UART2) | |
UART2_BDH = (divisor >> 8) & 0x1F; | |
UART2_BDL = divisor & 0xFF; | |
UART2_C1 = 0; | |
#endif | |
UART2_C2 = C2_TX_INACTIVE; | |
21f6: 232c movs r3, #44 ; 0x2c | |
21f8: 70d3 strb r3, [r2, #3] | |
NVIC_SET_PRIORITY(IRQ_UART2_STATUS, IRQ_PRIORITY); | |
21fa: 4b0c ldr r3, [pc, #48] ; (222c <serial3_begin+0x7c>) | |
21fc: 2240 movs r2, #64 ; 0x40 | |
21fe: 701a strb r2, [r3, #0] | |
NVIC_ENABLE_IRQ(IRQ_UART2_STATUS); | |
2200: f5a3 7345 sub.w r3, r3, #788 ; 0x314 | |
2204: f44f 1280 mov.w r2, #1048576 ; 0x100000 | |
2208: 601a str r2, [r3, #0] | |
220a: 4770 bx lr | |
220c: 40048034 .word 0x40048034 | |
2210: 1fffe8ea .word 0x1fffe8ea | |
2214: 1fffe881 .word 0x1fffe881 | |
2218: 1fffe8f0 .word 0x1fffe8f0 | |
221c: 1fffe8eb .word 0x1fffe8eb | |
2220: 1fffe880 .word 0x1fffe880 | |
2224: 4004c008 .word 0x4004c008 | |
2228: 4006c000 .word 0x4006c000 | |
222c: e000e414 .word 0xe000e414 | |
00002230 <serial3_format>: | |
void serial3_format(uint32_t format) | |
{ | |
uint8_t c; | |
c = UART2_C1; | |
2230: 4a13 ldr r2, [pc, #76] ; (2280 <serial3_format+0x50>) | |
2232: 7893 ldrb r3, [r2, #2] | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
2234: f000 0103 and.w r1, r0, #3 | |
2238: f003 03ec and.w r3, r3, #236 ; 0xec | |
223c: 430b orrs r3, r1 | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
223e: 0741 lsls r1, r0, #29 | |
2240: bf48 it mi | |
2242: f043 0310 orrmi.w r3, r3, #16 | |
UART2_C1 = c; | |
2246: 7093 strb r3, [r2, #2] | |
if ((format & 0x0F) == 0x04) UART2_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
2248: f000 030f and.w r3, r0, #15 | |
224c: 2b04 cmp r3, #4 | |
uint8_t c; | |
c = UART2_C1; | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART2_C1 = c; | |
224e: 490c ldr r1, [pc, #48] ; (2280 <serial3_format+0x50>) | |
if ((format & 0x0F) == 0x04) UART2_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
2250: d103 bne.n 225a <serial3_format+0x2a> | |
2252: 798b ldrb r3, [r1, #6] | |
2254: f043 0340 orr.w r3, r3, #64 ; 0x40 | |
2258: 718b strb r3, [r1, #6] | |
c = UART2_S2 & ~0x10; | |
225a: 7953 ldrb r3, [r2, #5] | |
if (format & 0x10) c |= 0x10; // rx invert | |
225c: 06c2 lsls r2, r0, #27 | |
c = UART2_C1; | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART2_C1 = c; | |
if ((format & 0x0F) == 0x04) UART2_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART2_S2 & ~0x10; | |
225e: f003 03ef and.w r3, r3, #239 ; 0xef | |
if (format & 0x10) c |= 0x10; // rx invert | |
UART2_S2 = c; | |
2262: 4a07 ldr r2, [pc, #28] ; (2280 <serial3_format+0x50>) | |
c = (c & ~0x13) | (format & 0x03); // configure parity | |
if (format & 0x04) c |= 0x10; // 9 bits (might include parity) | |
UART2_C1 = c; | |
if ((format & 0x0F) == 0x04) UART2_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART2_S2 & ~0x10; | |
if (format & 0x10) c |= 0x10; // rx invert | |
2264: bf48 it mi | |
2266: f043 0310 orrmi.w r3, r3, #16 | |
UART2_S2 = c; | |
226a: 7153 strb r3, [r2, #5] | |
c = UART2_C3 & ~0x10; | |
226c: 7993 ldrb r3, [r2, #6] | |
if (format & 0x20) c |= 0x10; // tx invert | |
226e: 0681 lsls r1, r0, #26 | |
UART2_C1 = c; | |
if ((format & 0x0F) == 0x04) UART2_C3 |= 0x40; // 8N2 is 9 bit with 9th bit always 1 | |
c = UART2_S2 & ~0x10; | |
if (format & 0x10) c |= 0x10; // rx invert | |
UART2_S2 = c; | |
c = UART2_C3 & ~0x10; | |
2270: f003 03ef and.w r3, r3, #239 ; 0xef | |
if (format & 0x20) c |= 0x10; // tx invert | |
2274: bf48 it mi | |
2276: f043 0310 orrmi.w r3, r3, #16 | |
UART2_C3 = c; | |
227a: 7193 strb r3, [r2, #6] | |
227c: 4770 bx lr | |
227e: bf00 nop | |
2280: 4006c000 .word 0x4006c000 | |
00002284 <serial3_end>: | |
use9Bits = format & 0x80; | |
#endif | |
} | |
void serial3_end(void) | |
{ | |
2284: b508 push {r3, lr} | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return; | |
2286: 4b11 ldr r3, [pc, #68] ; (22cc <serial3_end+0x48>) | |
2288: 681b ldr r3, [r3, #0] | |
228a: 04db lsls r3, r3, #19 | |
228c: d400 bmi.n 2290 <serial3_end+0xc> | |
228e: bd08 pop {r3, pc} | |
while (transmitting) yield(); // wait for buffered data to send | |
2290: 4b0f ldr r3, [pc, #60] ; (22d0 <serial3_end+0x4c>) | |
2292: 781a ldrb r2, [r3, #0] | |
2294: f002 03ff and.w r3, r2, #255 ; 0xff | |
2298: b112 cbz r2, 22a0 <serial3_end+0x1c> | |
229a: f7ff f8d1 bl 1440 <yield> | |
229e: e7f7 b.n 2290 <serial3_end+0xc> | |
NVIC_DISABLE_IRQ(IRQ_UART2_STATUS); | |
22a0: 4a0c ldr r2, [pc, #48] ; (22d4 <serial3_end+0x50>) | |
22a2: f44f 1180 mov.w r1, #1048576 ; 0x100000 | |
22a6: 6011 str r1, [r2, #0] | |
UART2_C2 = 0; | |
22a8: 4a0b ldr r2, [pc, #44] ; (22d8 <serial3_end+0x54>) | |
CORE_PIN7_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
22aa: 490c ldr r1, [pc, #48] ; (22dc <serial3_end+0x58>) | |
void serial3_end(void) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return; | |
while (transmitting) yield(); // wait for buffered data to send | |
NVIC_DISABLE_IRQ(IRQ_UART2_STATUS); | |
UART2_C2 = 0; | |
22ac: 70d3 strb r3, [r2, #3] | |
CORE_PIN7_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
22ae: f240 1203 movw r2, #259 ; 0x103 | |
22b2: 600a str r2, [r1, #0] | |
CORE_PIN8_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1); | |
22b4: 604a str r2, [r1, #4] | |
rx_buffer_head = 0; | |
22b6: 4a0a ldr r2, [pc, #40] ; (22e0 <serial3_end+0x5c>) | |
22b8: 7013 strb r3, [r2, #0] | |
rx_buffer_tail = 0; | |
22ba: 4a0a ldr r2, [pc, #40] ; (22e4 <serial3_end+0x60>) | |
22bc: 7013 strb r3, [r2, #0] | |
if (rts_pin) rts_deassert(); | |
22be: 4b0a ldr r3, [pc, #40] ; (22e8 <serial3_end+0x64>) | |
22c0: 681b ldr r3, [r3, #0] | |
22c2: b10b cbz r3, 22c8 <serial3_end+0x44> | |
22c4: 2201 movs r2, #1 | |
22c6: 701a strb r2, [r3, #0] | |
22c8: bd08 pop {r3, pc} | |
22ca: bf00 nop | |
22cc: 40048034 .word 0x40048034 | |
22d0: 1fffe880 .word 0x1fffe880 | |
22d4: e000e180 .word 0xe000e180 | |
22d8: 4006c000 .word 0x4006c000 | |
22dc: 4004c008 .word 0x4004c008 | |
22e0: 1fffe8ea .word 0x1fffe8ea | |
22e4: 1fffe881 .word 0x1fffe881 | |
22e8: 1fffe87c .word 0x1fffe87c | |
000022ec <serial3_set_transmit_pin>: | |
} | |
void serial3_set_transmit_pin(uint8_t pin) | |
{ | |
22ec: b538 push {r3, r4, r5, lr} | |
22ee: 4604 mov r4, r0 | |
while (transmitting) ; | |
22f0: 4b09 ldr r3, [pc, #36] ; (2318 <serial3_set_transmit_pin+0x2c>) | |
22f2: 781b ldrb r3, [r3, #0] | |
22f4: f003 05ff and.w r5, r3, #255 ; 0xff | |
22f8: 2b00 cmp r3, #0 | |
22fa: d1f9 bne.n 22f0 <serial3_set_transmit_pin+0x4> | |
pinMode(pin, OUTPUT); | |
22fc: 4620 mov r0, r4 | |
22fe: 2101 movs r1, #1 | |
2300: f7fe fa02 bl 708 <pinMode> | |
digitalWrite(pin, LOW); | |
2304: 4620 mov r0, r4 | |
2306: 4629 mov r1, r5 | |
2308: f7fe f9de bl 6c8 <digitalWrite> | |
transmit_pin = portOutputRegister(pin); | |
230c: 4b03 ldr r3, [pc, #12] ; (231c <serial3_set_transmit_pin+0x30>) | |
230e: f853 2034 ldr.w r2, [r3, r4, lsl #3] | |
2312: 4b03 ldr r3, [pc, #12] ; (2320 <serial3_set_transmit_pin+0x34>) | |
2314: 601a str r2, [r3, #0] | |
2316: bd38 pop {r3, r4, r5, pc} | |
2318: 1fffe880 .word 0x1fffe880 | |
231c: 00002a94 .word 0x00002a94 | |
2320: 1fffe8ec .word 0x1fffe8ec | |
00002324 <serial3_set_tx>: | |
transmit_mask = digitalPinToBitMask(pin); | |
#endif | |
} | |
void serial3_set_tx(uint8_t pin, uint8_t opendrain) | |
{ | |
2324: b510 push {r4, lr} | |
uint32_t cfg; | |
if (opendrain) pin |= 128; | |
2326: b109 cbz r1, 232c <serial3_set_tx+0x8> | |
2328: f040 0080 orr.w r0, r0, #128 ; 0x80 | |
if (pin == tx_pin_num) return; | |
232c: 4a0e ldr r2, [pc, #56] ; (2368 <serial3_set_tx+0x44>) | |
232e: 7813 ldrb r3, [r2, #0] | |
2330: 4298 cmp r0, r3 | |
2332: d017 beq.n 2364 <serial3_set_tx+0x40> | |
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |
2334: 4c0d ldr r4, [pc, #52] ; (236c <serial3_set_tx+0x48>) | |
2336: 6824 ldr r4, [r4, #0] | |
2338: 04e4 lsls r4, r4, #19 | |
233a: d512 bpl.n 2362 <serial3_set_tx+0x3e> | |
switch (tx_pin_num & 127) { | |
233c: f003 037f and.w r3, r3, #127 ; 0x7f | |
2340: 2b08 cmp r3, #8 | |
2342: d102 bne.n 234a <serial3_set_tx+0x26> | |
case 8: CORE_PIN8_CONFIG = 0; break; // PTD3 | |
2344: 4b0a ldr r3, [pc, #40] ; (2370 <serial3_set_tx+0x4c>) | |
2346: 2400 movs r4, #0 | |
2348: 601c str r4, [r3, #0] | |
#if defined(KINETISL) | |
case 20: CORE_PIN20_CONFIG = 0; break; // PTD5 | |
#endif | |
} | |
if (opendrain) { | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
234a: 2900 cmp r1, #0 | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
234c: f000 037f and.w r3, r0, #127 ; 0x7f | |
#if defined(KINETISL) | |
case 20: CORE_PIN20_CONFIG = 0; break; // PTD5 | |
#endif | |
} | |
if (opendrain) { | |
cfg = PORT_PCR_DSE | PORT_PCR_ODE; | |
2350: bf0c ite eq | |
2352: 2144 moveq r1, #68 ; 0x44 | |
2354: 2160 movne r1, #96 ; 0x60 | |
} else { | |
cfg = PORT_PCR_DSE | PORT_PCR_SRE; | |
} | |
switch (pin & 127) { | |
2356: 2b08 cmp r3, #8 | |
2358: d103 bne.n 2362 <serial3_set_tx+0x3e> | |
case 8: CORE_PIN8_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
235a: 4b05 ldr r3, [pc, #20] ; (2370 <serial3_set_tx+0x4c>) | |
235c: f441 7140 orr.w r1, r1, #768 ; 0x300 | |
2360: 6019 str r1, [r3, #0] | |
#if defined(KINETISL) | |
case 20: CORE_PIN20_CONFIG = cfg | PORT_PCR_MUX(3); break; | |
#endif | |
} | |
} | |
tx_pin_num = pin; | |
2362: 7010 strb r0, [r2, #0] | |
2364: bd10 pop {r4, pc} | |
2366: bf00 nop | |
2368: 1fffe569 .word 0x1fffe569 | |
236c: 40048034 .word 0x40048034 | |
2370: 4004c00c .word 0x4004c00c | |
00002374 <serial3_set_rx>: | |
} | |
void serial3_set_rx(uint8_t pin) | |
{ | |
2374: 4770 bx lr | |
2376: ffff 4a0d vtbl.8 d20, {d15-d17}, d13 | |
00002378 <serial3_set_rts>: | |
#endif | |
} | |
int serial3_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; | |
2378: 4a0d ldr r2, [pc, #52] ; (23b0 <serial3_set_rts+0x38>) | |
rx_pin_num = pin; | |
#endif | |
} | |
int serial3_set_rts(uint8_t pin) | |
{ | |
237a: b538 push {r3, r4, r5, lr} | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; | |
237c: 6814 ldr r4, [r2, #0] | |
237e: f414 5280 ands.w r2, r4, #4096 ; 0x1000 | |
2382: f04f 0400 mov.w r4, #0 | |
2386: d010 beq.n 23aa <serial3_set_rts+0x32> | |
if (pin < CORE_NUM_DIGITAL) { | |
2388: 2821 cmp r0, #33 ; 0x21 | |
238a: 4d0a ldr r5, [pc, #40] ; (23b4 <serial3_set_rts+0x3c>) | |
238c: d80a bhi.n 23a4 <serial3_set_rts+0x2c> | |
rts_pin = portOutputRegister(pin); | |
238e: 4a0a ldr r2, [pc, #40] ; (23b8 <serial3_set_rts+0x40>) | |
#if defined(KINETISL) | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
2390: 2101 movs r1, #1 | |
int serial3_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; | |
if (pin < CORE_NUM_DIGITAL) { | |
rts_pin = portOutputRegister(pin); | |
2392: f852 3030 ldr.w r3, [r2, r0, lsl #3] | |
2396: 602b str r3, [r5, #0] | |
#if defined(KINETISL) | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
2398: f7fe f9b6 bl 708 <pinMode> | |
rts_assert(); | |
239c: 682b ldr r3, [r5, #0] | |
239e: 701c strb r4, [r3, #0] | |
UART2_MODEM &= ~UART_MODEM_RXRTSE; | |
return 0; | |
} | |
UART2_MODEM |= UART_MODEM_RXRTSE; | |
*/ | |
return 1; | |
23a0: 2001 movs r0, #1 | |
23a2: bd38 pop {r3, r4, r5, pc} | |
rts_mask = digitalPinToBitMask(pin); | |
#endif | |
pinMode(pin, OUTPUT); | |
rts_assert(); | |
} else { | |
rts_pin = NULL; | |
23a4: 602c str r4, [r5, #0] | |
return 0; | |
23a6: 4620 mov r0, r4 | |
23a8: bd38 pop {r3, r4, r5, pc} | |
#endif | |
} | |
int serial3_set_rts(uint8_t pin) | |
{ | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; | |
23aa: 4610 mov r0, r2 | |
return 0; | |
} | |
UART2_MODEM |= UART_MODEM_RXRTSE; | |
*/ | |
return 1; | |
} | |
23ac: bd38 pop {r3, r4, r5, pc} | |
23ae: bf00 nop | |
23b0: 40048034 .word 0x40048034 | |
23b4: 1fffe87c .word 0x1fffe87c | |
23b8: 00002a94 .word 0x00002a94 | |
000023bc <serial3_set_cts>: | |
int serial3_set_cts(uint8_t pin) | |
{ | |
#if defined(KINETISK) | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; | |
23bc: 4b0b ldr r3, [pc, #44] ; (23ec <serial3_set_cts+0x30>) | |
23be: 681b ldr r3, [r3, #0] | |
23c0: f413 5380 ands.w r3, r3, #4096 ; 0x1000 | |
23c4: d010 beq.n 23e8 <serial3_set_cts+0x2c> | |
if (pin == 14) { | |
23c6: 280e cmp r0, #14 | |
23c8: 4b09 ldr r3, [pc, #36] ; (23f0 <serial3_set_cts+0x34>) | |
23ca: d109 bne.n 23e0 <serial3_set_cts+0x24> | |
CORE_PIN14_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
23cc: 4a09 ldr r2, [pc, #36] ; (23f4 <serial3_set_cts+0x38>) | |
23ce: f240 3102 movw r1, #770 ; 0x302 | |
23d2: 6011 str r1, [r2, #0] | |
} else { | |
UART2_MODEM &= ~UART_MODEM_TXCTSE; | |
return 0; | |
} | |
UART2_MODEM |= UART_MODEM_TXCTSE; | |
23d4: 7b5a ldrb r2, [r3, #13] | |
23d6: f042 0201 orr.w r2, r2, #1 | |
23da: 735a strb r2, [r3, #13] | |
return 1; | |
23dc: 2001 movs r0, #1 | |
23de: 4770 bx lr | |
#if defined(KINETISK) | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; | |
if (pin == 14) { | |
CORE_PIN14_CONFIG = PORT_PCR_MUX(3) | PORT_PCR_PE; // weak pulldown | |
} else { | |
UART2_MODEM &= ~UART_MODEM_TXCTSE; | |
23e0: 7b5a ldrb r2, [r3, #13] | |
23e2: f002 02fe and.w r2, r2, #254 ; 0xfe | |
23e6: 735a strb r2, [r3, #13] | |
return 0; | |
23e8: 2000 movs r0, #0 | |
23ea: 4770 bx lr | |
23ec: 40048034 .word 0x40048034 | |
23f0: 4006c000 .word 0x4006c000 | |
23f4: 4004c004 .word 0x4004c004 | |
000023f8 <serial3_putchar>: | |
return 0; | |
#endif | |
} | |
void serial3_putchar(uint32_t c) | |
{ | |
23f8: b5f8 push {r3, r4, r5, r6, r7, lr} | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return; | |
23fa: 4b1d ldr r3, [pc, #116] ; (2470 <serial3_putchar+0x78>) | |
23fc: 681b ldr r3, [r3, #0] | |
23fe: 04da lsls r2, r3, #19 | |
return 0; | |
#endif | |
} | |
void serial3_putchar(uint32_t c) | |
{ | |
2400: 4606 mov r6, r0 | |
uint32_t head, n; | |
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return; | |
2402: d533 bpl.n 246c <serial3_putchar+0x74> | |
if (transmit_pin) transmit_assert(); | |
2404: 4b1b ldr r3, [pc, #108] ; (2474 <serial3_putchar+0x7c>) | |
2406: 681b ldr r3, [r3, #0] | |
2408: b10b cbz r3, 240e <serial3_putchar+0x16> | |
240a: 2201 movs r2, #1 | |
240c: 701a strb r2, [r3, #0] | |
head = tx_buffer_head; | |
240e: 4b1a ldr r3, [pc, #104] ; (2478 <serial3_putchar+0x80>) | |
2410: 781c ldrb r4, [r3, #0] | |
if (++head >= TX_BUFFER_SIZE) head = 0; | |
2412: 3401 adds r4, #1 | |
2414: 2c28 cmp r4, #40 ; 0x28 | |
2416: 461f mov r7, r3 | |
2418: bf28 it cs | |
241a: 2400 movcs r4, #0 | |
while (tx_buffer_tail == head) { | |
241c: 4d17 ldr r5, [pc, #92] ; (247c <serial3_putchar+0x84>) | |
241e: 782b ldrb r3, [r5, #0] | |
2420: 42a3 cmp r3, r4 | |
2422: d118 bne.n 2456 <serial3_putchar+0x5e> | |
int priority = nvic_execution_priority(); | |
2424: f7ff f8a4 bl 1570 <nvic_execution_priority> | |
if (priority <= IRQ_PRIORITY) { | |
2428: 2840 cmp r0, #64 ; 0x40 | |
242a: dc0f bgt.n 244c <serial3_putchar+0x54> | |
if ((UART2_S1 & UART_S1_TDRE)) { | |
242c: 4a14 ldr r2, [pc, #80] ; (2480 <serial3_putchar+0x88>) | |
242e: 7913 ldrb r3, [r2, #4] | |
2430: 061b lsls r3, r3, #24 | |
2432: d5f3 bpl.n 241c <serial3_putchar+0x24> | |
uint32_t tail = tx_buffer_tail; | |
2434: 782b ldrb r3, [r5, #0] | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
2436: 4913 ldr r1, [pc, #76] ; (2484 <serial3_putchar+0x8c>) | |
while (tx_buffer_tail == head) { | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART2_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
2438: 3301 adds r3, #1 | |
243a: 2b28 cmp r3, #40 ; 0x28 | |
243c: bf28 it cs | |
243e: 2300 movcs r3, #0 | |
n = tx_buffer[tail]; | |
2440: 5cc9 ldrb r1, [r1, r3] | |
if (use9Bits) UART2_C3 = (UART2_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART2_D = n; | |
tx_buffer_tail = tail; | |
2442: b2db uxtb r3, r3 | |
int priority = nvic_execution_priority(); | |
if (priority <= IRQ_PRIORITY) { | |
if ((UART2_S1 & UART_S1_TDRE)) { | |
uint32_t tail = tx_buffer_tail; | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
2444: b2c9 uxtb r1, r1 | |
if (use9Bits) UART2_C3 = (UART2_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART2_D = n; | |
2446: 71d1 strb r1, [r2, #7] | |
tx_buffer_tail = tail; | |
2448: 702b strb r3, [r5, #0] | |
244a: e7e7 b.n 241c <serial3_putchar+0x24> | |
} | |
} else if (priority >= 256) { | |
244c: 28ff cmp r0, #255 ; 0xff | |
244e: dde5 ble.n 241c <serial3_putchar+0x24> | |
yield(); // wait | |
2450: f7fe fff6 bl 1440 <yield> | |
2454: e7e2 b.n 241c <serial3_putchar+0x24> | |
} | |
} | |
tx_buffer[head] = c; | |
2456: 4b0b ldr r3, [pc, #44] ; (2484 <serial3_putchar+0x8c>) | |
2458: b2f6 uxtb r6, r6 | |
245a: 551e strb r6, [r3, r4] | |
transmitting = 1; | |
245c: 4b0a ldr r3, [pc, #40] ; (2488 <serial3_putchar+0x90>) | |
245e: 2201 movs r2, #1 | |
2460: 701a strb r2, [r3, #0] | |
tx_buffer_head = head; | |
UART2_C2 = C2_TX_ACTIVE; | |
2462: 4b07 ldr r3, [pc, #28] ; (2480 <serial3_putchar+0x88>) | |
yield(); // wait | |
} | |
} | |
tx_buffer[head] = c; | |
transmitting = 1; | |
tx_buffer_head = head; | |
2464: b2e4 uxtb r4, r4 | |
UART2_C2 = C2_TX_ACTIVE; | |
2466: 22ac movs r2, #172 ; 0xac | |
yield(); // wait | |
} | |
} | |
tx_buffer[head] = c; | |
transmitting = 1; | |
tx_buffer_head = head; | |
2468: 703c strb r4, [r7, #0] | |
UART2_C2 = C2_TX_ACTIVE; | |
246a: 70da strb r2, [r3, #3] | |
246c: bdf8 pop {r3, r4, r5, r6, r7, pc} | |
246e: bf00 nop | |
2470: 40048034 .word 0x40048034 | |
2474: 1fffe8ec .word 0x1fffe8ec | |
2478: 1fffe8f0 .word 0x1fffe8f0 | |
247c: 1fffe8eb .word 0x1fffe8eb | |
2480: 4006c000 .word 0x4006c000 | |
2484: 1fffe882 .word 0x1fffe882 | |
2488: 1fffe880 .word 0x1fffe880 | |
0000248c <serial3_write>: | |
} | |
void serial3_write(const void *buf, unsigned int count) | |
{ | |
248c: b538 push {r3, r4, r5, lr} | |
248e: 4604 mov r4, r0 | |
2490: 1845 adds r5, r0, r1 | |
const uint8_t *p = (const uint8_t *)buf; | |
while (count-- > 0) serial3_putchar(*p++); | |
2492: 42ac cmp r4, r5 | |
2494: d004 beq.n 24a0 <serial3_write+0x14> | |
2496: f814 0b01 ldrb.w r0, [r4], #1 | |
249a: f7ff ffad bl 23f8 <serial3_putchar> | |
249e: e7f8 b.n 2492 <serial3_write+0x6> | |
} | |
24a0: bd38 pop {r3, r4, r5, pc} | |
24a2: ffff b508 vabal.u<illegal width 64> <illegal reg q13.5>, d15, d8 | |
000024a4 <serial3_flush>: | |
void serial3_flush(void) | |
{ | |
24a4: b508 push {r3, lr} | |
while (transmitting) yield(); // wait | |
24a6: 4b03 ldr r3, [pc, #12] ; (24b4 <serial3_flush+0x10>) | |
24a8: 781b ldrb r3, [r3, #0] | |
24aa: b113 cbz r3, 24b2 <serial3_flush+0xe> | |
24ac: f7fe ffc8 bl 1440 <yield> | |
24b0: e7f9 b.n 24a6 <serial3_flush+0x2> | |
} | |
24b2: bd08 pop {r3, pc} | |
24b4: 1fffe880 .word 0x1fffe880 | |
000024b8 <serial3_write_buffer_free>: | |
int serial3_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
tail = tx_buffer_tail; | |
24b8: 4a06 ldr r2, [pc, #24] ; (24d4 <serial3_write_buffer_free+0x1c>) | |
int serial3_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
24ba: 4b07 ldr r3, [pc, #28] ; (24d8 <serial3_write_buffer_free+0x20>) | |
24bc: 781b ldrb r3, [r3, #0] | |
tail = tx_buffer_tail; | |
24be: 7810 ldrb r0, [r2, #0] | |
int serial3_write_buffer_free(void) | |
{ | |
uint32_t head, tail; | |
head = tx_buffer_head; | |
24c0: b2db uxtb r3, r3 | |
tail = tx_buffer_tail; | |
24c2: b2c0 uxtb r0, r0 | |
if (head >= tail) return TX_BUFFER_SIZE - 1 - head + tail; | |
24c4: 4283 cmp r3, r0 | |
24c6: bf2c ite cs | |
24c8: 3027 addcs r0, #39 ; 0x27 | |
return tail - head - 1; | |
24ca: f100 30ff addcc.w r0, r0, #4294967295 ; 0xffffffff | |
24ce: 1ac0 subs r0, r0, r3 | |
} | |
24d0: 4770 bx lr | |
24d2: bf00 nop | |
24d4: 1fffe8eb .word 0x1fffe8eb | |
24d8: 1fffe8f0 .word 0x1fffe8f0 | |
000024dc <serial3_available>: | |
int serial3_available(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
24dc: 4b05 ldr r3, [pc, #20] ; (24f4 <serial3_available+0x18>) | |
24de: 7818 ldrb r0, [r3, #0] | |
tail = rx_buffer_tail; | |
24e0: 4b05 ldr r3, [pc, #20] ; (24f8 <serial3_available+0x1c>) | |
24e2: 781b ldrb r3, [r3, #0] | |
int serial3_available(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
24e4: b2c0 uxtb r0, r0 | |
tail = rx_buffer_tail; | |
24e6: b2db uxtb r3, r3 | |
if (head >= tail) return head - tail; | |
24e8: 4298 cmp r0, r3 | |
return RX_BUFFER_SIZE + head - tail; | |
24ea: bf38 it cc | |
24ec: 3040 addcc r0, #64 ; 0x40 | |
24ee: 1ac0 subs r0, r0, r3 | |
} | |
24f0: 4770 bx lr | |
24f2: bf00 nop | |
24f4: 1fffe8ea .word 0x1fffe8ea | |
24f8: 1fffe881 .word 0x1fffe881 | |
000024fc <serial3_getchar>: | |
int serial3_getchar(void) | |
{ | |
24fc: b510 push {r4, lr} | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
24fe: 4b10 ldr r3, [pc, #64] ; (2540 <serial3_getchar+0x44>) | |
tail = rx_buffer_tail; | |
2500: 4910 ldr r1, [pc, #64] ; (2544 <serial3_getchar+0x48>) | |
int serial3_getchar(void) | |
{ | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
2502: 781a ldrb r2, [r3, #0] | |
tail = rx_buffer_tail; | |
2504: 780b ldrb r3, [r1, #0] | |
int serial3_getchar(void) | |
{ | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
2506: b2d2 uxtb r2, r2 | |
tail = rx_buffer_tail; | |
2508: b2db uxtb r3, r3 | |
if (head == tail) return -1; | |
250a: 429a cmp r2, r3 | |
250c: d014 beq.n 2538 <serial3_getchar+0x3c> | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
250e: 3301 adds r3, #1 | |
2510: 2b40 cmp r3, #64 ; 0x40 | |
2512: bf28 it cs | |
2514: 2300 movcs r3, #0 | |
c = rx_buffer[tail]; | |
2516: 480c ldr r0, [pc, #48] ; (2548 <serial3_getchar+0x4c>) | |
rx_buffer_tail = tail; | |
2518: b2dc uxtb r4, r3 | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
c = rx_buffer[tail]; | |
251a: 5cc0 ldrb r0, [r0, r3] | |
rx_buffer_tail = tail; | |
251c: 700c strb r4, [r1, #0] | |
if (rts_pin) { | |
251e: 490b ldr r1, [pc, #44] ; (254c <serial3_getchar+0x50>) | |
2520: 6809 ldr r1, [r1, #0] | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
c = rx_buffer[tail]; | |
2522: b2c0 uxtb r0, r0 | |
rx_buffer_tail = tail; | |
if (rts_pin) { | |
2524: b151 cbz r1, 253c <serial3_getchar+0x40> | |
int avail; | |
if (head >= tail) avail = head - tail; | |
2526: 429a cmp r2, r3 | |
else avail = RX_BUFFER_SIZE + head - tail; | |
2528: bf38 it cc | |
252a: 3240 addcc r2, #64 ; 0x40 | |
252c: 1ad3 subs r3, r2, r3 | |
if (avail <= RTS_LOW_WATERMARK) rts_assert(); | |
252e: 2b1a cmp r3, #26 | |
2530: dc04 bgt.n 253c <serial3_getchar+0x40> | |
2532: 2300 movs r3, #0 | |
2534: 700b strb r3, [r1, #0] | |
2536: bd10 pop {r4, pc} | |
uint32_t head, tail; | |
int c; | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
2538: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
if (head >= tail) avail = head - tail; | |
else avail = RX_BUFFER_SIZE + head - tail; | |
if (avail <= RTS_LOW_WATERMARK) rts_assert(); | |
} | |
return c; | |
} | |
253c: bd10 pop {r4, pc} | |
253e: bf00 nop | |
2540: 1fffe8ea .word 0x1fffe8ea | |
2544: 1fffe881 .word 0x1fffe881 | |
2548: 1fffe8aa .word 0x1fffe8aa | |
254c: 1fffe87c .word 0x1fffe87c | |
00002550 <serial3_peek>: | |
int serial3_peek(void) | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
2550: 4b08 ldr r3, [pc, #32] ; (2574 <serial3_peek+0x24>) | |
2552: 781a ldrb r2, [r3, #0] | |
tail = rx_buffer_tail; | |
2554: 4b08 ldr r3, [pc, #32] ; (2578 <serial3_peek+0x28>) | |
2556: 781b ldrb r3, [r3, #0] | |
2558: b2db uxtb r3, r3 | |
if (head == tail) return -1; | |
255a: 429a cmp r2, r3 | |
255c: d007 beq.n 256e <serial3_peek+0x1e> | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
255e: 3301 adds r3, #1 | |
2560: 2b40 cmp r3, #64 ; 0x40 | |
2562: bf28 it cs | |
2564: 2300 movcs r3, #0 | |
return rx_buffer[tail]; | |
2566: 4a05 ldr r2, [pc, #20] ; (257c <serial3_peek+0x2c>) | |
2568: 5cd0 ldrb r0, [r2, r3] | |
256a: b2c0 uxtb r0, r0 | |
256c: 4770 bx lr | |
{ | |
uint32_t head, tail; | |
head = rx_buffer_head; | |
tail = rx_buffer_tail; | |
if (head == tail) return -1; | |
256e: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff | |
if (++tail >= RX_BUFFER_SIZE) tail = 0; | |
return rx_buffer[tail]; | |
} | |
2572: 4770 bx lr | |
2574: 1fffe8ea .word 0x1fffe8ea | |
2578: 1fffe881 .word 0x1fffe881 | |
257c: 1fffe8aa .word 0x1fffe8aa | |
00002580 <serial3_clear>: | |
void serial3_clear(void) | |
{ | |
rx_buffer_head = rx_buffer_tail; | |
2580: 4b05 ldr r3, [pc, #20] ; (2598 <serial3_clear+0x18>) | |
2582: 781a ldrb r2, [r3, #0] | |
2584: 4b05 ldr r3, [pc, #20] ; (259c <serial3_clear+0x1c>) | |
2586: b2d2 uxtb r2, r2 | |
2588: 701a strb r2, [r3, #0] | |
if (rts_pin) rts_assert(); | |
258a: 4b05 ldr r3, [pc, #20] ; (25a0 <serial3_clear+0x20>) | |
258c: 681b ldr r3, [r3, #0] | |
258e: b10b cbz r3, 2594 <serial3_clear+0x14> | |
2590: 2200 movs r2, #0 | |
2592: 701a strb r2, [r3, #0] | |
2594: 4770 bx lr | |
2596: bf00 nop | |
2598: 1fffe881 .word 0x1fffe881 | |
259c: 1fffe8ea .word 0x1fffe8ea | |
25a0: 1fffe87c .word 0x1fffe87c | |
000025a4 <uart2_status_isr>: | |
// Receive data above watermark UART_S1_RDRF | |
// LIN break detect UART_S2_LBKDIF | |
// RxD pin active edge UART_S2_RXEDGIF | |
void uart2_status_isr(void) | |
{ | |
25a4: b510 push {r4, lr} | |
uint32_t head, tail, n; | |
uint8_t c; | |
if (UART2_S1 & UART_S1_RDRF) { | |
25a6: 4b29 ldr r3, [pc, #164] ; (264c <uart2_status_isr+0xa8>) | |
25a8: 791a ldrb r2, [r3, #4] | |
25aa: 0692 lsls r2, r2, #26 | |
25ac: d520 bpl.n 25f0 <uart2_status_isr+0x4c> | |
if (use9Bits && (UART2_C3 & 0x80)) { | |
n = UART2_D | 0x100; | |
} else { | |
n = UART2_D; | |
} | |
head = rx_buffer_head + 1; | |
25ae: 4a28 ldr r2, [pc, #160] ; (2650 <uart2_status_isr+0xac>) | |
if (UART2_S1 & UART_S1_RDRF) { | |
if (use9Bits && (UART2_C3 & 0x80)) { | |
n = UART2_D | 0x100; | |
} else { | |
n = UART2_D; | |
25b0: 79d8 ldrb r0, [r3, #7] | |
} | |
head = rx_buffer_head + 1; | |
25b2: 7813 ldrb r3, [r2, #0] | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
if (head != rx_buffer_tail) { | |
25b4: 4927 ldr r1, [pc, #156] ; (2654 <uart2_status_isr+0xb0>) | |
if (use9Bits && (UART2_C3 & 0x80)) { | |
n = UART2_D | 0x100; | |
} else { | |
n = UART2_D; | |
} | |
head = rx_buffer_head + 1; | |
25b6: 3301 adds r3, #1 | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
25b8: 2b40 cmp r3, #64 ; 0x40 | |
if (head != rx_buffer_tail) { | |
25ba: 7809 ldrb r1, [r1, #0] | |
n = UART2_D | 0x100; | |
} else { | |
n = UART2_D; | |
} | |
head = rx_buffer_head + 1; | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
25bc: bf28 it cs | |
25be: 2300 movcs r3, #0 | |
if (head != rx_buffer_tail) { | |
25c0: 428b cmp r3, r1 | |
if (UART2_S1 & UART_S1_RDRF) { | |
if (use9Bits && (UART2_C3 & 0x80)) { | |
n = UART2_D | 0x100; | |
} else { | |
n = UART2_D; | |
25c2: b2c0 uxtb r0, r0 | |
} | |
head = rx_buffer_head + 1; | |
if (head >= RX_BUFFER_SIZE) head = 0; | |
if (head != rx_buffer_tail) { | |
25c4: d003 beq.n 25ce <uart2_status_isr+0x2a> | |
rx_buffer[head] = n; | |
25c6: 4924 ldr r1, [pc, #144] ; (2658 <uart2_status_isr+0xb4>) | |
25c8: 54c8 strb r0, [r1, r3] | |
rx_buffer_head = head; | |
25ca: b2d9 uxtb r1, r3 | |
25cc: 7011 strb r1, [r2, #0] | |
} | |
if (rts_pin) { | |
25ce: 4a23 ldr r2, [pc, #140] ; (265c <uart2_status_isr+0xb8>) | |
25d0: 6811 ldr r1, [r2, #0] | |
25d2: b169 cbz r1, 25f0 <uart2_status_isr+0x4c> | |
int avail; | |
tail = tx_buffer_tail; | |
25d4: 4a22 ldr r2, [pc, #136] ; (2660 <uart2_status_isr+0xbc>) | |
25d6: 7812 ldrb r2, [r2, #0] | |
25d8: b2d2 uxtb r2, r2 | |
if (head >= tail) avail = head - tail; | |
25da: 4293 cmp r3, r2 | |
else avail = RX_BUFFER_SIZE + head - tail; | |
25dc: bf36 itet cc | |
25de: f1c2 0240 rsbcc r2, r2, #64 ; 0x40 | |
rx_buffer_head = head; | |
} | |
if (rts_pin) { | |
int avail; | |
tail = tx_buffer_tail; | |
if (head >= tail) avail = head - tail; | |
25e2: ebc2 0303 rsbcs r3, r2, r3 | |
else avail = RX_BUFFER_SIZE + head - tail; | |
25e6: 189b addcc r3, r3, r2 | |
if (avail >= RTS_HIGH_WATERMARK) rts_deassert(); | |
25e8: 2b27 cmp r3, #39 ; 0x27 | |
25ea: bfc4 itt gt | |
25ec: 2301 movgt r3, #1 | |
25ee: 700b strbgt r3, [r1, #0] | |
} | |
} | |
c = UART2_C2; | |
25f0: 4a16 ldr r2, [pc, #88] ; (264c <uart2_status_isr+0xa8>) | |
25f2: 78d1 ldrb r1, [r2, #3] | |
25f4: b2c9 uxtb r1, r1 | |
if ((c & UART_C2_TIE) && (UART2_S1 & UART_S1_TDRE)) { | |
25f6: 060c lsls r4, r1, #24 | |
25f8: d516 bpl.n 2628 <uart2_status_isr+0x84> | |
25fa: 7913 ldrb r3, [r2, #4] | |
25fc: 0618 lsls r0, r3, #24 | |
25fe: d513 bpl.n 2628 <uart2_status_isr+0x84> | |
head = tx_buffer_head; | |
2600: 4b18 ldr r3, [pc, #96] ; (2664 <uart2_status_isr+0xc0>) | |
tail = tx_buffer_tail; | |
2602: 4817 ldr r0, [pc, #92] ; (2660 <uart2_status_isr+0xbc>) | |
if (avail >= RTS_HIGH_WATERMARK) rts_deassert(); | |
} | |
} | |
c = UART2_C2; | |
if ((c & UART_C2_TIE) && (UART2_S1 & UART_S1_TDRE)) { | |
head = tx_buffer_head; | |
2604: 781c ldrb r4, [r3, #0] | |
tail = tx_buffer_tail; | |
2606: 7803 ldrb r3, [r0, #0] | |
2608: b2db uxtb r3, r3 | |
if (head == tail) { | |
260a: 429c cmp r4, r3 | |
260c: d102 bne.n 2614 <uart2_status_isr+0x70> | |
UART2_C2 = C2_TX_COMPLETING; | |
260e: 236c movs r3, #108 ; 0x6c | |
2610: 70d3 strb r3, [r2, #3] | |
2612: e009 b.n 2628 <uart2_status_isr+0x84> | |
} else { | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
2614: 3301 adds r3, #1 | |
2616: 2b28 cmp r3, #40 ; 0x28 | |
2618: bf28 it cs | |
261a: 2300 movcs r3, #0 | |
n = tx_buffer[tail]; | |
261c: 4c12 ldr r4, [pc, #72] ; (2668 <uart2_status_isr+0xc4>) | |
261e: 5ce4 ldrb r4, [r4, r3] | |
if (use9Bits) UART2_C3 = (UART2_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART2_D = n; | |
tx_buffer_tail = tail; | |
2620: b2db uxtb r3, r3 | |
tail = tx_buffer_tail; | |
if (head == tail) { | |
UART2_C2 = C2_TX_COMPLETING; | |
} else { | |
if (++tail >= TX_BUFFER_SIZE) tail = 0; | |
n = tx_buffer[tail]; | |
2622: b2e4 uxtb r4, r4 | |
if (use9Bits) UART2_C3 = (UART2_C3 & ~0x40) | ((n & 0x100) >> 2); | |
UART2_D = n; | |
2624: 71d4 strb r4, [r2, #7] | |
tx_buffer_tail = tail; | |
2626: 7003 strb r3, [r0, #0] | |
} | |
} | |
if ((c & UART_C2_TCIE) && (UART2_S1 & UART_S1_TC)) { | |
2628: 064b lsls r3, r1, #25 | |
262a: d50e bpl.n 264a <uart2_status_isr+0xa6> | |
262c: 4b07 ldr r3, [pc, #28] ; (264c <uart2_status_isr+0xa8>) | |
262e: 791a ldrb r2, [r3, #4] | |
2630: f012 0f40 tst.w r2, #64 ; 0x40 | |
2634: 4619 mov r1, r3 | |
2636: d008 beq.n 264a <uart2_status_isr+0xa6> | |
transmitting = 0; | |
2638: 4b0c ldr r3, [pc, #48] ; (266c <uart2_status_isr+0xc8>) | |
263a: 2200 movs r2, #0 | |
263c: 701a strb r2, [r3, #0] | |
if (transmit_pin) transmit_deassert(); | |
263e: 4b0c ldr r3, [pc, #48] ; (2670 <uart2_status_isr+0xcc>) | |
2640: 681b ldr r3, [r3, #0] | |
2642: b103 cbz r3, 2646 <uart2_status_isr+0xa2> | |
2644: 701a strb r2, [r3, #0] | |
UART2_C2 = C2_TX_INACTIVE; | |
2646: 232c movs r3, #44 ; 0x2c | |
2648: 70cb strb r3, [r1, #3] | |
264a: bd10 pop {r4, pc} | |
264c: 4006c000 .word 0x4006c000 | |
2650: 1fffe8ea .word 0x1fffe8ea | |
2654: 1fffe881 .word 0x1fffe881 | |
2658: 1fffe8aa .word 0x1fffe8aa | |
265c: 1fffe87c .word 0x1fffe87c | |
2660: 1fffe8eb .word 0x1fffe8eb | |
2664: 1fffe8f0 .word 0x1fffe8f0 | |
2668: 1fffe882 .word 0x1fffe882 | |
266c: 1fffe880 .word 0x1fffe880 | |
2670: 1fffe8ec .word 0x1fffe8ec | |
00002674 <usb_init_serialnumber>: | |
3, | |
{0,0,0,0,0,0,0,0,0,0} | |
}; | |
void usb_init_serialnumber(void) | |
{ | |
2674: b51f push {r0, r1, r2, r3, r4, lr} | |
char buf[11]; | |
uint32_t i, num; | |
__disable_irq(); | |
2676: b672 cpsid i | |
FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL; | |
2678: 4b15 ldr r3, [pc, #84] ; (26d0 <usb_init_serialnumber+0x5c>) | |
267a: 2270 movs r2, #112 ; 0x70 | |
267c: 701a strb r2, [r3, #0] | |
FTFL_FCCOB0 = 0x41; | |
267e: 4a15 ldr r2, [pc, #84] ; (26d4 <usb_init_serialnumber+0x60>) | |
2680: 2141 movs r1, #65 ; 0x41 | |
2682: 7011 strb r1, [r2, #0] | |
FTFL_FCCOB1 = 15; | |
2684: 210f movs r1, #15 | |
2686: f802 1c01 strb.w r1, [r2, #-1] | |
FTFL_FSTAT = FTFL_FSTAT_CCIF; | |
268a: 2280 movs r2, #128 ; 0x80 | |
268c: 701a strb r2, [r3, #0] | |
while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait | |
268e: 781a ldrb r2, [r3, #0] | |
2690: 0612 lsls r2, r2, #24 | |
2692: d5fc bpl.n 268e <usb_init_serialnumber+0x1a> | |
num = *(uint32_t *)&FTFL_FCCOB7; | |
2694: 4b10 ldr r3, [pc, #64] ; (26d8 <usb_init_serialnumber+0x64>) | |
2696: 6818 ldr r0, [r3, #0] | |
__enable_irq(); | |
2698: b662 cpsie i | |
// add extra zero to work around OS-X CDC-ACM driver bug | |
if (num < 10000000) num = num * 10; | |
269a: 4b10 ldr r3, [pc, #64] ; (26dc <usb_init_serialnumber+0x68>) | |
269c: 4298 cmp r0, r3 | |
269e: bf98 it ls | |
26a0: 230a movls r3, #10 | |
ultoa(num, buf, 10); | |
26a2: ac01 add r4, sp, #4 | |
FTFL_FSTAT = FTFL_FSTAT_CCIF; | |
while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait | |
num = *(uint32_t *)&FTFL_FCCOB7; | |
__enable_irq(); | |
// add extra zero to work around OS-X CDC-ACM driver bug | |
if (num < 10000000) num = num * 10; | |
26a4: bf98 it ls | |
26a6: 4358 mulls r0, r3 | |
ultoa(num, buf, 10); | |
26a8: 4621 mov r1, r4 | |
26aa: 220a movs r2, #10 | |
26ac: f7fe ff7e bl 15ac <ultoa> | |
for (i=0; i<10; i++) { | |
26b0: 2300 movs r3, #0 | |
char c = buf[i]; | |
26b2: 5ce1 ldrb r1, [r4, r3] | |
26b4: 4a0a ldr r2, [pc, #40] ; (26e0 <usb_init_serialnumber+0x6c>) | |
if (!c) break; | |
26b6: b129 cbz r1, 26c4 <usb_init_serialnumber+0x50> | |
26b8: eb02 0043 add.w r0, r2, r3, lsl #1 | |
num = *(uint32_t *)&FTFL_FCCOB7; | |
__enable_irq(); | |
// add extra zero to work around OS-X CDC-ACM driver bug | |
if (num < 10000000) num = num * 10; | |
ultoa(num, buf, 10); | |
for (i=0; i<10; i++) { | |
26bc: 3301 adds r3, #1 | |
26be: 2b0a cmp r3, #10 | |
char c = buf[i]; | |
if (!c) break; | |
usb_string_serial_number_default.wString[i] = c; | |
26c0: 8041 strh r1, [r0, #2] | |
num = *(uint32_t *)&FTFL_FCCOB7; | |
__enable_irq(); | |
// add extra zero to work around OS-X CDC-ACM driver bug | |
if (num < 10000000) num = num * 10; | |
ultoa(num, buf, 10); | |
for (i=0; i<10; i++) { | |
26c2: d1f6 bne.n 26b2 <usb_init_serialnumber+0x3e> | |
char c = buf[i]; | |
if (!c) break; | |
usb_string_serial_number_default.wString[i] = c; | |
} | |
usb_string_serial_number_default.bLength = i * 2 + 2; | |
26c4: 3301 adds r3, #1 | |
26c6: 005b lsls r3, r3, #1 | |
26c8: 7013 strb r3, [r2, #0] | |
} | |
26ca: b004 add sp, #16 | |
26cc: bd10 pop {r4, pc} | |
26ce: bf00 nop | |
26d0: 40020000 .word 0x40020000 | |
26d4: 40020007 .word 0x40020007 | |
26d8: 40020008 .word 0x40020008 | |
26dc: 0098967f .word 0x0098967f | |
26e0: 1fffe5f2 .word 0x1fffe5f2 | |
000026e4 <_ZN14HardwareSerial5writeEm>: | |
virtual int read(void) { return serial_getchar(); } | |
virtual void flush(void) { serial_flush(); } | |
virtual void clear(void) { serial_clear(); } | |
virtual int availableForWrite(void) { return serial_write_buffer_free(); } | |
virtual size_t write(uint8_t c) { serial_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
26e4: b508 push {r3, lr} | |
26e6: 6803 ldr r3, [r0, #0] | |
26e8: b2c9 uxtb r1, r1 | |
26ea: 681b ldr r3, [r3, #0] | |
26ec: 4798 blx r3 | |
26ee: bd08 pop {r3, pc} | |
000026f0 <_ZN14HardwareSerial5writeEl>: | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
26f0: b508 push {r3, lr} | |
26f2: 6803 ldr r3, [r0, #0] | |
26f4: b2c9 uxtb r1, r1 | |
26f6: 681b ldr r3, [r3, #0] | |
26f8: 4798 blx r3 | |
26fa: bd08 pop {r3, pc} | |
000026fc <_ZN14HardwareSerial5writeEj>: | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
26fc: b508 push {r3, lr} | |
26fe: 6803 ldr r3, [r0, #0] | |
2700: b2c9 uxtb r1, r1 | |
2702: 681b ldr r3, [r3, #0] | |
2704: 4798 blx r3 | |
2706: bd08 pop {r3, pc} | |
00002708 <_ZN14HardwareSerial5writeEi>: | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
2708: b508 push {r3, lr} | |
270a: 6803 ldr r3, [r0, #0] | |
270c: b2c9 uxtb r1, r1 | |
270e: 681b ldr r3, [r3, #0] | |
2710: 4798 blx r3 | |
2712: bd08 pop {r3, pc} | |
00002714 <_ZN14HardwareSerial5beginEm>: | |
#ifdef __cplusplus | |
#include "Stream.h" | |
class HardwareSerial : public Stream | |
{ | |
public: | |
virtual void begin(uint32_t baud) { serial_begin(BAUD2DIV(baud)); } | |
2714: 084b lsrs r3, r1, #1 | |
2716: f103 6037 add.w r0, r3, #191889408 ; 0xb700000 | |
271a: f500 30d8 add.w r0, r0, #110592 ; 0x1b000 | |
271e: fbb0 f0f1 udiv r0, r0, r1 | |
2722: f7fe bf61 b.w 15e8 <serial_begin> | |
00002726 <_ZN14HardwareSerial5beginEmm>: | |
virtual void begin(uint32_t baud, uint32_t format) { | |
2726: b510 push {r4, lr} | |
serial_begin(BAUD2DIV(baud)); | |
2728: 084b lsrs r3, r1, #1 | |
272a: f103 6037 add.w r0, r3, #191889408 ; 0xb700000 | |
272e: f500 30d8 add.w r0, r0, #110592 ; 0x1b000 | |
#include "Stream.h" | |
class HardwareSerial : public Stream | |
{ | |
public: | |
virtual void begin(uint32_t baud) { serial_begin(BAUD2DIV(baud)); } | |
virtual void begin(uint32_t baud, uint32_t format) { | |
2732: 4614 mov r4, r2 | |
serial_begin(BAUD2DIV(baud)); | |
2734: fbb0 f0f1 udiv r0, r0, r1 | |
2738: f7fe ff56 bl 15e8 <serial_begin> | |
serial_format(format); } | |
273c: 4620 mov r0, r4 | |
273e: e8bd 4010 ldmia.w sp!, {r4, lr} | |
2742: f7fe bfb5 b.w 16b0 <serial_format> | |
00002746 <_ZN14HardwareSerial3endEv>: | |
virtual void end(void) { serial_end(); } | |
2746: f7fe bfdd b.w 1704 <serial_end> | |
0000274a <_ZN14HardwareSerial17transmitterEnableEh>: | |
virtual void transmitterEnable(uint8_t pin) { serial_set_transmit_pin(pin); } | |
274a: 4608 mov r0, r1 | |
274c: f7ff b80e b.w 176c <serial_set_transmit_pin> | |
00002750 <_ZN14HardwareSerial5setRXEh>: | |
virtual void setRX(uint8_t pin) { serial_set_rx(pin); } | |
2750: 4608 mov r0, r1 | |
2752: f7ff b85d b.w 1810 <serial_set_rx> | |
00002756 <_ZN14HardwareSerial5setTXEhb>: | |
virtual void setTX(uint8_t pin, bool opendrain=false) { serial_set_tx(pin, opendrain); } | |
2756: 4608 mov r0, r1 | |
2758: 4611 mov r1, r2 | |
275a: f7ff b823 b.w 17a4 <serial_set_tx> | |
0000275e <_ZN14HardwareSerial9attachRtsEh>: | |
virtual bool attachRts(uint8_t pin) { return serial_set_rts(pin); } | |
275e: b508 push {r3, lr} | |
2760: 4608 mov r0, r1 | |
2762: f7ff f87b bl 185c <serial_set_rts> | |
2766: 3000 adds r0, #0 | |
2768: bf18 it ne | |
276a: 2001 movne r0, #1 | |
276c: bd08 pop {r3, pc} | |
0000276e <_ZN14HardwareSerial9attachCtsEh>: | |
virtual bool attachCts(uint8_t pin) { return serial_set_cts(pin); } | |
276e: b508 push {r3, lr} | |
2770: 4608 mov r0, r1 | |
2772: f7ff f895 bl 18a0 <serial_set_cts> | |
2776: 3000 adds r0, #0 | |
2778: bf18 it ne | |
277a: 2001 movne r0, #1 | |
277c: bd08 pop {r3, pc} | |
0000277e <_ZN14HardwareSerial9availableEv>: | |
virtual int available(void) { return serial_available(); } | |
277e: f7ff b979 b.w 1a74 <serial_available> | |
00002782 <_ZN14HardwareSerial4peekEv>: | |
virtual int peek(void) { return serial_peek(); } | |
2782: f7ff b9b1 b.w 1ae8 <serial_peek> | |
00002786 <_ZN14HardwareSerial4readEv>: | |
virtual int read(void) { return serial_getchar(); } | |
2786: f7ff b985 b.w 1a94 <serial_getchar> | |
0000278a <_ZN14HardwareSerial5flushEv>: | |
virtual void flush(void) { serial_flush(); } | |
278a: f7ff b957 b.w 1a3c <serial_flush> | |
0000278e <_ZN14HardwareSerial5clearEv>: | |
virtual void clear(void) { serial_clear(); } | |
278e: f7ff b9c3 b.w 1b18 <serial_clear> | |
00002792 <_ZN14HardwareSerial17availableForWriteEv>: | |
virtual int availableForWrite(void) { return serial_write_buffer_free(); } | |
2792: f7ff b95d b.w 1a50 <serial_write_buffer_free> | |
00002796 <_ZN14HardwareSerial5writeEh>: | |
virtual size_t write(uint8_t c) { serial_putchar(c); return 1; } | |
2796: b508 push {r3, lr} | |
2798: 4608 mov r0, r1 | |
279a: f7ff f8a7 bl 18ec <serial_putchar> | |
279e: 2001 movs r0, #1 | |
27a0: bd08 pop {r3, pc} | |
000027a2 <_ZN14HardwareSerial9write9bitEm>: | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
{ serial_write(buffer, size); return size; } | |
virtual size_t write(const char *str) { size_t len = strlen(str); | |
serial_write((const uint8_t *)str, len); | |
return len; } | |
virtual size_t write9bit(uint32_t c) { serial_putchar(c); return 1; } | |
27a2: b508 push {r3, lr} | |
27a4: 4608 mov r0, r1 | |
27a6: f7ff f8a1 bl 18ec <serial_putchar> | |
27aa: 2001 movs r0, #1 | |
27ac: bd08 pop {r3, pc} | |
000027ae <_ZN14HardwareSerial5writeEPKhj>: | |
virtual size_t write(uint8_t c) { serial_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
27ae: b510 push {r4, lr} | |
{ serial_write(buffer, size); return size; } | |
27b0: 4608 mov r0, r1 | |
virtual size_t write(uint8_t c) { serial_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
27b2: 4614 mov r4, r2 | |
{ serial_write(buffer, size); return size; } | |
27b4: 4611 mov r1, r2 | |
27b6: f7ff f8e3 bl 1980 <serial_write> | |
27ba: 4620 mov r0, r4 | |
27bc: bd10 pop {r4, pc} | |
000027be <_ZN14HardwareSerial5writeEPKc>: | |
virtual size_t write(const char *str) { size_t len = strlen(str); | |
27be: b538 push {r3, r4, r5, lr} | |
27c0: 4608 mov r0, r1 | |
27c2: 460d mov r5, r1 | |
27c4: f000 f94c bl 2a60 <strlen> | |
27c8: 4604 mov r4, r0 | |
serial_write((const uint8_t *)str, len); | |
27ca: 4621 mov r1, r4 | |
27cc: 4628 mov r0, r5 | |
27ce: f7ff f8d7 bl 1980 <serial_write> | |
return len; } | |
27d2: 4620 mov r0, r4 | |
27d4: bd38 pop {r3, r4, r5, pc} | |
000027d6 <_Z12serialEvent1v>: | |
#include "HardwareSerial.h" | |
HardwareSerial Serial1; | |
void serialEvent1() __attribute__((weak)); | |
void serialEvent1() {} | |
27d6: 4770 bx lr | |
000027d8 <_GLOBAL__sub_I_Serial1>: | |
27d8: 4b04 ldr r3, [pc, #16] ; (27ec <_GLOBAL__sub_I_Serial1+0x14>) | |
27da: 2200 movs r2, #0 | |
27dc: 711a strb r2, [r3, #4] | |
27de: f44f 717a mov.w r1, #1000 ; 0x3e8 | |
27e2: 731a strb r2, [r3, #12] | |
// C++ interface | |
// | |
#ifdef __cplusplus | |
#include "Stream.h" | |
class HardwareSerial : public Stream | |
27e4: 4a02 ldr r2, [pc, #8] ; (27f0 <_GLOBAL__sub_I_Serial1+0x18>) | |
27e6: 6099 str r1, [r3, #8] | |
27e8: 601a str r2, [r3, #0] | |
27ea: 4770 bx lr | |
27ec: 1fffe8f4 .word 0x1fffe8f4 | |
27f0: 00002c30 .word 0x00002c30 | |
000027f4 <_ZN15HardwareSerial25writeEm>: | |
virtual int read(void) { return serial2_getchar(); } | |
virtual void flush(void) { serial2_flush(); } | |
virtual void clear(void) { serial2_clear(); } | |
virtual int availableForWrite(void) { return serial2_write_buffer_free(); } | |
virtual size_t write(uint8_t c) { serial2_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
27f4: b508 push {r3, lr} | |
27f6: 6803 ldr r3, [r0, #0] | |
27f8: b2c9 uxtb r1, r1 | |
27fa: 681b ldr r3, [r3, #0] | |
27fc: 4798 blx r3 | |
27fe: bd08 pop {r3, pc} | |
00002800 <_ZN15HardwareSerial25writeEl>: | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
2800: b508 push {r3, lr} | |
2802: 6803 ldr r3, [r0, #0] | |
2804: b2c9 uxtb r1, r1 | |
2806: 681b ldr r3, [r3, #0] | |
2808: 4798 blx r3 | |
280a: bd08 pop {r3, pc} | |
0000280c <_ZN15HardwareSerial25writeEj>: | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
280c: b508 push {r3, lr} | |
280e: 6803 ldr r3, [r0, #0] | |
2810: b2c9 uxtb r1, r1 | |
2812: 681b ldr r3, [r3, #0] | |
2814: 4798 blx r3 | |
2816: bd08 pop {r3, pc} | |
00002818 <_ZN15HardwareSerial25writeEi>: | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
2818: b508 push {r3, lr} | |
281a: 6803 ldr r3, [r0, #0] | |
281c: b2c9 uxtb r1, r1 | |
281e: 681b ldr r3, [r3, #0] | |
2820: 4798 blx r3 | |
2822: bd08 pop {r3, pc} | |
00002824 <_ZN15HardwareSerial25beginEm>: | |
extern void serialEvent1(void); | |
class HardwareSerial2 : public HardwareSerial | |
{ | |
public: | |
virtual void begin(uint32_t baud) { serial2_begin(BAUD2DIV2(baud)); } | |
2824: 084b lsrs r3, r1, #1 | |
2826: f103 6037 add.w r0, r3, #191889408 ; 0xb700000 | |
282a: f500 30d8 add.w r0, r0, #110592 ; 0x1b000 | |
282e: fbb0 f0f1 udiv r0, r0, r1 | |
2832: f7ff ba19 b.w 1c68 <serial2_begin> | |
00002836 <_ZN15HardwareSerial25beginEmm>: | |
virtual void begin(uint32_t baud, uint32_t format) { | |
2836: b510 push {r4, lr} | |
serial2_begin(BAUD2DIV2(baud)); | |
2838: 084b lsrs r3, r1, #1 | |
283a: f103 6037 add.w r0, r3, #191889408 ; 0xb700000 | |
283e: f500 30d8 add.w r0, r0, #110592 ; 0x1b000 | |
class HardwareSerial2 : public HardwareSerial | |
{ | |
public: | |
virtual void begin(uint32_t baud) { serial2_begin(BAUD2DIV2(baud)); } | |
virtual void begin(uint32_t baud, uint32_t format) { | |
2842: 4614 mov r4, r2 | |
serial2_begin(BAUD2DIV2(baud)); | |
2844: fbb0 f0f1 udiv r0, r0, r1 | |
2848: f7ff fa0e bl 1c68 <serial2_begin> | |
serial2_format(format); } | |
284c: 4620 mov r0, r4 | |
284e: e8bd 4010 ldmia.w sp!, {r4, lr} | |
2852: f7ff ba69 b.w 1d28 <serial2_format> | |
00002856 <_ZN15HardwareSerial23endEv>: | |
virtual void end(void) { serial2_end(); } | |
2856: f7ff ba91 b.w 1d7c <serial2_end> | |
0000285a <_ZN15HardwareSerial217transmitterEnableEh>: | |
virtual void transmitterEnable(uint8_t pin) { serial2_set_transmit_pin(pin); } | |
285a: 4608 mov r0, r1 | |
285c: f7ff bac2 b.w 1de4 <serial2_set_transmit_pin> | |
00002860 <_ZN15HardwareSerial25setRXEh>: | |
virtual void setRX(uint8_t pin) { serial2_set_rx(pin); } | |
2860: 4608 mov r0, r1 | |
2862: f7ff bb11 b.w 1e88 <serial2_set_rx> | |
00002866 <_ZN15HardwareSerial25setTXEhb>: | |
virtual void setTX(uint8_t pin, bool opendrain=false) { serial2_set_tx(pin, opendrain); } | |
2866: 4608 mov r0, r1 | |
2868: 4611 mov r1, r2 | |
286a: f7ff bad7 b.w 1e1c <serial2_set_tx> | |
0000286e <_ZN15HardwareSerial29attachRtsEh>: | |
virtual bool attachRts(uint8_t pin) { return serial2_set_rts(pin); } | |
286e: b508 push {r3, lr} | |
2870: 4608 mov r0, r1 | |
2872: f7ff fb31 bl 1ed8 <serial2_set_rts> | |
2876: 3000 adds r0, #0 | |
2878: bf18 it ne | |
287a: 2001 movne r0, #1 | |
287c: bd08 pop {r3, pc} | |
0000287e <_ZN15HardwareSerial29attachCtsEh>: | |
virtual bool attachCts(uint8_t pin) { return serial2_set_cts(pin); } | |
287e: b508 push {r3, lr} | |
2880: 4608 mov r0, r1 | |
2882: f7ff fb4b bl 1f1c <serial2_set_cts> | |
2886: 3000 adds r0, #0 | |
2888: bf18 it ne | |
288a: 2001 movne r0, #1 | |
288c: bd08 pop {r3, pc} | |
0000288e <_ZN15HardwareSerial29availableEv>: | |
virtual int available(void) { return serial2_available(); } | |
288e: f7ff bbd5 b.w 203c <serial2_available> | |
00002892 <_ZN15HardwareSerial24peekEv>: | |
virtual int peek(void) { return serial2_peek(); } | |
2892: f7ff bc0d b.w 20b0 <serial2_peek> | |
00002896 <_ZN15HardwareSerial24readEv>: | |
virtual int read(void) { return serial2_getchar(); } | |
2896: f7ff bbe1 b.w 205c <serial2_getchar> | |
0000289a <_ZN15HardwareSerial25flushEv>: | |
virtual void flush(void) { serial2_flush(); } | |
289a: f7ff bbb3 b.w 2004 <serial2_flush> | |
0000289e <_ZN15HardwareSerial25clearEv>: | |
virtual void clear(void) { serial2_clear(); } | |
289e: f7ff bc1f b.w 20e0 <serial2_clear> | |
000028a2 <_ZN15HardwareSerial217availableForWriteEv>: | |
virtual int availableForWrite(void) { return serial2_write_buffer_free(); } | |
28a2: f7ff bbb9 b.w 2018 <serial2_write_buffer_free> | |
000028a6 <_ZN15HardwareSerial25writeEh>: | |
virtual size_t write(uint8_t c) { serial2_putchar(c); return 1; } | |
28a6: b508 push {r3, lr} | |
28a8: 4608 mov r0, r1 | |
28aa: f7ff fb55 bl 1f58 <serial2_putchar> | |
28ae: 2001 movs r0, #1 | |
28b0: bd08 pop {r3, pc} | |
000028b2 <_ZN15HardwareSerial29write9bitEm>: | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
{ serial2_write(buffer, size); return size; } | |
virtual size_t write(const char *str) { size_t len = strlen(str); | |
serial2_write((const uint8_t *)str, len); | |
return len; } | |
virtual size_t write9bit(uint32_t c) { serial2_putchar(c); return 1; } | |
28b2: b508 push {r3, lr} | |
28b4: 4608 mov r0, r1 | |
28b6: f7ff fb4f bl 1f58 <serial2_putchar> | |
28ba: 2001 movs r0, #1 | |
28bc: bd08 pop {r3, pc} | |
000028be <_ZN15HardwareSerial25writeEPKhj>: | |
virtual size_t write(uint8_t c) { serial2_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
28be: b510 push {r4, lr} | |
{ serial2_write(buffer, size); return size; } | |
28c0: 4608 mov r0, r1 | |
virtual size_t write(uint8_t c) { serial2_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
28c2: 4614 mov r4, r2 | |
{ serial2_write(buffer, size); return size; } | |
28c4: 4611 mov r1, r2 | |
28c6: f7ff fb91 bl 1fec <serial2_write> | |
28ca: 4620 mov r0, r4 | |
28cc: bd10 pop {r4, pc} | |
000028ce <_ZN15HardwareSerial25writeEPKc>: | |
virtual size_t write(const char *str) { size_t len = strlen(str); | |
28ce: b538 push {r3, r4, r5, lr} | |
28d0: 4608 mov r0, r1 | |
28d2: 460d mov r5, r1 | |
28d4: f000 f8c4 bl 2a60 <strlen> | |
28d8: 4604 mov r4, r0 | |
serial2_write((const uint8_t *)str, len); | |
28da: 4621 mov r1, r4 | |
28dc: 4628 mov r0, r5 | |
28de: f7ff fb85 bl 1fec <serial2_write> | |
return len; } | |
28e2: 4620 mov r0, r4 | |
28e4: bd38 pop {r3, r4, r5, pc} | |
000028e6 <_Z12serialEvent2v>: | |
#include "HardwareSerial.h" | |
HardwareSerial2 Serial2; | |
void serialEvent2() __attribute__((weak)); | |
void serialEvent2() {} | |
28e6: 4770 bx lr | |
000028e8 <_GLOBAL__sub_I_Serial2>: | |
28e8: 4b04 ldr r3, [pc, #16] ; (28fc <_GLOBAL__sub_I_Serial2+0x14>) | |
28ea: 2200 movs r2, #0 | |
28ec: 711a strb r2, [r3, #4] | |
28ee: f44f 717a mov.w r1, #1000 ; 0x3e8 | |
28f2: 731a strb r2, [r3, #12] | |
operator bool() { return true; } | |
}; | |
extern HardwareSerial Serial1; | |
extern void serialEvent1(void); | |
class HardwareSerial2 : public HardwareSerial | |
28f4: 4a02 ldr r2, [pc, #8] ; (2900 <_GLOBAL__sub_I_Serial2+0x18>) | |
28f6: 6099 str r1, [r3, #8] | |
28f8: 601a str r2, [r3, #0] | |
28fa: 4770 bx lr | |
28fc: 1fffe904 .word 0x1fffe904 | |
2900: 00002c90 .word 0x00002c90 | |
00002904 <_ZN15HardwareSerial35writeEm>: | |
virtual int read(void) { return serial3_getchar(); } | |
virtual void flush(void) { serial3_flush(); } | |
virtual void clear(void) { serial3_clear(); } | |
virtual int availableForWrite(void) { return serial3_write_buffer_free(); } | |
virtual size_t write(uint8_t c) { serial3_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
2904: b508 push {r3, lr} | |
2906: 6803 ldr r3, [r0, #0] | |
2908: b2c9 uxtb r1, r1 | |
290a: 681b ldr r3, [r3, #0] | |
290c: 4798 blx r3 | |
290e: bd08 pop {r3, pc} | |
00002910 <_ZN15HardwareSerial35writeEl>: | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
2910: b508 push {r3, lr} | |
2912: 6803 ldr r3, [r0, #0] | |
2914: b2c9 uxtb r1, r1 | |
2916: 681b ldr r3, [r3, #0] | |
2918: 4798 blx r3 | |
291a: bd08 pop {r3, pc} | |
0000291c <_ZN15HardwareSerial35writeEj>: | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
291c: b508 push {r3, lr} | |
291e: 6803 ldr r3, [r0, #0] | |
2920: b2c9 uxtb r1, r1 | |
2922: 681b ldr r3, [r3, #0] | |
2924: 4798 blx r3 | |
2926: bd08 pop {r3, pc} | |
00002928 <_ZN15HardwareSerial35writeEi>: | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
2928: b508 push {r3, lr} | |
292a: 6803 ldr r3, [r0, #0] | |
292c: b2c9 uxtb r1, r1 | |
292e: 681b ldr r3, [r3, #0] | |
2930: 4798 blx r3 | |
2932: bd08 pop {r3, pc} | |
00002934 <_ZN15HardwareSerial35beginEm>: | |
extern void serialEvent2(void); | |
class HardwareSerial3 : public HardwareSerial | |
{ | |
public: | |
virtual void begin(uint32_t baud) { serial3_begin(BAUD2DIV3(baud)); } | |
2934: 084b lsrs r3, r1, #1 | |
2936: f103 60b7 add.w r0, r3, #95944704 ; 0x5b80000 | |
293a: f500 4058 add.w r0, r0, #55296 ; 0xd800 | |
293e: fbb0 f0f1 udiv r0, r0, r1 | |
2942: f7ff bc35 b.w 21b0 <serial3_begin> | |
00002946 <_ZN15HardwareSerial35beginEmm>: | |
virtual void begin(uint32_t baud, uint32_t format) { | |
2946: b510 push {r4, lr} | |
serial3_begin(BAUD2DIV3(baud)); | |
2948: 084b lsrs r3, r1, #1 | |
294a: f103 60b7 add.w r0, r3, #95944704 ; 0x5b80000 | |
294e: f500 4058 add.w r0, r0, #55296 ; 0xd800 | |
class HardwareSerial3 : public HardwareSerial | |
{ | |
public: | |
virtual void begin(uint32_t baud) { serial3_begin(BAUD2DIV3(baud)); } | |
virtual void begin(uint32_t baud, uint32_t format) { | |
2952: 4614 mov r4, r2 | |
serial3_begin(BAUD2DIV3(baud)); | |
2954: fbb0 f0f1 udiv r0, r0, r1 | |
2958: f7ff fc2a bl 21b0 <serial3_begin> | |
serial3_format(format); } | |
295c: 4620 mov r0, r4 | |
295e: e8bd 4010 ldmia.w sp!, {r4, lr} | |
2962: f7ff bc65 b.w 2230 <serial3_format> | |
00002966 <_ZN15HardwareSerial33endEv>: | |
virtual void end(void) { serial3_end(); } | |
2966: f7ff bc8d b.w 2284 <serial3_end> | |
0000296a <_ZN15HardwareSerial317transmitterEnableEh>: | |
virtual void transmitterEnable(uint8_t pin) { serial3_set_transmit_pin(pin); } | |
296a: 4608 mov r0, r1 | |
296c: f7ff bcbe b.w 22ec <serial3_set_transmit_pin> | |
00002970 <_ZN15HardwareSerial35setRXEh>: | |
virtual void setRX(uint8_t pin) { serial3_set_rx(pin); } | |
2970: 4608 mov r0, r1 | |
2972: f7ff bcff b.w 2374 <serial3_set_rx> | |
00002976 <_ZN15HardwareSerial35setTXEhb>: | |
virtual void setTX(uint8_t pin, bool opendrain=false) { serial3_set_tx(pin, opendrain); } | |
2976: 4608 mov r0, r1 | |
2978: 4611 mov r1, r2 | |
297a: f7ff bcd3 b.w 2324 <serial3_set_tx> | |
0000297e <_ZN15HardwareSerial39attachRtsEh>: | |
virtual bool attachRts(uint8_t pin) { return serial3_set_rts(pin); } | |
297e: b508 push {r3, lr} | |
2980: 4608 mov r0, r1 | |
2982: f7ff fcf9 bl 2378 <serial3_set_rts> | |
2986: 3000 adds r0, #0 | |
2988: bf18 it ne | |
298a: 2001 movne r0, #1 | |
298c: bd08 pop {r3, pc} | |
0000298e <_ZN15HardwareSerial39attachCtsEh>: | |
virtual bool attachCts(uint8_t pin) { return serial3_set_cts(pin); } | |
298e: b508 push {r3, lr} | |
2990: 4608 mov r0, r1 | |
2992: f7ff fd13 bl 23bc <serial3_set_cts> | |
2996: 3000 adds r0, #0 | |
2998: bf18 it ne | |
299a: 2001 movne r0, #1 | |
299c: bd08 pop {r3, pc} | |
0000299e <_ZN15HardwareSerial39availableEv>: | |
virtual int available(void) { return serial3_available(); } | |
299e: f7ff bd9d b.w 24dc <serial3_available> | |
000029a2 <_ZN15HardwareSerial34peekEv>: | |
virtual int peek(void) { return serial3_peek(); } | |
29a2: f7ff bdd5 b.w 2550 <serial3_peek> | |
000029a6 <_ZN15HardwareSerial34readEv>: | |
virtual int read(void) { return serial3_getchar(); } | |
29a6: f7ff bda9 b.w 24fc <serial3_getchar> | |
000029aa <_ZN15HardwareSerial35flushEv>: | |
virtual void flush(void) { serial3_flush(); } | |
29aa: f7ff bd7b b.w 24a4 <serial3_flush> | |
000029ae <_ZN15HardwareSerial35clearEv>: | |
virtual void clear(void) { serial3_clear(); } | |
29ae: f7ff bde7 b.w 2580 <serial3_clear> | |
000029b2 <_ZN15HardwareSerial317availableForWriteEv>: | |
virtual int availableForWrite(void) { return serial3_write_buffer_free(); } | |
29b2: f7ff bd81 b.w 24b8 <serial3_write_buffer_free> | |
000029b6 <_ZN15HardwareSerial35writeEh>: | |
virtual size_t write(uint8_t c) { serial3_putchar(c); return 1; } | |
29b6: b508 push {r3, lr} | |
29b8: 4608 mov r0, r1 | |
29ba: f7ff fd1d bl 23f8 <serial3_putchar> | |
29be: 2001 movs r0, #1 | |
29c0: bd08 pop {r3, pc} | |
000029c2 <_ZN15HardwareSerial39write9bitEm>: | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
{ serial3_write(buffer, size); return size; } | |
virtual size_t write(const char *str) { size_t len = strlen(str); | |
serial3_write((const uint8_t *)str, len); | |
return len; } | |
virtual size_t write9bit(uint32_t c) { serial3_putchar(c); return 1; } | |
29c2: b508 push {r3, lr} | |
29c4: 4608 mov r0, r1 | |
29c6: f7ff fd17 bl 23f8 <serial3_putchar> | |
29ca: 2001 movs r0, #1 | |
29cc: bd08 pop {r3, pc} | |
000029ce <_ZN15HardwareSerial35writeEPKhj>: | |
virtual size_t write(uint8_t c) { serial3_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
29ce: b510 push {r4, lr} | |
{ serial3_write(buffer, size); return size; } | |
29d0: 4608 mov r0, r1 | |
virtual size_t write(uint8_t c) { serial3_putchar(c); return 1; } | |
virtual size_t write(unsigned long n) { return write((uint8_t)n); } | |
virtual size_t write(long n) { return write((uint8_t)n); } | |
virtual size_t write(unsigned int n) { return write((uint8_t)n); } | |
virtual size_t write(int n) { return write((uint8_t)n); } | |
virtual size_t write(const uint8_t *buffer, size_t size) | |
29d2: 4614 mov r4, r2 | |
{ serial3_write(buffer, size); return size; } | |
29d4: 4611 mov r1, r2 | |
29d6: f7ff fd59 bl 248c <serial3_write> | |
29da: 4620 mov r0, r4 | |
29dc: bd10 pop {r4, pc} | |
000029de <_ZN15HardwareSerial35writeEPKc>: | |
virtual size_t write(const char *str) { size_t len = strlen(str); | |
29de: b538 push {r3, r4, r5, lr} | |
29e0: 4608 mov r0, r1 | |
29e2: 460d mov r5, r1 | |
29e4: f000 f83c bl 2a60 <strlen> | |
29e8: 4604 mov r4, r0 | |
serial3_write((const uint8_t *)str, len); | |
29ea: 4621 mov r1, r4 | |
29ec: 4628 mov r0, r5 | |
29ee: f7ff fd4d bl 248c <serial3_write> | |
return len; } | |
29f2: 4620 mov r0, r4 | |
29f4: bd38 pop {r3, r4, r5, pc} | |
000029f6 <_Z12serialEvent3v>: | |
#include "HardwareSerial.h" | |
HardwareSerial3 Serial3; | |
void serialEvent3() __attribute__((weak)); | |
void serialEvent3() {} | |
29f6: 4770 bx lr | |
000029f8 <_GLOBAL__sub_I_Serial3>: | |
29f8: 4b04 ldr r3, [pc, #16] ; (2a0c <_GLOBAL__sub_I_Serial3+0x14>) | |
29fa: 2200 movs r2, #0 | |
29fc: 711a strb r2, [r3, #4] | |
29fe: f44f 717a mov.w r1, #1000 ; 0x3e8 | |
2a02: 731a strb r2, [r3, #12] | |
operator bool() { return true; } | |
}; | |
extern HardwareSerial2 Serial2; | |
extern void serialEvent2(void); | |
class HardwareSerial3 : public HardwareSerial | |
2a04: 4a02 ldr r2, [pc, #8] ; (2a10 <_GLOBAL__sub_I_Serial3+0x18>) | |
2a06: 6099 str r1, [r3, #8] | |
2a08: 601a str r2, [r3, #0] | |
2a0a: 4770 bx lr | |
2a0c: 1fffe914 .word 0x1fffe914 | |
2a10: 00002cf0 .word 0x00002cf0 | |
00002a14 <__libc_init_array>: | |
2a14: b570 push {r4, r5, r6, lr} | |
2a16: 4b0e ldr r3, [pc, #56] ; (2a50 <__libc_init_array+0x3c>) | |
2a18: 4d0e ldr r5, [pc, #56] ; (2a54 <__libc_init_array+0x40>) | |
2a1a: 1aed subs r5, r5, r3 | |
2a1c: 10ad asrs r5, r5, #2 | |
2a1e: 2400 movs r4, #0 | |
2a20: 461e mov r6, r3 | |
2a22: 42ac cmp r4, r5 | |
2a24: d004 beq.n 2a30 <__libc_init_array+0x1c> | |
2a26: f856 2024 ldr.w r2, [r6, r4, lsl #2] | |
2a2a: 4790 blx r2 | |
2a2c: 3401 adds r4, #1 | |
2a2e: e7f8 b.n 2a22 <__libc_init_array+0xe> | |
2a30: f000 f98a bl 2d48 <_init> | |
2a34: 4d08 ldr r5, [pc, #32] ; (2a58 <__libc_init_array+0x44>) | |
2a36: 4b09 ldr r3, [pc, #36] ; (2a5c <__libc_init_array+0x48>) | |
2a38: 1aed subs r5, r5, r3 | |
2a3a: 10ad asrs r5, r5, #2 | |
2a3c: 2400 movs r4, #0 | |
2a3e: 461e mov r6, r3 | |
2a40: 42ac cmp r4, r5 | |
2a42: d004 beq.n 2a4e <__libc_init_array+0x3a> | |
2a44: f856 2024 ldr.w r2, [r6, r4, lsl #2] | |
2a48: 4790 blx r2 | |
2a4a: 3401 adds r4, #1 | |
2a4c: e7f8 b.n 2a40 <__libc_init_array+0x2c> | |
2a4e: bd70 pop {r4, r5, r6, pc} | |
2a50: 00002d54 .word 0x00002d54 | |
2a54: 00002d54 .word 0x00002d54 | |
2a58: 00002d70 .word 0x00002d70 | |
2a5c: 00002d54 .word 0x00002d54 | |
00002a60 <strlen>: | |
2a60: 4603 mov r3, r0 | |
2a62: f813 2b01 ldrb.w r2, [r3], #1 | |
2a66: 2a00 cmp r2, #0 | |
2a68: d1fb bne.n 2a62 <strlen+0x2> | |
2a6a: 1a18 subs r0, r3, r0 | |
2a6c: 3801 subs r0, #1 | |
2a6e: 4770 bx lr | |
2a70: 75746573 .word 0x75746573 | |
2a74: 65622070 .word 0x65622070 | |
2a78: 006e6967 .word 0x006e6967 | |
2a7c: 75746573 .word 0x75746573 | |
2a80: 3270 .short 0x3270 | |
... | |
00002a83 <heatmap_gp>: | |
2a83: 0000 0000 ff80 0000 ffe0 00ff ffff ffff ................ | |
2a93: 40ff . | |
00002a94 <digital_pin_to_info_PGM>: | |
2a94: 0840 43fe a040 4004 0844 43fe a044 4004 @..C@[email protected]..@ | |
2aa4: 1800 43fe c000 4004 0030 43fe 9030 4004 [email protected]..@ | |
2ab4: 0034 43fe 9034 4004 181c 43fe c01c 4004 [email protected]...@ | |
2ac4: 1810 43fe c010 4004 1808 43fe c008 4004 [email protected]...@ | |
2ad4: 180c 43fe c00c 4004 100c 43fe b00c 4004 [email protected]...@ | |
2ae4: 1010 43fe b010 4004 1018 43fe b018 4004 [email protected]...@ | |
2af4: 101c 43fe b01c 4004 1014 43fe b014 4004 [email protected]...@ | |
2b04: 1804 43fe c004 4004 1000 43fe b000 4004 [email protected]...@ | |
2b14: 0800 43fe a000 4004 0804 43fe a004 4004 [email protected]...@ | |
2b24: 080c 43fe a00c 4004 0808 43fe a008 4004 [email protected]...@ | |
2b34: 1814 43fe c014 4004 1818 43fe c018 4004 [email protected]...@ | |
2b44: 1004 43fe b004 4004 1008 43fe b008 4004 [email protected]...@ | |
2b54: 0014 43fe 9014 4004 084c 43fe a04c 4004 [email protected]..@ | |
2b64: 2004 43fe d004 4004 1024 43fe b024 4004 . .C...@$..C$..@ | |
2b74: 1020 43fe b020 4004 1028 43fe b028 4004 ..C ..@(..C(..@ | |
2b84: 102c 43fe b02c 4004 2000 43fe d000 4004 ,..C,..@. .C...@ | |
2b94: 0848 43fe a048 4004 0010 43fe 9010 4004 [email protected]...@ | |
2ba4: 0a0d ffff .... | |
00002ba8 <_ZTV16usb_serial_class>: | |
... | |
2bb0: 1415 0000 141b 0000 1401 0000 1405 0000 ................ | |
2bc0: 1409 0000 140d 0000 1411 0000 0000 0000 ................ | |
00002bd0 <usb_endpoint_config_table>: | |
2bd0: 1500 1519 .... | |
00002bd4 <usb_descriptor_list>: | |
2bd4: 0100 0000 e56a 1fff 0012 0000 0200 0000 ....j........... | |
2be4: e594 1fff 0043 0000 0300 0000 e5ee 1fff ....C........... | |
2bf4: 0000 0000 0301 0409 e57c 1fff 0000 0000 ........|....... | |
2c04: 0302 0409 e5d8 1fff 0000 0000 0303 0409 ................ | |
2c14: e5f2 1fff 0000 0000 0000 0000 0000 0000 ................ | |
2c24: 0000 0000 .... | |
00002c28 <_ZTV14HardwareSerial>: | |
... | |
2c30: 2797 0000 27af 0000 277f 0000 2787 0000 .'...'...'...'.. | |
2c40: 2783 0000 278b 0000 2715 0000 2727 0000 .'...'...'..''.. | |
2c50: 2747 0000 274b 0000 2751 0000 2757 0000 G'..K'..Q'..W'.. | |
2c60: 275f 0000 276f 0000 278f 0000 2793 0000 _'..o'...'...'.. | |
2c70: 26e5 0000 26f1 0000 26fd 0000 2709 0000 .&...&...&...'.. | |
2c80: 27bf 0000 27a3 0000 .'...'.. | |
00002c88 <_ZTV15HardwareSerial2>: | |
... | |
2c90: 28a7 0000 28bf 0000 288f 0000 2897 0000 .(...(...(...(.. | |
2ca0: 2893 0000 289b 0000 2825 0000 2837 0000 .(...(..%(..7(.. | |
2cb0: 2857 0000 285b 0000 2861 0000 2867 0000 W(..[(..a(..g(.. | |
2cc0: 286f 0000 287f 0000 289f 0000 28a3 0000 o(...(...(...(.. | |
2cd0: 27f5 0000 2801 0000 280d 0000 2819 0000 .'...(...(...(.. | |
2ce0: 28cf 0000 28b3 0000 .(...(.. | |
00002ce8 <_ZTV15HardwareSerial3>: | |
... | |
2cf0: 29b7 0000 29cf 0000 299f 0000 29a7 0000 .)...)...)...).. | |
2d00: 29a3 0000 29ab 0000 2935 0000 2947 0000 .)...)..5)..G).. | |
2d10: 2967 0000 296b 0000 2971 0000 2977 0000 g)..k)..q)..w).. | |
2d20: 297f 0000 298f 0000 29af 0000 29b3 0000 .)...)...)...).. | |
2d30: 2905 0000 2911 0000 291d 0000 2929 0000 .)...)...)..)).. | |
2d40: 29df 0000 29c3 0000 .)...).. | |
00002d48 <_init>: | |
2d48: b5f8 push {r3, r4, r5, r6, r7, lr} | |
2d4a: bf00 nop | |
2d4c: bcf8 pop {r3, r4, r5, r6, r7} | |
2d4e: bc08 pop {r3} | |
2d50: 469e mov lr, r3 | |
2d52: 4770 bx lr | |
00002d54 <__init_array_start>: | |
2d54: 00000435 .word 0x00000435 | |
2d58: 000005b1 .word 0x000005b1 | |
2d5c: 000005c5 .word 0x000005c5 | |
2d60: 00001425 .word 0x00001425 | |
2d64: 000027d9 .word 0x000027d9 | |
2d68: 000028e9 .word 0x000028e9 | |
2d6c: 000029f9 .word 0x000029f9 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment