From: Manfred Steiner Date: Sun, 18 Aug 2024 09:25:40 +0000 (+0200) Subject: Test-Software test_2024-07-23 fertiggestellt X-Git-Tag: test-software/nano-1284/release/v2024-10-28_141638~10 X-Git-Url: https://git.htl-mechatronik.at/public/?a=commitdiff_plain;h=268719e1dcf32fbf071ae81fd76f77b2b5d982ac;p=nano-x-base.git Test-Software test_2024-07-23 fertiggestellt --- diff --git a/README.md b/README.md index 142b85f..9d64190 100644 --- a/README.md +++ b/README.md @@ -44,3 +44,65 @@ Vorne | Hinten ## Print-Layout (KiCad) * Version V1a: [Branch v1a](https://git.htl-mechatronik.at/public/?p=nano-x-base.git;a=blob;f=kicad/dist/v1a/README.md;hb=refs/heads/v1a) + +## Test-Software + +### Nano-644, Nano-1284 und Arduino Nano + +Die fertig übersetzten ELF-Dateien sind zu finden unter: +* Nano-644: [test_2024-07-23_nano-644.elf](software/nano-644/test_2024-07-23/release/v2024-08-18_1103/test_2024-07-23_nano-644.elf) +* Nano-1284: [test_2024-07-23_nano-1284p.elf](software/nano-1284/test_2024-07-23/release/v2024-08-18_1118/test_2024-07-23_nano-1284p.elf) +* Ardunino Nano (5V): [test_2024-07-23_nano-5v.elf](software/arduino-nano-5v/test_2024-07-23/release/v2024-08-18_1113/test_2024-07-23_nano-5v.elf) + +Entwicklungsumgebung: + +* Tool-Chain: GNU AVR C/C++, simuc (simavr) +* IDE: VS-Code +* Betriebssystem: Linux/Debian + +Software-Ordner je nach verwendetem µC: +* Nano-644 (3.3V): [software/nano-644/test_2024-07-23/](software/nano-644/test_2024-07-23/) +* Arduino Nano (5V): [software/arduino-nano-5v/test_2024-07-23/](software/arduino-nano-5v/test_2024-07-23/) +* Nano-1284 (3.3V): [software/nano-1284/test_2024-07-23/](software/nano-1284/test_2024-07-23/) + +Die Quelltexte sind im Ordner `software/nano-644/test_2024-07-23/src/` zu finden. In den anderen Ordnern ist der Ordner `src` nur ein symbolischer Link zu [software/nano-644/test_2024-07-23/src/](software/nano-644/test_2024-07-23/src/)! + +Das Programm kann mit `make flash` auf den jeweiligen Nano übertragen werden. Über die USB-Schnittstelle kann mittels Terminalprogramm (115200/8N1) (`make picocom`) die Verbindung hergestellt werden. + +Dort kann mittels Menüfunktion die entsprechende Baugruppe ausgewahlt und getestet werden. Für den Punkt `Modbus` ist der Anschluss eines modbusfähigen Energiezählers *Easton SDM230-Modbus* erforderlich. + +``` +==================================== + ATmega644P / Aug 18 2024 / 11:03:20 +==================================== + +Available units: + + 0 ... Led + 1 ... Switch + 2 ... Rgb + 3 ... Seg7 + 4 ... Poti + 5 ... Encoder + 6 ... R2R + 7 ... Motor + 8 ... PortExp + 9 ... Lcd + a ... Uart1 + b ... Modbus + c ... IEEE485 + d ... I2C-Master + e ... I2C-Slave + f ... I2C-Sparkfun Env-Combo + 10 ... RTC-8563 + 11 ... CC-1101-Send + 12 ... CC-1101-Receive + +Select unit: +``` + +### Raspberry Pico + +Für den Raspberry Pico steht derzeit nur ein kleines bereits übersetztes Programm zur Verfügung. + +[software/pico/nano-x-blink/](software/pico/nano-x-blink/) diff --git a/docs/v1a/messung/cc1101/osci/cc1101_01a_reset-1.png b/docs/v1a/messung/cc1101/osci/cc1101_01a_reset-1.png new file mode 100644 index 0000000..7ca20f2 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/cc1101_01a_reset-1.png differ diff --git a/docs/v1a/messung/cc1101/osci/cc1101_01b_reset-2.png b/docs/v1a/messung/cc1101/osci/cc1101_01b_reset-2.png new file mode 100644 index 0000000..e37eb4e Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/cc1101_01b_reset-2.png differ diff --git a/docs/v1a/messung/cc1101/osci/cc1101_01c_reset-3.png b/docs/v1a/messung/cc1101/osci/cc1101_01c_reset-3.png new file mode 100644 index 0000000..5047c30 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/cc1101_01c_reset-3.png differ diff --git a/docs/v1a/messung/cc1101/osci/cc1101_02a_init-register-1 b/docs/v1a/messung/cc1101/osci/cc1101_02a_init-register-1 new file mode 100644 index 0000000..d4bc9c2 --- /dev/null +++ b/docs/v1a/messung/cc1101/osci/cc1101_02a_init-register-1 @@ -0,0 +1,5 @@ + +[writeRegister(0x00, 0x29)]: IOCFG2 +[writeRegister(0x01, 0x2e)]: IOCFG1 +[writeRegister(0x02, 0x3e)]: IOCFG0: 0x3F (default) -> 0x3E => CLK_XOSC/192 -> CLK_XOSC/128 +[writeRegister(0x03, 0x47)] FIFTHR; FIFO_THR=7 -> Threshold: TX-FIFO: 33 Bytes, RX_FIFO: 32 Bytes diff --git a/docs/v1a/messung/cc1101/osci/cc1101_02a_init-register-1.png b/docs/v1a/messung/cc1101/osci/cc1101_02a_init-register-1.png new file mode 100644 index 0000000..f21b6af Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/cc1101_02a_init-register-1.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01.png b/docs/v1a/messung/cc1101/osci/messung2/s-01.png new file mode 100644 index 0000000..cfd0b63 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01a.png b/docs/v1a/messung/cc1101/osci/messung2/s-01a.png new file mode 100644 index 0000000..73b0559 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01a.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01b-startcal.png b/docs/v1a/messung/cc1101/osci/messung2/s-01b-startcal.png new file mode 100644 index 0000000..c1636b0 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01b-startcal.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01c-bwboost.png b/docs/v1a/messung/cc1101/osci/messung2/s-01c-bwboost.png new file mode 100644 index 0000000..d07186b Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01c-bwboost.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01d-ifadcon.png b/docs/v1a/messung/cc1101/osci/messung2/s-01d-ifadcon.png new file mode 100644 index 0000000..29bfd6c Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01d-ifadcon.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01e-tx.png b/docs/v1a/messung/cc1101/osci/messung2/s-01e-tx.png new file mode 100644 index 0000000..1551174 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01e-tx.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01f-endcal.png b/docs/v1a/messung/cc1101/osci/messung2/s-01f-endcal.png new file mode 100644 index 0000000..838a28c Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01f-endcal.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01g-bytes-11.png b/docs/v1a/messung/cc1101/osci/messung2/s-01g-bytes-11.png new file mode 100644 index 0000000..df80b83 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01g-bytes-11.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01g-endcal.png b/docs/v1a/messung/cc1101/osci/messung2/s-01g-endcal.png new file mode 100644 index 0000000..ccea1fd Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01g-endcal.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01i-bytes-10.png b/docs/v1a/messung/cc1101/osci/messung2/s-01i-bytes-10.png new file mode 100644 index 0000000..191f67f Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01i-bytes-10.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01j-bytes-01.png b/docs/v1a/messung/cc1101/osci/messung2/s-01j-bytes-01.png new file mode 100644 index 0000000..f329161 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01j-bytes-01.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01k-bytes-00.png b/docs/v1a/messung/cc1101/osci/messung2/s-01k-bytes-00.png new file mode 100644 index 0000000..b6013bb Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01k-bytes-00.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01l-state-tx.png b/docs/v1a/messung/cc1101/osci/messung2/s-01l-state-tx.png new file mode 100644 index 0000000..8386c92 Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01l-state-tx.png differ diff --git a/docs/v1a/messung/cc1101/osci/messung2/s-01m.png b/docs/v1a/messung/cc1101/osci/messung2/s-01m.png new file mode 100644 index 0000000..06d31cc Binary files /dev/null and b/docs/v1a/messung/cc1101/osci/messung2/s-01m.png differ diff --git a/docs/v1a/messung/modbus/README.md b/docs/v1a/messung/modbus/README.md new file mode 100644 index 0000000..d9381ec --- /dev/null +++ b/docs/v1a/messung/modbus/README.md @@ -0,0 +1,59 @@ +# Messung Modbus + +![Schaltung](schaltung_nano-x-base-v1a_modbus.svg) + +Modbusgerät: [Eastron SDM230-Modbus](https://www.eastroneurope.com/products/view/sdm230modbus) + +Modbus-Parameter: +* Modbus RTU +* 9600 Bit/s, 8N1 +* Geräteadresse: 1 + +------------------------------------------- + +# Messung m1.png + +![m1.png](m1.png) + +Kein zusätzlicher 100µF Elko Versorgung des Motor-Treiber IC U6 +* Kanal 1 (blau): UART TxD1 +* Kanal 2 (rot):UART RxD1 +* Kanal 3 (grün): DE Signal (PB1) +* Kanal 4 (orange): Modbus IEEE485 A +* B1: UART Dekodierung (Rigol MSO 1104 -> Math -> Decode RS232/9600/8N1) + +## Detail Paket 1: + +Modbus Request: Function Code 0x04 (Read Input Register): + +* `0x01`: Geräteadresse +* `0x04`: Modbus Function-Code (*Read Input Register*) +* `0x00 0x00`: Register-Startadresse +* `0x00 0x02`: Anzahl der Register +* `0x71`: Modbus-CRC Low-Byte +* `0xcb`: Modbus-CRC High-Byte + +Nach dem Request muss das DE-Signal auf `0` wechseln, damit die Antwort vom Modbus-Slave empfangen werden kann. + +![m2.png](m2.png) + +## Detail Paket 2: + +* `0x01`: Geräteadresse +* `0x04`: Modbus Function-Code (*Read Input Register*) +* `0x04`: Anzahl der Daten-Bytes (= 2 Register) +* `0x43 0x6d`: Register 0 +* `0x92 0x27`: Register 1 +* `0x52`: Modbus-CRC Low-Byte +* `0xa7`: Modbus-CRC High-Byte + +Register 0:1 bilden den 32-Bit IEEE-754 Float Wert der Spannung: +``` +0x436d9227 -> 237.5709 +``` + + +![m3.png](m3.png) + + + diff --git a/docs/v1a/messung/modbus/m1.png b/docs/v1a/messung/modbus/m1.png new file mode 100644 index 0000000..13e6420 Binary files /dev/null and b/docs/v1a/messung/modbus/m1.png differ diff --git a/docs/v1a/messung/modbus/m2.png b/docs/v1a/messung/modbus/m2.png new file mode 100644 index 0000000..09defda Binary files /dev/null and b/docs/v1a/messung/modbus/m2.png differ diff --git a/docs/v1a/messung/modbus/m3.png b/docs/v1a/messung/modbus/m3.png new file mode 100644 index 0000000..d359a8e Binary files /dev/null and b/docs/v1a/messung/modbus/m3.png differ diff --git a/docs/v1a/messung/modbus/schaltung_nano-x-base-v1a_modbus.pdf b/docs/v1a/messung/modbus/schaltung_nano-x-base-v1a_modbus.pdf new file mode 100644 index 0000000..1f5e90e Binary files /dev/null and b/docs/v1a/messung/modbus/schaltung_nano-x-base-v1a_modbus.pdf differ diff --git a/docs/v1a/messung/modbus/schaltung_nano-x-base-v1a_modbus.svg b/docs/v1a/messung/modbus/schaltung_nano-x-base-v1a_modbus.svg new file mode 100644 index 0000000..e5bb383 --- /dev/null +++ b/docs/v1a/messung/modbus/schaltung_nano-x-base-v1a_modbus.svg @@ -0,0 +1,41051 @@ + + + +SVG Image created as input-output.svg date 2024/07/29 15:15:41 + Image generated by Eeschema-SVG + + + + + + + + + + + +R60 +R60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +680R +680R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(2.2V/10mA) +Green +(2.2V/10mA) +Green + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(2.2V/10mA) +Green +(2.2V/10mA) +Green + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Yellow +(2.2V/10mA) +Yellow +(2.2V/10mA) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Yellow +(2.2V/10mA) +Yellow +(2.2V/10mA) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +11 +11 + + + + + + + + + + + + + + + +12 +12 + + + + + + + + + + + + + + + + + + + + +13 +13 + + + + + + + + + + + + + + + + + + + + + + + +14 +14 + + + + + + + + + + + + + +15 +15 + + + + + + + + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + +16 +16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A +A + + + + + +17 +17 + + + + + + + + + + + + +18 +18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +19 +19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +20 +20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +21 +21 + + + + + + + + + + + + + + + + + + + + +22 +22 + + + + + + + + + + + + + + + + + + + + + + + + + +23 +23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +24 +24 + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +A +A + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +9 +9 + + + + + + + + + + + + + + + + + + + + + + + + + + + +SH + +SH + + + + + + + + + + + + + + + + + + + + + + + + + +SH + +SH + + + + + + + + + + + + + + + + + + + + + + + + +J6 +J6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++4V7 ++4V7 + + + + + + + + + + + + + + + + + + +R59 +R59 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +680R +680R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Nano-644 / Arduino Nano + +Nano-644 / Arduino Nano + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TxD0 +TxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +PB2/INT2/AIN0 +PB2/INT2/AIN0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB1/CLKO/T1 +PB1/CLKO/T1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +11 +11 + + + + + + + + + + + + + + + +PD5/OC1A +PD5/OC1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +12 +12 + + + + + + + + + + + + + + + + + + + + +~{SS}/PB4/OC0B +~{SS}/PB4/OC0B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +13 +13 + + + + + + + + + + + + + + + + + + + + + + + +MOSI/PB5 +MOSI/PB5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +14 +14 + + + + + + + + + + + + + +MISO/PB6 +MISO/PB6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +15 +15 + + + + + + + + + + + + + + + + + + + + + + + + + +SCK/PB7 +SCK/PB7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +16 +16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++3V3-OUT ++3V3-OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +17 +17 + + + + + + + + + + + + +AREF +AREF + + + + + + + + + + + + + + + + + + + + + + + +18 +18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA0/ADC0 +PA0/ADC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +19 +19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RxD0 +RxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +PA1/ADC1 +PA1/ADC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +20 +20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA2/ADC2 +PA2/ADC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +21 +21 + + + + + + + + + + + + + + + + + + + + +PA3/ADC3 +PA3/ADC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +22 +22 + + + + + + + + + + + + + + + + + + + + + + + + + + +SDA/PC1 + +SDA/PC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +23 + +23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SCL/PC0 + +SCL/PC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +24 + +24 + + + + + + + + + + + + + + + + + + +PA6/ADC6 +PA6/ADC6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +25 +25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA7/ADC7 +PA7/ADC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +26 +26 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5V-OUT +5V-OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +27 +27 + + + + + + + + + + + + + + + + + +~{RESET} +~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +28 +28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +29 +29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +~{RESET} +~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +5V-IN +5V-IN + + + + + + + + + + + + + + + + + + + + + + + + +30 +30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TxD1 +TxD1 + + + + + + + + + + + + + + + + + + + + + + + +31 +31 + + + + + + + + + + + + + + + + + + + + + + + +RxD1 +RxD1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +32 +32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +33 +33 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +PD7/OC2A +PD7/OC2A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +PD6/ICP1/OC2B +PD6/ICP1/OC2B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +PB0/T0 +PB0/T0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + +PD4/OC1B/XCK1 +PD4/OC1B/XCK1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB3/OC0A/AIN1 +PB3/OC0A/AIN1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +9 +9 + + + + + + + + + + + + + + + + + + + + + + + +CN1A +CN1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++3V3 ++3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + +J34 +J34 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R1 +R1 + + + + + + + + + + + + + + + + +10R +10R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R61 +R61 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +120R +120R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++3V3 ++3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R62 +R62 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +10R +10R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J1 +J1 + + + + + + + + + + + + + + + + + + + +R2 +R2 + + + + + + + + + + + + + + + + + + + + + +10R +10R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R64 +R64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +470K +470K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R65 +R65 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +470K +470K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++3V3 ++3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + +J29 +J29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + +D19 +D19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SM712 +SM712 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C13 +C13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +100nF +100nF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + +J21 +J21 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +blue + +blue + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + +J7 +J7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RO +RO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +~{RE} +~{RE} + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +DE +DE + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +DI +DI + + + + + + + + + + + + + + + +4 +4 + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5 + +5 + + + + + + + + + + + + + + + + + + + + +A +A + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + + +3V3 + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8 + +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +U5 +U5 + + + + + + + + + + + + + + + + + + + + + + + + +SN65HVD11 +SN65HVD11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++3V3 ++3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R66 +R66 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +470K +470K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + +J35 +J35 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + +J19 +J19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + +J20 +J20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R63 +R63 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +10R +10R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J2 +J2 + + + + + + + + + + + + + + + + + + + + + + + ++3V3 ++3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R76 +R76 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +120R +120R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R73 +R73 + + + + + + + + + + + + + + + + + + + + + + + + + + +120R +120R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R74 +R74 + + + + + + + + + + + + + + + + +120R +120R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++3V3 ++3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R75 +R75 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +120R +120R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +M-RxD +M-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PI-TxD +PI-TxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB1/T1/M-DE +PB1/T1/M-DE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +M-TxD +M-TxD + + + + + + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + +J1-TxD +J1-TxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +M-TxD +M-TxD + + + + + + + + + + + + + + + + + + + + + + + +PB0/T0/~{M-RE} +PB0/T0/~{M-RE} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A +A + + + + + +M-RxD +M-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C-RxD1 +C-RxD1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J1-RxD +J1-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB0/T0/~{M-RE} +PB0/T0/~{M-RE} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB1/T1/M-DE +PB1/T1/M-DE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TxD1 +TxD1 + + + + + + + + + + + + + + + + + + + + + + + +RxD1 +RxD1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PI-RxD +PI-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C-TxD1 +C-TxD1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R73 +R73 + + + + + + + + + + + + + + + + + + + + + + + + + + +120R +120R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R2 +R2 + + + + + + + + + + + + + + + + + + + + + +10R +10R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R1 +R1 + + + + + + + + + + + + + + + + +10R +10R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CN1A +CN1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TxD0 +TxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +PB2/INT2/AIN0 +PB2/INT2/AIN0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB1/CLKO/T1 +PB1/CLKO/T1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +11 +11 + + + + + + + + + + + + + + + +PD5/OC1A +PD5/OC1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +12 +12 + + + + + + + + + + + + + + + + + + + + +~{SS}/PB4/OC0B +~{SS}/PB4/OC0B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +13 +13 + + + + + + + + + + + + + + + + + + + + + + + +MOSI/PB5 +MOSI/PB5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +14 +14 + + + + + + + + + + + + + +MISO/PB6 +MISO/PB6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +15 +15 + + + + + + + + + + + + + + + + + + + + + + + + + +SCK/PB7 +SCK/PB7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +16 +16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++3V3-OUT ++3V3-OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +17 +17 + + + + + + + + + + + + +AREF +AREF + + + + + + + + + + + + + + + + + + + + + + + +18 +18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA0/ADC0 +PA0/ADC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +19 +19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RxD0 +RxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +PA1/ADC1 +PA1/ADC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +20 +20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA2/ADC2 +PA2/ADC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +21 +21 + + + + + + + + + + + + + + + + + + + + +PA3/ADC3 +PA3/ADC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +22 +22 + + + + + + + + + + + + + + + + + + + + + + + + + + +SDA/PC1 + +SDA/PC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +23 + +23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SCL/PC0 + +SCL/PC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +24 + +24 + + + + + + + + + + + + + + + + + + +PA6/ADC6 +PA6/ADC6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +25 +25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA7/ADC7 +PA7/ADC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +26 +26 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5V-OUT +5V-OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +27 +27 + + + + + + + + + + + + + + + + + +~{RESET} +~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +28 +28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +29 +29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +~{RESET} +~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +5V-IN +5V-IN + + + + + + + + + + + + + + + + + + + + + + + + +30 +30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TxD1 +TxD1 + + + + + + + + + + + + + + + + + + + + + + + +31 +31 + + + + + + + + + + + + + + + + + + + + + + + +RxD1 +RxD1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +32 +32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +33 +33 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +PD7/OC2A +PD7/OC2A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +PD6/ICP1/OC2B +PD6/ICP1/OC2B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +PB0/T0 +PB0/T0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + +PD4/OC1B/XCK1 +PD4/OC1B/XCK1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB3/OC0A/AIN1 +PB3/OC0A/AIN1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +9 +9 + + + + + + + + + + + + + + + + + + + + + + + +D19 +D19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SM712 +SM712 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + +J6 +J6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +11 +11 + + + + + + + + + + + + + + + +12 +12 + + + + + + + + + + + + + + + + + + + + +13 +13 + + + + + + + + + + + + + + + + + + + + + + + +14 +14 + + + + + + + + + + + + + +15 +15 + + + + + + + + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + +16 +16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A +A + + + + + +17 +17 + + + + + + + + + + + + +18 +18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +19 +19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +20 +20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +21 +21 + + + + + + + + + + + + + + + + + + + + +22 +22 + + + + + + + + + + + + + + + + + + + + + + + + + +23 +23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +24 +24 + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +A +A + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +9 +9 + + + + + + + + + + + + + + + + + + + + + + + + + + + +SH + +SH + + + + + + + + + + + + + + + + + + + + + + + + + +SH + +SH + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J20 +J20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + +U5 +U5 + + + + + + + + + + + + + + + + + + + + + + + + +SN65HVD11 +SN65HVD11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RO +RO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +~{RE} +~{RE} + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +DE +DE + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +DI +DI + + + + + + + + + + + + + + + +4 +4 + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5 + +5 + + + + + + + + + + + + + + + + + + + + +A +A + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + +7 +7 + + + + + + + + +3V3 + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8 + +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J29 +J29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/v1a/messung/motor/README.md b/docs/v1a/messung/motor/README.md new file mode 100644 index 0000000..d3541a9 --- /dev/null +++ b/docs/v1a/messung/motor/README.md @@ -0,0 +1,93 @@ +# Messung Motorendstufe + +![Schaltung](schaltung-motor.svg) + +Motortreiber: MP6610 +[https://wmsc.lcsc.com/wmsc/upload/file/pdf/v2/lcsc/2403151634_Monolithic-Power-Systems-MP6610GS-Z_C3655415.pdf](https://wmsc.lcsc.com/wmsc/upload/file/pdf/v2/lcsc/2403151634_Monolithic-Power-Systems-MP6610GS-Z_C3655415.pdf) + +Motor: PPN7PA12C1 +[https://www.digikey.at/de/products/detail/nmb-technologies-corporation/PPN7PA12C1/2417079](https://www.digikey.at/de/products/detail/nmb-technologies-corporation/PPN7PA12C1/2417079) + +Motordaten: +* 5V DC Motor +* Spannungsbereich: 1V .. 7V +* Leerlaufstrom: 120mA (14000 min-1) +* Anlaufstrom: 1.3A +* Anlaufmoment: 2.6mNm (+/-25%) +* Ohmscher Widerstand: 4.4Ohm (+/-10%) +* Normallast: 0.49mNm (11600min-1) + +Zusätzlicher 3K3 Widerstand zwischen Ausgang U12 (OPV) und Masse, sonst hochfrequentes Aufschwingen des Stromsignals. + +## Messung m1.png + +Normaler Laufbetrieb: PWM 185Hz, 78% Duty-Dycle (4.2ms ON, 1.2ms OFF) + +Starke Überschwinger am 5V Netz auf bis zu 8V! + +![m1-1.png](m1-1.png) + +Kein zusätzlicher 100µF Elko Versorgung des Motor-Treiber IC U6 +* Kanal 1 (blau): PWM Signal OC0A (PB3) +* Kanal 2 (rot): Motor + +* Kanal 3 (grün): Motorstrom (1A/V) (V-R68) +* Kanal 4 (orange): 5V am Nano-X-Board + +Detail (ab 0ms): +![m1-2.png](m1-2.png) + +----------------------------------------- + +## Messung m2.png + +Motor blockiert: PWM 185Hz, 44% Duty-Dycle (2.4ms ON, 3ms OFF) + +Überstromabschaltung durch Motortreiber. + +![m2-1.png](m2-1.png) + +* Kanal 1 (blau): PWM Signal OC0A (PB3) +* Kanal 2 (rot): Motor + +* Kanal 3 (grün): Motorstrom (1A/V) (V-R68) +* Kanal 4 (orange): 5V am Nano-X-Board + +Detail (ab -0.8ms): +![m2-2.png](m2-2.png) + +----------------------------------------- + +## Messung m3.png + +Motor blockiert: PWM 185Hz, 44% Duty-Dycle (2.4ms ON, 3ms OFF) + +Überstromabschaltung durch Motortreiber. +Strom begrenzt auf ca. 0.6A (2.5V) +Müsste eigentlich laut Datenblatt 1,5A sein -> ??? + + +![m3-1.png](m3-1.png) + +* Kanal 1 (blau): PWM Signal OC0A (PB3) +* Kanal 2 (rot): Motor + +* Kanal 3 (grün): Motorstrom (4.13V/A) OPV Ausgang +* Kanal 4 (orange): 5V am Nano-X-Board + +Detail (ab 0ms): +![m3-2.png](m3-2.png) + +----------------------------------------- + +## Messung m4.png + +Normaler Laufbetrieb: PWM 185Hz, 78% Duty-Dycle (4.2ms ON, 1ms OFF) + +5V Überspannung durch zusätzlich 100µF Elko reduziert. + +![m4.png](m4.png) + +100µF Elko zusätzlich zu C5(100nF) und C14(10uF) an Versorgung des Motor-Treiber IC U6 +* Kanal 1 (gelb): PWM Signal OC0A (PB3) +* Kanal 2 (hellblau): Motor + +* Kanal 3 (Magenta): VIN an Nano-644 (5V USB) +* Kanal 4 (dunkelblau): 5V am Nano-X-Board + diff --git a/docs/v1a/messung/motor/m1-1.png b/docs/v1a/messung/motor/m1-1.png new file mode 100644 index 0000000..ee1ae2e Binary files /dev/null and b/docs/v1a/messung/motor/m1-1.png differ diff --git a/docs/v1a/messung/motor/m1-2.png b/docs/v1a/messung/motor/m1-2.png new file mode 100644 index 0000000..2785c1a Binary files /dev/null and b/docs/v1a/messung/motor/m1-2.png differ diff --git a/docs/v1a/messung/motor/m2-1.png b/docs/v1a/messung/motor/m2-1.png new file mode 100644 index 0000000..87d1a0b Binary files /dev/null and b/docs/v1a/messung/motor/m2-1.png differ diff --git a/docs/v1a/messung/motor/m2-2.png b/docs/v1a/messung/motor/m2-2.png new file mode 100644 index 0000000..6b4f088 Binary files /dev/null and b/docs/v1a/messung/motor/m2-2.png differ diff --git a/docs/v1a/messung/motor/m3-1.png b/docs/v1a/messung/motor/m3-1.png new file mode 100644 index 0000000..85f3fa4 Binary files /dev/null and b/docs/v1a/messung/motor/m3-1.png differ diff --git a/docs/v1a/messung/motor/m3-2.png b/docs/v1a/messung/motor/m3-2.png new file mode 100644 index 0000000..c92506d Binary files /dev/null and b/docs/v1a/messung/motor/m3-2.png differ diff --git a/docs/v1a/messung/motor/m4.png b/docs/v1a/messung/motor/m4.png new file mode 100644 index 0000000..41df7ac Binary files /dev/null and b/docs/v1a/messung/motor/m4.png differ diff --git a/docs/v1a/messung/motor/schaltung-motor.pdf b/docs/v1a/messung/motor/schaltung-motor.pdf new file mode 100644 index 0000000..9933a96 Binary files /dev/null and b/docs/v1a/messung/motor/schaltung-motor.pdf differ diff --git a/docs/v1a/messung/motor/schaltung-motor.svg b/docs/v1a/messung/motor/schaltung-motor.svg new file mode 100644 index 0000000..f1e01e8 --- /dev/null +++ b/docs/v1a/messung/motor/schaltung-motor.svg @@ -0,0 +1,4307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v1a/messung/rtc8563/README.md b/docs/v1a/messung/rtc8563/README.md new file mode 100644 index 0000000..07acf46 --- /dev/null +++ b/docs/v1a/messung/rtc8563/README.md @@ -0,0 +1,127 @@ +# Messung RTC PCF8563 + +![Schaltung](schaltung-nano-644-v1a.svg) + +RTC: [BM8563EMA](https://jlcpcb.com/partdetail/Gatemode-BM8563EMA/C269878) +[https://wmsc.lcsc.com/wmsc/upload/file/pdf/v2/lcsc/2308181040_GATEMODE-BM8563EMA_C269878.pdf](https://wmsc.lcsc.com/wmsc/upload/file/pdf/v2/lcsc/2308181040_GATEMODE-BM8563EMA_C269878.pdf) + +## Zusammenfassung + +Die Abschaltung und der Wakeup via RTC Interrupt funktioniert. + +Falls der Q1 sperrt (C18 aufgeladen), kann ein "Wakeup" durch eines der folgenden Ereignisse erfolgen: +1) Wakeup durch RTC Interrupt +2) Von Batterie trennen, 5s warten und Batterie verbinden +3) ISP-Schnittstelle anstecken +4) PC7 mit GND verbinden, zB TP-PC67 Pin 2 -> GND (1mm Header beim USB-Stecker, Pin beim USB Stecker) + +Kein Wakeup erfolgt durch eines der folgenden Ereignisse: +1) Reset-Taster +2) USB-Schnittstelle (DTR) + +Eventuell Verbesserung bei nächster Print-Version möglich, zB nReset = 0 -> Transistor -> entladen von C18 -> Q1 schaltet ein + +## Vorbereitungen + +### **Nano-644** +* JP1: die mittleren Lötjumper-Pads sind zu verbinden +* J1: Batterie +3V -> VBAT, GND -> GND +* R5 (0R) zu entfernen + +Nach Anstecken der Batterie: +1) C18 ungeladen und Q1 schaltet durch +2) C18 ladet sich mit Tau von etwa 10Kx10u = 100ms. Q1-VGS -0.5..-1V ==> 0V -> 2V -> 2V/3V = 66.7% ==> t = 1.07xTau = 107ms. +3) Tatsächlich sind bereits 70ms nicht ausreichend um einen Hochlauf zu gewährleisten. Daher sind die Fuses so zu konfigurieren, dass ein Programm rasch startet und PC7 auf LOW zieht. + +### **Bootloader** + +Bootloader: [https://git.htl-mechatronik.at/public/?p=nano-644.git;a=tree;f=software/bootloader-arduino;hb=3a2252c99c0cefdfad723cadff2f9bd724b55bfe](https://git.htl-mechatronik.at/public/?p=nano-644.git;a=tree;f=software/bootloader-arduino;hb=3a2252c99c0cefdfad723cadff2f9bd724b55bfe) + +``` +# LFUSE=0xE7 -> startuptime 16K CLOCKS + 4.1ms -> 5.4ms +avrdude -c usbasp -p m644p -U lfuse:w:0xE7:m -U hfuse:w:0xD8:m -U efuse:w:0xFE:m -U lock:w:0xEF:m +``` +### **Programm** + +Ein Programm muss so wie der Bootloader PC7 auf LOW halten. Eine Abschaltung erfolgt dadurch, dass: + +1) Die RTC so konfiguriert wird, dass der Augang nINT (Open Drain) nicht aktiv ist und erst nach der gewünschten "Schlafzeit" auf LOW gezogen wird. + +2) Port PC7 auf HIGH geschaltet wird, der C18 beginnt sich aufzuladen. + +3) Da der C18 nicht vollständig aufgeladen auf 3V wird, besteht die Gefahr, dass der Q1 ncith abschaltet. Daher nach ca. 2..5ms den PC7 auf Input ohne Pull-Up konfigurieren. Dann kann sich C18 über R12(R13) weiter aufladen, und es ist eine sichere Abschaltung gewährleistet. + +Lösung-Quelltext: [https://git.htl-mechatronik.at/public/?p=nano-x-base.git;a=blob;f=software/nano-644/test_2024-07-23/src/units/rtc8563.cpp;h=ea8821eb932e2a535cdd3c585df41f23b0d91fa0;hb=refs/heads/w-v1a-2024-07-23#l202](https://git.htl-mechatronik.at/public/?p=nano-x-base.git;a=blob;f=software/nano-644/test_2024-07-23/src/units/rtc8563.cpp;h=ea8821eb932e2a535cdd3c585df41f23b0d91fa0;hb=refs/heads/w-v1a-2024-07-23#l202) + +----------------------------------------- + +## Messung "Batterie anstecken" + +* Bild 1: Kanal 1 (blau): Messung an PC7 + +![Bild 1 - Batterie anstecken](osci/osci-batt-on-01.png) + +----------------------------------------- + +## Messung "Batterie abstecken" + +* Bild 2: Kanal 1 (blau): Messung an VDD Versorgung des PCF8563 + +![Bild 2 - Batterie abstecken](osci/osci-batt-off-3v-VDD8563-no-usb.png) + +Es ist erkennbar, dass nach bereits 1.7s die 1V Schwelle erreicht wird. Ab diesem Zeitpunkt arbeitet die RTC nicht mehr zuverlässig. Vermutlich hört der Oszillator auf wodurch sich der Stromverbrauch reduziert und die Entladekurve flacher wird. + +Praktisch zeigt sich, dass erst nach einer Abschaltung von ca. 25s die RTC ihrer Einstellungen verliert. Ob, die Uhrzeit nach mehr als 1.5s Abschaltung noch korrekt ist wurde nicht geprüft. + +Der Entladungsgradient zu beginn lässt auf einen C1-Entladestrom von ca. 16µA schließen. Laut Datenbaltt dürften es nur 0.25µA sein! + +* Bild 3: Kanal 1 (blau): Messung an PC7 + +![Bild 3 - Batterie abstecken](osci/osci-batt-off-pc7-01.png) + +Es ist erkennbar, dass wenige Sekunden ausreichen, damit C18 ausreichend entladen wird, und bei erneutem anstecken der Batterie ein sicherer Programmhochlauf möglich ist. + +----------------------------------------- + +## Messung "Abschaltung (via Programm)" + +Bild 4: +* Kanal 1 (blau): Messung an PC7 +* Kanal 2 (rot): Messung an 3V3-RTC (?) +* Der nInt Ausgang des RTC-Chip ist bei dieser Messung nicht aktiv! + +![Bild 4 - Abschaltung](osci/osci-batt-pc7_to_high.png) + +Es ist recht gut zu erkennen das bei PC7=HIGH es etwa 500µS dauert bis der C18 geladen ist. Die Aufladung reicht nicht aus um Q1 abzuschalten. Es reduziert sich lediglich die Spannung von 3V auf ca. 2.2V. + +![Bild 5 - Abschaltung](osci/osci-batt-pc7_to_high_rtc-int-not-to-low.png) + +Erst nach etwa 5ms schaltet der µC den PC7 auf Input ohne Pullup wodurch der C18 sich weiter aufladet und schließlich der Q1 abdreht (3V3 sinkt unter PC7). + +----------------------------------------- + +## Messung "Wakeup" + +Bild 4: +* Kanal 1 (blau): Messung an PC7 +* Kanal 2 (rot): Messung an 3V3-RTC (?) +* Der nInt Ausgang des RTC-Chip wird bei ca. 1.5s vom RTC aktiv nach unten gezogen. + +![Bild 6 - Wakeup](osci/osci-batt-pc7_to_high_wakeup_by_rtc.png) + +Nach ca. 5s erfolgt der Wakeup des µC durch einen RTC Timer-Interrupt. + +Die Spannung an PC7 ist über dem 3V3-RTC Netz, daher ist der Q1 sicher gesperrt (UGS ca. +0.3V, Q1 wird bei UGS=-0.5...-1V leitend). + +----------------------------------------- + +## Messung "nINT LOW" + +Was passiert mit dem PC7 wenn der RTC den nINT aktiv auf LOW zieht und der µC den PC7 auf HIGH? + +![Bild 7 - PC7](osci/osci-batt-pc7_to_high_rtc-int-to-low.png) + +PC7 erreicht nur ca. 2.2V, wodurch keine Abschaltung erfolgen kann. Daher ist bei einer Abschaltung sicherzustellen, dass der RTC den nINT Pin nicht aktiv auf LOW zieht. Es ist daher das Timer-Flag bzw. Alarm-Flag zu löschen, bevor die Abschaltung mit PC7=1 eingeleitet wird. + + + diff --git a/docs/v1a/messung/rtc8563/osci/osci-batt-off-3v-VDD8563-no-usb.png b/docs/v1a/messung/rtc8563/osci/osci-batt-off-3v-VDD8563-no-usb.png new file mode 100644 index 0000000..64df360 Binary files /dev/null and b/docs/v1a/messung/rtc8563/osci/osci-batt-off-3v-VDD8563-no-usb.png differ diff --git a/docs/v1a/messung/rtc8563/osci/osci-batt-off-pc7-01.png b/docs/v1a/messung/rtc8563/osci/osci-batt-off-pc7-01.png new file mode 100644 index 0000000..44aacfd Binary files /dev/null and b/docs/v1a/messung/rtc8563/osci/osci-batt-off-pc7-01.png differ diff --git a/docs/v1a/messung/rtc8563/osci/osci-batt-on-01.png b/docs/v1a/messung/rtc8563/osci/osci-batt-on-01.png new file mode 100644 index 0000000..8ec1687 Binary files /dev/null and b/docs/v1a/messung/rtc8563/osci/osci-batt-on-01.png differ diff --git a/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high.png b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high.png new file mode 100644 index 0000000..55c6432 Binary files /dev/null and b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high.png differ diff --git a/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_rtc-int-not-to-low.png b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_rtc-int-not-to-low.png new file mode 100644 index 0000000..9d593e2 Binary files /dev/null and b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_rtc-int-not-to-low.png differ diff --git a/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_rtc-int-to-low.png b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_rtc-int-to-low.png new file mode 100644 index 0000000..fd771e5 Binary files /dev/null and b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_rtc-int-to-low.png differ diff --git a/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_wakeup_by_rtc.png b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_wakeup_by_rtc.png new file mode 100644 index 0000000..7e70de8 Binary files /dev/null and b/docs/v1a/messung/rtc8563/osci/osci-batt-pc7_to_high_wakeup_by_rtc.png differ diff --git a/docs/v1a/messung/rtc8563/schaltung-nano-644-v1a.svg b/docs/v1a/messung/rtc8563/schaltung-nano-644-v1a.svg new file mode 100644 index 0000000..feaa713 --- /dev/null +++ b/docs/v1a/messung/rtc8563/schaltung-nano-644-v1a.svg @@ -0,0 +1,32200 @@ + + + + SVG Image created as nano-644.svg date 2024/08/17 15:47:32 + Image generated by Eeschema-SVG + + + + + + + + + + R7 + + R7 + + + + + + + + + + + + + + + 68K + + 68K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C4 + + C4 + + + + + + + + + + + + + + + + + + + + 22n + + 22n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R6 + + R6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15K + + 15K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BS + + BS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + 2 + + + + + + + + + + + + + + + + + FB + + FB + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + EN + + EN + + + + + + + + + + + 4 + + 4 + + + + + + + + + + VIN + + VIN + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + SW + + SW + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + U2 + + U2 + + + + + + + + + + + + + + + + + + + + + HD9108 + + HD9108 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R11 + + R11 + + + + + + + + + + + + + + + + + + + + + + + 100K + + 100K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Black + + Black + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SW2 + + SW2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + TP-PC67 + + TP-PC67 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C3 + + C3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4u7 + + 4u7 + + + + + + + + + + + + + + + + X7R + + X7R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + TP-GDO02 + + TP-GDO02 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R15 + + R15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100R + + 100R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R4 + + R4 + + + + + + + + + + + + + + + + 10R + + 10R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + J4 + + J4 + + + + + + + + + + + + + + + + + + + + + + + R8 + + R8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10K + + 10K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MISO + + MISO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + SCK + + SCK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + MOSI + + MOSI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + J3 + + J3 + + + + + + + + + + + + + + + + + + + + ISP + + ISP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L1 + + L1 + + + + + + + + + 100uH + + 100uH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C1 + + C1 + + + + + + + + + + + + + + + + + + + + + + 22u + + 22u + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPI-MOSI + + SPI-MOSI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + UART0-TxD + + UART0-TxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UART1-RxD + + UART1-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + 11 + + + + + + + + + + + + + + + + + UART1-TxD + + UART1-TxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 + + 12 + + + + + + + + + + + + + + + + + + + + + + OC1B + + OC1B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + 13 + + + + + + + + + + + + + + + + + + + + + + + + + OC1A + + OC1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14 + + 14 + + + + + + + + + + + + + + + OC2B + + OC2B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + OC2A + + OC2A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 + + 17 + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 18 + + 18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I²C-SCL + + I²C-SCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 19 + + 19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPI-MISO + + SPI-MISO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + I²C-SDA + + I²C-SDA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + 20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC2 + + PC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 21 + + 21 + + + + + + + + + + + + + + + + + + + + + + PC3 + + PC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 22 + + 22 + + + + + + + + + + + + + + + + + + + + + + + + + + + PC4 + + PC4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 23 + + 23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC5 + + PC5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 24 + + 24 + + + + + + + + + + + + + + + + + + + + PC6 + + PC6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 25 + + 25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC7 + + PC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 26 + + 26 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AVCC + + AVCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 27 + + 27 + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 28 + + 28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AREF + + AREF + + + + + + + + + + + + + + + + + + + + + + + + + 29 + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPI-SCK + + SPI-SCK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + PA7 + + PA7 + + + + + + + + + + + + + + + + + + + 30 + + 30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA6 + + PA6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + 31 + + + + + + + + + + + + + + + + + + + + + + + + + PA5 + + PA5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 32 + + 32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA4 + + PA4 + + + + + + + + + + + + + + + + + + + + 33 + + 33 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA3 + + PA3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 34 + + 34 + + + + + + + + + + + + + + + + + + + + + + + PA2 + + PA2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 35 + + 35 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA1 + + PA1 + + + + + + + + + + + + + + + + + + + + + + 36 + + 36 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA0 + + PA0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 37 + + 37 + + + + + + + + + + + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 38 + + 38 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 39 + + 39 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + + + + PB0 + + PB0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 40 + + 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB1 + + PB1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 41 + + 41 + + + + + + + + + + + + + + + PB2 + + PB2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 42 + + 42 + + + + + + + + + + + + + + + + + + + + PB3 + + PB3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 43 + + 43 + + + + + + + + + + + + + + + + + + + + + + + SPI-~{SS} + + SPI-~{SS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 44 + + 44 + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 45 + + 45 + + + + + + + + + + + + + + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + XTAL2 + + XTAL2 + + + + + + + + + + + + + + + + + + + + + + + 7 + + 7 + + + + + + + + + XTAL1 + + XTAL1 + + + + + + + + + + + + + + + + + + 8 + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UART0-RxD + + UART0-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9 + + 9 + + + + + + + + + + + + + + + + + + + + + + + + + U1 + + U1 + + + + + + + + + + + + + + + + ATmega644P-20M + + ATmega644P-20M + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C12 + + C12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AVCC + + AVCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C10 + + C10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10p + + 10p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L2 + + L2 + + + + + + + + + + + + + + 10uH + + 10uH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R14 + + R14 + + + + + + + + + + + + + + + + + + + + + 10K + + 10K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Red + + Red + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SW1 + + SW1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C6 + + C6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R16 + + R16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100R + + 100R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C8 + + C8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C13 + + C13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1n + + 1n + + + + + + + + + + + + + + + + + + + + + + C17 + + C17 + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C9 + + C9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C7 + + C7 + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R10 + + R10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100K + + 100K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R17 + + R17 + + + + + + + + + + + + + + + + + + + + 470K + + 470K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C16 + + C16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10n + + 10n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4V2..18V + + 4V2..18V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3-ISP + + +3V3-ISP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R9 + + R9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10K + + 10K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + Q1 + + Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3-ISP + + +3V3-ISP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + UD+ + + UD+ + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + V3 + + V3 + + + + + + + + + + + + + + + + + + + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UD- + + UD- + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + + 3 + + + + + + + + + + + + + + + + + + + + ~{DTR} + + ~{DTR} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + + + + ~{CTS} + + ~{CTS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + ~{RTS} + + ~{RTS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + 7 + + + + + + + + + TXD + + TXD + + + + + + + + + + + + + + + + + + + + 8 + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RXD + + RXD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9 + + 9 + + + + + + + + + + + + + + + + + + + + + + + + + U4 + + U4 + + + + + + + + + + + + + + CH340K + + CH340K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VCC + + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 11 + + 11 + + + + + + + + + + + + + + + + + MISO/GD01 + + MISO/GD01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 + + 12 + + + + + + + + + + + + + + + + + + + + + + MOSI + + MOSI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + 13 + + + + + + + + + + + + + + + + + + + + + + + + + ~{CS} + + ~{CS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14 + + 14 + + + + + + + + + + + + + + + SCK + + SCK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 17 + + 17 + + + + + + + + + + + + + + GD00 + + GD00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 18 + + 18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 19 + + 19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + 2 + + + + + + + + + + + + + + + + + GD02 + + GD02 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + 20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + ANT + + ANT + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + + 7 + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 8 + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 9 + + 9 + + + + + + + + + + + + + + + + + + + + + + + + + U3 + + U3 + + + + + + + + + + + + + + + + + + + + + + + + E07-900MM10S + + E07-900MM10S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R12 + + R12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10K + + 10K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + + + + + + + + + + + 2 + + + 2 + + + + + + + + + + + + + + + + + + 3 + + + 3 + + + + + + + + + + + + + + + + + + J5 + + + J5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A1 + + + A1 + + + + + + + + + + + + + + + VBUS + + VBUS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A4 + + A4 + + + + + + + + + + + + + CC1 + + CC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A5 + + A5 + + + + + + + + + + + + + + + + + + + + + + + + + D+ + + D+ + + + + + + + + + + + + + + + + + + A6 + + A6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D- + + D- + + + + + + + + + + + + + + + + + A7 + + A7 + + + + + + + + + + + + SBU1 + + SBU1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8 + + A8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CC2 + + CC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + B5 + + B5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D+ + + D+ + + + + + + + + + + + + + + + + + + B6 + + B6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D- + + D- + + + + + + + + + + + + + + + + + B7 + + B7 + + + + + + + + + + + + + + + + + + + + + + + + + + + SBU2 + + SBU2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + B8 + + B8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SHIELD + + + SHIELD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S1 + + + S1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + J2 + + J2 + + + + + + + + + + + + + + + + + USB-C + + USB-C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D4 + + D4 + + + + + + + + + + + + + + + + + + + + + + + + + + R1 + + R1 + + + + + + + + + + + + + + + + + + 1K + + 1K + + + + + + + + + + + + + + + + + + + + + F1 + + F1 + + + + + + + + + + 500mA/250mA + + 500mA/250mA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5V + + +5V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C2 + + C2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1u + + 1u + + + + + + + + + + + + + + + + X7R + + X7R + + + + + + + + + + + + + + + + + 50V + + 50V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R2 + + R2 + + + + + + + + + + + + + + + + + + + + + + + 560R + + 560R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C18 + + C18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10u + + 10u + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6,3V + + 6,3V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R3 + + R3 + + + + + + + + + + + + + + + + + + + + + + + + + + 4K7 + + 4K7 + + + + + + + + + + + + + + + + + + + D5 + + D5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R13 + + R13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 470K + + 470K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D3 + + D3 + + + + + + + + + + + + + + + + + + + + + + + + + + + GREEN + + GREEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R5 + + R5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0R + + 0R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D2 + + D2 + + + + + + + + + + + + + + + + + + + + + + + + YELLOW + + YELLOW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + USB + + USB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D1/TX + + D1/TX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D7 + + D7 + + + + + + + + + + + + + + + + + + + + + D8 + + D8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D9 + + D9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D10 + + D10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D11 + + D11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D12 + + D12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D13 + + D13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AREF + + AREF + + + + + + + + + + + + + + + + + + + + + + + + + + + + A0 + + A0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D0/RX + + D0/RX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A1 + + A1 + + + + + + + + + + + + + + + A2 + + A2 + + + + + + + + + + + + + + + + + + + + A3 + + A3 + + + + + + + + + + + + + + + + + + + + + + + A4 + + A4 + + + + + + + + + + + + + A5 + + A5 + + + + + + + + + + + + + + + + + + + + + + + + + A6 + + A6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A7 + + A7 + + + + + + + + + + + + +5V(VBAT-3V) + + +5V(VBAT-3V) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VIN + + VIN + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D2 + + D2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D3 + + D3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D4 + + D4 + + + + + + + + + + + + + + + + + + + + + + D5 + + D5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D6 + + D6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + J1 + + J1 + + + + + + + + + + + + Conn_02x15_Arduino-Nano + + Conn_02x15_Arduino-Nano + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D1 + + D1 + + + + + + + + + + + + + + + + + + + RED + + RED + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TP1 + + TP1 + + + + + + + + + + + + + + + + + + + + + + + + + 3V + + 3V + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OSCI + + OSCI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + OSCO + + OSCO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + ~{INT} + + ~{INT} + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + + VSS + + + VSS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + + 4 + + + + + + + + + + SDA + + SDA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + SCL + + SCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CLKO + + CLKO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + 7 + + + + + + + + + + VDD + + + VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8 + + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U5 + + U5 + + + + + + + + + + + + + + + + + + + + + + + + + + BM8563EMA + + BM8563EMA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D6 + + D6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3-RTC + + +3V3-RTC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3V3-RTC + + 3V3-RTC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C11 + + C11 + + + + + + + + + + + + + + + + + + + + + + + + + + + 10p + + 10p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3-RTC + + +3V3-RTC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C5 + + C5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Y2 + + Y2 + + + + + + + + + + + + + + + 32.768kHz + + 32.768kHz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5V + + +5V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + + 4 + + + 4 + + + + + + + JP1 + + JP1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C14 + + C14 + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D7 + + D7 + + + + + + + + + + + + + + + + + + 4.1V + + 4.1V + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + + 3 + + + 3 + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + Y1 + + Y1 + + + + + + + + + + 12MHz + + 12MHz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C15 + + C15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA0/ADC0 + + PA0/ADC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA0/ADC0 + + PA0/ADC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SCK/PB7 + + SCK/PB7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA1/ADC1 + + PA1/ADC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VRIN + + VRIN + + + + + + + + + + + + + + + + + + + PA6/ADC6 + + PA6/ADC6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LED-GREEN/PC4 + + LED-GREEN/PC4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDO0 + + GDO0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LED-YELLOW/PC3 + + LED-YELLOW/PC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD5/OC1A + + PD5/OC1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AREF + + AREF + + + + + + + + + + + + + + + + + + + + + + + MISO/PB6 + + MISO/PB6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ANT + + ANT + + + + + + + + + + SCK/PB7 + + SCK/PB7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB0/T0 + + PB0/T0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB1/CLKO/T1 + + PB1/CLKO/T1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB2/INT2/AIN0 + + PB2/INT2/AIN0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MISO/PB6 + + MISO/PB6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MOSI/PB5 + + MOSI/PB5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SCK/PB7 + + SCK/PB7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA1/ADC1 + + PA1/ADC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDO2 + + GDO2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LED-RED/PC2 + + LED-RED/PC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MOSI/PB5 + + MOSI/PB5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DTR0 + + DTR0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{SS}/PB4/OC0B + + ~{SS}/PB4/OC0B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB3/OC0A/AIN1 + + PB3/OC0A/AIN1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD4/OC1B/XCK1 + + PD4/OC1B/XCK1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA3/ADC3 + + PA3/ADC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{CS} + + ~{CS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA2/ADC2 + + PA2/ADC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AREF + + AREF + + + + + + + + + + + + + + + + + + + + + + + PB3/OC0A/AIN1 + + PB3/OC0A/AIN1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TxD0 + + TxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB0/T0 + + PB0/T0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SDA/PC1 + + SDA/PC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA6/ADC6 + + PA6/ADC6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA7/ADC7 + + PA7/ADC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB2/INT2/AIN0 + + PB2/INT2/AIN0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD5/OC1A + + PD5/OC1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD4/OC1B/XCK1 + + PD4/OC1B/XCK1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VIN + + VIN + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{SS}/PB4/OC0B + + ~{SS}/PB4/OC0B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC7 + + PC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VBAT + + VBAT + + + + + + + + + + + + + + + + + + + + + + + + + + + LED-GREEN/PC4 + + LED-GREEN/PC4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LED-YELLOW/PC3 + + LED-YELLOW/PC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{SW2}/PC5 + + ~{SW2}/PC5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB1/CLKO/T1 + + PB1/CLKO/T1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TxD1 + + TxD1 + + + + + + + + + + + + + + + + + + + + + + + TxD0 + + TxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VROUT + + VROUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SCL/PC0 + + SCL/PC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RxD1 + + RxD1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA7/ADC7 + + PA7/ADC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LED-RED/PC2 + + LED-RED/PC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD6/ICP1/OC2B + + PD6/ICP1/OC2B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC6 + + PC6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC7 + + PC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RxD0 + + RxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MOSI/PB5 + + MOSI/PB5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DTR0 + + DTR0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VBAT + + VBAT + + + + + + + + + + + + + + + + + + + + + + + + + + + MISO/PB6 + + MISO/PB6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD7/OC2A + + PD7/OC2A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD6/ICP1/OC2B + + PD6/ICP1/OC2B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SCL/PC0 + + SCL/PC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SDA/PC1 + + SDA/PC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RxD0 + + RxD0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA3/ADC3 + + PA3/ADC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD7/OC2A + + PD7/OC2A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA2/ADC2 + + PA2/ADC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D7 + + D7 + + + + + + + + + + + + + + + + + + 4.1V + + 4.1V + + + + + + + + + + + + + + + + + + + + + + + F1 + + F1 + + + + + + + + + + 500mA/250mA + + 500mA/250mA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JP1 + + JP1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + + 4 + + + 4 + + + + + + + 3V3-RTC + + 3V3-RTC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3-RTC + + +3V3-RTC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L1 + + L1 + + + + + + + + + 100uH + + 100uH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R7 + + R7 + + + + + + + + + + + + + + + 68K + + 68K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U2 + + U2 + + + + + + + + + + + + + + + + + + + + + HD9108 + + HD9108 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BS + + BS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + 2 + + + + + + + + + + + + + + + + + FB + + FB + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + EN + + EN + + + + + + + + + + + 4 + + 4 + + + + + + + + + + VIN + + VIN + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + SW + + SW + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + C4 + + C4 + + + + + + + + + + + + + + + + + + + + 22n + + 22n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U1 + + U1 + + + + + + + + + + + + + + + + ATmega644P-20M + + ATmega644P-20M + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPI-MOSI + + SPI-MOSI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + UART0-TxD + + UART0-TxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UART1-RxD + + UART1-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + 11 + + + + + + + + + + + + + + + + + UART1-TxD + + UART1-TxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 + + 12 + + + + + + + + + + + + + + + + + + + + + + OC1B + + OC1B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + 13 + + + + + + + + + + + + + + + + + + + + + + + + + OC1A + + OC1A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14 + + 14 + + + + + + + + + + + + + + + OC2B + + OC2B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + OC2A + + OC2A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 + + 17 + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 18 + + 18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I²C-SCL + + I²C-SCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 19 + + 19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPI-MISO + + SPI-MISO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + I²C-SDA + + I²C-SDA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + 20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC2 + + PC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 21 + + 21 + + + + + + + + + + + + + + + + + + + + + + PC3 + + PC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 22 + + 22 + + + + + + + + + + + + + + + + + + + + + + + + + + + PC4 + + PC4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 23 + + 23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC5 + + PC5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 24 + + 24 + + + + + + + + + + + + + + + + + + + + PC6 + + PC6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 25 + + 25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PC7 + + PC7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 26 + + 26 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AVCC + + AVCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 27 + + 27 + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 28 + + 28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AREF + + AREF + + + + + + + + + + + + + + + + + + + + + + + + + 29 + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPI-SCK + + SPI-SCK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + PA7 + + PA7 + + + + + + + + + + + + + + + + + + + 30 + + 30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA6 + + PA6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + 31 + + + + + + + + + + + + + + + + + + + + + + + + + PA5 + + PA5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 32 + + 32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA4 + + PA4 + + + + + + + + + + + + + + + + + + + + 33 + + 33 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA3 + + PA3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 34 + + 34 + + + + + + + + + + + + + + + + + + + + + + + PA2 + + PA2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 35 + + 35 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA1 + + PA1 + + + + + + + + + + + + + + + + + + + + + + 36 + + 36 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PA0 + + PA0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 37 + + 37 + + + + + + + + + + + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 38 + + 38 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 39 + + 39 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + + + + PB0 + + PB0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 40 + + 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PB1 + + PB1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 41 + + 41 + + + + + + + + + + + + + + + PB2 + + PB2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 42 + + 42 + + + + + + + + + + + + + + + + + + + + PB3 + + PB3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 43 + + 43 + + + + + + + + + + + + + + + + + + + + + + + SPI-~{SS} + + SPI-~{SS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 44 + + 44 + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 45 + + 45 + + + + + + + + + + + + + + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + XTAL2 + + XTAL2 + + + + + + + + + + + + + + + + + + + + + + + 7 + + 7 + + + + + + + + + XTAL1 + + XTAL1 + + + + + + + + + + + + + + + + + + 8 + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UART0-RxD + + UART0-RxD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9 + + 9 + + + + + + + + + + + + + + + + + + + + + + + + + C12 + + C12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U5 + + U5 + + + + + + + + + + + + + + + + + + + + + + + + + + BM8563EMA + + BM8563EMA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OSCI + + OSCI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + OSCO + + OSCO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + ~{INT} + + ~{INT} + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + + VSS + + + VSS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + + 4 + + + + + + + + + + SDA + + SDA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + SCL + + SCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CLKO + + CLKO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + 7 + + + + + + + + + + VDD + + + VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8 + + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C2 + + C2 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1u + + 1u + + + + + + + + + + + + + + + + X7R + + X7R + + + + + + + + + + + + + + + + + 50V + + 50V + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + J1 + + J1 + + + + + + + + + + + + Conn_02x15_Arduino-Nano + + Conn_02x15_Arduino-Nano + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D1/TX + + D1/TX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D7 + + D7 + + + + + + + + + + + + + + + + + + + + + D8 + + D8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D9 + + D9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D10 + + D10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D11 + + D11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D12 + + D12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D13 + + D13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AREF + + AREF + + + + + + + + + + + + + + + + + + + + + + + + + + + + A0 + + A0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D0/RX + + D0/RX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A1 + + A1 + + + + + + + + + + + + + + + A2 + + A2 + + + + + + + + + + + + + + + + + + + + A3 + + A3 + + + + + + + + + + + + + + + + + + + + + + + A4 + + A4 + + + + + + + + + + + + + A5 + + A5 + + + + + + + + + + + + + + + + + + + + + + + + + A6 + + A6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A7 + + A7 + + + + + + + + + + + + +5V(VBAT-3V) + + +5V(VBAT-3V) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VIN + + VIN + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D2 + + D2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D3 + + D3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D4 + + D4 + + + + + + + + + + + + + + + + + + + + + + D5 + + D5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D6 + + D6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U3 + + U3 + + + + + + + + + + + + + + + + + + + + + + + + E07-900MM10S + + E07-900MM10S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VCC + + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 11 + + 11 + + + + + + + + + + + + + + + + + MISO/GD01 + + MISO/GD01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 + + 12 + + + + + + + + + + + + + + + + + + + + + + MOSI + + MOSI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13 + + 13 + + + + + + + + + + + + + + + + + + + + + + + + + ~{CS} + + ~{CS} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14 + + 14 + + + + + + + + + + + + + + + SCK + + SCK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 17 + + 17 + + + + + + + + + + + + + + GD00 + + GD00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 18 + + 18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 19 + + 19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + 2 + + + + + + + + + + + + + + + + + GD02 + + GD02 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + + 20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + ANT + + ANT + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + + 7 + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 8 + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NC + + NC + + + + + + + + + + + + + + + + + + + + + + 9 + + 9 + + + + + + + + + + + + + + + + + + + + + + + + + +3V3 + + +3V3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C17 + + C17 + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C14 + + C14 + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Y2 + + Y2 + + + + + + + + + + + + + + + 32.768kHz + + 32.768kHz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D6 + + D6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3V3-RTC + + +3V3-RTC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C1 + + C1 + + + + + + + + + + + + + + + + + + + + + + 22u + + 22u + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + J3 + + J3 + + + + + + + + + + + + + + + + + + + + ISP + + ISP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MISO + + MISO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + 1 + + + + + + + + + + + + VCC + + VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + 2 + + + + + + + + + + + + + + + + + SCK + + SCK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + 3 + + + + + + + + + + + + + + + + + + + + MOSI + + MOSI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + 4 + + + + + + + + + + ~{RESET} + + ~{RESET} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 5 + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + +3V3-ISP + + +3V3-ISP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L2 + + L2 + + + + + + + + + + + + + + 10uH + + 10uH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C9 + + C9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100n + + 100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R8 + + R8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10K + + 10K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R15 + + R15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100R + + 100R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GND + + GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kicad/dist/v1a/README.md b/kicad/dist/v1a/README.md index 82563fd..dd77055 100644 --- a/kicad/dist/v1a/README.md +++ b/kicad/dist/v1a/README.md @@ -34,15 +34,19 @@ Vorne | Hinten 3 Stück Nano-X-Base V1a (+2 leere Prints), Bestellung bei JLCPCB am 10.7.2024 -Datum | Kosten | Firma | Beschreibung ----------- | ------- | ---- | ---- + Datum | Kosten | Firma | Beschreibung +--------- | --------- | -------- | ------------------------------------------- +12.6.2024 | € 44,45 | Timetex | 10 Stk. Aufbewahrungsboxen 4.7.2024 | € 209,29 | JLCPCB | Bauteile 4.7.2024 | € -6,99 | JLCPCB | Rückzahlung Bauteile 10.7.2024 | € 239,02 | JLCPCB | 5x PCB, 3x Bestückung beidseitig, Transport 10.7.2024 | € 280,30 | Mouser | Bauteile 10.7.2024 | € 72,80 | Reichelt | Bauteile - | € 53,70 | Mouser | Bauteile ---- | € 848,12 | Gesamtkosten +10.7.2024 | € 53,70 | Mouser | Bauteile +xx.7.2024 | € 93,27 | eBay | Diverse Baulelemente, Kabel, ... + 8.8.2024 | € 69,61 | FedEx | Zoll + +--- | € 1055,45 | Gesamtkosten Ausständig: Zoll, Steuer @@ -62,27 +66,48 @@ ERC Fehler lassen sich auch durch neuerliches Einfügen des Symbolös nicht bese ---------------------------------------------------- -## Fehler / Verbesserungen - -### Konzept - -Keine +## Fehler + +1) Beschriftung J27 "..LCD/OE.." -> "..7-SEG/OE.." +2) Beschriftung Motoranschluss, +/- vertauscht +3) Footprint C19, X fehlt (da standadrdmäßig nicht bestückt) +4) J6 /Modbus/RJ45) LEDs direkt an PB0 und PB1: PB0 -> J34.3, PB1 -> J35.3 +5) Fehlender Widerstand 3K3 an OPV: U12.1 -> 3K3 -> GND +6) Größerer C an Versorgung Motortreiber IC U6: U6.2 -> 100 µF -> GND +7) C7 und C8 (Encoder) entfernen +8) R44 (Encoder B): 10K -> 10R ?? +9) R45 (Encoder A): 10K -> 100R ?? +10) C7 und C8 entfernen (oder nicht bestücken) +11) R72 (Gabelkoppler T-C): 1K -> 3K3 +12) R16 (Vorwiderstand LED Blau): 10R -> 560R +13) Pico R40: 5V-N -> 5V-Nano +14) nCS für Port-Expander PA7 kann bei Arduino-Nano nicht als Output betrieben werden. Lösung: nCS auf PA1 ändern und zsätzlicher Jumper für nCS. +15) Keine Widerstände bei MOSI, MISO, SCK. Wenn Port_Expander mit VCC != VCC auf Nano-644/Nano-5V betrieben wird eventuell Beschädigung möglich. +16) I2C Levelshifter zu Raspberry PI sinnvoll, VCC=5V bei Bestückung mit Arduino-Nano-5V möglich. + +## Verbesserungen + +1) J14 (Encoder Switch) könnte entfallen +2) Zusätzlicher Jumper für Motor + mit 0.1R -> Strommessung Motor +3) OPV U12 sehr klein (schlecht händisch lötbar). Entweder entfernen oder alternativ JLCP C693057 (SOIC-8) (nur 7V/µS Slew Rate statt 150V/µs) +4) J5: TxD0 -> RTS, RxD0 -> CTS (eventuell wählbar via Lötjumper) +5) PB7:4 via Levelshifter zu LCD (zB C168855), PB3:0 via Lötjumper (offen) zu LCD (LCD kann im 4-Bit Modus angesteuert werden) +6) 7-Segment: PA6 statt PA0, Modbus nRE: PD4 statt PB0, Modbus DE: PD5 statt PB1 (Poti + 7-Seg + Modbus gleichzeitig) +7) RGB Jumper J22/J23/J24 auf einen anodenseitigen Jumper reduzieren ### Schaltung -Keine - | Reference | Beschreibung | | -------------- | ---------------------------------------------------------- | ### Bestückung -Keine - | Reference | Beschreibung | | -------------- | ---------------------------------------------------------- | -| D5 | JLCPCB plugin, Rotation um 90° | -| U12 | JLCPCB plugin, Rotation um 180° | +| D5 | JLCPCB plugin, Rotation um 90° | +| U12 | JLCPCB plugin, Rotation um 180° | +| R16 | 10R -> 560R (Vorwiderstand blaueLED D4) | +| R72 | 1K -> 3K3 (Vorwiderstand Phototransistor) | ### Funktion / Software diff --git a/kicad/nano-x-base.kicad_pro b/kicad/nano-x-base.kicad_pro index d424cb8..786234e 100644 --- a/kicad/nano-x-base.kicad_pro +++ b/kicad/nano-x-base.kicad_pro @@ -825,7 +825,7 @@ "workbook_filename": "" }, "page_layout_descr_file": "", - "plot_directory": "/tmp/", + "plot_directory": "/tmp/motor", "spice_current_sheet_as_root": false, "spice_external_command": "spice \"%I\"", "spice_model_current_sheet_as_root": true, diff --git a/software/arduino-nano-5v/test_2024-07-23/.gdb_history b/software/arduino-nano-5v/test_2024-07-23/.gdb_history new file mode 100644 index 0000000..3339046 --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/.gdb_history @@ -0,0 +1,9 @@ +target remote :1234 +layout split +stepi +quit +target remote :1234 +layout split +stepi +b *main+9 +quit diff --git a/software/arduino-nano-5v/test_2024-07-23/.gdbinit b/software/arduino-nano-5v/test_2024-07-23/.gdbinit new file mode 100644 index 0000000..139597f --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/.gdbinit @@ -0,0 +1,2 @@ + + diff --git a/software/arduino-nano-5v/test_2024-07-23/.gitignore b/software/arduino-nano-5v/test_2024-07-23/.gitignore new file mode 100644 index 0000000..a959910 --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/.gitignore @@ -0,0 +1,4 @@ +.depend +**/build +**/dist +**/sim diff --git a/software/arduino-nano-5v/test_2024-07-23/.vscode/c_cpp_properties.json b/software/arduino-nano-5v/test_2024-07-23/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..93c17af --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux AVR", + "includePath": [ + "/usr/lib/avr/include/**", + "/usr/lib/gcc/avr/**" + ], + "defines": [], + "compilerPath": "/usr/bin/avr-gcc", + "compilerArgs": [ "-mmcu=atmega328p", "-DF_CPU=16000000", "-Os" ], + "cStandard": "gnu11", + "cppStandard": "gnu++11", + "intelliSenseMode": "linux-gcc-x64" + } + ], + "version": 4 +} diff --git a/software/arduino-nano-5v/test_2024-07-23/.vscode/launch.json b/software/arduino-nano-5v/test_2024-07-23/.vscode/launch.json new file mode 100644 index 0000000..f29cf2e --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/.vscode/launch.json @@ -0,0 +1,37 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Build", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "build" + },{ + "name": "Flash", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "flash" + },{ + "name": "Clean", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "clean" + },{ + // es muss mit simuc --board arduino dist/programm.elf der Simulator + // gestartet werden. Dessen gdb-stub öffnet auf localhost:1234 einen Port + "name": "Debug (simuc)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/sim/atmega328p.elf", + "cwd": "${workspaceFolder}", + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/usr/bin/avr-gdb", + "miDebuggerServerAddress": ":1234", + "preLaunchTask": "build" + } + ] +} diff --git a/software/arduino-nano-5v/test_2024-07-23/.vscode/settings.json b/software/arduino-nano-5v/test_2024-07-23/.vscode/settings.json new file mode 100644 index 0000000..b2e94c9 --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "[c]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[cpp]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[h]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[hpp]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "cSpell.words": [], + "cSpell.ignorePaths": [ + "**/*.json", "**/*.c", "**/*.h", "**/*.cpp", "**/*.hpp", "**/Makefile" + ] +} diff --git a/software/arduino-nano-5v/test_2024-07-23/.vscode/tasks.json b/software/arduino-nano-5v/test_2024-07-23/.vscode/tasks.json new file mode 100644 index 0000000..74fb1c7 --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/.vscode/tasks.json @@ -0,0 +1,23 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [{ + "label": "build", + "type": "shell", + "command": "make", + "problemMatcher":[ + "$gcc" + ] + },{ + "label": "clean", + "type": "shell", + "command": "make", + "args": [ "clean" ], + },{ + "label": "flash", + "type": "shell", + "command": "make", + "args": [ "flash" ], + }] +} \ No newline at end of file diff --git a/software/arduino-nano-5v/test_2024-07-23/Makefile b/software/arduino-nano-5v/test_2024-07-23/Makefile new file mode 100644 index 0000000..eb17024 --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/Makefile @@ -0,0 +1,125 @@ +.PHONY: all info flash picocom clean +$(shell mkdir -p dist >/dev/null) +$(shell mkdir -p build >/dev/null) +$(shell mkdir -p sim >/dev/null) +$(shell mkdir -p sim/build >/dev/null) + +NAME="test_2024-07-23_nano-5v" +SRC= $(wildcard src/*.c src/*.cpp src/*/*.c src/*/*.cpp) +HDR= $(wildcard src/*.h src/*.hpp src/*/*.h src/*/*.hpp) +OBJ_CPP = $(SRC:src/%.cpp=build/%.o) +OBJ = $(OBJ_CPP:src/%.c=build/%.o) +OBJ_SIM_CPP = $(SRC:src/%.cpp=sim/build/%.o) +OBJ_SIM = $(OBJ_SIM_CPP:src/%.c=sim/build/%.o) + +DEVICE=atmega328p + +CC= avr-g++ +CFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=16000000 -c +LFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=16000000 -Wl,-u,vfprintf -lprintf_flt -lm + +CFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=16000000 -g -c -c +LFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=16000000 -g -Wl,-u,vfprintf -lprintf_flt -lm + + +all: dist/$(NAME).elf dist/$(NAME).s dist/$(NAME).hex sim/$(NAME).elf sim/$(NAME).s info + + +info: + @avr-size --mcu=$(DEVICE) --format=avr dist/$(NAME).elf + +.depend: $(SRC) $(HDR) + $(CC) -mmcu=$(DEVICE) -MM $(SRC) | sed --regexp-extended 's/^(.*\.o)\: src\/(.*)(\.cpp|\.c) (.*)/build\/\2\.o\: src\/\2\3 \4/g' > .depend + +-include .depend + +# .depend solte auch auf Header Files achten! + +dist/$(NAME).elf: .depend $(OBJ) + $(CC) $(LFLAGS) -o $@ $(OBJ) + +dist/%.s: dist/%.elf + avr-objdump -d $< > $@ + +dist/%.hex: dist/%.elf + avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ + +sim/$(NAME).elf: .depend $(OBJ_SIM) + $(CC) $(LFLAGS_SIM) -o $@ $(OBJ_SIM) + +# ensure that __DATE__ and __TIME__ macros are up to date +build/main.o: src/main.cpp $(SRC) $(HDR) + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +build/%.o: src/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +build/%.o: src/%.cpp + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +sim/build/%.o: src/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_SIM) -o $@ $< + +sim/build/%.o: src/%.cpp + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_SIM) -o $@ $< + +sim/%.s: sim/%.elf + avr-objdump -d $< > $@ + +simuc: sim/$(NAME).elf + simuc --board arduino $< + +gdb: sim/$(NAME).elf + avr-gdb $< + + +flash: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB0 -p m328p -e -U flash:w:$< + +flash0: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB0 -p m328p -e -U flash:w:$< + +flash1: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB1 -p m328p -e -U flash:w:$< + +flash2: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB2 -p m328p -e -U flash:w:$< + +picocom: + # picocom sends CR for ENTER -> convert cr (\r) to lf (\n) + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB0 + +picocom0: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB0 + +picocom1: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB1 + +picocom2: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB2 + + +isp-328p: + avrdude -c usbasp -p m328p + +isp-flash-328p: dist/$(NAME).elf all + avrdude -c usbasp -p m328p -e -U flash:w:$< + +flash-328pp: dist/$(NAME).elf all + avrdude -c arduino -p m328p -P /dev/ttyUSB0 -b 115200 -e -U flash:w:$< + + +isp-fuse-328p: + avrdude -c usbasp -p m328p -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xFF:m -U lock:w:0xFF:m + +clean: + @rm -r dist + @rm -r build + @rm -r sim + @find . -type f -name ".depend" -exec rm {} \; + @echo "clean done" diff --git a/software/arduino-nano-5v/test_2024-07-23/README.md b/software/arduino-nano-5v/test_2024-07-23/README.md new file mode 100644 index 0000000..c4d5e14 --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/README.md @@ -0,0 +1 @@ +# Testprogramm diff --git a/software/arduino-nano-5v/test_2024-07-23/release/v2024-08-18_1113/test_2024-07-23_nano-5v.elf b/software/arduino-nano-5v/test_2024-07-23/release/v2024-08-18_1113/test_2024-07-23_nano-5v.elf new file mode 100755 index 0000000..2f20bd1 Binary files /dev/null and b/software/arduino-nano-5v/test_2024-07-23/release/v2024-08-18_1113/test_2024-07-23_nano-5v.elf differ diff --git a/software/arduino-nano-5v/test_2024-07-23/src b/software/arduino-nano-5v/test_2024-07-23/src new file mode 120000 index 0000000..38a7ae1 --- /dev/null +++ b/software/arduino-nano-5v/test_2024-07-23/src @@ -0,0 +1 @@ +../../nano-644/test_2024-07-23/src \ No newline at end of file diff --git a/software/nano-1284/test_2024-07-23/.gdb_history b/software/nano-1284/test_2024-07-23/.gdb_history new file mode 100644 index 0000000..3339046 --- /dev/null +++ b/software/nano-1284/test_2024-07-23/.gdb_history @@ -0,0 +1,9 @@ +target remote :1234 +layout split +stepi +quit +target remote :1234 +layout split +stepi +b *main+9 +quit diff --git a/software/nano-1284/test_2024-07-23/.gdbinit b/software/nano-1284/test_2024-07-23/.gdbinit new file mode 100644 index 0000000..139597f --- /dev/null +++ b/software/nano-1284/test_2024-07-23/.gdbinit @@ -0,0 +1,2 @@ + + diff --git a/software/nano-1284/test_2024-07-23/.gitignore b/software/nano-1284/test_2024-07-23/.gitignore new file mode 100644 index 0000000..a959910 --- /dev/null +++ b/software/nano-1284/test_2024-07-23/.gitignore @@ -0,0 +1,4 @@ +.depend +**/build +**/dist +**/sim diff --git a/software/nano-1284/test_2024-07-23/.vscode/c_cpp_properties.json b/software/nano-1284/test_2024-07-23/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..dda83a0 --- /dev/null +++ b/software/nano-1284/test_2024-07-23/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux AVR", + "includePath": [ + "/usr/lib/avr/include/**", + "/usr/lib/gcc/avr/**" + ], + "defines": [], + "compilerPath": "/usr/bin/avr-gcc", + "compilerArgs": [ "-mmcu=atmega1284p", "-DF_CPU=12000000", "-Os" ], + "cStandard": "gnu11", + "cppStandard": "gnu++11", + "intelliSenseMode": "linux-gcc-x64" + } + ], + "version": 4 +} diff --git a/software/nano-1284/test_2024-07-23/.vscode/launch.json b/software/nano-1284/test_2024-07-23/.vscode/launch.json new file mode 100644 index 0000000..f29cf2e --- /dev/null +++ b/software/nano-1284/test_2024-07-23/.vscode/launch.json @@ -0,0 +1,37 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Build", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "build" + },{ + "name": "Flash", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "flash" + },{ + "name": "Clean", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "clean" + },{ + // es muss mit simuc --board arduino dist/programm.elf der Simulator + // gestartet werden. Dessen gdb-stub öffnet auf localhost:1234 einen Port + "name": "Debug (simuc)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/sim/atmega328p.elf", + "cwd": "${workspaceFolder}", + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/usr/bin/avr-gdb", + "miDebuggerServerAddress": ":1234", + "preLaunchTask": "build" + } + ] +} diff --git a/software/nano-1284/test_2024-07-23/.vscode/settings.json b/software/nano-1284/test_2024-07-23/.vscode/settings.json new file mode 100644 index 0000000..58539af --- /dev/null +++ b/software/nano-1284/test_2024-07-23/.vscode/settings.json @@ -0,0 +1,29 @@ +{ + "[c]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[cpp]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[h]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[hpp]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "cSpell.words": [], + "cSpell.ignorePaths": [ + "**/*.json", "**/*.c", "**/*.h", "**/*.cpp", "**/*.hpp", "**/Makefile" + ], + "java.project.sourcePaths": [ + "src/units" + ] +} diff --git a/software/nano-1284/test_2024-07-23/.vscode/tasks.json b/software/nano-1284/test_2024-07-23/.vscode/tasks.json new file mode 100644 index 0000000..74fb1c7 --- /dev/null +++ b/software/nano-1284/test_2024-07-23/.vscode/tasks.json @@ -0,0 +1,23 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [{ + "label": "build", + "type": "shell", + "command": "make", + "problemMatcher":[ + "$gcc" + ] + },{ + "label": "clean", + "type": "shell", + "command": "make", + "args": [ "clean" ], + },{ + "label": "flash", + "type": "shell", + "command": "make", + "args": [ "flash" ], + }] +} \ No newline at end of file diff --git a/software/nano-1284/test_2024-07-23/Makefile b/software/nano-1284/test_2024-07-23/Makefile new file mode 100644 index 0000000..88e53cd --- /dev/null +++ b/software/nano-1284/test_2024-07-23/Makefile @@ -0,0 +1,124 @@ +.PHONY: all info flash picocom clean +$(shell mkdir -p dist >/dev/null) +$(shell mkdir -p build >/dev/null) +$(shell mkdir -p sim >/dev/null) +$(shell mkdir -p sim/build >/dev/null) + +NAME=test_2024-07-23_nano-1284p +SRC= $(wildcard src/*.c src/*.cpp src/*/*.c src/*/*.cpp) +HDR= $(wildcard src/*.h src/*.hpp src/*/*.h src/*/*.hpp) +OBJ_CPP = $(SRC:src/%.cpp=build/%.o) +OBJ = $(OBJ_CPP:src/%.c=build/%.o) +OBJ_SIM_CPP = $(SRC:src/%.cpp=sim/build/%.o) +OBJ_SIM = $(OBJ_SIM_CPP:src/%.c=sim/build/%.o) + +DEVICE=atmega1284p +AVRDUDE_DEVICE=m1284p + +CC= avr-g++ +CFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -c +LFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -Wl,-u,vfprintf -lprintf_flt -lm + +CFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -c -c +LFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -Wl,-u,vfprintf -lprintf_flt -lm + + +all: dist/$(NAME).elf dist/$(NAME).s dist/$(NAME).hex sim/$(NAME).elf sim/$(NAME).s info + +info: + @avr-size --mcu=$(DEVICE) --format=avr dist/$(NAME).elf + +.depend: $(SRC) $(HDR) + $(CC) -mmcu=$(DEVICE) -MM $(SRC) | sed --regexp-extended 's/^(.*\.o)\: src\/(.*)(\.cpp|\.c) (.*)/build\/\2\.o\: src\/\2\3 \4/g' > .depend + +-include .depend + +# .depend solte auch auf Header Files achten! + +dist/$(NAME).elf: .depend $(OBJ) + $(CC) $(LFLAGS) -o $@ $(OBJ) + +dist/%.s: dist/%.elf + avr-objdump -d $< > $@ + +dist/%.hex: dist/%.elf + avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ + +sim/$(NAME).elf: .depend $(OBJ_SIM) + $(CC) $(LFLAGS_SIM) -o $@ $(OBJ_SIM) + +# ensure that __DATE__ and __TIME__ macros are up to date +build/main.o: src/main.cpp $(SRC) $(HDR) + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +build/%.o: src/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +build/%.o: src/%.cpp + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +sim/build/%.o: src/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_SIM) -o $@ $< + +sim/build/%.o: src/%.cpp + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_SIM) -o $@ $< + +sim/%.s: sim/%.elf + avr-objdump -d $< > $@ + +simuc: sim/$(NAME).elf + simuc --board nano-1284 $< + +gdb: sim/$(NAME).elf + avr-gdb $< + + +flash: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB0 -p $(AVRDUDE_DEVICE) -e -U flash:w:$< + +flash0: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB0 -p $(AVRDUDE_DEVICE) -e -U flash:w:$< + +flash1: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB1 -p $(AVRDUDE_DEVICE) -e -U flash:w:$< + +flash2: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB2 -p $(AVRDUDE_DEVICE) -e -U flash:w:$< + +picocom: + # picocom sends CR for ENTER -> convert cr (\r) to lf (\n) + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB0 + +picocom0: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB0 + +picocom1: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB1 + +picocom2: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB2 + + +isp-1284p: + avrdude -c usbasp -p $(AVRDUDE_DEVICE) + +isp-flash-1284p: dist/$(NAME).elf all + avrdude -c usbasp -p $(AVRDUDE_DEVICE) -e -U flash:w:$< + +flash-1284p: dist/$(NAME).elf all + avrdude -c arduino -p $(AVRDUDE_DEVICE) -P /dev/ttyUSB0 -b 115200 -e -U flash:w:$< + +isp-fuse-1284p: + avrdude -c usbasp -p $(AVRDUDE_DEVICE) -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xFF:m -U lock:w:0xFF:m + +clean: + @rm -r dist + @rm -r build + @rm -r sim + @find . -type f -name ".depend" -exec rm {} \; + @echo "clean done" diff --git a/software/nano-1284/test_2024-07-23/README.md b/software/nano-1284/test_2024-07-23/README.md new file mode 100644 index 0000000..65a0866 --- /dev/null +++ b/software/nano-1284/test_2024-07-23/README.md @@ -0,0 +1 @@ +# Testprogramm für Nano-1284 diff --git a/software/nano-1284/test_2024-07-23/release/v2024-08-18_1118/test_2024-07-23_nano-1284p.elf b/software/nano-1284/test_2024-07-23/release/v2024-08-18_1118/test_2024-07-23_nano-1284p.elf new file mode 100755 index 0000000..8c3e007 Binary files /dev/null and b/software/nano-1284/test_2024-07-23/release/v2024-08-18_1118/test_2024-07-23_nano-1284p.elf differ diff --git a/software/nano-1284/test_2024-07-23/src b/software/nano-1284/test_2024-07-23/src new file mode 120000 index 0000000..38a7ae1 --- /dev/null +++ b/software/nano-1284/test_2024-07-23/src @@ -0,0 +1 @@ +../../nano-644/test_2024-07-23/src \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/.gdb_history b/software/nano-644/test_2024-07-23/.gdb_history new file mode 100644 index 0000000..3339046 --- /dev/null +++ b/software/nano-644/test_2024-07-23/.gdb_history @@ -0,0 +1,9 @@ +target remote :1234 +layout split +stepi +quit +target remote :1234 +layout split +stepi +b *main+9 +quit diff --git a/software/nano-644/test_2024-07-23/.gdbinit b/software/nano-644/test_2024-07-23/.gdbinit new file mode 100644 index 0000000..139597f --- /dev/null +++ b/software/nano-644/test_2024-07-23/.gdbinit @@ -0,0 +1,2 @@ + + diff --git a/software/nano-644/test_2024-07-23/.gitignore b/software/nano-644/test_2024-07-23/.gitignore new file mode 100644 index 0000000..a959910 --- /dev/null +++ b/software/nano-644/test_2024-07-23/.gitignore @@ -0,0 +1,4 @@ +.depend +**/build +**/dist +**/sim diff --git a/software/nano-644/test_2024-07-23/.vscode/c_cpp_properties.json b/software/nano-644/test_2024-07-23/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..3a57c79 --- /dev/null +++ b/software/nano-644/test_2024-07-23/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux AVR", + "includePath": [ + "/usr/lib/avr/include/**", + "/usr/lib/gcc/avr/**" + ], + "defines": [], + "compilerPath": "/usr/bin/avr-gcc", + "compilerArgs": [ "-mmcu=atmega644p", "-DF_CPU=12000000", "-Os" ], + "cStandard": "gnu11", + "cppStandard": "gnu++11", + "intelliSenseMode": "linux-gcc-x64" + } + ], + "version": 4 +} diff --git a/software/nano-644/test_2024-07-23/.vscode/launch.json b/software/nano-644/test_2024-07-23/.vscode/launch.json new file mode 100644 index 0000000..f29cf2e --- /dev/null +++ b/software/nano-644/test_2024-07-23/.vscode/launch.json @@ -0,0 +1,37 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Build", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "build" + },{ + "name": "Flash", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "flash" + },{ + "name": "Clean", + // "request": "launch", + "type": "node-terminal", + "preLaunchTask": "clean" + },{ + // es muss mit simuc --board arduino dist/programm.elf der Simulator + // gestartet werden. Dessen gdb-stub öffnet auf localhost:1234 einen Port + "name": "Debug (simuc)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/sim/atmega328p.elf", + "cwd": "${workspaceFolder}", + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/usr/bin/avr-gdb", + "miDebuggerServerAddress": ":1234", + "preLaunchTask": "build" + } + ] +} diff --git a/software/nano-644/test_2024-07-23/.vscode/settings.json b/software/nano-644/test_2024-07-23/.vscode/settings.json new file mode 100644 index 0000000..58539af --- /dev/null +++ b/software/nano-644/test_2024-07-23/.vscode/settings.json @@ -0,0 +1,29 @@ +{ + "[c]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[cpp]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[h]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "[hpp]": { + "editor.insertSpaces": true, + "editor.tabSize": 3, + "editor.detectIndentation": false + }, + "cSpell.words": [], + "cSpell.ignorePaths": [ + "**/*.json", "**/*.c", "**/*.h", "**/*.cpp", "**/*.hpp", "**/Makefile" + ], + "java.project.sourcePaths": [ + "src/units" + ] +} diff --git a/software/nano-644/test_2024-07-23/.vscode/tasks.json b/software/nano-644/test_2024-07-23/.vscode/tasks.json new file mode 100644 index 0000000..74fb1c7 --- /dev/null +++ b/software/nano-644/test_2024-07-23/.vscode/tasks.json @@ -0,0 +1,23 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [{ + "label": "build", + "type": "shell", + "command": "make", + "problemMatcher":[ + "$gcc" + ] + },{ + "label": "clean", + "type": "shell", + "command": "make", + "args": [ "clean" ], + },{ + "label": "flash", + "type": "shell", + "command": "make", + "args": [ "flash" ], + }] +} \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/Makefile b/software/nano-644/test_2024-07-23/Makefile new file mode 100644 index 0000000..4ceec53 --- /dev/null +++ b/software/nano-644/test_2024-07-23/Makefile @@ -0,0 +1,138 @@ +.PHONY: all info flash picocom clean +$(shell mkdir -p dist >/dev/null) +$(shell mkdir -p build >/dev/null) +$(shell mkdir -p sim >/dev/null) +$(shell mkdir -p sim/build >/dev/null) + +NAME=test_2024-07-23_nano-644 +SRC= $(wildcard src/*.c src/*.cpp src/*/*.c src/*/*.cpp) +HDR= $(wildcard src/*.h src/*.hpp src/*/*.h src/*/*.hpp) +OBJ_CPP = $(SRC:src/%.cpp=build/%.o) +OBJ = $(OBJ_CPP:src/%.c=build/%.o) +OBJ_SIM_CPP = $(SRC:src/%.cpp=sim/build/%.o) +OBJ_SIM = $(OBJ_SIM_CPP:src/%.c=sim/build/%.o) + +DEVICE=atmega644p + +CC= avr-g++ +CFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -c +LFLAGS= -Wall -mmcu=$(DEVICE) -Os -DF_CPU=12000000 -Wl,-u,vfprintf -lprintf_flt -lm + +CFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -c -c +LFLAGS_SIM= -Wall -mmcu=$(DEVICE) -Og -DF_CPU=12000000 -g -Wl,-u,vfprintf -lprintf_flt -lm + + +all: dist/$(NAME).elf dist/$(NAME).s dist/$(NAME).hex sim/$(NAME).elf sim/$(NAME).s info + +dbg: + @echo --HDR--------------------------------- + @echo $(HDR) + @echo --SRC--------------------------------- + @echo $(SRC) + @echo --OBJ--------------------------------- + @echo $(OBJ) + @echo --OBJ_CPP----------------------------- + @echo $(OBJ_CPP) + @echo --OBJ--------------------------------- + @echo $(OBJ) + @echo =================================== + @echo + +info: + @avr-size --mcu=$(DEVICE) --format=avr dist/$(NAME).elf + +.depend: $(SRC) $(HDR) + $(CC) -mmcu=$(DEVICE) -MM $(SRC) | sed --regexp-extended 's/^(.*\.o)\: src\/(.*)(\.cpp|\.c) (.*)/build\/\2\.o\: src\/\2\3 \4/g' > .depend + +-include .depend + +# .depend solte auch auf Header Files achten! + +dist/$(NAME).elf: .depend $(OBJ) + $(CC) $(LFLAGS) -o $@ $(OBJ) + +dist/%.s: dist/%.elf + avr-objdump -d $< > $@ + +dist/%.hex: dist/%.elf + avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ + +sim/$(NAME).elf: .depend $(OBJ_SIM) + $(CC) $(LFLAGS_SIM) -o $@ $(OBJ_SIM) + +# ensure that __DATE__ and __TIME__ macros are up to date +build/main.o: src/main.cpp $(SRC) $(HDR) + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +build/%.o: src/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +build/%.o: src/%.cpp + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $< + +sim/build/%.o: src/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_SIM) -o $@ $< + +sim/build/%.o: src/%.cpp + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_SIM) -o $@ $< + +sim/%.s: sim/%.elf + avr-objdump -d $< > $@ + +simuc: sim/$(NAME).elf + simuc --board arduino $< + +gdb: sim/$(NAME).elf + avr-gdb $< + + +flash: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB0 -p m644p -e -U flash:w:$< + +flash0: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB0 -p m644p -e -U flash:w:$< + +flash1: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB1 -p m644p -e -U flash:w:$< + +flash2: dist/$(NAME).elf all + avrdude -c arduino -P /dev/ttyUSB2 -p m644p -e -U flash:w:$< + +picocom: + # picocom sends CR for ENTER -> convert cr (\r) to lf (\n) + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB0 + +picocom0: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB0 + +picocom1: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB1 + +picocom2: + picocom -b 115200 --omap crlf --raise-dtr /dev/ttyUSB2 + + +isp-644p: + avrdude -c usbasp -p m644p + +isp-flash-644p: dist/$(NAME).elf all + avrdude -c usbasp -p m644p -e -U flash:w:$< + +flash-644p: dist/$(NAME).elf all + avrdude -c arduino -p m644p -P /dev/ttyUSB0 -b 115200 -e -U flash:w:$< + + +isp-fuse-644p: + avrdude -c usbasp -p m644p -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xFF:m -U lock:w:0xFF:m + +clean: + @rm -r dist + @rm -r build + @rm -r sim + @find . -type f -name ".depend" -exec rm {} \; + @echo "clean done" diff --git a/software/nano-644/test_2024-07-23/README.md b/software/nano-644/test_2024-07-23/README.md new file mode 100644 index 0000000..c4d5e14 --- /dev/null +++ b/software/nano-644/test_2024-07-23/README.md @@ -0,0 +1 @@ +# Testprogramm diff --git a/software/nano-644/test_2024-07-23/release/v2024-08-18_1103/test_2024-07-23_nano-644.elf b/software/nano-644/test_2024-07-23/release/v2024-08-18_1103/test_2024-07-23_nano-644.elf new file mode 100755 index 0000000..5605578 Binary files /dev/null and b/software/nano-644/test_2024-07-23/release/v2024-08-18_1103/test_2024-07-23_nano-644.elf differ diff --git a/software/nano-644/test_2024-07-23/src/adafruit/bme280.cpp b/software/nano-644/test_2024-07-23/src/adafruit/bme280.cpp new file mode 100644 index 0000000..1836c56 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/adafruit/bme280.cpp @@ -0,0 +1,512 @@ +#include "bme280.h" +#include +#include + +Adafruit_BME280 theBME280; +Adafruit_BME280_Temp bm280TempSensor; +Adafruit_BME280_Pressure bm280PressureSensor; +Adafruit_BME280_Humidity bm280HumiditySensor; + +Adafruit_BME280::Adafruit_BME280() { + static I2cMaster i2cDevice; + t_fine_adjust = 0; + temp_sensor = &bm280TempSensor; + pressure_sensor = &bm280PressureSensor; + humidity_sensor = &bm280HumiditySensor; + i2c_dev = &i2cDevice; +} + +bool Adafruit_BME280::begin (uint8_t addr) { + if (!i2c_dev->begin(addr)) { + return false; + } + return init(); +} + +bool Adafruit_BME280::init() { + _sensorID = read8(BME280_REGISTER_CHIPID); + if (_sensorID != 0x60) { + return false; + } + write8(BME280_REGISTER_SOFTRESET, 0xB6); + _delay_ms(10); // wait for chip to wake up. + + // if chip is still reading calibration, delay + while (isReadingCalibration()) { + _delay_ms(10); + } + + readCoefficients(); // read trimming parameters, see DS 4.2.2 + setSampling(); // use defaults + _delay_ms(100); + + return true; +} + +/*! + * @brief setup sensor with given parameters / settings + * + * This is simply a overload to the normal begin()-function, so SPI users + * don't get confused about the library requiring an address. + * @param mode the power mode to use for the sensor + * @param tempSampling the temp samping rate to use + * @param pressSampling the pressure sampling rate to use + * @param humSampling the humidity sampling rate to use + * @param filter the filter mode to use + * @param duration the standby duration to use + */ +void Adafruit_BME280::setSampling(sensor_mode mode, + sensor_sampling tempSampling, + sensor_sampling pressSampling, + sensor_sampling humSampling, + sensor_filter filter, + standby_duration duration) { + _measReg.mode = mode; + _measReg.osrs_t = tempSampling; + _measReg.osrs_p = pressSampling; + + _humReg.osrs_h = humSampling; + _configReg.filter = filter; + _configReg.t_sb = duration; + _configReg.spi3w_en = 0; + + // making sure sensor is in sleep mode before setting configuration + // as it otherwise may be ignored + write8(BME280_REGISTER_CONTROL, MODE_SLEEP); + + // you must make sure to also set REGISTER_CONTROL after setting the + // CONTROLHUMID register, otherwise the values won't be applied (see + // DS 5.4.3) + write8(BME280_REGISTER_CONTROLHUMID, _humReg.get()); + write8(BME280_REGISTER_CONFIG, _configReg.get()); + write8(BME280_REGISTER_CONTROL, _measReg.get()); +} + +/*! + * @brief Writes an 8 bit value over I2C or SPI + * @param reg the register address to write to + * @param value the value to write to the register + */ +void Adafruit_BME280::write8(uint8_t reg, uint8_t value) { + uint8_t buffer[2]; + buffer[1] = value; + if (i2c_dev) { + buffer[0] = reg; + i2c_dev->write(buffer, 2); + } +} + +/*! + * @brief Reads an 8 bit value over I2C or SPI + * @param reg the register address to read from + * @returns the data byte read from the device + */ +uint8_t Adafruit_BME280::read8(uint8_t reg) { + uint8_t buffer[1]; + if (i2c_dev) { + buffer[0] = uint8_t(reg); + i2c_dev->write_then_read(buffer, 1, buffer, 1); + } + return buffer[0]; +} + +/*! + * @brief Reads a 16 bit value over I2C or SPI + * @param reg the register address to read from + * @returns the 16 bit data value read from the device + */ +uint16_t Adafruit_BME280::read16(uint8_t reg) { + uint8_t buffer[2]; + + if (i2c_dev) { + buffer[0] = uint8_t(reg); + i2c_dev->write_then_read(buffer, 1, buffer, 2); + } + return uint16_t(buffer[0]) << 8 | uint16_t(buffer[1]); +} + +/*! + * @brief Reads a signed 16 bit little endian value over I2C or SPI + * @param reg the register address to read from + * @returns the 16 bit data value read from the device + */ +uint16_t Adafruit_BME280::read16_LE(uint8_t reg) { + uint16_t temp = read16(reg); + return (temp >> 8) | (temp << 8); +} + +/*! + * @brief Reads a signed 16 bit value over I2C or SPI + * @param reg the register address to read from + * @returns the 16 bit data value read from the device + */ +int16_t Adafruit_BME280::readS16(uint8_t reg) { return (int16_t)read16(reg); } + +/*! + * @brief Reads a signed little endian 16 bit value over I2C or SPI + * @param reg the register address to read from + * @returns the 16 bit data value read from the device + */ +int16_t Adafruit_BME280::readS16_LE(uint8_t reg) { + return (int16_t)read16_LE(reg); +} + +/*! + * @brief Reads a 24 bit value over I2C + * @param reg the register address to read from + * @returns the 24 bit data value read from the device + */ +uint32_t Adafruit_BME280::read24(uint8_t reg) { + uint8_t buffer[3]; + + if (i2c_dev) { + buffer[0] = uint8_t(reg); + i2c_dev->write_then_read(buffer, 1, buffer, 3); + } + return uint32_t(buffer[0]) << 16 | uint32_t(buffer[1]) << 8 | + uint32_t(buffer[2]); +} + +/*! + * @brief Take a new measurement (only possible in forced mode) + @returns true in case of success else false + */ +bool Adafruit_BME280::takeForcedMeasurement(void) { + bool return_value = false; + // If we are in forced mode, the BME sensor goes back to sleep after each + // measurement and we need to set it to forced mode once at this point, so + // it will take the next measurement and then return to sleep again. + // In normal mode simply does new measurements periodically. + if (_measReg.mode == MODE_FORCED) { + return_value = true; + // set to forced mode, i.e. "take next measurement" + write8(BME280_REGISTER_CONTROL, _measReg.get()); + // Store current time to measure the timeout + uint32_t timeout_start = millis(); + // wait until measurement has been completed, otherwise we would read the + // the values from the last measurement or the timeout occurred after 2 sec. + while (read8(BME280_REGISTER_STATUS) & 0x08) { + // In case of a timeout, stop the while loop + if ((millis() - timeout_start) > 2000) { + return_value = false; + break; + } + _delay_ms(1); + } + } + return return_value; +} + +/*! + * @brief Reads the factory-set coefficients + */ +void Adafruit_BME280::readCoefficients(void) { + _bme280_calib.dig_T1 = read16_LE(BME280_REGISTER_DIG_T1); + _bme280_calib.dig_T2 = readS16_LE(BME280_REGISTER_DIG_T2); + _bme280_calib.dig_T3 = readS16_LE(BME280_REGISTER_DIG_T3); + + _bme280_calib.dig_P1 = read16_LE(BME280_REGISTER_DIG_P1); + _bme280_calib.dig_P2 = readS16_LE(BME280_REGISTER_DIG_P2); + _bme280_calib.dig_P3 = readS16_LE(BME280_REGISTER_DIG_P3); + _bme280_calib.dig_P4 = readS16_LE(BME280_REGISTER_DIG_P4); + _bme280_calib.dig_P5 = readS16_LE(BME280_REGISTER_DIG_P5); + _bme280_calib.dig_P6 = readS16_LE(BME280_REGISTER_DIG_P6); + _bme280_calib.dig_P7 = readS16_LE(BME280_REGISTER_DIG_P7); + _bme280_calib.dig_P8 = readS16_LE(BME280_REGISTER_DIG_P8); + _bme280_calib.dig_P9 = readS16_LE(BME280_REGISTER_DIG_P9); + + _bme280_calib.dig_H1 = read8(BME280_REGISTER_DIG_H1); + _bme280_calib.dig_H2 = readS16_LE(BME280_REGISTER_DIG_H2); + _bme280_calib.dig_H3 = read8(BME280_REGISTER_DIG_H3); + _bme280_calib.dig_H4 = ((int8_t)read8(BME280_REGISTER_DIG_H4) << 4) | + (read8(BME280_REGISTER_DIG_H4 + 1) & 0xF); + _bme280_calib.dig_H5 = ((int8_t)read8(BME280_REGISTER_DIG_H5 + 1) << 4) | + (read8(BME280_REGISTER_DIG_H5) >> 4); + _bme280_calib.dig_H6 = (int8_t)read8(BME280_REGISTER_DIG_H6); +} + +/*! + * @brief return true if chip is busy reading cal data + * @returns true if reading calibration, false otherwise + */ +bool Adafruit_BME280::isReadingCalibration(void) { + uint8_t const rStatus = read8(BME280_REGISTER_STATUS); + + return (rStatus & (1 << 0)) != 0; +} + +/*! + * @brief Returns the temperature from the sensor + * @returns the temperature read from the device + */ +float Adafruit_BME280::readTemperature(void) { + int32_t var1, var2; + + int32_t adc_T = read24(BME280_REGISTER_TEMPDATA); + if (adc_T == 0x800000) // value in case temp measurement was disabled + return NAN; + adc_T >>= 4; + + var1 = (int32_t)((adc_T / 8) - ((int32_t)_bme280_calib.dig_T1 * 2)); + var1 = (var1 * ((int32_t)_bme280_calib.dig_T2)) / 2048; + var2 = (int32_t)((adc_T / 16) - ((int32_t)_bme280_calib.dig_T1)); + var2 = (((var2 * var2) / 4096) * ((int32_t)_bme280_calib.dig_T3)) / 16384; + + t_fine = var1 + var2 + t_fine_adjust; + + int32_t T = (t_fine * 5 + 128) / 256; + + return (float)T / 100; +} + +/*! + * @brief Returns the pressure from the sensor + * @returns the pressure value (in Pascal) read from the device + */ +float Adafruit_BME280::readPressure(void) { + int64_t var1, var2, var3, var4; + + readTemperature(); // must be done first to get t_fine + + int32_t adc_P = read24(BME280_REGISTER_PRESSUREDATA); + if (adc_P == 0x800000) // value in case pressure measurement was disabled + return NAN; + adc_P >>= 4; + + var1 = ((int64_t)t_fine) - 128000; + var2 = var1 * var1 * (int64_t)_bme280_calib.dig_P6; + var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) * 131072); + var2 = var2 + (((int64_t)_bme280_calib.dig_P4) * 34359738368); + var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) / 256) + + ((var1 * ((int64_t)_bme280_calib.dig_P2) * 4096)); + var3 = ((int64_t)1) * 140737488355328; + var1 = (var3 + var1) * ((int64_t)_bme280_calib.dig_P1) / 8589934592; + + if (var1 == 0) { + return 0; // avoid exception caused by division by zero + } + + var4 = 1048576 - adc_P; + var4 = (((var4 * 2147483648UL) - var2) * 3125) / var1; + var1 = (((int64_t)_bme280_calib.dig_P9) * (var4 / 8192) * (var4 / 8192)) / + 33554432; + var2 = (((int64_t)_bme280_calib.dig_P8) * var4) / 524288; + var4 = ((var4 + var1 + var2) / 256) + (((int64_t)_bme280_calib.dig_P7) * 16); + + float P = var4 / 256.0; + + return P; +} + +/*! + * @brief Returns the humidity from the sensor + * @returns the humidity value read from the device + */ +float Adafruit_BME280::readHumidity(void) { + int32_t var1, var2, var3, var4, var5; + + readTemperature(); // must be done first to get t_fine + + int32_t adc_H = read16(BME280_REGISTER_HUMIDDATA); + if (adc_H == 0x8000) // value in case humidity measurement was disabled + return NAN; + + var1 = t_fine - ((int32_t)76800); + var2 = (int32_t)(adc_H * 16384); + var3 = (int32_t)(((int32_t)_bme280_calib.dig_H4) * 1048576); + var4 = ((int32_t)_bme280_calib.dig_H5) * var1; + var5 = (((var2 - var3) - var4) + (int32_t)16384) / 32768; + var2 = (var1 * ((int32_t)_bme280_calib.dig_H6)) / 1024; + var3 = (var1 * ((int32_t)_bme280_calib.dig_H3)) / 2048; + var4 = ((var2 * (var3 + (int32_t)32768)) / 1024) + (int32_t)2097152; + var2 = ((var4 * ((int32_t)_bme280_calib.dig_H2)) + 8192) / 16384; + var3 = var5 * var2; + var4 = ((var3 / 32768) * (var3 / 32768)) / 128; + var5 = var3 - ((var4 * ((int32_t)_bme280_calib.dig_H1)) / 16); + var5 = (var5 < 0 ? 0 : var5); + var5 = (var5 > 419430400 ? 419430400 : var5); + uint32_t H = (uint32_t)(var5 / 4096); + + return (float)H / 1024.0; +} + +/*! + * Calculates the altitude (in meters) from the specified atmospheric + * pressure (in hPa), and sea-level pressure (in hPa). + * @param seaLevel Sea-level pressure in hPa + * @returns the altitude value read from the device + */ +float Adafruit_BME280::readAltitude(float seaLevel) { + // Equation taken from BMP180 datasheet (page 16): + // http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf + + // Note that using the equation from wikipedia can give bad results + // at high altitude. See this thread for more information: + // http://forums.adafruit.com/viewtopic.php?f=22&t=58064 + + float atmospheric = readPressure() / 100.0F; + return 44330.0 * (1.0 - pow(atmospheric / seaLevel, 0.1903)); +} + +/*! + * Calculates the pressure at sea level (in hPa) from the specified + * altitude (in meters), and atmospheric pressure (in hPa). + * @param altitude Altitude in meters + * @param atmospheric Atmospheric pressure in hPa + * @returns the pressure at sea level (in hPa) from the specified altitude + */ +float Adafruit_BME280::seaLevelForAltitude(float altitude, float atmospheric) { + // Equation taken from BMP180 datasheet (page 17): + // http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf + + // Note that using the equation from wikipedia can give bad results + // at high altitude. See this thread for more information: + // http://forums.adafruit.com/viewtopic.php?f=22&t=58064 + + return atmospheric / pow(1.0 - (altitude / 44330.0), 5.255); +} + +/*! + * Returns Sensor ID found by init() for diagnostics + * @returns Sensor ID 0x60 for BME280, 0x56, 0x57, 0x58 BMP280 + */ +uint32_t Adafruit_BME280::sensorID(void) { return _sensorID; } + +/*! + * Returns the current temperature compensation value in degrees Celsius + * @returns the current temperature compensation value in degrees Celsius + */ +float Adafruit_BME280::getTemperatureCompensation(void) { + return float((t_fine_adjust * 5) >> 8) / 100.0; +}; + +/*! + * Sets a value to be added to each temperature reading. This adjusted + * temperature is used in pressure and humidity readings. + * @param adjustment Value to be added to each temperature reading in Celsius + */ +void Adafruit_BME280::setTemperatureCompensation(float adjustment) { + // convert the value in C into and adjustment to t_fine + t_fine_adjust = ((int32_t(adjustment * 100) << 8)) / 5; +}; + + +/**************************************************************************/ +/*! + @brief Gets the sensor_t data for the BME280's temperature sensor +*/ +/**************************************************************************/ +void Adafruit_BME280_Temp::getSensor(sensor_t *sensor) { + /* Clear the sensor_t object */ + memset(sensor, 0, sizeof(sensor_t)); + + /* Insert the sensor name in the fixed length char array */ + strncpy(sensor->name, "BME280", sizeof(sensor->name) - 1); + sensor->name[sizeof(sensor->name) - 1] = 0; + sensor->version = 1; + sensor->sensor_id = _sensorID; + sensor->type = SENSOR_TYPE_AMBIENT_TEMPERATURE; + sensor->min_delay = 0; + sensor->min_value = -40.0; /* Temperature range -40 ~ +85 C */ + sensor->max_value = +85.0; + sensor->resolution = 0.01; /* 0.01 C */ +} + +/**************************************************************************/ +/*! + @brief Gets the temperature as a standard sensor event + @param event Sensor event object that will be populated + @returns True +*/ +/**************************************************************************/ +bool Adafruit_BME280_Temp::getEvent(sensors_event_t *event) { + /* Clear the event */ + memset(event, 0, sizeof(sensors_event_t)); + + event->version = sizeof(sensors_event_t); + event->sensor_id = _sensorID; + event->type = SENSOR_TYPE_AMBIENT_TEMPERATURE; + event->timestamp = millis(); + event->temperature = theBME280.readTemperature(); + return true; +} + +/**************************************************************************/ +/*! + @brief Gets the sensor_t data for the BME280's pressure sensor +*/ +/**************************************************************************/ +void Adafruit_BME280_Pressure::getSensor(sensor_t *sensor) { + /* Clear the sensor_t object */ + memset(sensor, 0, sizeof(sensor_t)); + + /* Insert the sensor name in the fixed length char array */ + strncpy(sensor->name, "BME280", sizeof(sensor->name) - 1); + sensor->name[sizeof(sensor->name) - 1] = 0; + sensor->version = 1; + sensor->sensor_id = _sensorID; + sensor->type = SENSOR_TYPE_PRESSURE; + sensor->min_delay = 0; + sensor->min_value = 300.0; /* 300 ~ 1100 hPa */ + sensor->max_value = 1100.0; + sensor->resolution = 0.012; /* 0.12 hPa relative */ +} + +/**************************************************************************/ +/*! + @brief Gets the pressure as a standard sensor event + @param event Sensor event object that will be populated + @returns True +*/ +/**************************************************************************/ +bool Adafruit_BME280_Pressure::getEvent(sensors_event_t *event) { + /* Clear the event */ + memset(event, 0, sizeof(sensors_event_t)); + + event->version = sizeof(sensors_event_t); + event->sensor_id = _sensorID; + event->type = SENSOR_TYPE_PRESSURE; + event->timestamp = millis(); + event->pressure = theBME280.readPressure() / 100; // convert Pa to hPa + return true; +} + +/**************************************************************************/ +/*! + @brief Gets the sensor_t data for the BME280's humidity sensor +*/ +/**************************************************************************/ +void Adafruit_BME280_Humidity::getSensor(sensor_t *sensor) { + /* Clear the sensor_t object */ + memset(sensor, 0, sizeof(sensor_t)); + + /* Insert the sensor name in the fixed length char array */ + strncpy(sensor->name, "BME280", sizeof(sensor->name) - 1); + sensor->name[sizeof(sensor->name) - 1] = 0; + sensor->version = 1; + sensor->sensor_id = _sensorID; + sensor->type = SENSOR_TYPE_RELATIVE_HUMIDITY; + sensor->min_delay = 0; + sensor->min_value = 0; + sensor->max_value = 100; /* 0 - 100 % */ + sensor->resolution = 3; /* 3% accuracy */ +} + +/**************************************************************************/ +/*! + @brief Gets the humidity as a standard sensor event + @param event Sensor event object that will be populated + @returns True +*/ +/**************************************************************************/ +bool Adafruit_BME280_Humidity::getEvent(sensors_event_t *event) { + /* Clear the event */ + memset(event, 0, sizeof(sensors_event_t)); + + event->version = sizeof(sensors_event_t); + event->sensor_id = _sensorID; + event->type = SENSOR_TYPE_RELATIVE_HUMIDITY; + event->timestamp = millis(); + event->relative_humidity = theBME280.readHumidity(); + return true; +} diff --git a/software/nano-644/test_2024-07-23/src/adafruit/bme280.h b/software/nano-644/test_2024-07-23/src/adafruit/bme280.h new file mode 100644 index 0000000..aa5aa72 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/adafruit/bme280.h @@ -0,0 +1,373 @@ +// https://github.com/adafruit/Adafruit_BME280_Library + +/*! + * @file Adafruit_BME280.h + * + * Designed specifically to work with the Adafruit BME280 Breakout + * ----> http://www.adafruit.com/products/2650 + * + * These sensors use I2C or SPI to communicate, 2 or 4 pins are required + * to interface. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Written by Kevin "KTOWN" Townsend for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * See the LICENSE file for details. + * + */ + +#ifndef __BME280_H__ +#define __BME280_H__ + +// #include "Arduino.h" + +// #include +// #include +// #include + + +#include "../i2cmaster.hpp" +#include "../main.hpp" +// #define byte uint8_t + + + +#include +#include +#include "sensor.h" + +/*! + * @brief default I2C address + */ +#define BME280_ADDRESS (0x77) // Primary I2C Address + /*! + * @brief alternate I2C address + */ +#define BME280_ADDRESS_ALTERNATE (0x76) // Alternate Address + +/*! + * @brief Register addresses + */ +enum { + BME280_REGISTER_DIG_T1 = 0x88, + BME280_REGISTER_DIG_T2 = 0x8A, + BME280_REGISTER_DIG_T3 = 0x8C, + + BME280_REGISTER_DIG_P1 = 0x8E, + BME280_REGISTER_DIG_P2 = 0x90, + BME280_REGISTER_DIG_P3 = 0x92, + BME280_REGISTER_DIG_P4 = 0x94, + BME280_REGISTER_DIG_P5 = 0x96, + BME280_REGISTER_DIG_P6 = 0x98, + BME280_REGISTER_DIG_P7 = 0x9A, + BME280_REGISTER_DIG_P8 = 0x9C, + BME280_REGISTER_DIG_P9 = 0x9E, + + BME280_REGISTER_DIG_H1 = 0xA1, + BME280_REGISTER_DIG_H2 = 0xE1, + BME280_REGISTER_DIG_H3 = 0xE3, + BME280_REGISTER_DIG_H4 = 0xE4, + BME280_REGISTER_DIG_H5 = 0xE5, + BME280_REGISTER_DIG_H6 = 0xE7, + + BME280_REGISTER_CHIPID = 0xD0, + BME280_REGISTER_VERSION = 0xD1, + BME280_REGISTER_SOFTRESET = 0xE0, + + BME280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0 + + BME280_REGISTER_CONTROLHUMID = 0xF2, + BME280_REGISTER_STATUS = 0XF3, + BME280_REGISTER_CONTROL = 0xF4, + BME280_REGISTER_CONFIG = 0xF5, + BME280_REGISTER_PRESSUREDATA = 0xF7, + BME280_REGISTER_TEMPDATA = 0xFA, + BME280_REGISTER_HUMIDDATA = 0xFD +}; + +/**************************************************************************/ +/*! + @brief calibration data +*/ +/**************************************************************************/ +typedef struct { + uint16_t dig_T1; ///< temperature compensation value + int16_t dig_T2; ///< temperature compensation value + int16_t dig_T3; ///< temperature compensation value + + uint16_t dig_P1; ///< pressure compensation value + int16_t dig_P2; ///< pressure compensation value + int16_t dig_P3; ///< pressure compensation value + int16_t dig_P4; ///< pressure compensation value + int16_t dig_P5; ///< pressure compensation value + int16_t dig_P6; ///< pressure compensation value + int16_t dig_P7; ///< pressure compensation value + int16_t dig_P8; ///< pressure compensation value + int16_t dig_P9; ///< pressure compensation value + + uint8_t dig_H1; ///< humidity compensation value + int16_t dig_H2; ///< humidity compensation value + uint8_t dig_H3; ///< humidity compensation value + int16_t dig_H4; ///< humidity compensation value + int16_t dig_H5; ///< humidity compensation value + int8_t dig_H6; ///< humidity compensation value +} bme280_calib_data; +/*=========================================================================*/ + +class Adafruit_BME280; + +/** Adafruit Unified Sensor interface for temperature component of BME280 */ +class Adafruit_BME280_Temp : public Adafruit_Sensor { +public: + /** @brief Create an Adafruit_Sensor compatible object for the temp sensor + @param parent A pointer to the BME280 class */ + Adafruit_BME280_Temp() { _sensorID = 280; } + bool getEvent(sensors_event_t *); + void getSensor(sensor_t *); + +private: + int _sensorID; +}; + +/** Adafruit Unified Sensor interface for pressure component of BME280 */ +class Adafruit_BME280_Pressure : public Adafruit_Sensor { +public: + /** @brief Create an Adafruit_Sensor compatible object for the pressure sensor + @param parent A pointer to the BME280 class */ + Adafruit_BME280_Pressure() { _sensorID = 280; } + bool getEvent(sensors_event_t *); + void getSensor(sensor_t *); + +private: + int _sensorID; +}; + +/** Adafruit Unified Sensor interface for humidity component of BME280 */ +class Adafruit_BME280_Humidity : public Adafruit_Sensor { +public: + /** @brief Create an Adafruit_Sensor compatible object for the humidity sensor + @param parent A pointer to the BME280 class */ + Adafruit_BME280_Humidity() { _sensorID = 280;} + bool getEvent(sensors_event_t *); + void getSensor(sensor_t *); + +private: + int _sensorID; +}; + +/**************************************************************************/ +/*! + @brief Class that stores state and functions for interacting with BME280 IC +*/ +/**************************************************************************/ +class Adafruit_BME280 { +public: + /**************************************************************************/ + /*! + @brief sampling rates + */ + /**************************************************************************/ + enum sensor_sampling { + SAMPLING_NONE = 0b000, + SAMPLING_X1 = 0b001, + SAMPLING_X2 = 0b010, + SAMPLING_X4 = 0b011, + SAMPLING_X8 = 0b100, + SAMPLING_X16 = 0b101 + }; + + /**************************************************************************/ + /*! + @brief power modes + */ + /**************************************************************************/ + enum sensor_mode { + MODE_SLEEP = 0b00, + MODE_FORCED = 0b01, + MODE_NORMAL = 0b11 + }; + + /**************************************************************************/ + /*! + @brief filter values + */ + /**************************************************************************/ + enum sensor_filter { + FILTER_OFF = 0b000, + FILTER_X2 = 0b001, + FILTER_X4 = 0b010, + FILTER_X8 = 0b011, + FILTER_X16 = 0b100 + }; + + /**************************************************************************/ + /*! + @brief standby duration in ms + */ + /**************************************************************************/ + enum standby_duration { + STANDBY_MS_0_5 = 0b000, + STANDBY_MS_10 = 0b110, + STANDBY_MS_20 = 0b111, + STANDBY_MS_62_5 = 0b001, + STANDBY_MS_125 = 0b010, + STANDBY_MS_250 = 0b011, + STANDBY_MS_500 = 0b100, + STANDBY_MS_1000 = 0b101 + }; + + // constructors + Adafruit_BME280(); + + bool begin(uint8_t addr = BME280_ADDRESS); + bool init(); + + void setSampling(sensor_mode mode = MODE_NORMAL, + sensor_sampling tempSampling = SAMPLING_X16, + sensor_sampling pressSampling = SAMPLING_X16, + sensor_sampling humSampling = SAMPLING_X16, + sensor_filter filter = FILTER_OFF, + standby_duration duration = STANDBY_MS_0_5); + + bool takeForcedMeasurement(void); + float readTemperature(void); + float readPressure(void); + float readHumidity(void); + + float readAltitude(float seaLevel); + float seaLevelForAltitude(float altitude, float pressure); + uint32_t sensorID(void); + + float getTemperatureCompensation(void); + void setTemperatureCompensation(float); + +protected: + I2cMaster *i2c_dev = NULL; ///< Pointer to I2C bus interface + // Adafruit_SPIDevice *spi_dev = NULL; ///< Pointer to SPI bus interface + + Adafruit_BME280_Temp *temp_sensor; + Adafruit_BME280_Pressure *pressure_sensor; + Adafruit_BME280_Humidity *humidity_sensor; + + void readCoefficients(void); + bool isReadingCalibration(void); + + void write8(uint8_t reg, uint8_t value); + uint8_t read8(uint8_t reg); + uint16_t read16(uint8_t reg); + uint32_t read24(uint8_t reg); + int16_t readS16(uint8_t reg); + uint16_t read16_LE(uint8_t reg); // little endian + int16_t readS16_LE(uint8_t reg); // little endian + + uint8_t _i2caddr; //!< I2C addr for the TwoWire interface + int32_t _sensorID; //!< ID of the BME Sensor + int32_t t_fine; //!< temperature with high resolution, stored as an attribute + //!< as this is used for temperature compensation reading + //!< humidity and pressure + + int32_t t_fine_adjust; //!< add to compensate temp readings and in turn + //!< to pressure and humidity readings + + bme280_calib_data _bme280_calib; //!< here calibration data is stored + + /**************************************************************************/ + /*! + @brief config register + */ + /**************************************************************************/ + struct config { + // inactive duration (standby time) in normal mode + // 000 = 0.5 ms + // 001 = 62.5 ms + // 010 = 125 ms + // 011 = 250 ms + // 100 = 500 ms + // 101 = 1000 ms + // 110 = 10 ms + // 111 = 20 ms + unsigned int t_sb : 3; ///< inactive duration (standby time) in normal mode + + // filter settings + // 000 = filter off + // 001 = 2x filter + // 010 = 4x filter + // 011 = 8x filter + // 100 and above = 16x filter + unsigned int filter : 3; ///< filter settings + + // unused - don't set + unsigned int none : 1; ///< unused - don't set + unsigned int spi3w_en : 1; ///< unused - don't set + + /// @return combined config register + unsigned int get() { return (t_sb << 5) | (filter << 2) | spi3w_en; } + }; + config _configReg; //!< config register object + + /**************************************************************************/ + /*! + @brief ctrl_meas register + */ + /**************************************************************************/ + struct ctrl_meas { + // temperature oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_t : 3; ///< temperature oversampling + + // pressure oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_p : 3; ///< pressure oversampling + + // device mode + // 00 = sleep + // 01 or 10 = forced + // 11 = normal + unsigned int mode : 2; ///< device mode + + /// @return combined ctrl register + unsigned int get() { return (osrs_t << 5) | (osrs_p << 2) | mode; } + }; + ctrl_meas _measReg; //!< measurement register object + + /**************************************************************************/ + /*! + @brief ctrl_hum register + */ + /**************************************************************************/ + struct ctrl_hum { + /// unused - don't set + unsigned int none : 5; + + // pressure oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_h : 3; ///< pressure oversampling + + /// @return combined ctrl hum register + unsigned int get() { return (osrs_h); } + }; + ctrl_hum _humReg; //!< hum register object +}; + +extern Adafruit_BME280 theBME280; + +#endif diff --git a/software/nano-644/test_2024-07-23/src/adafruit/ens160.cpp b/software/nano-644/test_2024-07-23/src/adafruit/ens160.cpp new file mode 100644 index 0000000..29e3704 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/adafruit/ens160.cpp @@ -0,0 +1,374 @@ +/* + ScioSense_ENS160.h - Library for the ENS160 sensor with I2C interface from ScioSense + 2023 Mar 23 v6 Christoph Friese Bugfix measurement routine, prepare next release + 2021 Nov 25 v5 Martin Herold Custom mode timing fixed + 2021 Feb 04 v4 Giuseppe de Pinto Custom mode fixed + 2020 Apr 06 v3 Christoph Friese Changed nomenclature to ScioSense as product shifted from ams + 2020 Feb 15 v2 Giuseppe Pasetti Corrected firmware flash option + 2019 May 05 v1 Christoph Friese Created + based on application note "ENS160 Software Integration.pdf" rev 0.01 +*/ + +#include "ens160.h" +#include "math.h" +#include +#include +#include + +ScioSense_ENS160::ScioSense_ENS160 () { + _revENS16x = 0; + + //Isotherm, HP0 252°C / HP1 350°C / HP2 250°C / HP3 324°C / measure every 1008ms + _seq_steps[0][0] = 0x7c; + _seq_steps[0][1] = 0x0a; + _seq_steps[0][2] = 0x7e; + _seq_steps[0][3] = 0xaf; + _seq_steps[0][4] = 0xaf; + _seq_steps[0][5] = 0xa2; + _seq_steps[0][6] = 0x00; + _seq_steps[0][7] = 0x80; +} + +bool ScioSense_ENS160::begin () { + i2cDevice.begin(ENS160_I2CADDR_1); + _delay_ms(ENS160_BOOTING); + if (reset()) { + if (checkPartID()) { + if (setMode(ENS160_OPMODE_IDLE)) { + if (clearCommand()) { + if (getFirmware()) { + return true; + } + } + } + } + } + return false; + +} + +bool ScioSense_ENS160::write8 (uint8_t reg, uint8_t value) { + uint8_t buffer[2]; + buffer[1] = value; + buffer[0] = reg; + return i2cDevice.write(buffer, 2); +} + +bool ScioSense_ENS160::read8 (uint8_t reg, uint8_t *value) { + uint8_t buffer[1]; + buffer[0] = uint8_t(reg); + return i2cDevice.write_then_read(buffer, 1, value, 1); +} + +bool ScioSense_ENS160::read16 (uint8_t reg, uint16_t *value) { + uint8_t buffer[1]; + buffer[0] = uint8_t(reg); + return i2cDevice.write_then_read(buffer, 1, (uint8_t *)value, 2); +} + +bool ScioSense_ENS160::read16LE (uint8_t reg, uint16_t *value) { + uint16_t tmp; + if (read16(reg, &tmp)) { + *value = ((tmp & 0xff) << 8) | (tmp >> 8); + return true; + } + return false; +} + +bool ScioSense_ENS160::readBytes (uint8_t reg, uint8_t *bytes, uint8_t len) { + uint8_t buffer[1]; + buffer[0] = uint8_t(reg); + return i2cDevice.write_then_read(buffer, 1, buffer, len); +} + + +// Sends a reset to the ENS160. Returns false on I2C problems. +bool ScioSense_ENS160::reset () { + if (write8(ENS160_REG_OPMODE, ENS160_OPMODE_RESET)) { + _delay_ms(ENS160_BOOTING); + return true; + } + _delay_ms(ENS160_BOOTING); + return false; +} + +// Reads the part ID and confirms valid sensor +bool ScioSense_ENS160::checkPartID () { + uint16_t part_id; + + read16(ENS160_REG_PART_ID, &part_id); + _delay_ms(ENS160_BOOTING); + + if (part_id == ENS160_PARTID) { + _revENS16x = 0; + return true; + + } else if (part_id == ENS161_PARTID) { + _revENS16x = 1; + return true; + } + + return false; +} + +// Initialize idle mode and confirms +bool ScioSense_ENS160::clearCommand () { + uint8_t status; + + if (write8(ENS160_REG_COMMAND, ENS160_COMMAND_NOP)) { + if (write8(ENS160_REG_COMMAND, ENS160_COMMAND_CLRGPR)) { + _delay_ms(ENS160_BOOTING); + if (read8(ENS160_REG_DATA_STATUS, &status)) { + return true; + } + } + } + _delay_ms(ENS160_BOOTING); + return false; +} + +// Read firmware revisions +bool ScioSense_ENS160::getFirmware () { + uint8_t i2cbuf[3]; + + if (clearCommand()) { + _delay_ms(ENS160_BOOTING); + if (write8(ENS160_REG_COMMAND, ENS160_COMMAND_GET_APPVER)) { + if (readBytes(ENS160_REG_GPR_READ_4, i2cbuf, 3)) { + _fw_ver_major = i2cbuf[0]; + _fw_ver_minor = i2cbuf[1]; + _fw_ver_build = i2cbuf[2]; + _revENS16x = this->_fw_ver_major > 6 ? 1 : 0; + _delay_ms(ENS160_BOOTING); + return true; + } + } + } + _delay_ms(ENS160_BOOTING); + return false; +} + +// Set operation mode of sensor +bool ScioSense_ENS160::setMode (uint8_t mode) { + //LP only valid for rev>0 + if ((mode == ENS160_OPMODE_LP) and (_revENS16x == 0)) { + return false; + } + if (write8(ENS160_REG_OPMODE, mode)) { + _delay_ms(ENS160_BOOTING); + return true; + } + _delay_ms(ENS160_BOOTING); + return false; +} + +// Initialize definition of custom mode with steps +bool ScioSense_ENS160::initCustomMode (uint16_t stepNum) { + if (stepNum > 0) { + _stepCount = stepNum; + if (setMode(ENS160_OPMODE_IDLE)) { + if (clearCommand()) { + if (write8(ENS160_REG_COMMAND, ENS160_COMMAND_SETSEQ)) { + _delay_ms(ENS160_BOOTING); + return true; + } + } + } + } + _delay_ms(ENS160_BOOTING); + return false; +} + +// Add a step to custom measurement profile with definition of duration, enabled data acquisition and temperature for each hotplate +bool ScioSense_ENS160::addCustomStep (uint16_t time, bool measureHP0, bool measureHP1, bool measureHP2, bool measureHP3, uint16_t tempHP0, uint16_t tempHP1, uint16_t tempHP2, uint16_t tempHP3) { + uint8_t seq_ack; + uint8_t temp; + + _delay_ms(ENS160_BOOTING); + + temp = (uint8_t)(((time / 24) - 1) << 6); + if (measureHP0) { + temp = temp | 0x20; + } + if (measureHP1) { + temp = temp | 0x10; + } + if (measureHP2) { + temp = temp | 0x08; + } + if (measureHP3) { + temp = temp | 0x04; + } + if (!write8(ENS160_REG_GPR_WRITE_0, temp)) { + return false; + } + temp = (uint8_t)(((time / 24) - 1) >> 2); + if (!write8(ENS160_REG_GPR_WRITE_1, temp)) { + return false; + } + if (!write8(ENS160_REG_GPR_WRITE_2, (uint8_t)(tempHP0 / 2))) { + return false; + } + if (!write8(ENS160_REG_GPR_WRITE_3, (uint8_t)(tempHP1 / 2))) { + return false; + } + if (write8(ENS160_REG_GPR_WRITE_4, (uint8_t)(tempHP2 / 2))) { + return false; + } + if (write8(ENS160_REG_GPR_WRITE_5, (uint8_t)(tempHP3 / 2))) { + return false; + } + + if (write8(ENS160_REG_GPR_WRITE_6, (uint8_t)(_stepCount - 1))) { + return false; + } + + if (_stepCount == 1) { + if (!write8(ENS160_REG_GPR_WRITE_7, 128)) { + return false; + } + } else { + if (!write8(ENS160_REG_GPR_WRITE_7, 0)) { + return false; + } + } + _delay_ms(ENS160_BOOTING); + + if (!read8(ENS160_REG_GPR_READ_7, &seq_ack)) { + return false; + } + _delay_ms(ENS160_BOOTING); + + if ((ENS160_SEQ_ACK_COMPLETE | _stepCount) != seq_ack) { + _stepCount++; + return false; + } + + return true; +} + +bool ScioSense_ENS160::readStatus (uint8_t *status) { + return read8(ENS160_REG_DATA_STATUS, status); +} + +bool ScioSense_ENS160::readData (ENS160_DATA *data) { + uint8_t buffer[1] = { 0x21 }; + return i2cDevice.write_then_read(buffer, 1, (uint8_t *)data, sizeof(ENS160_DATA)); +} + +// Perform prediction measurement and stores result in internal variables +bool ScioSense_ENS160::measure (bool waitForNew) { + uint8_t i2cbuf[8]; + uint8_t status; + + // Set default status for early bail out + if (waitForNew) { + do { + if (!read8(ENS160_REG_DATA_STATUS, &status)) { + return false; + } + _delay_ms(1); + } while (!IS_NEWDAT(status)); + } else { + if (!read8(ENS160_REG_DATA_STATUS, &status)) { + return false; + } + } + + + // Read predictions + if (IS_NEWDAT(status)) { + if (!readBytes(ENS160_REG_DATA_AQI, i2cbuf, 7)) { + return false; + } + return false; + _data_aqi = i2cbuf[0]; + _data_tvoc = i2cbuf[1] | ((uint16_t)i2cbuf[2] << 8); + _data_eco2 = i2cbuf[3] | ((uint16_t)i2cbuf[4] << 8); + if (_revENS16x > 0) { + _data_aqi500 = ((uint16_t)i2cbuf[5]) | ((uint16_t)i2cbuf[6] << 8); + } else { + _data_aqi500 = 0; + } + return true; + } + + return false; +} + +// Perfrom raw measurement and stores result in internal variables +bool ScioSense_ENS160::measureRaw (bool waitForNew) { + uint8_t i2cbuf[8]; + uint8_t status; + + // Set default status for early bail out + if (waitForNew) { + do { + _delay_ms(1); + if (!read8(ENS160_REG_DATA_STATUS, &status)) { + return false; + } + } while (!IS_NEWGPR(status)); + } else { + if (!read8(ENS160_REG_DATA_STATUS, &status)) { + return false; + } + } + + if (IS_NEWGPR(status)) { + + // Read raw resistance values + if (!readBytes(ENS160_REG_GPR_READ_0, i2cbuf, 8)) { + return false; + } + _hp0_rs = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[0] | ((uint16_t)i2cbuf[1] << 8))); + _hp1_rs = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[2] | ((uint16_t)i2cbuf[3] << 8))); + _hp2_rs = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[4] | ((uint16_t)i2cbuf[5] << 8))); + _hp3_rs = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[6] | ((uint16_t)i2cbuf[7] << 8))); + + // Read baselines + if (!readBytes(ENS160_REG_DATA_BL, i2cbuf, 8)) { + return false; + } + _hp0_bl = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[0] | ((uint16_t)i2cbuf[1] << 8))); + _hp1_bl = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[2] | ((uint16_t)i2cbuf[3] << 8))); + _hp2_bl = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[4] | ((uint16_t)i2cbuf[5] << 8))); + _hp3_bl = CONVERT_RS_RAW2OHMS_F((uint32_t)(i2cbuf[6] | ((uint16_t)i2cbuf[7] << 8))); + + if (!read8(ENS160_REG_DATA_MISR, i2cbuf)) { + return false; + } + _misr = i2cbuf[0]; + return true; + } + + return false; +} + + +// Writes t (degC) and h (%rh) to ENV_DATA. Returns false on I2C problems. +bool ScioSense_ENS160::set_envdata (float t, float h) { + uint16_t t_data = (uint16_t)((t + 273.15f) * 64.0f); + uint16_t rh_data = (uint16_t)(h * 512.0f); + return this->set_envdata210(t_data, rh_data); +} + +// Writes t and h (in ENS210 format) to ENV_DATA. Returns false on I2C problems. +bool ScioSense_ENS160::set_envdata210 (uint16_t t, uint16_t h) { + //uint16_t temp; + uint8_t trh_in[4]; + + //temp = (uint16_t)((t + 273.15f) * 64.0f); + trh_in[0] = t & 0xff; + trh_in[1] = (t >> 8) & 0xff; + + //temp = (uint16_t)(h * 512.0f); + trh_in[2] = h & 0xff; + trh_in[3] = (h >> 8) & 0xff; + + if (!i2cDevice.writeByteAndBuffer(ENS160_REG_TEMP_IN, trh_in, 4)) { + return false; + } + + return true; +} diff --git a/software/nano-644/test_2024-07-23/src/adafruit/ens160.h b/software/nano-644/test_2024-07-23/src/adafruit/ens160.h new file mode 100644 index 0000000..7f26ba1 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/adafruit/ens160.h @@ -0,0 +1,188 @@ +/* + ScioSense_ENS160.h - Library for the ENS160 sensor with I2C interface from ScioSense + 2023 Mar 23 v6 Christoph Friese Bugfix measurement routine, prepare next release + 2021 July 29 v4 Christoph Friese Changed nomenclature to ScioSense as product shifted from ams + 2020 Apr 06 v3 Christoph Friese Changed nomenclature to ScioSense as product shifted from ams + 2020 Feb 15 v2 Giuseppe Pasetti Corrected firmware flash option + 2019 May 05 v1 Christoph Friese Created + based on application note "ENS160 Software Integration.pdf" rev 0.01 +*/ + +#ifndef __SCIOSENSE_ENS160_H_ +#define __SCIOSENSE_ENS160_H_ + +#include "../i2cmaster.hpp" +#include +// #define byte uint8_t + +// #if (ARDUINO >= 100) +// #include "Arduino.h" +// #else +// #include "WProgram.h" +// #endif + +// #include + +// Chip constants +#define ENS160_PARTID 0x0160 +#define ENS161_PARTID 0x0161 +#define ENS160_BOOTING 10 + +// 7-bit I2C slave address of the ENS160 +#define ENS160_I2CADDR_0 0x52 //ADDR low +#define ENS160_I2CADDR_1 0x53 //ADDR high + +// ENS160 registers for version V0 +#define ENS160_REG_PART_ID 0x00 // 2 byte register +#define ENS160_REG_OPMODE 0x10 +#define ENS160_REG_CONFIG 0x11 +#define ENS160_REG_COMMAND 0x12 +#define ENS160_REG_TEMP_IN 0x13 +#define ENS160_REG_RH_IN 0x15 +#define ENS160_REG_DATA_STATUS 0x20 +#define ENS160_REG_DATA_AQI 0x21 +#define ENS160_REG_DATA_TVOC 0x22 +#define ENS160_REG_DATA_ECO2 0x24 +#define ENS160_REG_DATA_BL 0x28 +#define ENS160_REG_DATA_T 0x30 +#define ENS160_REG_DATA_RH 0x32 +#define ENS160_REG_DATA_MISR 0x38 +#define ENS160_REG_GPR_WRITE_0 0x40 +#define ENS160_REG_GPR_WRITE_1 ENS160_REG_GPR_WRITE_0 + 1 +#define ENS160_REG_GPR_WRITE_2 ENS160_REG_GPR_WRITE_0 + 2 +#define ENS160_REG_GPR_WRITE_3 ENS160_REG_GPR_WRITE_0 + 3 +#define ENS160_REG_GPR_WRITE_4 ENS160_REG_GPR_WRITE_0 + 4 +#define ENS160_REG_GPR_WRITE_5 ENS160_REG_GPR_WRITE_0 + 5 +#define ENS160_REG_GPR_WRITE_6 ENS160_REG_GPR_WRITE_0 + 6 +#define ENS160_REG_GPR_WRITE_7 ENS160_REG_GPR_WRITE_0 + 7 +#define ENS160_REG_GPR_READ_0 0x48 +#define ENS160_REG_GPR_READ_4 ENS160_REG_GPR_READ_0 + 4 +#define ENS160_REG_GPR_READ_6 ENS160_REG_GPR_READ_0 + 6 +#define ENS160_REG_GPR_READ_7 ENS160_REG_GPR_READ_0 + 7 + +//ENS160 data register fields +#define ENS160_COMMAND_NOP 0x00 +#define ENS160_COMMAND_CLRGPR 0xCC +#define ENS160_COMMAND_GET_APPVER 0x0E +#define ENS160_COMMAND_SETTH 0x02 +#define ENS160_COMMAND_SETSEQ 0xC2 + +#define ENS160_OPMODE_RESET 0xF0 +#define ENS160_OPMODE_DEP_SLEEP 0x00 +#define ENS160_OPMODE_IDLE 0x01 +#define ENS160_OPMODE_STD 0x02 +#define ENS160_OPMODE_LP 0x03 +#define ENS160_OPMODE_CUSTOM 0xC0 + +#define ENS160_BL_CMD_START 0x02 +#define ENS160_BL_CMD_ERASE_APP 0x04 +#define ENS160_BL_CMD_ERASE_BLINE 0x06 +#define ENS160_BL_CMD_WRITE 0x08 +#define ENS160_BL_CMD_VERIFY 0x0A +#define ENS160_BL_CMD_GET_BLVER 0x0C +#define ENS160_BL_CMD_GET_APPVER 0x0E +#define ENS160_BL_CMD_EXITBL 0x12 + +#define ENS160_SEQ_ACK_NOTCOMPLETE 0x80 +#define ENS160_SEQ_ACK_COMPLETE 0xC0 + +#define IS_ENS160_SEQ_ACK_NOT_COMPLETE(x) (ENS160_SEQ_ACK_NOTCOMPLETE == (ENS160_SEQ_ACK_NOTCOMPLETE & (x))) +#define IS_ENS160_SEQ_ACK_COMPLETE(x) (ENS160_SEQ_ACK_COMPLETE == (ENS160_SEQ_ACK_COMPLETE & (x))) + +#define ENS160_DATA_STATUS_NEWDAT 0x02 +#define ENS160_DATA_STATUS_NEWGPR 0x01 + +#define IS_NEWDAT(x) (ENS160_DATA_STATUS_NEWDAT == (ENS160_DATA_STATUS_NEWDAT & (x))) +#define IS_NEWGPR(x) (ENS160_DATA_STATUS_NEWGPR == (ENS160_DATA_STATUS_NEWGPR & (x))) +#define IS_NEW_DATA_AVAILABLE(x) (0 != ((ENS160_DATA_STATUS_NEWDAT | ENS160_DATA_STATUS_NEWGPR ) & (x))) + +#define CONVERT_RS_RAW2OHMS_I(x) (1 << ((x) >> 11)) +#define CONVERT_RS_RAW2OHMS_F(x) (pow (2, (float)(x) / 2048)) + +typedef struct { + uint8_t aqi; + uint16_t tvoc; + uint16_t eco2; +} ENS160_DATA; + +class ScioSense_ENS160 { + + public: + ScioSense_ENS160(); + + void setI2C(uint8_t sda, uint8_t scl); // Function to redefine I2C pins + + bool begin(); // Init I2C communication, resets ENS160 and checks its PART_ID. Returns false on I2C problems or wrong PART_ID. + uint8_t revENS16x() { return this->_revENS16x; } // Report version of sensor (0: ENS160, 1: ENS161) + bool setMode(uint8_t mode); // Set operation mode of sensor + + bool initCustomMode(uint16_t stepNum); // Initialize definition of custom mode with steps + bool addCustomStep(uint16_t time, bool measureHP0, bool measureHP1, bool measureHP2, bool measureHP3, uint16_t tempHP0, uint16_t tempHP1, uint16_t tempHP2, uint16_t tempHP3); + // Add a step to custom measurement profile with definition of duration, enabled data acquisition and temperature for each hotplate + + bool readData (ENS160_DATA *data); + bool readStatus(uint8_t *status); + bool measure(bool waitForNew); // Perform measurement and stores result in internal variables + bool measureRaw(bool waitForNew); // Perform raw measurement and stores result in internal variables + bool set_envdata(float t, float h); // Writes t (degC) and h (%rh) to ENV_DATA. Returns "0" if I2C transmission is successful + bool set_envdata210(uint16_t t, uint16_t h); // Writes t and h (in ENS210 format) to ENV_DATA. Returns "0" if I2C transmission is successful + uint8_t getMajorRev() { return this->_fw_ver_major; } // Get major revision number of used firmware + uint8_t getMinorRev() { return this->_fw_ver_minor; } // Get minor revision number of used firmware + uint8_t getBuild() { return this->_fw_ver_build; } // Get build revision number of used firmware + + uint8_t getAQI() { return this->_data_aqi; } // Get AQI value of last measurement + uint16_t getTVOC() { return this->_data_tvoc; } // Get TVOC value of last measurement + uint16_t geteCO2() { return this->_data_eco2; } // Get eCO2 value of last measurement + uint16_t getAQI500() { return this->_data_aqi500; } // Get AQI500 value of last measurement + uint32_t getHP0() { return this->_hp0_rs; } // Get resistance of HP0 of last measurement + uint32_t getHP1() { return this->_hp1_rs; } // Get resistance of HP1 of last measurement + uint32_t getHP2() { return this->_hp2_rs; } // Get resistance of HP2 of last measurement + uint32_t getHP3() { return this->_hp3_rs; } // Get resistance of HP3 of last measurement + uint32_t getHP0BL() { return this->_hp0_bl; } // Get baseline resistance of HP0 of last measurement + uint32_t getHP1BL() { return this->_hp1_bl; } // Get baseline resistance of HP1 of last measurement + uint32_t getHP2BL() { return this->_hp2_bl; } // Get baseline resistance of HP2 of last measurement + uint32_t getHP3BL() { return this->_hp3_bl; } // Get baseline resistance of HP3 of last measurement + uint8_t getMISR() { return this->_misr; } // Return status code of sensor + + private: + I2cMaster i2cDevice; + bool reset(); // Sends a reset to the ENS160. Returns false on I2C problems. + bool checkPartID(); // Reads the part ID and confirms valid sensor + bool clearCommand(); // Initialize idle mode and confirms + bool getFirmware(); // Read firmware revisions + + uint8_t _revENS16x; // ENS160 or ENS161 connected? (FW >7) + + uint8_t _fw_ver_major; + uint8_t _fw_ver_minor; + uint8_t _fw_ver_build; + + uint16_t _stepCount; // Counter for custom sequence + + uint8_t _data_aqi; + uint16_t _data_tvoc; + uint16_t _data_eco2; + uint16_t _data_aqi500; + uint32_t _hp0_rs; + uint32_t _hp0_bl; + uint32_t _hp1_rs; + uint32_t _hp1_bl; + uint32_t _hp2_rs; + uint32_t _hp2_bl; + uint32_t _hp3_rs; + uint32_t _hp3_bl; + uint16_t _temp; + int _slaveaddr; // Slave address of the ENS160 + uint8_t _misr; + + uint8_t _seq_steps[1][8]; + + bool write8(uint8_t reg, uint8_t value); + bool read8 (uint8_t reg, uint8_t *value); + bool read16 (uint8_t reg, uint16_t *value); + bool read16LE (uint8_t reg, uint16_t *value); + bool readBytes (uint8_t reg, uint8_t *bytes, uint8_t len); +}; + + +#endif diff --git a/software/nano-644/test_2024-07-23/src/adafruit/sensor.h b/software/nano-644/test_2024-07-23/src/adafruit/sensor.h new file mode 100644 index 0000000..ac7e454 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/adafruit/sensor.h @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software< /span> + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Update by K. Townsend (Adafruit Industries) for lighter typedefs, and + * extended sensor support to include color, voltage and current */ + +#ifndef _ADAFRUIT_SENSOR_H +#define _ADAFRUIT_SENSOR_H + +#ifndef ARDUINO +#include +#elif ARDUINO >= 100 +#include "Arduino.h" +#include "Print.h" +#else +#include "WProgram.h" +#endif + +/* Constants */ +#define SENSORS_GRAVITY_EARTH (9.80665F) /**< Earth's gravity in m/s^2 */ +#define SENSORS_GRAVITY_MOON (1.6F) /**< The moon's gravity in m/s^2 */ +#define SENSORS_GRAVITY_SUN (275.0F) /**< The sun's gravity in m/s^2 */ +#define SENSORS_GRAVITY_STANDARD (SENSORS_GRAVITY_EARTH) +#define SENSORS_MAGFIELD_EARTH_MAX \ + (60.0F) /**< Maximum magnetic field on Earth's surface */ +#define SENSORS_MAGFIELD_EARTH_MIN \ + (30.0F) /**< Minimum magnetic field on Earth's surface */ +#define SENSORS_PRESSURE_SEALEVELHPA \ + (1013.25F) /**< Average sea level pressure is 1013.25 hPa */ +#define SENSORS_DPS_TO_RADS \ + (0.017453293F) /**< Degrees/s to rad/s multiplier \ + */ +#define SENSORS_RADS_TO_DPS \ + (57.29577793F) /**< Rad/s to degrees/s multiplier */ +#define SENSORS_GAUSS_TO_MICROTESLA \ + (100) /**< Gauss to micro-Tesla multiplier */ + +/** Sensor types */ +typedef enum { + SENSOR_TYPE_ACCELEROMETER = (1), /**< Gravity + linear acceleration */ + SENSOR_TYPE_MAGNETIC_FIELD = (2), + SENSOR_TYPE_ORIENTATION = (3), + SENSOR_TYPE_GYROSCOPE = (4), + SENSOR_TYPE_LIGHT = (5), + SENSOR_TYPE_PRESSURE = (6), + SENSOR_TYPE_PROXIMITY = (8), + SENSOR_TYPE_GRAVITY = (9), + SENSOR_TYPE_LINEAR_ACCELERATION = + (10), /**< Acceleration not including gravity */ + SENSOR_TYPE_ROTATION_VECTOR = (11), + SENSOR_TYPE_RELATIVE_HUMIDITY = (12), + SENSOR_TYPE_AMBIENT_TEMPERATURE = (13), + SENSOR_TYPE_OBJECT_TEMPERATURE = (14), + SENSOR_TYPE_VOLTAGE = (15), + SENSOR_TYPE_CURRENT = (16), + SENSOR_TYPE_COLOR = (17), + SENSOR_TYPE_TVOC = (18), + SENSOR_TYPE_VOC_INDEX = (19), + SENSOR_TYPE_NOX_INDEX = (20), + SENSOR_TYPE_CO2 = (21), + SENSOR_TYPE_ECO2 = (22), + SENSOR_TYPE_PM10_STD = (23), + SENSOR_TYPE_PM25_STD = (24), + SENSOR_TYPE_PM100_STD = (25), + SENSOR_TYPE_PM10_ENV = (26), + SENSOR_TYPE_PM25_ENV = (27), + SENSOR_TYPE_PM100_ENV = (28), + SENSOR_TYPE_GAS_RESISTANCE = (29), + SENSOR_TYPE_UNITLESS_PERCENT = (30), + SENSOR_TYPE_ALTITUDE = (31) +} sensors_type_t; + +/** struct sensors_vec_s is used to return a vector in a common format. */ +typedef struct { + union { + float v[3]; ///< 3D vector elements + struct { + float x; ///< X component of vector + float y; ///< Y component of vector + float z; ///< Z component of vector + }; ///< Struct for holding XYZ component + /* Orientation sensors */ + struct { + float roll; /**< Rotation around the longitudinal axis (the plane body, 'X + axis'). Roll is positive and increasing when moving + downward. -90 degrees <= roll <= 90 degrees */ + float pitch; /**< Rotation around the lateral axis (the wing span, 'Y + axis'). Pitch is positive and increasing when moving + upwards. -180 degrees <= pitch <= 180 degrees) */ + float heading; /**< Angle between the longitudinal axis (the plane body) + and magnetic north, measured clockwise when viewing from + the top of the device. 0-359 degrees */ + }; ///< Struct for holding roll/pitch/heading + }; ///< Union that can hold 3D vector array, XYZ components or + ///< roll/pitch/heading + int8_t status; ///< Status byte + uint8_t reserved[3]; ///< Reserved +} sensors_vec_t; + +/** struct sensors_color_s is used to return color data in a common format. */ +typedef struct { + union { + float c[3]; ///< Raw 3-element data + /* RGB color space */ + struct { + float r; /**< Red component */ + float g; /**< Green component */ + float b; /**< Blue component */ + }; ///< RGB data in floating point notation + }; ///< Union of various ways to describe RGB colorspace + uint32_t rgba; /**< 24-bit RGBA value */ +} sensors_color_t; + +/* Sensor event (36 bytes) */ +/** struct sensor_event_s is used to provide a single sensor event in a common + * format. */ +typedef struct { + int32_t version; /**< must be sizeof(struct sensors_event_t) */ + int32_t sensor_id; /**< unique sensor identifier */ + int32_t type; /**< sensor type */ + int32_t reserved0; /**< reserved */ + int32_t timestamp; /**< time is in milliseconds */ + union { + float data[4]; ///< Raw data */ + sensors_vec_t acceleration; /**< acceleration values are in meter per second + per second (m/s^2) */ + sensors_vec_t + magnetic; /**< magnetic vector values are in micro-Tesla (uT) */ + sensors_vec_t orientation; /**< orientation values are in degrees */ + sensors_vec_t gyro; /**< gyroscope values are in rad/s */ + float temperature; /**< temperature is in degrees centigrade (Celsius) */ + float distance; /**< distance in centimeters */ + float light; /**< light in SI lux units */ + float pressure; /**< pressure in hectopascal (hPa) */ + float relative_humidity; /**< relative humidity in percent */ + float current; /**< current in milliamps (mA) */ + float voltage; /**< voltage in volts (V) */ + float tvoc; /**< Total Volatile Organic Compounds, in ppb */ + float voc_index; /**< VOC (Volatile Organic Compound) index where 100 is + normal (unitless) */ + float nox_index; /**< NOx (Nitrogen Oxides) index where 100 is normal + (unitless) */ + float CO2; /**< Measured CO2 in parts per million (ppm) */ + float eCO2; /**< equivalent/estimated CO2 in parts per million (ppm + estimated from some other measurement) */ + float pm10_std; /**< Standard Particulate Matter <=1.0 in parts per million + (ppm) */ + float pm25_std; /**< Standard Particulate Matter <=2.5 in parts per million + (ppm) */ + float pm100_std; /**< Standard Particulate Matter <=10.0 in parts per + million (ppm) */ + float pm10_env; /**< Environmental Particulate Matter <=1.0 in parts per + million (ppm) */ + float pm25_env; /**< Environmental Particulate Matter <=2.5 in parts per + million (ppm) */ + float pm100_env; /**< Environmental Particulate Matter <=10.0 in parts per + million (ppm) */ + float gas_resistance; /**< Proportional to the amount of VOC particles in + the air (Ohms) */ + float unitless_percent; /** +#include +#include + +#include "i2cmaster.hpp" + +I2cMaster::I2cMaster () { + address = 0; + timer = 0; +} + +void I2cMaster::tick1ms () { + if (timer > 0) { + timer--; + } +} + +bool I2cMaster::begin (uint8_t addr) { + this->address = addr; + // TWBR = 13; // 100kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 100000) / (2 * 100000 * 4); + TWBR = 100; // 50kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 50000) / (2 * 50000 * 4); + TWCR = (1 << TWEN); + return true; +} + +void I2cMaster::end () { + TWCR = (1 << TWEN); + TWBR = 0; +} + +bool I2cMaster::read (uint8_t *buffer, uint8_t len) { + if (start(true)) { + if (readBytes(buffer, len)) { + if (stop()) { + return true; + } + } + } + return false; +} + + +bool I2cMaster::write (const uint8_t *buffer, uint8_t len) { + if (start(false)) { + if (writeBytes(buffer, len, false)) { + if (stop()) { + return true; + } + } + } + return false; +} + +bool I2cMaster::write_P (const uint8_t *buffer, uint8_t len) { + if (start(false)) { + if (writeBytes(buffer, len, true)) { + if (stop()) { + return true; + } + } + } + return false; +} + + +bool I2cMaster::writeByteAndBuffer (uint8_t byte, const uint8_t *buffer, uint8_t len) { + if (start(false)) { + do { + TWDR = byte; + TWCR = (1 << TWINT) | (1 << TWEN); // send byte + while (!(TWCR & (1 << TWINT))) {}; // wait until last action done + if ((TWSR & 0xf8) != 0x28) { + return false; + } + byte = *buffer++; + } while (len-- > 0); + return true; + } + return false; +} + + +bool I2cMaster::write_then_read (const uint8_t *write_buffer, uint8_t write_len, uint8_t *read_buffer, uint8_t read_len) { + if (start(false)) { + if (writeBytes(write_buffer, write_len, false)) { + if (start(true)) { + if (readBytes(read_buffer, read_len)) { + if (stop()) { + return true; + } + } + } + } + } + return false; +} + +// ------------------------------------------------------------- + +bool I2cMaster::readBytes (uint8_t *buffer, uint8_t len) { + while (len-- > 0) { + if (len > 0) { + TWCR = (1 << TWEA) | (1 << TWINT) | (1 << TWEN); // read data byte with ACK enabled + } else { + TWCR = (1 << TWINT) | (1 << TWEN); // read data byte with ACK disabled + } + while (!(TWCR & (1 << TWINT))) {}; // wait until last action done + uint8_t sr = TWSR & 0xf8; + if ((len > 0 && sr != 0x50) || (len == 0 && sr != 0x58)) { + return false; + } + *buffer++ = TWDR; + } + return true; +} + +bool I2cMaster::writeBytes (const uint8_t *buffer, uint8_t len, bool fromFlash) { + while (len-- > 0) { + // printf_P(PSTR("[wB:len=%d, byte=%02x]"), len + 1, *buffer); + TWDR = fromFlash ? pgm_read_byte(buffer++) : *buffer++; + TWCR = (1 << TWINT) | (1 << TWEN); // send data byte + timer = 5; + while (timer > 0 && !(TWCR & (1 << TWINT))) {}; // wait until last action done + if (!timer || (TWSR & 0xf8) != 0x28) { + return false; + } + } + return true; +} + +bool I2cMaster::start (bool read) { + TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // send START condition + timer = 5; + while (timer > 0 && !(TWCR & (1 << TWINT))) {}; // wait until last action done + uint8_t sr = TWSR & 0xf8; + if (!timer || (sr != 0x08 && sr != 0x10)) { + return false; + } + TWDR = (address << 1) | (read ? 1 : 0); // address + R/nW + TWCR = (1 << TWINT) | (1 << TWEN); // send address/RW + timer = 5; + while (timer > 0 && !(TWCR & (1 << TWINT))) {}; // wait until last action done + sr = TWSR & 0xf8; + if (!timer || (!read && sr != 0x18) || (read && sr != 0x40)) { + return false; + } + return true; +} + +bool I2cMaster::stop () { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); + while (TWCR & ( 1 << TWSTO)); + return true; +} + diff --git a/software/nano-644/test_2024-07-23/src/i2cmaster.hpp b/software/nano-644/test_2024-07-23/src/i2cmaster.hpp new file mode 100644 index 0000000..89b1e46 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/i2cmaster.hpp @@ -0,0 +1,30 @@ +#ifndef I2C_MASTER +#define I2C_MASTER + +#include + +class I2cMaster { + public: + static void end (); + + public: + I2cMaster (); + void tick1ms (); + bool begin (uint8_t addr); + bool read (uint8_t *buffer, uint8_t len); + bool write (const uint8_t *buffer, uint8_t len); + bool write_P (const uint8_t *buffer, uint8_t len); + bool write_then_read (const uint8_t *write_buffer, uint8_t write_len, uint8_t *read_buffer, uint8_t read_len); + bool writeByteAndBuffer (uint8_t byte, const uint8_t *buffer, uint8_t len); + + private: + uint8_t address; + uint8_t timer; + bool start (bool read); + bool stop (); + bool writeBytes (const uint8_t *buffer, uint8_t len, bool fromFlash); + bool writeBytes_P (const uint8_t *buffer); + bool readBytes (uint8_t *buffer, uint8_t len); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/i2cslave.cpp b/software/nano-644/test_2024-07-23/src/i2cslave.cpp new file mode 100644 index 0000000..2bf6ac2 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/i2cslave.cpp @@ -0,0 +1,92 @@ +#include +#include +#include + +#include "i2cslave.hpp" + +I2cSlave::I2cSlave () { + timer = 0; + fromMaster.rIndex = 0; + fromMaster.wIndex = 0; + toMaster.rIndex = 0; + toMaster.wIndex = 0; +} + +void I2cSlave::tick1ms () { + if (timer > 0) { + timer--; + } +} + +bool I2cSlave::begin (uint8_t addr, bool acceptGeneralCalls) { + if (addr > 127) { + return false; + } + TWAR = addr << 1 | (acceptGeneralCalls ? 1 : 0); + TWBR = 100; // 50kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 50000) / (2 * 50000 * 4); + TWCR = (1 << TWEA) | (1 << TWEN) | (1 << TWIE); + return true; +} + +void I2cSlave::end () { + TWCR = (1 << TWEN); + TWBR = 0; +} + +int I2cSlave::read () { + return getByte(fromMaster); +} + +void I2cSlave::write (uint8_t byte) { + putByte(toMaster, byte); +} + + +void I2cSlave::putByte (RingBuffer& buffer, uint8_t byte) { + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + buffer.data[buffer.wIndex++] = byte; + if (buffer.wIndex >= sizeof(buffer.data)) { + buffer.wIndex = 0; + } + if (buffer.wIndex == buffer.rIndex) { + buffer.rIndex++; + if (buffer.rIndex >= sizeof(buffer.data)) { + buffer.rIndex = 0; + } + } + } +} + +int I2cSlave::getByte (RingBuffer& buffer) { + uint8_t b; + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + if (buffer.rIndex == buffer.wIndex) { + return EOF; + } + b = buffer.data[buffer.rIndex++]; + if (buffer.rIndex >= sizeof(buffer.data)) { + buffer.rIndex = 0; + } + } + return b; +} + +void I2cSlave::handleTWIIsr () { + uint8_t sr = TWSR & 0xf8; + switch (sr) { + case 0x80: { // Previously addressed with own SLA+W; data has been received; ACK has been returned + putByte(fromMaster, TWDR); + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE); // no TWEA -> only one byte accepted + break; + } + case 0xa8: { // Own SLA+R has been received; ACK has been returned + int response = getByte(toMaster);; + TWDR = response < 0 ? 0x00 : (uint8_t)response; + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE); // no TWEA -> only one byte accepted + break; + } + default: TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE); break; + } + +} + diff --git a/software/nano-644/test_2024-07-23/src/i2cslave.hpp b/software/nano-644/test_2024-07-23/src/i2cslave.hpp new file mode 100644 index 0000000..2fe2dc7 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/i2cslave.hpp @@ -0,0 +1,32 @@ +#ifndef I2C_SLAVE +#define I2C_SLAVE + +#include + +class I2cSlave { + private: + typedef struct { + uint8_t rIndex; + uint8_t wIndex; + uint8_t data[8]; + } RingBuffer; + + public: + I2cSlave (); + void tick1ms (); + bool begin (uint8_t addr, bool acceptGeneralCalls); + void end (); + void handleTWIIsr (); + int read (); + void write (uint8_t byte); + + private: + uint8_t timer; + RingBuffer fromMaster; + RingBuffer toMaster; + void putByte (RingBuffer& buffer, uint8_t byte); + int getByte (RingBuffer& buffer); + +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/main.cpp b/software/nano-644/test_2024-07-23/src/main.cpp new file mode 100644 index 0000000..2971b6e --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/main.cpp @@ -0,0 +1,361 @@ +#include +#include +#include +#include + +#include +#include + +#include "main.hpp" +#include "units/encoder.hpp" +#include "units/i2c.hpp" +#include "units/led.hpp" +#include "units/ieee485.hpp" +#include "units/led.hpp" +#include "units/lcd.hpp" +#include "units/switch.hpp" +#include "units/rgb.hpp" +#include "units/seg7.hpp" +#include "units/poti.hpp" +#include "units/r2r.hpp" +#include "units/motor.hpp" +#include "units/portexp.hpp" +#include "units/uart1.hpp" +#include "units/modbus.hpp" +#include "units/rtc8563.hpp" +#include "units/cc1101.hpp" + +const char MAIN_CPP_DATE[] PROGMEM = __DATE__; +const char MAIN_CPP_TIME[] PROGMEM = __TIME__; +#ifdef __AVR_ATmega328P__ + const char MAIN_CPP_PART_NAME[] PROGMEM = "ATmega328P"; +#endif +#ifdef __AVR_ATmega644P__ + const char MAIN_CPP_PART_NAME[] PROGMEM = "ATmega644P"; +#endif +#ifdef __AVR_ATmega1284P__ + const char MAIN_CPP_PART_NAME[] PROGMEM = "ATmega1284P"; +#endif + +const char PSTR_DIVIDER[] PROGMEM = "\n====================================\n "; +const char PSTR_LINEFEED[] PROGMEM = "\n"; +const char PSTR_ERROR[] PROGMEM = "ERROR"; +const char PSTR_Done[] PROGMEM = "Done"; + +extern "C" { + void __cxa_pure_virtual () {} + int __cxa_guard_acquire(uint8_t *g) { return 0; } + void __cxa_guard_release(uint8_t *g) {} + void __cxa_guard_abort(uint8_t *g) {} + void __gxx_personality_sj0 () {} + void __cxa_rethrow () {} + void __cxa_begin_catch () {} + void __cxa_end_catch () {} + + int uart_putchar(char c, FILE *stream) { + if (c == '\n') { + uart_putchar('\r', stream); + } + if (stream == stdout) { + loop_until_bit_is_set(UCSR0A, UDRE0); + UDR0 = c; + } + return 0; + } + + + uint64_t volatile systemMillis = 0; + uint8_t volatile uartBuffer[32]; + uint8_t volatile rIndex = 0; + uint8_t volatile wIndex = 0; + + int uart_getchar (FILE *stream) { + // if (rIndex == wIndex) { + // // nothing in buffer + // return EOF; + // } + // printf_P(PSTR(" r%d"), rIndex); + while (rIndex == wIndex) { + // wait for character + } + + // don't use "char c" because german special characters would lead to negative return -> stream error + // char c = uartBuffer[rIndex++]; + + uint8_t c = uartBuffer[rIndex++]; + // printf_P(PSTR("(%02x) "), c); + if (c == '\r') { + c = '\n'; + } + putchar(c); // echo on terminal + return c; + } + + static FILE mystdout = { 0, 0, _FDEV_SETUP_WRITE , 0, 0, uart_putchar, NULL, 0 }; + static FILE mystdin = { 0, 0, _FDEV_SETUP_READ , 0, 0, NULL, uart_getchar, 0 }; + + #if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + static volatile uint16_t timerFlashGreenLed = 0; + static volatile uint16_t timerFlashRedLed = 0; + void flashRedLed (uint16_t ms) { + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + if (timerFlashRedLed == 0) { + PORTC |= (1 << PC2); + if (ms < 0xff80) { + ms += 0x80; // at least 128ms OFF after + } + timerFlashRedLed = ms; + } + } + } + void flashGreenLed (uint16_t ms) { + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + if (timerFlashGreenLed == 0) { + PORTC |= (1 << PC4); + if (ms < 0xff80) { + ms += 0x80; // at least 128ms OFF after + } + timerFlashGreenLed = ms; + } + } + } + #endif + + static volatile uint32_t timer1ms = 0; + static volatile int keyUart0 = EOF; + + Led led; + Switch sw; + Rgb rgb; + Seg7 seg7; + Poti poti; + Encoder encoder; + R2r r2r; + Motor motor; + PortExp portExp; + Lcd lcd; + Uart1 uart1; + Modbus modbus; + Ieee485 ieee485; + I2c i2cSparkfun(I2c::SparkFunEnvCombo); + I2c i2cMaster(I2c::Master); + I2c i2cSlave(I2c::Slave); + Rtc8563 rtc8563(Rtc8563::NORMAL); + Cc1101 cc1101Send(Cc1101::Send); + Cc1101 cc1101Receive(Cc1101::Receive); +} + +void setTimer (uint32_t ms) { + ATOMIC_BLOCK(ATOMIC_FORCEON) { + timer1ms = ms; + } +} + +int wait (uint32_t ms) { + setTimer(ms); + do { + ATOMIC_BLOCK(ATOMIC_FORCEON) { + ms = timer1ms; + } + } while (ms > 0 && keyUart0 == EOF); + return keyUart0; +} + +int waitAndReadKey (uint32_t ms) { + keyUart0 = EOF; + int key = wait(ms); + keyUart0 = EOF; + return key; +} + +int main () { + + #if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + // Nano-644 LEDs (Green, Orange, Red) + DDRC |= (1 << PC7) | (1 << PC4) | (1 << PC3) | (1 << PC2); + PORTC &= ~((1 << PC7) | (1 << PC4) | (1 << PC3) | (1 << PC2)); + + // Nano-644 push button SW2 + DDRC &= ~(1 << PC5); + PORTC |= (1 << PC5); // enable internal pullup resistor + #endif + + #ifdef __AVR_ATmega328P__ + DDRB |= (1 << PB5); + PORTB &= ~(1 << PB5); + #endif + + // UART0 interface on Nano-644 + UCSR0A = (1 << U2X0); + UCSR0B = (1 << RXCIE0) | (1 << RXEN0) | (1 <getName()); + printf_P(PSTR_LINEFEED); + } + printf_P(PSTR("\nSelect unit: ")); + rIndex = 0; wIndex = 0; + fgets(s, sizeof(s), stdin); + } while (sscanf(s, "%x", &i) != 1 || i < 0 || i >= sizeof(unit) / sizeof(unit[0]) ); + + TestUnit *pu = unit[i]; + printf_P(PSTR("\n\n[")); printf_P(pu->getName()); printf_P(PSTR("]: ")); + keyUart0 = EOF; + + pu->init(); + for (uint8_t subtest = 0; subtest < 0xff; subtest++) { + printf_P(PSTR("\n%4d: "), subtest); + if (pu->run(subtest) < 0) { + break; + } + if (keyUart0 == 27) { + keyUart0 = EOF; + break; + } + keyUart0 = EOF; + } + pu->cleanup(); + } +} + +uint64_t millis () { + volatile uint64_t millis = systemMillis; + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + millis = systemMillis; + } + return millis; +} + +#ifndef USART0_RX_vect + #define USART0_RX_vect USART_RX_vect +#endif +ISR (USART0_RX_vect) { + uint8_t b = UDR0; + keyUart0 = b; + uartBuffer[wIndex++] = b; + // printf_P(PSTR(" w%d(%02x)"), wIndex, b); + if (wIndex == rIndex) { + // buffer overflow, kick out oldest byte + rIndex++; + } +} + +#ifdef USART1_RX_vect + ISR (USART1_RX_vect) { + uint8_t b = UDR1; + if (modbus.enabled) { + modbus.handleRxByte(b); + } + if (uart1.enabled) { + uart1.handleRxByte(b); + } + if (ieee485.enabled) { + ieee485.handleRxByte(b); + } + } +#endif + +ISR (TWI_vect) { + if (i2cMaster.enabled) { + i2cMaster.handleTwiIrq(); + } else if (i2cSlave.enabled) { + i2cSlave.handleTwiIrq(); + } else if (i2cSparkfun.enabled) { + i2cSparkfun.handleTwiIrq(); + } else { + TWCR = (1 << TWINT); // clear interrupt request bit and disable TWI + } +} + +ISR (TIMER2_COMPA_vect) { // every 100us + static uint16_t timer500ms = 0; + static uint8_t timer100us = 0; + + if (encoder.enabled) { + encoder.tick100us(); + } + if (motor.enabled) { + motor.tick100us(); + } + + timer100us++; + if (timer100us >= 10) { + timer100us = 0; + if (timer1ms > 0) { + timer1ms--; + } + systemMillis++; + i2cMaster.tick1ms(); + i2cSlave.tick1ms(); + i2cSparkfun.tick1ms(); + cc1101Send.tick1ms(); + cc1101Receive.tick1ms(); + #if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + if (timerFlashRedLed > 0) { + if (--timerFlashRedLed < 128) { + PORTC &= ~(1 << PC2); // red LED + } + } + if (timerFlashGreenLed > 0) { + if (--timerFlashGreenLed < 128 ) { + PORTC &= ~(1 << PC4); // green LED + } + } + #endif + } + + timer500ms++; + if (timer500ms >= 5000) { + #if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + PORTC ^= (1 << PC3); // orange LED blinking + #endif + #ifdef __AVR_ATmega328P__ + if (!seg7.enabled) { + PORTB ^= (1 << PB5); // LED L + } + #endif + timer500ms = 0; + } +} + diff --git a/software/nano-644/test_2024-07-23/src/main.hpp b/software/nano-644/test_2024-07-23/src/main.hpp new file mode 100644 index 0000000..a7f2ae8 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/main.hpp @@ -0,0 +1,36 @@ +#ifndef MAIN_HPP +#define MAIN_HPP + +#include +#include + +#define ENTER '\r' +#define CTRLC '\003' +#define ESCAPE 0x1b + +extern int wait (uint32_t ms); +extern int waitAndReadKey (uint32_t ms); +extern uint64_t millis (); + +extern const char PSTR_DIVIDER[]; +extern const char PSTR_LINEFEED[]; +extern const char PSTR_ERROR[]; +extern const char PSTR_Done[]; + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + extern "C" { + extern void flashRedLed (uint16_t ms); + extern void flashGreenLed (uint16_t ms); + } +#endif + + +class TestUnit { + public: + virtual int8_t run (uint8_t subtest) = 0; + virtual void init () = 0; + virtual void cleanup () = 0; + virtual PGM_P getName () = 0; +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/cc1101.cpp b/software/nano-644/test_2024-07-23/src/units/cc1101.cpp new file mode 100644 index 0000000..d53ecf2 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/cc1101.cpp @@ -0,0 +1,741 @@ +#include +#include +#include +#include + +#include "cc1101.hpp" +#include "../main.hpp" + +// 868MHz Modem E07-900MM1DS (chipset CC1101) +// https://jlcpcb.com/partdetail/Chengdu_Ebyte_ElecTech-E07900MM10S/C5844212 + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // ------------------------------------ + // not available + + void Cc1101::init () {} + void Cc1101::cleanup () {} + void Cc1101::setChipEnableLow () {} + void Cc1101::setChipEnableHigh () {} + int8_t Cc1101::run (uint8_t subtest) { return -1; } + PGM_P Cc1101::getName () { return PSTR("?"); } + +#endif + + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // -------------------------------------------------------- + // PA4 ... nCS + // PB4 ... nSS (not used, but must be high, otherwise AVR SPI master not working) + // PB5 ... MOSI + // PB6 ... MISO + // PB7 ... SCK + + // -------------------------------------------------------- + + // Output power table from CC1101 datasheet page 59 + const Cc1101::PATABLE_INIT_ITEM_t PMEM_CC1101_PATABLE_INIT[] PROGMEM = { + { 0xc6, "9.6" }, // 9.6 dBm / 29.4mA (default value) + { 0xc0, "11" }, // 11 dBm / 34.2mA + { 0xc5, "10" }, // 10 dBm / 30.0mA + { 0xcd, "7" }, // 7 dBm / 25.8mA + { 0x86, "5" }, // 5 dBm / 19.9mA + { 0x50, "0" }, // 0 dBm / 16.8mA + { 0x37, "-6" }, // -6 dBm / 16.4mA + { 0x26, "-10" }, // 10 dBm / 14.5mA + { 0x1d, "-15" }, // 15 dBm / 13.3mA + { 0x17, "-20" }, // 20 dBm / 12.6mA + { 0x03, "-30" }, // 30 dBm / 12.0mA + }; + const Cc1101::Register_t PMEM_CC1101_REGISTER_INIT PROGMEM = { + /* 0x00: iocfg2 0x0b (----) */ { Cc1101::CHIP_NOT_READY, 0, 0 }, // GDO2 + /* 0x01: iocfg1 0x2e (----) */ { Cc1101::HIGH_IMPEDANCE_WHEN_CHIP_SELECT_HIGH, 0, 0 }, // GDO1/MISO + /* 0x02: iocfg0 0x06 (----) */ { Cc1101::SYNC_SENT_OR_RECEIVED_UNTIL_END_OF_PACKET, 0, 0 }, // GDO0 -> PA5 + /* 0x03: fifothr 0x47 (0x07) */ { 7, 0, 1, 0 }, // fifo_thr = 0b111, close_in_rx=0, adc_retention = 1, (bit7=0) + /* 0x04: sync1 0x7a (0xd3) */ 0x7a, + /* 0x05: sync0 0x0e (0x91) */ 0x0e, + /* 0x06: pktlen 0x14 (0x3d) */ PACKET_LENGTH, + /* 0x07: pktctrl1 0x04 (----) */ { Cc1101::NO_ADDR_CHECK, 1, 0, 0, 0 }, // adr_chk=0b00, append_status=1, crc_autoflush=0, (bit4=0), pqt=0b000 + /* 0x08: pktctrl0 0x05 (----) */ { Cc1101::FIXED, 1, 0, Cc1101::NORMAL_USE_FIFO, 0, 0 }, // length_config=0b01, crc_en=1, (bit3=0), pkt_format=0b00, white_data=0, (bit7=0) + /* 0x09: addr 0x00 (----) */ 0x00, + /* 0x0a: channr 0x00 (----) */ 0x00, + /* 0x0b: fsctrl1 0x06 (0x08) */ { 6, 0, 0 }, // frqu_if=6, (bit5=0), (bit76=0b00) + /* 0x0c: fsctrl0 0x00 (----) */ { 0 }, // freqoff = 0 + /* 0x0d: frequ2 0x21 (----) */ 0x21, + /* 0x0e: frequ1 0x62 (----) */ 0x62, + /* 0x0f: frequ0 0x76 (----) */ 0x76, + /* 0x10: mdmcfg4 0xca (0x5b) */ { 0x0a, 0, 3 }, // drate_e=0x0a, chanbw_m=0, chanbw_e=3 + /* 0x11: mdmcfg3 0xf8 (----) */ { 0xf8 }, // drate_m=0xf8 + /* 0x12: mdmcfg2 0x16 (0x03) */ { Cc1101::SYNC_16_16_CARRIER_SENSE, 0, Cc1101::GFSK, 0}, // sync_mode=0b110, manchester_en=0, mod_format=0b001, dem_dcfilt_off=0 + /* 0x13: mdmcfg1 0x22 (----) */ { 2, 0, Cc1101::FOUR, 0 }, // chanspc_e=0b10, bit32=0, num_preamble=0b010, fec_en=0 + /* 0x14: mdmcfg0 0xf8 (----) */ { 0xf8 }, // chanspc_m = 0x08 + /* 0x15: deviatn 0x40 (0x47) */ { 0, 0, 4, 0 }, // deviation_m=0, (bit3=0), deviation_e=4, (bit7=0) + /* 0x16: mcsm2 0x07 (----) */ { 7, 0, 0, 0 }, // rx_time=7 (NA), rx_time_qual=0, rx_time_rssi=0, (bit76=0b00) + /* 0x17: mcsm1 0x30 (----) */ { Cc1101::TXOFF_IDLE, Cc1101::RXOFF_IDLE, Cc1101::RSSI_BELOW_THRESHOLD__UNLESS_RECEIVE_PACKET, 0 }, // mcsm1 (txoff_mode=0b00, rxoff_mode=0b00, cca_mode=0b11, (bit76=0b00) ) + /* 0x18: mcsm0 0x18 (----) */ { 0, 0, 2, Cc1101::IDLE_TO_RX_OR_TX, 0 }, // xosc_force_on=0, pin_ctrl_en=0, po_timeout=2 (149-155us), fs_autocal=0b01, (bit76=0b00) + /* 0x19: foccfg 0x16 (0x1d) */ 0x16, + /* 0x1a: bscfg 0x6c (0x1c) */ 0x6c, + /* 0x1b: agcctrl2 0x43 (0xc7) */ 0x43, + /* 0x1c: agcctrl1 0x49 (0x00) */ 0x49, + /* 0x1d: agcctrl0 0x91 (0xb2) */ 0x91, + /* 0x1e: worevt1 0x87 (----) */ 0x87, + /* 0x1f: worevt0 0x6b (----) */ 0x6b, + /* 0x20: worctrl 0xfb (0xf8) */ 0xfb, + /* 0x21: frend1 0x56 (0xb6) */ 0x56, + /* 0x22: frend0 0x10 (----) */ { 0, 0, 1, 0 }, // pa_power = 0, (bit3 = 0), lodiv_buf_current = 1, (bit76=0b00) + /* 0x23: fscal3 0xe9 (0xea) */ 0xe9, + /* 0x24: fscal2 0x2a (----) */ 0x2a, + /* 0x25: fscal1 0x00 (----) */ 0x00, + /* 0x26: fscal0 0x1f (0x11) */ 0x1f, + /* 0x27: rcctrl1 0x41 (----) */ 0x41, + /* 0x28: rcctrl0 0x00 (----) */ 0x00, + /* 0x29: fstest 0x59 (----) */ 0x59, + /* 0x2a: ptest 0x7f (----) */ 0x7f, + /* 0x2b: agctest 0x3f (----) */ 0x3f, + /* 0x2c: test2 0x81 (0x88) */ 0x81, + /* 0x2d: test1 0x35 (0x31) */ 0x35, + /* 0x2e: test0 0x09 (0x0b) */ 0x09 + }; + + // -------------------------------------------------------------------------------------- + + int8_t Cc1101::runSend (uint8_t subtest) { + if (subtest == 0) { + bool ok = true; + GDOx_CFG_t cfg0 = SYNC_SENT_OR_RECEIVED_UNTIL_END_OF_PACKET; + ok &= writeRegister(0x02, cfg0); + return ok; + } else if (subtest > 1) { + return -1; + } + + printf_P(PSTR(" use + and - for power change (other key -> back to default)")); + + uint16_t cnt = 0; + uint8_t paIndex = 0; + uint8_t pa_power; + int key = EOF; + do { + // if ((cnt & 0x0f) == 0) { + // paIndex = (cnt >> 4) & 0x07; + // union { FREND0_t value; uint8_t byte; } frend0 = { paIndex, 0, 1, 0 }; + // printf_P(PSTR("\n switch power ")); + // if (writeRegister(FREND0, frend0.byte )) { + // printf_P(PSTR("to %d (FREND0 = 0x%02X)"), frend0.value.pa_power, frend0.byte); + // } else { + // printf_P(PSTR("fails")); + // } + // } + if (key != EOF) { + uint8_t max = (sizeof(PMEM_CC1101_PATABLE_INIT) / sizeof(PMEM_CC1101_PATABLE_INIT[0])) - 1; + switch (key) { + case '+': if (paIndex == 0) paIndex = 1; else if (paIndex > 1) paIndex--; break; + case '-': if (paIndex == 0) paIndex = max; else if (paIndex < max) paIndex++; break; + default: paIndex = 0; break; // default value + } + + const PATABLE_INIT_ITEM_t *values = PMEM_CC1101_PATABLE_INIT; + + memcpy_P(&pa_power, &((values[paIndex]).pa_power), 1); + PGM_P info = (values[paIndex]).dbm; + printf_P(PSTR("\n switch power to ")); printf_P(info); + printf_P(PSTR("dBm ")); + if (writeRegister(0x3e, pa_power )) { + printf_P(PSTR("(PATABLE = 0x%02X)"), pa_power); + } else { + printf_P(PSTR("fails")); + } + } + + MainRadioControlState state = UNKNOWN; + uint8_t data[PACKET_LENGTH]; + printf_P(PSTR("\n [%04x]: state="), cnt++); + if (!readStatusRegister(MARCSTATE, (uint8_t *)&state)) { + printf_P(PSTR("E1")); + } else { + printf_P(PSTR("0x%02x"), state); + } + data[0] = pa_power; + printf_P(PSTR(" --> send %d bytes (HEX: %02X"), sizeof(data), paIndex); + for (uint8_t i = 1; i < sizeof(data); i++) { + data[i] = uint8_t((cnt + i - 1) & 0xff); + printf_P(PSTR(" %02X"), data[i]); + } + printf_P(PSTR("] -> ")); + + if (!sendData(data, sizeof(data))) { + flashRedLed(100); + printf_P(PSTR("E1")); + continue; + } + flashGreenLed(100); + key = waitAndReadKey(2000); + printf_P(PSTR("OK")); + + } while (key == EOF || (key != ESCAPE)); + + return 0; + } + + int8_t Cc1101::runReceive (uint8_t subtest) { + if (subtest == 0) { + bool ok = true; + GDOx_CFG_t cfg0 = SYNC_SENT_OR_RECEIVED_UNTIL_END_OF_PACKET; + ok &= writeRegister(0x02, cfg0); + return ok; + } else if (subtest > 1) { + return -1; + } + + int key = EOF; + uint16_t cnt = 0; + MainRadioControlState state; + while (key == EOF) { + printf_P(PSTR("\n [%04x] => start ... "), cnt++); + strobe(SRX); + do { + state = UNKNOWN; + if (!readStatusRegister(MARCSTATE, (uint8_t *)&state)) { + printf_P(PSTR("E1")); + _delay_ms(500); + break; + } + if (wait(0) != EOF) { + printf_P(PSTR("cancelled")); + _delay_ms(500); + break; + } + if (state == IDLE) { + printf_P(PSTR("? (IDLE)")); + _delay_ms(500); + break; + } + + } while (state != RX && state != RXFIFO_OVERFLOW); + + if (state != RX && state != RXFIFO_OVERFLOW) { + continue; + } + printf_P(PSTR("OK, receive ... ")); + + uint8_t length; + uint8_t lastLength = 0xff; + do { + uint8_t data[PACKET_LENGTH]; + if (!readStatusRegister(MARCSTATE, (uint8_t *)&state)) { + printf_P(PSTR("E2")); + _delay_ms(500); + continue; + } + if (wait(0) != EOF) { + printf_P(PSTR("cancelled")); + _delay_ms(500); + return -1; + } + if (!readStatusRegister(RXBYTES, (uint8_t *)&length)) { + printf_P(PSTR("E2")); + _delay_ms(500); + continue; + } + if (lastLength != length) { + lastLength = length; + } + if (length >= PACKET_LENGTH) { + if (receiveData(data, &length, sizeof(data))) { + if (length > 0) { + flashGreenLed(100); + printf_P(PSTR(" -> ")); + if (status.receivePacketStatusValid) { + printf_P(PSTR(" RSSI=%d, LQI=%d, CRC "), status.receivedPacketStatus.value.rssi, status.receivedPacketStatus.value.lqi); + if (status.receivedPacketStatus.value.crcOk) { + printf_P(PSTR("OK, ")); + } else { + printf_P(PSTR("ERROR, ")); + } + } + printf_P(PSTR("%d data bytes (HEX): "), length); + for (uint8_t i = 0; i < length; i++) { + printf_P(PSTR(" %02X"), data[i]); + } + printf_P(PSTR(" ... ")); + } + } + } + + } while (state == RX || state == RXFIFO_OVERFLOW); + + printf_P(PSTR("done (state=0x%02x)"), state); + } + return -1; + } + + int8_t Cc1101::runTest (uint8_t subtest) { + if (subtest > 0) { + return -1; + } + while (wait(0) == EOF) {} + return -1; + } + + + int8_t Cc1101::run (uint8_t subtest) { + switch (mode) { + case Send: return runSend(subtest); + case Receive: return runReceive(subtest); + case Test: return runTest(subtest); + default: return -1; + } + } + + uint8_t Cc1101::sendSpiByte (uint8_t b) { + SPDR = b; + while (!(SPSR & (1< "), addr, value); + if (ok && status.receivePacketStatusValid) { + printf_P(PSTR("status=0x%02x]"), status.spiResponse.byte); + } else { + printf_P(PSTR("ERR]")); + } + } + + return ok; + } + + bool Cc1101::writeRegisters (uint8_t addr, uint8_t *buffer, uint8_t length) { + bool ok = true; + uint8_t l = length; + uint8_t *p = buffer; + + addr = (addr & 0x3f) | 0x40; // write burst + setChipEnableLow(); + ok &= waitForMisoLow(); + sendSpiByte(addr); + while (length-- > 0) { + sendSpiByte(*buffer++); + } + setChipEnableHigh(); + + if (debugPrint.print.writeRegisters) { + printf_P(PSTR("\n [writeRegisters(0x%02x): "), addr & 0x3f); + while (l-- > 0) { + printf_P(PSTR(" 0x%02x"), *p++); + } + printf_P(PSTR(" -> ")); + if (ok && status.receivePacketStatusValid) { + printf_P(PSTR("status=0x%02x]"), status.spiResponse.byte); + } else { + printf_P(PSTR("ERR]")); + } + } + + return ok; + } + + + bool Cc1101::readRegister (uint8_t addr, uint8_t *value) { + bool ok = true; + addr = (addr & 0x3f) | 0x80; + setChipEnableLow(); + ok &= waitForMisoLow(); + status.spiResponse.byte = sendSpiByte(addr); + status.spiResponseValid = 1; + *value = sendSpiByte(0); + setChipEnableHigh(); + + if (debugPrint.print.readRegister) { + printf_P(PSTR("\n [readRegister(0x%02x) -> "), addr & 0x3f); + if (ok && status.spiResponseValid) { + printf_P(PSTR("0x%02x,status=0x%02x]"), *value, status.spiResponse.byte); + } else { + printf_P(PSTR("ERR]")); + } + } + return ok; + } + + bool Cc1101::readRegisters (uint8_t addr, uint8_t *buffer, uint8_t length) { + bool ok = true; + + uint8_t l = length; + uint8_t *p = buffer; + + addr |= 0xc0; // read burst + setChipEnableLow(); + ok &= waitForMisoLow(); + sendSpiByte(addr); + while (length-- > 0) { + *buffer++ = sendSpiByte(0); + } + setChipEnableHigh(); + + if (debugPrint.print.readRegisters) { + printf_P(PSTR("\n [readRegisters(0x%02x, ..., %d)] -> "), addr & 0x3f, l); + if (ok) { + while (l-- > 0) { + printf_P(PSTR(" 0x%02x"), *p++); + } + printf_P(PSTR("]")); + } else { + printf_P(PSTR("ERR]")); + } + } + + return ok; + } + + bool Cc1101::readStatusRegister (StatusAddress_t addr, uint8_t *value) { + if (addr < 0x30 || addr > 0x3d) { + return false; + } else { + return readRegisters(addr, value, 1); + } + } + + bool Cc1101::sendData (uint8_t *buffer, uint8_t length) { + timer = 10; + uint8_t ok = true; + uint8_t txbytes; + uint8_t states[16]; uint8_t statesIndex = 0; + // ok &= writeRegister(0x3f, length); + ok &= writeRegisters(0x3f, buffer, length); + ok &= readStatusRegister(TXBYTES, &txbytes); + ok &= (txbytes == 20); + if (ok) { + ok &= strobe(STX); // start sending bytes + // ok &= waitForGD0High(); // wait for start of SYNC + if (ok) { + uint8_t lastState = 0; + uint8_t state; + do { + ok &= readStatusRegister(MARCSTATE, &state); + if (state != lastState && statesIndex < 16) { + states[statesIndex++] = state; + } + lastState = state; + } while (ok && state != 0x13 && timer > 0); + ok &= state == 0x13; // check if in state TX + } + if (ok) { + uint8_t lastTxbytes = 20; + do { + ok &= readStatusRegister(TXBYTES, &txbytes); + if (lastTxbytes != txbytes) { + lastTxbytes = txbytes; + } + } while (ok && txbytes > 0 && timer > 0); + ok &= txbytes == 0; + } + } + if (!ok) { + strobe(SFTX); // flush TXfifo + } else { + uint8_t state; + uint8_t lastState = 0; + do { + ok &= readStatusRegister(MARCSTATE, &state); + if (lastState != state) { + lastState = state; + } + } while (ok && state != 0x01 && timer > 0); + ok &= state == 0x01; // check if in state IDLE + } + // ok &= waitForGD0Low(); // wait for end of package + + if (ok) { + printf_P(PSTR(" States[")); + for (uint8_t i = 0; i < statesIndex; i++) { + printf_P(PSTR(" 0x%02X"), states[i]); + } + printf_P(PSTR("] ")); + } + + return ok; + } + + bool Cc1101::receiveData (uint8_t *buffer, uint8_t *receivedLength, uint8_t maxBufferSize) { + bool ok = true; + STATUS_RXBYTES_t status; + uint8_t lastLength = 0; + uint8_t length = 0; + *receivedLength = 0; + timer = 50; + + this->status.receivePacketStatusValid = 0; + ok &= readStatusRegister(RXBYTES, &status.byte); + if (ok && status.rxbytes.num_rxbytes > 0) { + length = status.rxbytes.num_rxbytes; + + do { + _delay_us(400); // 20 Bytes in 4ms -> 200us/Byte -> CC1101 datasheet page 56: "twice that of which RF bytes are recived" + lastLength = length; + ok &= readStatusRegister(RXBYTES, &status.byte); + if (ok) { + // printf_P(PSTR(" [rxbytes=%d] "), status.byte); + length = status.byte & 0x7f; + } + ok &= timer > 0; + } while (ok && lastLength != length); + + if (ok) { + uint8_t extraBytesCount = this->status.receivePacketStatusEnabled ? 2 : 0; + if ((PACKET_LENGTH + extraBytesCount) != length) { + printf_P(PSTR(" ERROR[receive %d bytes, expect %d bytes] "), *receivedLength, PACKET_LENGTH + extraBytesCount); + *receivedLength = 0; + ok = false; + } else { + printf_P(PSTR(" OK[receive %d bytes] "), length); + *receivedLength = PACKET_LENGTH < maxBufferSize ? length - extraBytesCount : maxBufferSize; + ok &= readRegisters(0xff, buffer, *receivedLength); + if (!ok) { + *receivedLength = 0; + } else { + length -= *receivedLength; + if (length > extraBytesCount) { + printf_P(PSTR(" [WARN: buffer to small] ")); + while (length > extraBytesCount) { + uint8_t byte; + ok &= readRegister(0xff, &byte); + ok = false; + length--; + } + } + if (length > 0) { + ok &= readRegisters(0xff, this->status.receivedPacketStatus.byte, 2); + if (ok) { + this->status.receivePacketStatusValid = 1; + } + } + } + } + } + } + ok &= strobe(SFRX); + + return ok; + } + + + void Cc1101::printRegisters () { + const Register_t *regValues = &PMEM_CC1101_REGISTER_INIT; + printf_P(PSTR("\n")); + for (uint8_t addr = 0; addr < sizeof(Register_t); addr++) { + bool ok = true; + uint8_t regValue, value; + memcpy_P(®Value, ((const uint8_t *)regValues) + addr, 1); + ok &= readRegister(addr, &value); + if (value != regValue) { printf_P(PSTR(" != 0x%02x"), regValue); } + } + uint8_t data[8]; + for (uint8_t addr = 0x30; addr <= 0x3d; addr++) { + readStatusRegister((StatusAddress_t)addr, data); + } + readRegisters(0x3e, data, 8); // PATABLE + } + + bool Cc1101::resetCC1101 () { + bool ok = true; + setChipEnableLow(); + _delay_us(10); + setChipEnableHigh(); + _delay_us(50); + setChipEnableLow(); + ok &= waitForMisoLow(); + ok &= strobe(SRES); + ok &= waitForMisoLow(); + + + return ok; + } + + bool Cc1101::initRegister () { + const Register_t *regValues = &PMEM_CC1101_REGISTER_INIT; + bool ok = true; + // DebugPrint_t tmp = debugPrint.print; + // debugPrint.byte = 0xff; // print all + // printRegisters(); + + for (uint8_t addr = 0; ok && addr < sizeof(Register_t); addr++) { + uint8_t regValue; + memcpy_P(®Value, ((const uint8_t *)regValues) + addr, 1); + ok &= writeRegister(addr, regValue); + if ((addr == 0x07) && (regValue & 0x04)) { + status.receivePacketStatusEnabled = true; + } + } + + // debugPrint.print = tmp; + return ok; + } + + bool Cc1101::initPaTable () { + const PATABLE_INIT_ITEM_t *values = PMEM_CC1101_PATABLE_INIT; + uint8_t patable[8]; + uint8_t initValuesIndex = 0; + for (uint8_t i = 0; i < 8; i++) { + memcpy_P(&patable[i], &(values[initValuesIndex++].pa_power), 1); + if (initValuesIndex >= (sizeof(PMEM_CC1101_PATABLE_INIT) / sizeof(PATABLE_INIT_ITEM_t))) { + initValuesIndex = 0; + } + if (debugPrint.print.writePaTable) { + printf_P(PSTR("\nPTABLE %d: 0x%02x"), i, patable[i]); + } + } + return writeRegisters(0x3e, patable, 8); + } + +#endif + + diff --git a/software/nano-644/test_2024-07-23/src/units/cc1101.hpp b/software/nano-644/test_2024-07-23/src/units/cc1101.hpp new file mode 100644 index 0000000..a861f09 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/cc1101.hpp @@ -0,0 +1,281 @@ +#ifndef CC1101_HPP +#define CC1101_HPP + +#include +#include "../main.hpp" +#include + +class Cc1101 : public TestUnit { + public: + #define PACKET_LENGTH 20 + + public: + typedef enum { Test, Send, Receive } Cc1101Mode; + typedef enum { _IDLE = 0, _RX = 1, _TX = 2, _FSTXON = 3, _CALIBRATE = 4, _SETTLING = 5, _RXFIFO_OVFL = 6, _TXFIFO_UNFL = 7 } StatusState_t; + typedef struct { uint8_t fifoBytes:4; StatusState_t state:3; uint8_t chipNotReady:1; } Status_t; + typedef struct { int8_t rssi:8; uint8_t lqi:7; uint8_t crcOk:1; } ReceivedPacketStatus_t; // CC1101 datasheet page 37 + union { + struct { + union { + Status_t value; + uint8_t byte; + } spiResponse; + union { + ReceivedPacketStatus_t value; + uint8_t byte [2]; + } receivedPacketStatus; + uint8_t spiResponseValid: 1; + uint8_t receivePacketStatusEnabled:1; + uint8_t receivePacketStatusValid:1; + }; + uint32_t dword; + } status; + + public: + Cc1101 (Cc1101Mode mode) { timer = 0; this->mode = mode; status.dword = 0; } + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName (); + + public: + void tick1ms () { if (timer > 0) timer--; }; + + private: + typedef enum { SRES = 0x30, SCAL = 0x33, SRX = 0x34, STX = 0x35, SFRX = 0x3a, SFTX = 0x3b, SIDLE = 0x36 } StrobeCommand_t; + typedef enum { MARCSTATE = 0x35, TXBYTES = 0x3A, RXBYTES = 0x3B } StatusAddress_t; + typedef struct { uint8_t writeRegister:1; uint8_t writeRegisters:1; uint8_t readRegister:1; uint8_t readRegisters:1; uint8_t writePaTable:1; } DebugPrint_t; + + private: + int8_t runSend (uint8_t subtest); + int8_t runReceive (uint8_t subtest); + int8_t runTest (uint8_t subtest); + uint8_t sendSpiByte (uint8_t b); + void triggerOn(); + void triggerOff(); + void triggerToggle (); + void setChipEnableLow (); + void setChipEnableHigh (); + bool isMisoHigh (); + bool isGd0High (); + bool waitForMisoLow (); + bool waitForGD0High (); + bool waitForGD0Low (); + bool strobe (StrobeCommand_t strobe); + bool writeRegister (uint8_t addr, uint8_t value); + bool writeRegisters (uint8_t addr, uint8_t *buffer, uint8_t length); + bool readRegister (uint8_t addr, uint8_t *value); + bool readRegisters (uint8_t addr, uint8_t *buffer, uint8_t length); + bool readStatusRegister (StatusAddress_t addr, uint8_t *value); + bool sendData (uint8_t *buffer, uint8_t length); + bool receiveData (uint8_t *buffer, uint8_t *receivedLength, uint8_t maxBufferSize); + void printRegisters (); + + bool resetCC1101 (); + bool initRegister (); + bool initPaTable (); + + + private: + Cc1101Mode mode; + uint8_t timer; + union { + DebugPrint_t print; + uint8_t byte; + } debugPrint; + + + public: + typedef enum { + IOCFG2 = 0x00, IOCFG1 = 0x01, IOCFG0 = 0x02, + FIFOTHR = 0x03, + SYNC1 = 0x04, SYNC0 = 0x05, + PKTLEN = 0x06, + PKTCTRL1 = 0x07, PKTCTRL0 = 0x08, + ADDR = 0x00, CHANNR = 0x0a, + FSCTRL1 = 0x0b, FSCTRL0 = 0x0c, + FREQU2 = 0x0d, FREQU1 = 0x0e, FREQU0 = 0x0f, + MDMCFG4 = 0x10, MDMCFG3 = 0x11, MDMCFG2 = 0x12, MDMCFG1 = 0x13, MDMCFG0 = 0x14, + DEVIATN = 0x15, + MCSM2 = 0x16, MCSM1 = 0x17, MCSM0 = 0x18, + FOCCFG = 0x19, BSCFG = 0x1a, + AGCCTRL2 = 0x1b, AGCCTRL1 = 0x1c, AGCCTRL0 = 0x1d, + WOREVT1 = 0x1e, WOREVT0 = 0x1f, WORCTRL = 0x20, + FREND1 = 0x21, FREND0 = 0x22, + FSCAL3 = 0x23, FSCAL2 = 0x24, FSCAL1 = 0x25, FSCAL0 = 0x26, + RCCTRL1 = 0x27, RCCTRL0 = 0x28, + FSTEST = 0x29, PTEST = 0x2a, AGCTEST = 0x2b, + TEST2 = 0x2c, TEST1 = 0x2d, TEST0 = 0x2e + } RegisterAddress_t; + + typedef enum { + RX_FIFO_FILLED_OR_ABOVE_THRESHHOLD = 0x00, + RX_FIFO_FILLED_OR_ABOVE_THRESHHOLD_OR_END_OF_PACKAGE_UNTIL_FIFO_EMPTY = 0x01, + TX_FIFO_FILLED_OR_ABOVE_THRESHHOLD = 0x02, + TX_FIFO_FULL_UNTIL_BELOW_THRESHHOLD = 0x03, + RX_FIFO_OVERFLOW_UNTIL_FIFO_FLUSHED = 0x04, + TX_FIFO_UNDERFLOW_UNTIL_FIFO_FLUSHED = 0x05, + SYNC_SENT_OR_RECEIVED_UNTIL_END_OF_PACKET = 0x06, + PACKET_RECEIVED_WITH_CRC_OK_UNTIL_FIRST_BYTE_READ_FROM_RXFIFO = 0x07, + PREAMBLE_QUALITY_REACHED_UNTIL_REENTER_RX = 0x08, + RSSI_LEVEL_BELOW_THRESHOLD = 0x09, + LOCK_DETECTOR_OUTPUT = 0x0a, + SERIAL_CLOCK = 0x0b, + SERIAL_SYNCHRONOUS_DATA_OUTPUT = 0x0c, + SERIAL_ASYNC_DATA_OUTPUT = 0x0d, + CARRIER_DETECTED_UNTIL_ENTER_IDLE = 0x0e, + CRC_OK_UNTIL_REENTER_RX = 0x0f, + RX_HARD_DATA_1 = 0x16, + RX_HARD_DATA_0 = 0x17, + PA_PD = 0x1b, + LNA_PD = 0x1c, + RX_SYMBOL_TICK = 0x1d, + WAKEUP_ON_RECEIVE_EVENT0 = 0x24, + WAKEUP_ON_RECEIVE_EVENT1 = 0x25, + CLK_256 = 0x26, + CLK_32K = 0x27, + CHIP_NOT_READY = 0x29, + XOSC_STABLE = 0x2b, + HIGH_IMPEDANCE_WHEN_CHIP_SELECT_HIGH = 0x2e, + HW_TO_0 = 0x2f, + CLK_XOSC = 0x30, + CLK_XOSC_DIV_1P5 = 0x31, + CLK_XOSC_DIV_2 = 0x32, + CLK_XOSC_DIV_3 = 0x33, + CLK_XOSC_DIV_4 = 0x34, + CLK_XOSC_DIV_6 = 0x35, + CLK_XOSC_DIV_8 = 0x36, + CLK_XOSC_DIV_12 = 0x37, + CLK_XOSC_DIV_16 = 0x38, + CLK_XOSC_DIV_24 = 0x39, + CLK_XOSC_DIV_32 = 0x3a, + CLK_XOSC_DIV_48 = 0x3b, + CLK_XOSC_DIV_64 = 0x3c, + CLK_XOSC_DIV_96 = 0x3d, + CLK_XOSC_DIV_128 = 0x3e, + CLK_XOSC_DIV_192 = 0x3f + } GDOx_CFG_t; + + typedef enum { + SLEEP = 0, + IDLE = 1, + XOFF = 2, + MANCAL_VCOON = 3, + MANCAL_REGON = 4, + MANCAL = 5, + FS_WAKEUP_VCOON = 6, + FS_WAKEUP_REGON = 7, + CALIBRATE_START = 8, + SETTLING_BWBOOST = 9, + SETTLING_FS_LOCK = 10, + SETTLIN_IFADCON = 11, + CALIBRATE_END = 12, + RX = 13, + RX_END = 14, + RX_RST = 15, + TXRX_SETTLING = 16, + RXFIFO_OVERFLOW = 17, + FXTXON = 18, + TX = 19, + TX_END = 20, + RXTX_SETTLING = 21, + TXFIFO_UNDERFLOW = 22, + UNKNOWN = 255 + } MainRadioControlState; + + typedef struct { uint8_t pa_power; const char dbm[4]; } PATABLE_INIT_ITEM_t; + + typedef enum { NO_ADDR_CHECK = 0, CHECK_NO_BROADCAST = 1, CHECK_WITH_BROADCAST_0 = 2, CHECK_WITH_BROADCAST_0_AND_255 = 3 } ADR_CHK_t; + typedef enum { FIXED = 0, VARIABLE = 1, INFINITE = 2 } LENGTH_CONFIG_t; + typedef enum { NORMAL_USE_FIFO = 0, SYNC_SERIAL = 1, RANDOM_TX = 2, ASYNC_SERIAL = 3 } PKT_FORMAT_t; + typedef enum { FSK2 = 0, GFSK = 1, ASK_OOK = 3, FSK4 = 4, MSK = 7 } MOD_FORMAT_t; + typedef enum { NO_SYNC = 0, SYNC_15_16 = 1, SYNC_16_16 = 2, SYNC_30_32 = 3, CARRIER_SENSE = 4, SYNC_15_16_CARRIER_SENSE = 5, SYNC_16_16_CARRIER_SENSE = 6 , SYNC_30_326_CARRIER_SENSE = 7} SYNC_MODE_t; + typedef enum { TWO = 0, THREE = 1, FOUR = 2, SIX = 3, EIGHT = 4, TWELVE = 5, SIXTEEN = 6, TWENTYFOUR = 7 } NUM_PREAMBLE_t; + typedef enum { TXOFF_IDLE = 0, TXOFF_FSTXON = 1, STAY_IN_TX = 2, TXOFF_RX = 3 } TXOFF_MODE_t; + typedef enum { RXOFF_IDLE = 0, RXOFF_FSTXON = 1, RXOFF_TX = 2, STAY_IN_RX = 3 } RXOFF_MODE_t; + typedef enum { ALWAYS = 0, RSSI_BELOW_THRESHOLD = 1, UNLESS_RECEIVE_PACKET = 2, RSSI_BELOW_THRESHOLD__UNLESS_RECEIVE_PACKET = 3 } CCA_MODE_t; + typedef enum { NEVER = 0, IDLE_TO_RX_OR_TX = 1, RX_OR_TX_TO_IDLE = 2, RX_OR_TX_TO_IDLE_EVERY_4_TIME = 3 } FS_AUTOCAL_t; + + typedef struct { GDOx_CFG_t gdo0_cfg:6; uint8_t gdo0_inv:1; uint8_t bit7:1; } IOCFG0_t; + typedef struct { GDOx_CFG_t gdo1_cfg:6; uint8_t gdo1_inv:1; uint8_t bit7:1; } IOCFG1_t; + typedef struct { GDOx_CFG_t gdo2_cfg:6; uint8_t gdo2_inv:1; uint8_t bit7:1; } IOCFG2_t; + typedef struct { uint8_t fifo_thr:4; uint8_t close_in_rx:2; uint8_t adc_retention:1; uint8_t bit7:1; } FIFOTHR_t; + typedef struct { ADR_CHK_t adr_chk:2; uint8_t append_status:1; uint8_t crc_autoflush:1; uint8_t bit4:1; uint8_t pqt:3; } PKTCTRL1_t; + typedef struct { LENGTH_CONFIG_t length_config:2; uint8_t crc_en:1; uint8_t bit3:1; PKT_FORMAT_t pkt_format:2; uint8_t white_data:1; uint8_t bit7:1; } PKTCTRL0_t; + typedef struct { uint8_t frequ_if:5; uint8_t bit5:1; uint8_t bit76:2; } FSCTRL1_t; + typedef struct { uint8_t frequoff:8; } FSCTRL0_t; + typedef struct { uint8_t drate_e:4; uint8_t chanbw_m:2; uint8_t chanbw_e:2; } MDMCFG4_t; + typedef struct { uint8_t drate_m:8; } MDMCFG3_t; + typedef struct { SYNC_MODE_t sync_mode:3; uint8_t manchester_en:1; MOD_FORMAT_t mod_format:3; uint8_t dem_dcfilt_off:1; } MDMCFG2_t; + typedef struct { uint8_t chanspc_e:2; uint8_t bit32:2; NUM_PREAMBLE_t num_preamble:3; uint8_t fec_en:1; } MDMCFG1_t; + typedef struct { uint8_t chanspc_m:8; } MDMCFG0_t; + typedef struct { uint8_t deviation_m:3; uint8_t bit3:1; uint8_t deviation_e:3; uint8_t bit7:1; } DEVIATN_t; + typedef struct { uint8_t rx_time:3; uint8_t rx_time_qual:1; uint8_t rx_time_rssi:1; uint8_t bit765:3; } MCSM2_t; + typedef struct { TXOFF_MODE_t txoff_mode:2; RXOFF_MODE_t rxoff_mode:2; CCA_MODE_t cca_mode:2; uint8_t bit76:2; } MCSM1_t; + typedef struct { uint8_t xosc_force_on:1; uint8_t pin_ctrl_en:1; uint8_t po_timeout:2; FS_AUTOCAL_t fs_autocal:2; uint8_t bit76:2; } MCSM0_t; + typedef struct { uint8_t pa_power:3; uint8_t bit3:1; uint8_t lodiv_buf_current:2; uint8_t bit76:2; } FREND0_t; + + typedef union { + uint8_t byte; + struct { + uint8_t num_rxbytes:7; + uint8_t rxfifo_overflow:1; + } rxbytes; + } STATUS_RXBYTES_t; + + typedef struct { + IOCFG2_t iocfg2; + IOCFG1_t iocfg1; + IOCFG0_t iocfg0; + FIFOTHR_t fifothr; + uint8_t sync1; + uint8_t sync0; + uint8_t pktlen; + PKTCTRL1_t pktctrl1; + PKTCTRL0_t pktctrl0; + uint8_t addr; + uint8_t channr; + FSCTRL1_t fsctrl1; + FSCTRL0_t fsctrl0; + uint8_t frequ2; + uint8_t frequ1; + uint8_t frequ0; + MDMCFG4_t mdmcfg4; + MDMCFG3_t mdmcfg3; + MDMCFG2_t mdmcfg2; + MDMCFG1_t mdmcfg1; + MDMCFG0_t mdmcfg0; + DEVIATN_t deviatn; + MCSM2_t mcsm2; + MCSM1_t mcsm1; + MCSM0_t mcsm0; + uint8_t foccfg; + uint8_t bscfg; + uint8_t agcctrl2; + uint8_t agcctrl1; + uint8_t agcctrl0; + uint8_t worevt1; + uint8_t worevt0; + uint8_t worctrl; + uint8_t frend1; + FREND0_t frend0; + uint8_t fscal3; + uint8_t fscal2; + uint8_t fscal1; + uint8_t fscal0; + uint8_t rcctrl1; + uint8_t rcctrl0; + uint8_t fstest; + uint8_t ptest; + uint8_t agctest; + uint8_t test2; + uint8_t test1; + uint8_t test0; + + } Register_t; + + + +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/encoder.cpp b/software/nano-644/test_2024-07-23/src/units/encoder.cpp new file mode 100644 index 0000000..7b33b76 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/encoder.cpp @@ -0,0 +1,138 @@ +#include +#include + +#include "encoder.hpp" +#include "../main.hpp" + +// Encoder signals on rotation clockwise 1 step: +// A -----____------ one char app. 1ms..2ms (rotation speed) +// B -------___----- +// one step when: A = 0, B= 1->0 + +// Encoder signals on rotation counterclockwise 1 step: +// A -----____------ one char app. 1ms..2ms (rotation speed) +// B --______----- +// one step when: A = 0, B= 0->1 + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // --------------------------------------------------------------- + // PB0/T0 ... Encoder A + // PB1/T1 ... Encoder B + // PB2/INT2 ... push switch of encoder (pushed = 0) + + void Encoder::init () { + DDRB &= ~((1 << PB2) | (1 << PB1) | (1 << PB0)); + PORTB |= (1 << PORTB2) | (1 << PORTB1) | (1 << PORTB0); // enable pullup + enabled = 1; + } + + void Encoder::cleanup () { + enabled = 0; + DDRB &= ~((1 << PB2) | (1 << PB1) | (1 << PB0)); + PORTB &= ~((1 << PORTB2) | (1 << PORTB1) | (1 << PORTB0)); + } + + bool Encoder::isPressed () { + return (PINB & (1 << PB2)) == 0; + } + + bool Encoder::getA () { + return (PINB & (1 << PB0)) == 0; + } + + bool Encoder::getB () { + return (PINB & (1 << PB1)) == 0; + } + + +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // --------------------------------------------------------------- + // PD4/T0 ... Encoder A + // PB0 ... Encoder B + // PD7 ... push switch of encoder (pushed = 0) + + void Encoder::init () { + DDRB &= ~(1 << PB0); + DDRD &= ~((1 << PD7) | (1 << PD4)); + PORTB |= (1 << PB0); // enable pullup + PORTD |= (1 << PD7) | (1 << PD4); // enable pullup + enabled = 1; + } + + void Encoder::cleanup () { + enabled = 0; + PORTB &= ~(1 << PB0); + PORTD &= ~((1 << PD7) | (1 << PD4)); + DDRB &= ~(1 << PB0); + DDRD &= ~((1 << PD7) | (1 << PD4)); + } + + bool Encoder::isPressed () { + return (PIND & (1 << PD7)) == 0; + } + + bool Encoder::getA () { + return (PIND & (1 << PD4)) == 0; + } + + bool Encoder::getB () { + return (PINB & (1 << PB0)) == 0; + } + +#endif + + +int8_t Encoder::run (uint8_t subtest) { + switch (subtest) { + case 0: { + while (wait(10) == EOF) { + printf_P(PSTR("\r => Encoder (push to clear): ")); + printf_P(PSTR("%5d (0x%02x) "), count, (uint8_t)count); + if (isPressed()) { + reset(); + } + } + return 0; + } + } + + return -1; +} + +struct EncoderState { + int8_t a:1; // signal A + int8_t b:1; // signal B +}; + +void Encoder::tick100us () { + static EncoderState lastState = { 1, 1 }; + static EncoderState lastStableState = { 1, 1 }; + + if (!enabled) { + count = 0; + return; + } + EncoderState nextState; + nextState.a = getA() ? 1 : 0; + nextState.b = getB() ? 1 : 0; + if (nextState.a == lastState.a && nextState.b == lastState.b) { + if (lastStableState.a == 0 && nextState.b != lastStableState.b) { + if (nextState.b == 0) { + count = count < 127 ? count + 1 : 127; + } else { + count = count > -128 ? count - 1 : -128; + } + } + lastStableState.a = nextState.a; + lastStableState.b = nextState.b; + } + lastState.a = nextState.a; + lastState.b = nextState.b; +} + diff --git a/software/nano-644/test_2024-07-23/src/units/encoder.hpp b/software/nano-644/test_2024-07-23/src/units/encoder.hpp new file mode 100644 index 0000000..9b0861b --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/encoder.hpp @@ -0,0 +1,28 @@ +#ifndef ENCODER_HPP +#define ENCODER_PP + +#include +#include "../main.hpp" +#include + +class Encoder : public TestUnit { + public: + uint8_t enabled; + int8_t count; + + public: + Encoder () { reset(); enabled = 0; }; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Encoder"); } + void reset () { count = 0; } + void tick100us (); + bool isPressed (); + + private: + bool getA (); + bool getB (); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/i2c.cpp b/software/nano-644/test_2024-07-23/src/units/i2c.cpp new file mode 100644 index 0000000..60dd22d --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/i2c.cpp @@ -0,0 +1,216 @@ +#include +#include +#include +#include +#include + +#include "i2c.hpp" +#include "../adafruit/bme280.h" +#include "../main.hpp" + +// Sparkfun https://www.sparkfun.com/products/22858 +// ENS160 address 0x53 (air quality sensor) +// BME280 address 0x77 /humidity/temperature sensor) +// register 0xfe: humidity_7:0 +// register 0xfd: humidity_15:8 + +PGM_P I2c::getName () { + switch (mode) { + case SparkFunEnvCombo: return PSTR("I2C-Sparkfun Env-Combo"); + case Master: return PSTR("I2C-Master"); + case Slave: return PSTR("I2C-Slave"); + } + return "?"; +} + +void I2c::init () { + TWBR = 13; // 100kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 100000) / (2 * 100000 * 4); + TWBR = 28; // 50kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 50000) / (2 * 50000 * 4); + TWBR = 100; // 50kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 50000) / (2 * 50000 * 4); + TWCR = (1 << TWEN); + ADMUX = (1 << ADLAR) | (1 << REFS0); // ADC0, VREF=AVCC=3.3V + ADCSRA = (1 << ADEN) | 7; // ADC Enable, Prescaler 128 + enabled = true; +} + +void I2c::cleanup () { + enabled = false; + TWCR = (1 << TWEN); + TWBR = 0; + ADMUX = 0; + ADCSRA = 0; +} + +int8_t I2c::run (uint8_t subtest) { + if (subtest == 0 && mode == I2c::SparkFunEnvCombo) { + printf_P(PSTR(" BM280 ... ")); + if (!bm280.begin()) { + printf_P(PSTR("E1")); + return -1; + } + printf_P(PSTR("OK, ENS160 ... ")); + if (!ens160.begin()) { + printf_P(PSTR("E2")); + return -1; + } + if (!ens160.setMode(ENS160_OPMODE_STD)) { + printf_P(PSTR("E3")); + return -1; + } + if (!ens160.set_envdata(25.0, 65)) { + printf_P(PSTR("E4")); + return -1; + } + + printf_P(PSTR("OK")); + float accTemp = 0, accHumidity = 0; + int8_t accCount = -1; + + do { + // BME280 + float p = bm280.readPressure(); + printf_P(PSTR("\n => BM280: P= %.3fbar"), (double)p / 100000.0); + float t = bm280.readTemperature(); + printf_P(PSTR(", T= %.2f°C"), (double)t); + float h = bm280.readHumidity(); + printf_P(PSTR(", H= %.2f%%"), (double)h); + + if (accCount >= 0 && !isnanf(h) && !isnan(t)) { + accTemp += t; + accHumidity += h; + accCount++; + } + + bm280.setSampling( + Adafruit_BME280::MODE_NORMAL, + Adafruit_BME280::SAMPLING_X16, + Adafruit_BME280::SAMPLING_X16, + Adafruit_BME280::SAMPLING_X16, + Adafruit_BME280::FILTER_OFF, + Adafruit_BME280::STANDBY_MS_1000 + ); + + // ENS160 only activated every 32s to avoid wrong temperature measuerment + // if ES160 would be continously active, the temperature would be 4°C higher + // -> ES160 has not enough distance to BM280 + // This solution causes only a +0.3°C higher temperatur value + if (accCount < 0 || accCount >= 32) { + printf_P(PSTR(" | ENS160 (")); + if (accCount > 0) { + h = accHumidity / accCount; + t = accTemp / accCount; + accTemp = 0; + accHumidity = 0; + } + accCount = 0; + if (!ens160.set_envdata(t, h)) { + printf_P(PSTR("E1)")); + } else { + printf_P(PSTR("%.1f°C/%.1f%%): "), (double)t, (double)h); + if (!ens160.setMode(ENS160_OPMODE_STD)) { + printf_P(PSTR("E2")); + } else { + for (uint8_t i = 0; i < 100; i++) { + _delay_ms(15); + uint8_t status; + if (ens160.readStatus(&status)) { + if (status & ENS160_DATA_STATUS_NEWDAT) { + ENS160_DATA data; + if (ens160.readData(&data)) { + printf_P(PSTR(" aqi=%d("), data.aqi); + switch(data.aqi) { + case 1: printf_P(PSTR("excellent")); break; + case 2: printf_P(PSTR("good")); break; + case 3: printf_P(PSTR("moderate")); break; + case 4: printf_P(PSTR("poor")); break; + case 5: printf_P(PSTR("unhealthy")); break; + default: printf_P(PSTR("?")); break; + } + printf_P(PSTR("), tvoc=%dppb"), data.tvoc); + printf_P(PSTR(", eco2=%d("), data.eco2); + if (data.eco2 < 400) { + printf_P(PSTR("?")); + } else if (data.eco2 < 600) { + printf_P(PSTR("excellent")); + } else if (data.eco2 < 800) { + printf_P(PSTR("good")); + } else if (data.eco2 < 1000) { + printf_P(PSTR("fair")); + } else if (data.eco2 < 1500) { + printf_P(PSTR("poor")); + } else { + printf_P(PSTR("bad")); + } + printf_P(PSTR(")")); + } + break; + } + } + } + } + if (!ens160.setMode(ENS160_OPMODE_IDLE)) { + printf_P(PSTR("E3")); + } + } + } + + } while (wait(1000) == EOF); + + } else if (subtest == 0 && mode == I2c::Master) { + if (!master.begin(0x01)) { + printf_P(PSTR("E1")); + return -1; + } + do { + uint8_t buffer[1]; + // read poti + ADCSRA |= (1 << ADSC); // start ADC + while (ADCSRA & (1 << ADSC)) {} // wait for result + buffer[0] = ADCH; + printf_P(PSTR("\n I2C-MASTER: to slave: 0x%02x"), buffer[0]); + if (!master.write(buffer, 1)) { + printf_P(PSTR(" -> ERROR")); + } + printf_P(PSTR(", from slave: ")); + if (master.read(buffer, 1)) { + printf_P(PSTR("0x%02x"), buffer[0]); + } else { + printf_P(PSTR(" -> ERROR")); + } + } while (wait(1000) == EOF); + master.end(); + + } else if (subtest == 0 && mode == I2c::Slave) { + if (!slave.begin(0x01, false)) { + printf_P(PSTR("E1")); + return -1; + } + do { + int fromMaster = slave.read(); + if (fromMaster != EOF) { + ADCSRA |= (1 << ADSC); // start ADC + while (ADCSRA & (1 << ADSC)) {} // wait for result + slave.write(ADCH); + printf_P(PSTR("\n I2C SLAVE: from master: 0x%02x -> to master: 0x%02x"), fromMaster, ADCH); + } + } while (wait(0) == EOF); + slave.end(); + + } else { + printf_P(PSTR("end")); + return -1; + } + wait(500); + return 0; +} + +void I2c::handleTwiIrq () { + if (mode == I2c::Slave) { + DDRD |= (1 << PD7); + PORTD |= (1 << PD7); + slave.handleTWIIsr(); + PORTD &= ~(1 << PD7); + } else { + TWCR |= (1 << TWINT); // clear Interrupt Request + } +} diff --git a/software/nano-644/test_2024-07-23/src/units/i2c.hpp b/software/nano-644/test_2024-07-23/src/units/i2c.hpp new file mode 100644 index 0000000..2148cc0 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/i2c.hpp @@ -0,0 +1,43 @@ +#ifndef I2C_HPP +#define I2C_HPP + +#include +#include "../main.hpp" +#include "../adafruit/bme280.h" +#include "../adafruit/ens160.h" +#include "../i2cmaster.hpp" +#include "../i2cslave.hpp" + + +class I2c : public TestUnit { + public: + typedef enum I2cMode { SparkFunEnvCombo, Master, Slave } I2cMode; + + private: + I2cMode mode; + Adafruit_BME280 bm280; + ScioSense_ENS160 ens160; + I2cMaster master; + I2cSlave slave; + + public: + bool enabled; + + public: + I2c (I2cMode mode) { enabled = false; this->mode = mode; } + void tick1ms () { master.tick1ms(); slave.tick1ms(); } + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName (); + void handleTwiIrq (); + // uint16_t startRead (uint8_t address); + // uint16_t startWrite (uint8_t address); + // void stop (); + // uint16_t writeByte (uint8_t data); + // uint16_t writeData (uint8_t size, const uint8_t *data); + // uint16_t readData (uint8_t size, uint8_t *data); + // int32_t compensateBm280T (int32_t adcT); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/ieee485.cpp b/software/nano-644/test_2024-07-23/src/units/ieee485.cpp new file mode 100644 index 0000000..8fcb67a --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/ieee485.cpp @@ -0,0 +1,111 @@ +#include +#include +#include +#include + +#include "ieee485.hpp" +#include "../main.hpp" + +#ifdef __AVR_ATmega328P__ + +// Nano-328P +// ------------------------------------ +// IEE485 not supported (no UART1) + +void Ieee485::init () {} +void Ieee485::cleanup () {} +int8_t Ieee485::run (uint8_t subtest) { + return -1; +} + +#endif + + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + +// Nano-644 +// ------------------------------------ +// PB0 ... nRE .. Read enable +// PB1 ... DE .. Data enable + +#define SET_nRE (PORTB |= (1 << PB0)) +#define CLR_nRE (PORTB &= ~(1 << PB0)) +#define SET_DE (PORTB |= (1 << PB1)) +#define CLR_DE (PORTB &= ~(1 << PB1)) + +void Ieee485::init () { + // Poti + ADMUX = (1 << ADLAR) | (1 << REFS0); // ADC0, VREF=AVCC=3.3V + ADCSRA = (1 << ADEN) | 7; // ADC Enable, Prescaler 128 + + // Modbus + SET_nRE; + CLR_DE; + DDRB |= (1 << PB1) | (1 << PB0); + + // UART1 interface on Nano-644 + PORTD |= (1 << PD2); // enable RxD1 pullup + UCSR1A = (1 << U2X1); + UCSR1B = (1 << RXCIE1) | (1 << RXEN1) | (1 < send Byte 0x%02x"), ADCH); + int b; + ATOMIC_BLOCK(ATOMIC_FORCEON) { + b = receivedByte; + receivedByte = -1; + } + if (b >= 0) { + printf_P(PSTR("\n => receive Byte: 0x%02x"), b); + } + } + + } else { + printf_P(PSTR("end")); + return -1; + } + + return 0; +} + +void Ieee485::handleRxByte (uint8_t b) { + receivedByte = b; +} + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/ieee485.hpp b/software/nano-644/test_2024-07-23/src/units/ieee485.hpp new file mode 100644 index 0000000..ffbb15c --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/ieee485.hpp @@ -0,0 +1,22 @@ +#ifndef IEEE485_HPP +#define IEEE485_HPP + +#include +#include "../main.hpp" +#include + +class Ieee485 : public TestUnit { + public: + uint8_t enabled; + int16_t receivedByte; + + public: + Ieee485 () { enabled = 0; receivedByte = -1; } + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual const char *getName () { return PSTR("IEEE485"); } + void handleRxByte (uint8_t); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/lcd.cpp b/software/nano-644/test_2024-07-23/src/units/lcd.cpp new file mode 100644 index 0000000..8640690 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/lcd.cpp @@ -0,0 +1,264 @@ +#include +#include +#include + +#include "lcd.hpp" +#include "../main.hpp" + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // --------------------------------------------------------------- + // PA3 ..... E --> LCD Enable (Verbindung via J25 erforderlich) + // PD6 ..... R/W --> Read/Write: Read=1, Write=0 + // PD7 ..... RS --> Register Select: Command=0, Data=1 + // PB7:0 ... Data --> Achtung von 5V LCD nicht lesen! + + + // #define LCD_3V3 + #ifdef LCD_3V3 + #define DATA_PIN PINB + #endif + + void Lcd::init () { + DDRA |= (1 << PA3); + DDRB = 0xff; + DDRD |= (1 << PD7) | (1 << PD6); + initLcd(); + #ifdef LCD_3V3 + printf_P(PSTR("init 3.3V LCD")); + #else + printf_P(PSTR("init 5V LCD")); + #endif + } + + void Lcd::cleanup () { + DDRA &= ~(1 << PA3); + DDRB = 0; + DDRD &= ~((1 << PD7) | (1 << PD6)); + } + + void Lcd::setRS () { PORTD |= (1 << PD7); } + void Lcd::clrRS () { PORTD &= ~(1 << PD7); } + void Lcd::setRW () { PORTD |= (1 << PD6); } + void Lcd::clrRW () { PORTD &= ~(1 << PD6); } + void Lcd::setE () { PORTA |= (1 << PA3); } + void Lcd::clrE () { PORTA &= ~(1 << PA3); } + + void Lcd::setData (uint8_t data) { + PORTB = data; + } +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino Nano (5V) + // --------------------------------------------------------------- + // PC3 ..... E --> LCD Enable (Verbindung via J25 erforderlich) + // PD3 ..... R/W --> Read/Write: Read=1, Write=0 + // PD2 ..... RS --> Register Select: Command=0, Data=1 + // PD4 ..... Data0 + // PB0 ..... Data1 + // PD7 ..... Data2 + // PD6 ..... Data3 + // PB2 ..... Data4 + // PB3 ..... Data5 + // PB4 ..... Data6 + // PB5 ..... Data7 + + void Lcd::init () { + clrRW(); + clrRS(); + clrE(); + setData(0); + DDRB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB2) | (1 << PB0); + DDRC |= (1 << PC3); + DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD4) | (1 << PD3) | (1 << PD2); + initLcd(); + #ifdef LCD_3V3 + printf_P(PSTR("init 3.3V LCD")); + #else + printf_P(PSTR("init 5V LCD")); + #endif + } + + void Lcd::cleanup () { + clrRW(); + clrRS(); + clrE(); + setData(0); + DDRB &= ~((1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB2) | (1 << PB0)); + DDRC &= ~(1 << PC3); + DDRD &= ~((1 << PD7) | (1 << PD6) | (1 << PD4) | (1 << PD3) | (1 << PD2)); + } + + void Lcd::setRS () { PORTD |= (1 << PD2); } + void Lcd::clrRS () { PORTD &= ~(1 << PD2); } + void Lcd::setRW () { PORTD |= (1 << PD3); } + void Lcd::clrRW () { PORTD &= ~(1 << PD3); } + void Lcd::setE () { PORTC |= (1 << PC3); } + void Lcd::clrE () { PORTC &= ~(1 << PC3); } + + void Lcd::setData (uint8_t data) { + if (data & 0x01) PORTD |= (1 << PD4); else PORTD &= ~((1 << PD4)); + if (data & 0x02) PORTB |= (1 << PB0); else PORTB &= ~((1 << PB0)); + if (data & 0x04) PORTD |= (1 << PD7); else PORTD &= ~((1 << PD7)); + if (data & 0x08) PORTD |= (1 << PD6); else PORTD &= ~((1 << PD6)); + if (data & 0x10) PORTB |= (1 << PB2); else PORTB &= ~((1 << PB2)); + if (data & 0x20) PORTB |= (1 << PB3); else PORTB &= ~((1 << PB3)); + if (data & 0x40) PORTB |= (1 << PB4); else PORTB &= ~((1 << PB4)); + if (data & 0x80) PORTB |= (1 << PB5); else PORTB &= ~((1 << PB5)); + } +#endif + +// Befehle für das Display + +#define DISP_CLEAR 0b00000001 // Display clear +#define DISP_ON 0b00001111 // Display on +#define DISP_OFF 0b00001011 // Display off +#define CURSOR_ON 0b00001111 // Cursor on +#define CURSOR_OFF 0b00001101 // Cursor off +#define BLINK_ON 0b00001111 // Cursor Blink +#define BLINK_OFF 0b00001110 // Cursor No Blink + +int8_t Lcd::run (uint8_t subtest) { + if (subtest == 0) { + for (uint8_t i = 0; i < 20 * 4; i++) { + char c = (char)(i + 32); + if (i % 20 == 0) { + setCursor(i / 20 + 1, 1); + } + writeData(c); + while (isBusy()) {}; + } + // setCursor(1, 1); + // writeString(" 1234567890<>,;.:-_#+"); + // setCursor(2, 1); + // writeString("abcdefghijklmnopqrst"); + // setCursor(3, 1); + // writeString("uvwxyzABCDEFGHIJKLMN"); + // setCursor(4, 1); + // writeString("OPQRSTUVWXYZ "); + printf_P(PSTR("LCD beschrieben")); + while (wait(1) == EOF) { + } + + } else { + printf_P(PSTR("end")); + return -1; + } + wait(500); + return 0; +} + +void Lcd::initLcd () { + _delay_ms(16); // min 15ms warten für Reset des Displays + + setData( 0b00111011 ); // 8bit Modus, 5x7 Zeichen, Mehrzeilen Display + clrRW(); // write + clrRS(); // command + setE(); // E = 1 (transfer start) + _delay_us(10); // min. 10us + clrE(); // E = 0 (transfer end) + _delay_ms(5); // min. 4.1ms + + setData( 0b00111011 ); // 8bit Modus, 5x7 Zeichen, Mehrzeilen Display + clrRW(); // write + clrRS(); // command + setE(); // E = 1 (transfer start) + _delay_us(10); // min. 10us + clrE(); // E = 0 (transfer end) + _delay_us(100); // min. 100us + + setData( 0b00111011 ); // 8bit Modus, 5x7 Zeichen, Mehrzeilen Display + clrRW(); // write + clrRS(); // command + setE(); // E = 1 (transfer start) + _delay_us(10); // min. 10us + clrE(); // E = 0 (transfer end) + _delay_us(100); // min. 100us + + writeCommand(DISP_OFF); // Display aus + while(isBusy()) {}; + writeCommand(DISP_ON); // Display ein + while(isBusy()) {}; + writeCommand( BLINK_OFF & CURSOR_OFF); // Blink aus und Cursor aus + while(isBusy()) {}; + writeCommand(DISP_CLEAR);// Clear display + while(isBusy()) {}; +} + +uint8_t Lcd::isBusy () { + #ifdef LCD_3V3 + // DIR_DATA_PORT = 0; + // SET_RW_PIN; // read + // CLR_RS_PIN; // command + // SET_E_PIN; // E = 1 (transfer start) + // _delay_us(10); + // uint8_t busy = DATA_PIN & 0x80; // read bit 7 (busy bit) + // CLR_E_PIN; // E = 0 (transfer end) + // CLR_RW_PIN; + // DIR_DATA_PORT = 0xff; + // return busy != 0; + _delay_us(200); + #else + _delay_us(200); + #endif + return 0; +} + +void Lcd::writeCommand (uint8_t cmd) { + setData(cmd); + clrRW(); // write + clrRS(); // command + setE(); // E = 1 (transfer start) + _delay_us(10); // min. 10us + clrE(); // E = 0 (transfer end) + setData(0); +} + +void Lcd::setDDRamAddr (uint8_t address) { + setData(address | 0x80); + clrRW(); // write + clrRS(); // command + setE(); // E = 1 (transfer start) + _delay_us(10); // min. 10us + clrE(); // E = 0 (transfer end) + _delay_us(10); // min. 10us + setData(0); +} + +void Lcd::writeString (const char *s) { + while (*s) { + writeData(*s++); + while (isBusy()) {}; + } +} + +void Lcd::writeData (uint8_t data) { + setData(data); + setRS(); // data + clrRW(); // write + setE(); // E = 1 (transfer start) + _delay_us(10); // min. 10us + clrE(); // E = 0 (transfer end) + _delay_us(10); // min. 10us + clrRS(); + setData(0); +} + +void Lcd::setCursor (uint8_t row, uint8_t column) { + uint8_t b; + if (column > 20) { + return; + } + switch (row) { + case 1: b = 0x00 + column - 1; break; + case 2: b = 0x40 + column - 1; break; + case 3: b = 0x14 + column - 1; break; + case 4: b = 0x54 + column - 1; break; + default: return; + } + setDDRamAddr(b); + while (isBusy()) {}; +} diff --git a/software/nano-644/test_2024-07-23/src/units/lcd.hpp b/software/nano-644/test_2024-07-23/src/units/lcd.hpp new file mode 100644 index 0000000..3eb4456 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/lcd.hpp @@ -0,0 +1,34 @@ +#ifndef LCD_HPP +#define LCD_HPP + +#include +#include "../main.hpp" +#include + +class Lcd : public TestUnit { + public: + Lcd () {}; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Lcd"); } + + private: + void initLcd (); + uint8_t isBusy (); + void writeCommand (uint8_t); + void setDDRamAddr (uint8_t); + void writeString (const char *s); + void writeData (uint8_t); + void setCursor (uint8_t row, uint8_t column); + void setRS (); + void clrRS (); + void setRW (); + void clrRW (); + void setE (); + void clrE (); + void setData (uint8_t data); + +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/led.cpp b/software/nano-644/test_2024-07-23/src/units/led.cpp new file mode 100644 index 0000000..5a56665 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/led.cpp @@ -0,0 +1,133 @@ +#include +#include +#include + +#include "led.hpp" +#include "../main.hpp" + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // --------------------------------------------------------------- + // PD4 ..... Red + // PD5 ..... Orange/Yellow + // PD6 ..... Green + // PD7 ..... Blue + + void Led::init () { + PORTD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5) | (1 << PD4)); + DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD5) | (1 << PD4); + } + + void Led::cleanup () { + DDRD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5) | (1 << PD4)); + PORTD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5) | (1 << PD4)); + } + + void Led::setLed (LED led, bool on) { + if (on) { + switch(led) { + case RED: PORTD |= (1 << PD4); break; + case ORANGE: PORTD |= (1 << PD5); break; + case GREEN: PORTD |= (1 << PD6); break; + case BLUE: PORTD |= (1 << PD7); break; + } + } else { + switch(led) { + case RED: PORTD &= ~(1 << PD4); break; + case ORANGE: PORTD &= ~(1 << PD5); break; + case GREEN: PORTD &= ~(1 << PD6); break; + case BLUE: PORTD &= ~(1 << PD7); break; + } + } + } + + void Led::ledToggle (LED led) { + switch(led) { + case RED: PORTD ^= (1 << PD4); break; + case ORANGE: PORTD ^= (1 << PD5); break; + case GREEN: PORTD ^= (1 << PD6); break; + case BLUE: PORTD ^= (1 << PD7); break; + } + } + +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // --------------------------------------------------------------- + // PD5 ..... Red + // PB1 ..... Orange/Yellow + // PD3 ..... Green + // PD2 ..... Blue + + void Led::init () { + PORTD &= ~((1 << PD5) | (1 << PD3) | (1 << PD2)); + PORTB &= ~(1 << PB1); + DDRD |= (1 << PD5) | (1 << PD3) | (1 << PD2); + DDRB |= (1 << PB1); + } + + void Led::cleanup () { + DDRD &= ~((1 << PD5) | (1 << PD3) | (1 << PD2)); + DDRB &= ~(1 << PB1); + PORTD &= ~((1 << PD5) | (1 << PD3) | (1 << PD2)); + PORTB &= ~(1 << PB1); + } + + void Led::setLed (LED led, bool on) { + if (on) { + switch(led) { + case RED: PORTD |= (1 << PD5); break; + case ORANGE: PORTB |= (1 << PB1); break; + case GREEN: PORTD |= (1 << PD3); break; + case BLUE: PORTD |= (1 << PD2); break; + } + } else { + switch(led) { + case RED: PORTD &= ~(1 << PD5); break; + case ORANGE: PORTB &= ~(1 << PB1); break; + case GREEN: PORTD &= ~(1 << PD3); break; + case BLUE: PORTD &= ~(1 << PD2); break; + } + } + } + + void Led::ledToggle (LED led) { + switch(led) { + case RED: PORTD ^= (1 << PD5); break; + case ORANGE: PORTB ^= (1 << PB1); break; + case GREEN: PORTD ^= (1 << PD3); break; + case BLUE: PORTD ^= (1 << PD2); break; + } + } + +#endif + +void Led::ledOn (LED led) { + setLed(led, true); +} + +void Led::ledOff (LED led) { + setLed(led, false); +} + + +int8_t Led::run (uint8_t subtest) { + if (subtest <= 15) { + subtest = (subtest) % 4; + switch (subtest) { + case 0: ledOff(BLUE); ledOn(RED); break; + case 1: ledOff(RED); ledOn(ORANGE); break; + case 2: ledOff(ORANGE); ledOn(GREEN); break; + case 3: ledOff(GREEN); ledOn(BLUE); break; + } + printf_P(PSTR("Test LED D%d"), subtest + 1); + wait(500); + return 0; + } + + return -1; +} + diff --git a/software/nano-644/test_2024-07-23/src/units/led.hpp b/software/nano-644/test_2024-07-23/src/units/led.hpp new file mode 100644 index 0000000..780827f --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/led.hpp @@ -0,0 +1,25 @@ +#ifndef LED_HPP +#define LED_HPP + +#include +#include "../main.hpp" +#include + +class Led : public TestUnit { + public: + enum LED { RED, ORANGE, GREEN, BLUE }; + + public: + Led () {}; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Led"); } + + void setLed (LED led, bool on); + void ledOn (LED led); + void ledOff (LED led); + void ledToggle (LED led); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/modbus.cpp b/software/nano-644/test_2024-07-23/src/units/modbus.cpp new file mode 100644 index 0000000..abbe36d --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/modbus.cpp @@ -0,0 +1,160 @@ +#include +#include +#include + +#include "modbus.hpp" +#include "../main.hpp" + + +#ifdef __AVR_ATmega328P__ +void Modbus::init () {} +void Modbus::cleanup () {} +int8_t Modbus::run (uint8_t subtest) { return -1; } +void Modbus::handleRxByte (uint8_t b) {} +#endif + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + +// PB0 ... nRE .. Read enable +// PB1 ... DE .. Data enable + +#define SET_nRE (PORTB |= (1 << PB0)) +#define CLR_nRE (PORTB &= ~(1 << PB0)) +#define SET_DE (PORTB |= (1 << PB1)) +#define CLR_DE (PORTB &= ~(1 << PB1)) + + +void Modbus::init () { +} + +void Modbus::cleanup () { + enabled = 0; + UCSR1A = 0; + UCSR1B = 0; + UCSR1C = 0; + UBRR1H = 0; + UBRR1L = 0; + PORTD &= ~(1 << PD2); + DDRB &= ~((1 << PB1) | (1 << PB0)); + PORTB &= ~((1 << PB1) | (1 << PB0)); +} + +int8_t Modbus::run (uint8_t subtest) { + if (subtest == 0) { + SET_nRE; + CLR_DE; + DDRB |= (1 << PB1) | (1 << PB0); + + // UART1 interface on Nano-644 + PORTD |= (1 << PD2); // enable RxD1 pullup + UCSR1A = (1 << U2X1); + UCSR1B = (1 << RXCIE1) | (1 << RXEN1) | (1 <= 1 && subtest <= 4) { + uint8_t nre, de, b; + switch (subtest) { + case 1: nre = 1; de = 0; b = 0x01; break; + case 2: nre = 1; de = 1; b = 0x8e; break; + case 3: nre = 0; de = 0; b = 0x55; break; + case 4: nre = 0; de = 1; b = 0xaa; break; + default: return -1; + } + printf_P(PSTR(" DE=%u, nRE=%u send 0x%02x... "), de, nre, b); + if (nre) { + SET_nRE; + } else { + CLR_nRE; + } + if (de) { + SET_DE; + } else { + CLR_DE; + } + _delay_us(100); + receivedBytes = 0; + UDR1 = b; + _delay_ms(1); + if (receivedBytes > 0) { + printf_P(PSTR("0x%02x received"), received[0]); + receivedBytes = 0; + } else { + printf_P(PSTR("no byte received")); + } + printf_P(PSTR(" ... press key to proceed")); + while (wait(0xffffffff) == EOF) {} + CLR_DE; + SET_nRE; + + } else if (subtest == 5) { + static uint8_t frame[] = { 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0xcb }; + printf_P(PSTR("Modbus: lese Spannung von Eastron SDM-230 (Einphasenzähler)")); + SET_DE; + CLR_nRE; + _delay_us(100); + do { + SET_DE; + receivedBytes = 0; + for (uint8_t i = 0; i < sizeof(frame); i++) { + UCSR1A |= (1 << TXC1); + UDR1 = frame[i]; + while ((UCSR1A & (1 < Sending:")); + for (uint8_t i = 0; i < sizeof(frame); i++) { + printf_P(PSTR(" 0x%02x"), frame[i]); + } + int k = wait(100); + + printf_P(PSTR("\n RxD1:")); + if (receivedBytes == 0) { + printf_P(PSTR("?")); + } else { + for (uint8_t i = 0; i < receivedBytes; i++) { + if (i == sizeof(frame)) { + printf_P(PSTR(" ")); + } + printf_P(PSTR(" 0x%02x"), received[i]); + } + } + if (receivedBytes >= 16) { + union { + uint8_t b[4]; + float value; + } f; + f.b[0] = received[14]; + f.b[1] = received[13]; + f.b[2] = received[12]; + f.b[3] = received[11]; + printf_P(PSTR(" -> %4.8fV\n"), (double)f.value); + } + if (k != EOF) { + break; + } + + } while (wait(1000) == EOF); + + } else { + printf_P(PSTR("end")); + return -1; + } + wait(500); + return 0; +} + +void Modbus::handleRxByte (uint8_t b) { + if (receivedBytes < sizeof(received)) { + received[receivedBytes++] = b; + } +} + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/modbus.hpp b/software/nano-644/test_2024-07-23/src/units/modbus.hpp new file mode 100644 index 0000000..44b6a9d --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/modbus.hpp @@ -0,0 +1,24 @@ +#ifndef MODBUS_HPP +#define MODBUS_HPP + +#include +#include "../main.hpp" +#include + +class Modbus : public TestUnit { + public: + uint8_t enabled; + uint8_t receivedBytes; + uint8_t received[16]; + + + public: + Modbus () { enabled = 0; receivedBytes = 0; } + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Modbus"); } + void handleRxByte (uint8_t); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/motor.cpp b/software/nano-644/test_2024-07-23/src/units/motor.cpp new file mode 100644 index 0000000..4457c1a --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/motor.cpp @@ -0,0 +1,207 @@ +#include +#include +#include + +#include "motor.hpp" +#include "../main.hpp" + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // --------------------------------------------------------------- + // PB0 ..... rotation-sensor + // PB2 ..... nFault + // PB3 ..... PWM (OC0A) + // PB4 ..... EN + // PA3 ..... SW3 -> push button for Motor enable control + + #define ADC0K 64 + + void Motor::init () { + ADMUX = (1 << ADLAR) | (1 << REFS0); // ADC0, VREF=AVCC=3.3V + ADCSRA = (1 << ADEN) | 7; // ADC Enable, Prescaler 128 + TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00); // Fast PWM on OC0A + // TCCR0B = (1 << CS02) | ( 1 << CS00); // f = 12 MHz / 1024 = 11,71875 kHz -> fPWM=45Hz + TCCR0B = (1 << CS02); // f = 12 MHz / 256 = 46,875 kHz -> fPWM=183,1Hz + DDRB |= (1 << PB4) | (1 << PB3); // Motor enable + PORTA |= (1 << PORTA3); // push button for Motor enable control + setEnable(); + enabled = 1; + } + + void Motor::cleanup () { + ADMUX = 0; + ADCSRA = 0; + TCCR0A = 0; + TCCR0B = 0; + DDRB &= ~((1 << PB4) | (1 << PB3)); + PORTA &= ~(1 << PORTA3); + enabled = 0; + } + + bool Motor::isSW3Pressed () { + return (PINA & (1 << PC3)) == 0; + } + + void Motor::clearEnable () { + PORTB &= ~(1 << PB4); + } + + void Motor::setEnable () { + PORTB |= (1 << PB4); + } + + bool Motor::isFaultLow () { + return (PINB & (1 << PB2)) == 0; + } + + bool Motor::isSensorHigh () { + return (PINB & (1 << PB0)) != 0; + } +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // --------------------------------------------------------------- + // PD4 ..... rotation-sensor + // PD7 ..... nFault + // PD6/OC0A ..... PWM + // PB2 ..... EN + // PC3 ..... SW3 -> push button for Motor enable control + + #define ADC0K 91 + + void Motor::init () { + ADMUX = (1 << ADLAR) | (1 << REFS0); // ADC0, VREF=AVCC=5V + ADCSRA = (1 << ADEN) | 7; // ADC Enable, Prescaler 128 + TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00); // Fast PWM on OC0A + // TCCR0B = (1 << CS02) | ( 1 << CS00); // f = 16 MHz / 1024 = 15,625 kHz -> fPWM=61.04Hz + TCCR0B = (1 << CS02); // f = 16 MHz / 256 = 62.5 kHz -> fPWM=244.14Hz + DDRB |= (1 << PB2); + DDRC &= ~(1 << PC3); + DDRD |= (1 << PD6); + DDRD &= ~((1 << PD4) | (1 << PD7)); + PORTC |= ( 1 << PC3); + PORTD |= (1 << PD7) | (1 << PD5); + setEnable(); + enabled = 1; + } + + void Motor::cleanup () { + enabled = 0; + ADMUX = 0; + ADCSRA = 0; + TCCR0A = 0; + TCCR0B = 0; + clearEnable(); + DDRB &= ~((1 << PB2)); + DDRC &= ~(1 << PC3); + DDRD &= ~((1 << PD7) | (1 << PD6) | (1 << PD4)); + PORTC &= ~( 1 << PC3); + PORTD &= ~((1 << PD7) | (1 << PD6)); + } + + bool Motor::isSW3Pressed () { + return (PINC & (1 << PC3)) == 0; + } + + void Motor::clearEnable () { + PORTB &= ~(1 << PB2); + } + + void Motor::setEnable () { + PORTB |= (1 << PB2); + } + + bool Motor::isFaultLow () { + return (PIND & (1 << PD7)) == 0; + } + + bool Motor::isSensorHigh () { + return (PIND & (1 << PD4)) != 0; + } + +#endif + +int8_t Motor::run (uint8_t subtest) { + switch (subtest) { + case 0: { + printf_P(PSTR("\n")); + while (wait(10) == EOF) { + + printf_P(PSTR("\r SW3=%d->"), isSW3Pressed() ? 0 : 1); + if (isSW3Pressed()) { + clearEnable(); + printf_P(PSTR("EN=0")); + } else { + setEnable(); + printf_P(PSTR("EN=1")); + } + + ADCSRA |= (1 << ADSC); // start ADC + while (ADCSRA & (1 << ADSC)) {} // wait for result + printf_P(PSTR("\r => ADC0=%3d"), ADCH); + + ADMUX = (1 << ADLAR) | (1 << REFS1) | (1 << REFS0) | 2; // ADC2, VREF=2.5V + + int16_t x = ((int16_t)(ADCH) - 5) * ADC0K / 64; + if (x < 0) x = 0; else if (x > 255) x = 255; + uint8_t dutyCycle = 0xff - (uint8_t)x; + if (dutyCycle <= 1) { + dutyCycle = 0; + } else if (dutyCycle > 254) { + dutyCycle = 255; + } + OCR0A = dutyCycle; + printf_P(PSTR(" PWM/OC0A=%3d"), dutyCycle); + + ADCSRA |= (1 << ADSC); // start ADC + while (ADCSRA & (1 << ADSC)) {} // wait for result + printf_P(PSTR(" ADC2=%3d"), ADCH); + ADMUX = (1 << ADLAR) | (1 << REFS0); // ADC0, VREF=AVCC=3.3V + + printf_P(PSTR(" nFAULT=%d"), isFaultLow() ? 0 : 1); + printf_P(PSTR(" SENSOR=%d "), isSensorHigh()); + uint16_t timer; + ATOMIC_BLOCK(ATOMIC_FORCEON) { + timer = rpmTimer; + } + float rpm = 60.0 / (float)timer / 0.0001; + if (timer > 0) { + printf_P(PSTR(" n= %4d U/min"), (int)rpm); + } else { + printf_P(PSTR(" no rotation ")); + } + + } + return 0; + } + } + + return -1; +} + +void Motor::tick100us () { + static uint16_t timerH = 0; + static uint16_t timerL = 0; + static bool lastSensorHigh = false; + + bool sensorHigh = isSensorHigh(); + if (!sensorHigh && sensorHigh != lastSensorHigh && timerL > 10) { + rpmTimer = timerL + timerH; + timerL = 0; + timerH = 0; + } + if (sensorHigh) { + timerH = timerH < 0x4000 ? timerH + 1 : 0x4000; + } else { + timerL = timerL < 0x4000 ? timerL + 1 : 0x4000; + } + if (timerH >= 0x4000 || timerL >= 0x4000) { + rpmTimer = 0; // no ratation detected + } + lastSensorHigh = sensorHigh; +} + + diff --git a/software/nano-644/test_2024-07-23/src/units/motor.hpp b/software/nano-644/test_2024-07-23/src/units/motor.hpp new file mode 100644 index 0000000..6dc68f0 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/motor.hpp @@ -0,0 +1,29 @@ +#ifndef MOTOR_HPP +#define MOTOR_HPP + +#include +#include "../main.hpp" +#include + +class Motor : public TestUnit { + public: + uint8_t enabled; + uint16_t rpmTimer; + + public: + Motor () { enabled = 0; rpmTimer = 0; }; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Motor"); } + void tick100us (); + + private: + bool isSW3Pressed (); + void clearEnable (); + void setEnable (); + bool isFaultLow (); + bool isSensorHigh (); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/portexp.cpp b/software/nano-644/test_2024-07-23/src/units/portexp.cpp new file mode 100644 index 0000000..7eac74d --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/portexp.cpp @@ -0,0 +1,169 @@ +#include +#include +#include + +#include "portexp.hpp" +#include "../main.hpp" + +// Port-Expander MCP23S17 + +// SN-Print Stecker IO16 +// MCP23S17 | IO16 (MEGA2560) | Ampel-Print | | MCP23S17 | IO16 (MEGA2560) | Ampel-Print | +// ------------------------------------------ -------------------------------------------- +// GPA0 | IO16O7 (PA7) | Taster RU | | GPB0 | IO16U7 (PC7) | Taster LU | +// GPA1 | IO16O6 (PA6) | Taster RO | | GPB1 | IO16U6 (PC6) | Taster LO | +// GPA2 | IO16O5 (PA5) | U-Gruen | | GPB2 | IO16U5 (PC5) | R-Gruen | +// GPA3 | IO16O4 (PA4) | U-Gelb | | GPB3 | IO16U4 (PC4) | R-Gelb | +// GPA4 | IO16O3 (PA3) | U-Rot | | GPB4 | IO16U3 (PC3) | R-Rot | +// GPA5 | IO16O2 (PA2) | L-Gruen | | GPB5 | IO16U2 (PC2) | O-Gruen | +// GPA6 | IO16O1 (PA1) | L-Gelb | | GPB6 | IO16U1 (PC1) | O-Gelb | +// GPA7 | IO16O0 (PA0) | L-Rot | | GPB7 | IO16U0 (PC0) | O-Rot | + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // -------------------------------------------------------- + // PA7 ... nCS + // PB5 ... MOSI + // PB6 ... MISO + // PB7 ... SCK + + void PortExp::init () { + PRR0 &= (1 << PRSPI); + PORTA |= (1 << PA7); + DDRA |= (1 << PA7); // SPI nCS + // PORTB/DDRB must be configured before SPCR !! + PORTB |= (1 << PB4); // nSS must be HIGH, otherwise SPI master will not become active!! + DDRB |= (1 << PB7) | (1 << PB5) | (1 << PB4); // SPI SCK (=PB7) and SPI MOSI (=PB5) + + // SPCR |= (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); // SPI enable , Master, f=12MHz/128=93,75kHz + SPCR = (1 << SPE) | (1 << MSTR); // SPI enable , Master, f=12MHz/4 = 3MHz + } + + void PortExp::cleanup () { + DDRB &= ~(1 << PB6); // // SPI MISO (=PB6) + DDRB &= ~((1 << PB7) | (1 << PB5)); // SPI SCK (=PB7) and SPI MOSI (=PB5) + DDRA &= ~(1 << PA7); + PORTA &= ~(1 << PA7); // SPI nCS + SPCR = 0; + } + + void PortExp::setChipEnable () { + PORTA &= ~(1 << PA7); + } + + void PortExp::clearChipEnable () { + PORTA |= (1 << PA7); + } + + +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // ------------------------------------ + // PC1 ... nCS (MANUAL (!) connection PA1 - PA7 required) + // PB3 ... MOSI + // PB4 ... MISO + // PB5 ... SCK + + void PortExp::init () { + PRR &= (1 << PRSPI); + PORTC |= (1 << PC1); + DDRC |= (1 << PC1); // SPI nCS + // PORTB/DDRB must be configured before SPCR !! + PORTB |= (1 << PB2); // nSS must be HIGH, otherwise SPI master will not become active!! + DDRB |= (1 << PB5) | (1 << PB3) | (1 << PB2); // SPI SCK (=PB5), SPI MOSI (=PB3), SPI nSS (=PB2) + + // SPCR |= (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); // SPI enable , Master, f=16MHz/128=125kHz + SPCR = (1 << SPE) | (1 << MSTR); // SPI enable , Master, f=12MHz/4 = 3MHz + } + + void PortExp::cleanup () { + PORTC &= ~(1 << PC1); + DDRC &= ~(1 << PC1); + PORTB &= ~(1 << PB2); + DDRB &= ~((1 << PB5) | (1 << PB3) | (1 << PB2)); + SPCR = 0; + } + + void PortExp::setChipEnable () { + PORTC &= ~(1 << PC1); + } + + void PortExp::clearChipEnable () { + PORTC |= (1 << PC1); + } + +#endif + + + +int8_t PortExp::writeByte (uint8_t addr, uint8_t b) { + + setChipEnable(); + + SPDR = 0x40; // WRITE BYTE + while ((SPSR & (1 << SPIF)) == 0) {} + if (SPDR != 0) { + printf_P(PSTR("E1")); + clearChipEnable(); + return -1; + } + + SPDR = addr; // register address + while ((SPSR & (1 << SPIF)) == 0) {} + if (SPDR != 0) { + printf_P(PSTR("E2")); + clearChipEnable(); + return -1; + } + + SPDR = b; // value + while ((SPSR & (1 << SPIF)) == 0) {} + if (SPDR != 0) { + printf_P(PSTR("E3")); + clearChipEnable(); + return -1; + } + + clearChipEnable(); + + _delay_us(5); + return 0; +} + +int8_t PortExp::run (uint8_t subtest) { + if (subtest == 0) { + while (wait(500) == EOF) { + printf_P(PSTR("\n => start ...")); + for (uint8_t i = 0; i < 8; i++) { + writeByte(0, ~(1 << i)); // IODIRA (Bank = 0) + // writeByte(0, 0x00); // IODIRA (Bank = 0) - all output + writeByte(0x12, (1 << i)); // GPIOA (Bank = 0) + printf_P(PSTR("\n Bank0 - GPA%d = 1"), i); + wait(200); + writeByte(0x12, 0); // GPIOA (Bank = 0) + printf_P(PSTR("\n Bank0 - GPA%d = 0"), i); + writeByte(0, 0xff); // IODIRA (Bank = 0) + wait(200); + } + for (uint8_t i = 0; i < 8; i++) { + writeByte(1, ~(1 << i)); // IODIRB (Bank = 0) + // writeByte(1, 0x00); // IODIRB (Bank = 0) - all output + writeByte(0x13, (1 << i)); // GPIOB (Bank = 0) + printf_P(PSTR("\n Bank0 - GPB%d = 1"), i); + wait(200); + writeByte(0x13, 0); // GPIOB (Bank = 0) + printf_P(PSTR("\n Bank0 - GPB%d = 0"), i); + writeByte(1, 0xff); // IODIRB (Bank = 0) + wait(200); + } + } + return 0; + } + + return -1; +} + diff --git a/software/nano-644/test_2024-07-23/src/units/portexp.hpp b/software/nano-644/test_2024-07-23/src/units/portexp.hpp new file mode 100644 index 0000000..2fb665c --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/portexp.hpp @@ -0,0 +1,22 @@ +#ifndef PORTEXP_HPP +#define PORTEXP_HPP + +#include +#include "../main.hpp" +#include + +class PortExp : public TestUnit { + public: + PortExp () {}; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("PortExp"); } + + private: + void setChipEnable (); + void clearChipEnable (); + int8_t writeByte (uint8_t addr, uint8_t b); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/poti.cpp b/software/nano-644/test_2024-07-23/src/units/poti.cpp new file mode 100644 index 0000000..94fc5a4 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/poti.cpp @@ -0,0 +1,34 @@ +#include +#include + +#include "poti.hpp" +#include "../main.hpp" + +void Poti::init () { + ADMUX = (1 << REFS0); // ADC0, VREF=AVCC=3.3V + ADCSRA = (1 << ADEN) | 7; // ADC Enable, Prescaler 128 +} + +void Poti::cleanup () { + ADMUX = 0; + ADCSRA = 0; +} + +int8_t Poti::run (uint8_t subtest) { + switch (subtest) { + case 0: { + printf_P(PSTR("\n")); + while (wait(10) == EOF) { + printf_P(PSTR("\r => Measure ADC0: ")); + ADCSRA |= (1 << ADSC); // start ADC + while (ADCSRA & (1 << ADSC)) {} // wait for result + printf_P(PSTR("%4d (0x%03x)"), ADC, ADC); + } + return 0; + } + } + + return -1; +} + + diff --git a/software/nano-644/test_2024-07-23/src/units/poti.hpp b/software/nano-644/test_2024-07-23/src/units/poti.hpp new file mode 100644 index 0000000..b13dd29 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/poti.hpp @@ -0,0 +1,17 @@ +#ifndef POTI_HPP +#define POTI_PP + +#include +#include "../main.hpp" +#include + +class Poti : public TestUnit { + public: + Poti () {}; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Poti"); } +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/r2r.cpp b/software/nano-644/test_2024-07-23/src/units/r2r.cpp new file mode 100644 index 0000000..87fb822 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/r2r.cpp @@ -0,0 +1,46 @@ +#include +#include + +#include "r2r.hpp" +#include "../main.hpp" + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + // AVCC=3.3, POTI Vmax=3.3V + #define K 1.0 +#endif + +#ifdef __AVR_ATmega328P__ + // AVCC=4.7V, POTI Vmax=3.3V + #define K (1023.0 / 738.0) +#endif + +void R2r::init () { + ADMUX = (1 << REFS0) | 2; // ADC2, VREF=AVCC=3.3V + ADCSRA = (1 << ADEN) | 7; // ADC Enable, Prescaler 128 +} + +void R2r::cleanup () { + ADMUX = 0; + ADCSRA = 0; +} + +int8_t R2r::run (uint8_t subtest) { + switch (subtest) { + case 0: { + printf_P(PSTR("\n")); + while (wait(10) == EOF) { + printf_P(PSTR("\r => Measure ADC2: ")); + ADCSRA |= (1 << ADSC); // start ADC + while (ADCSRA & (1 << ADSC)) {} // wait for result + printf_P(PSTR("%4d (0x%03x)"), ADC, ADC); + uint8_t sw = (uint8_t)( ((float)(ADC) + 32.0) / 64.0 * K ); + printf_P(PSTR(" SW9:6 = %d %d% d %d "), sw >> 3, (sw >> 2) & 0x01, (sw >> 1) & 0x01, sw & 0x01 ); + } + return 0; + } + } + + return -1; +} + + diff --git a/software/nano-644/test_2024-07-23/src/units/r2r.hpp b/software/nano-644/test_2024-07-23/src/units/r2r.hpp new file mode 100644 index 0000000..84e97e6 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/r2r.hpp @@ -0,0 +1,17 @@ +#ifndef R2R_HPP +#define R2R_PP + +#include +#include "../main.hpp" +#include + +class R2r : public TestUnit { + public: + R2r () {}; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("R2R"); } +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/rgb.cpp b/software/nano-644/test_2024-07-23/src/units/rgb.cpp new file mode 100644 index 0000000..3f69cbd --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/rgb.cpp @@ -0,0 +1,152 @@ +#include +#include + +#include "rgb.hpp" +#include "../main.hpp" + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // --------------------------------------------------------------- + // PB0 ..... Red (inverse logic -> 0 = ON) + // PB1 ..... Green (inverse logic -> 0 = ON) + // PB2 ..... Blue (inverse logic -> 0 = ON) + + void Rgb::init () { + ledOff(RED); + ledOff(GREEN); + ledOff(BLUE); + DDRB |= (1 << PB2) | (1 << PB1) | (1 << PB0); + } + + void Rgb::cleanup () { + ledOff(RED); + ledOff(GREEN); + ledOff(BLUE); + DDRB &= ~((1 << PB2) | (1 << PB1) | (1 << PB0)); + } + + void Rgb::setLed (LED led, bool on) { + if (on) { + switch(led) { + case RED: PORTB &= ~(1 << PB0); break; + case GREEN: PORTB &= ~(1 << PB1); break; + case BLUE: PORTB &= ~(1 << PB2); break; + } + } else { + switch(led) { + case RED: PORTB |= (1 << PB0); break; + case GREEN: PORTB |= (1 << PB1); break; + case BLUE: PORTB |= (1 << PB2); break; + } + } + } + + void Rgb::ledToggle (LED led) { + switch(led) { + case RED: PORTB ^= (1 << PB0); break; + case GREEN: PORTB ^= (1 << PB1); break; + case BLUE: PORTB ^= (1 << PB2); break; + } + } + + +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // --------------------------------------------------------------- + // PD4 ..... Red (inverse logic -> 0 = ON) + // PB0 ..... Green (inverse logic -> 0 = ON) + // PD7 ..... Blue (inverse logic -> 0 = ON) + + void Rgb::init () { + ledOff(RED); + ledOff(GREEN); + ledOff(BLUE); + DDRB |= (1 << PB0); + DDRD |= (1 << PD7) | (1 << PD4); + } + + void Rgb::cleanup () { + ledOff(RED); + ledOff(GREEN); + ledOff(BLUE); + DDRB &= ~(1 << PB0); + DDRD &= ~((1 << PD7) | (1 << PD4)); + } + + void Rgb::setLed (LED led, bool on) { + if (on) { + switch (led) { + case RED: PORTD &= ~(1 << PD4); break; + case GREEN: PORTB &= ~(1 << PB0); break; + case BLUE: PORTD &= ~(1 << PD7); break; + } + } else { + switch (led) { + case RED: PORTD |= (1 << PD4); break; + case GREEN: PORTB |= (1 << PB0); break; + case BLUE: PORTD |= (1 << PD7); break; + } + } + } + + void Rgb::ledToggle (LED led) { + switch (led) { + case RED: PORTD ^= (1 << PD4); break; + case GREEN: PORTB ^= ~(1 << PB0); break; + case BLUE: PORTD ^= (1 << PD7); break; + } + } + +#endif + +void Rgb::ledOn (LED led) { + setLed(led, true); +} + +void Rgb::ledOff (LED led) { + setLed(led, false); +} + +int8_t Rgb::run (uint8_t subtest) { + switch (subtest) { + case 0: { + ledOn(RED); + printf_P(PSTR("Red")); + wait(3000); + ledOff(RED); + return 0; + } + + case 1: { + ledOn(GREEN); + printf_P(PSTR("Green")); + wait(3000); + ledOff(GREEN); + return 0; + } + + case 2: { + ledOn(BLUE); + printf_P(PSTR("Blue")); + wait(3000); + ledOff(BLUE); + return 0; + } + + case 3: { + ledOn(RED); ledOn(GREEN); ledOn(BLUE); + printf_P(PSTR("All")); + wait(3000); + ledOff(RED); ledOff(GREEN); ledOff(BLUE); + return 0; + } + } + + return -1; +} + + diff --git a/software/nano-644/test_2024-07-23/src/units/rgb.hpp b/software/nano-644/test_2024-07-23/src/units/rgb.hpp new file mode 100644 index 0000000..12e9da4 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/rgb.hpp @@ -0,0 +1,25 @@ +#ifndef RGB_HPP +#define RGB_PP + +#include +#include "../main.hpp" +#include + +class Rgb : public TestUnit { + public: + enum LED { RED, GREEN, BLUE }; + + public: + Rgb () {}; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Rgb"); } + + void setLed (LED led, bool on); + void ledOn (LED led); + void ledOff (LED led); + void ledToggle (LED led); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/rtc8563.cpp b/software/nano-644/test_2024-07-23/src/units/rtc8563.cpp new file mode 100644 index 0000000..4bd75ca --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/rtc8563.cpp @@ -0,0 +1,253 @@ +#include +#include +#include +#include +#include + +#include "rtc8563.hpp" +#include "../adafruit/bme280.h" +#include "../main.hpp" + +// RTC BME653EMA on Nano-644 + +const char PSTR_WEEKDAYS[] PROGMEM = "So\0Mo\0Di\0Mi\0Do\0Fr\0Sa\0"; + +// const uint8_t CONFIG[] PROGMEM = { +// /* config -> */ 0x00, 0x00, +// /* enable nINT -> */ 0x01, 0x01, // TIE = 1 +// /* set clock -> */ 0x02, 0x00, 0x00, 0x08, 0x16, 0x02, 0x08, 0x24 +// }; + +void Rtc8563::handleTwiIrq () { + TWCR |= (1 << TWINT); // clear Interrupt Request +} + +#ifdef __AVR_ATmega328P__ +void Rtc8563::init () {} +void Rtc8563::cleanup () {} +int8_t Rtc8563::run (uint8_t subtest) { return -1; } +PGM_P Rtc8563::getName () {} +#endif + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + +void Rtc8563::init () { + PORTC &= ~(1 << PC7); // nInt and nPowerOn (Q7 -> BATTERY) + DDRC |= (1 << PC7); + TWBR = 13; // 100kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 100000) / (2 * 100000 * 4); + TWBR = 28; // 50kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 50000) / (2 * 50000 * 4); + TWBR = 100; // 50kHz (TWPS1:0 = 00), TWBR = (F_CPU - 16 * 50000) / (2 * 50000 * 4); + TWCR = (1 << TWEN); + enabled = true; +} + +void Rtc8563::cleanup () { + enabled = false; + TWCR = (1 << TWEN); + TWBR = 0; + // PORTC &= ~(1 << PC7); + // DDRC &= ~(1 << PC7); +} + +PGM_P Rtc8563::getName () { + return PSTR("RTC-8563"); +} + +uint8_t Rtc8563::bcd2bin (uint8_t value) { + return (value >> 4) * 10 + (value & 0x0f); +} + +int8_t Rtc8563::run (uint8_t subtest) { + int key = EOF; + if (subtest == 0) { + // printf_P(PSTR(" BM280 ... ")); + rtc8563.begin(0x51); + Clock_t clock; + // uint8_t bufferConfig[] = { 0x00, 0x00, 0x01, 0x01 }; + // uint8_t bufferSetClock[] = { 0x02, 0x00, 0x00, 0x08, 0x16, 0x02, 0x08, 0x24 }; + + Rtc8563Reg_t reg; + uint8_t *pReg = (uint8_t *)(void *)® + memset(®, 0, sizeof(reg)); + + printf_P(PSTR("\n => config 8563 ... ")); + reg.reg1.field.tie = 1; + if (!rtc8563.write(pReg, 2)) { + printf_P(PSTR_ERROR); + } else { + printf_P(PSTR_Done); + } + printf_P(PSTR("\n press:")); + printf_P(PSTR("\n t .... timer on/off")); + printf_P(PSTR("\n p .... power on/off (PC7->Q1)")); + printf_P(PSTR("\n c .... init clock")); + printf_P(PSTR("\n w/W .. weekday (+/-)\n")); + printf_P(PSTR("\n y/Y .. year (+/-)")); + printf_P(PSTR("\n m/M .. month (+/-)")); + printf_P(PSTR("\n d/D .. day (+/-)")); + printf_P(PSTR("\n h/H .. hour (+/-)")); + printf_P(PSTR("\n n/N .. minute (+/-)")); + printf_P(PSTR("\n s/S .. second (+/-)\n")); + + do { + uint8_t addr = 0x00; + printf_P(PSTR("\n => read register 0-15 (hex):")); + if (!rtc8563.write_then_read(&addr, 1, pReg, sizeof(reg))) { + printf_P(PSTR_ERROR); + key = waitAndReadKey(1000); + continue; + } + memccpy(&clock, ®.clock, sizeof(clock), sizeof(clock)); + for (uint8_t i = 0; i < 16; i++) { + if (i % 4 == 0) { + printf_P(PSTR(" ")); + } + printf_P(PSTR(" %02X"), pReg[i]); + } + uint16_t year = (clock.month.field.century ? 2100 : 2000) + bcd2bin(clock.year.byte); + int8_t month = bcd2bin(clock.month.byte); + int8_t day = bcd2bin(clock.day.byte); + int8_t hrs = bcd2bin(clock.hour.byte); + int8_t min = bcd2bin(clock.min.byte); + int8_t sec = bcd2bin(clock.sec.byte); + int8_t weekday = clock.weekday.byte; + + PGM_P d = weekday >= 0 && weekday < 7 ? &PSTR_WEEKDAYS[weekday * 3] : PSTR("??"); + printf_P(PSTR(" --> ")); + printf_P(d); + printf_P(PSTR(", %d %04d-%02d-%02d %02d:%02d:%02d"), weekday, year, month, day, hrs, min, sec); + printf_P(PSTR(" - Timer=0x%02x"), reg.timer); + + key = waitAndReadKey(1000); + bool ok = true; + bool change = false; + switch (key) { + case 't': ok &= setTimer(reg.timerControl.field.enable ? 0 : 10, reg); break; + case 'c': ok &= setClock(5, 2024,8,16, 17,12,10 ); break; // ok &= rtc8563.write(bufferSetClock, sizeof(bufferSetClock)); break; + case 'p': powerOnOff(10, reg); break; + case 'y': year++; change = true; break; + case 'Y': year--; change = true; break; + case 'm': month++; change = true; break; + case 'M': month--; change = true; break; + case 'd': day++; change = true; break; + case 'D': day--; change = true; break; + case 'h': hrs++; change = true; break; + case 'H': hrs--; change = true; break; + case 'n': min++; change = true; break; + case 'N': min--; change = true; break; + case 's': sec++; change = true; break; + case 'S': sec--; change = true; break; + case 'w': weekday++; change = true; break; + case 'W': weekday--; change = true; break; + } + if (change) { + printf_P(PSTR("\n set: %04d-%02d-%02d %02d:%02d:%02d"), year, month, day, hrs, min, sec); + setClock(weekday, year, month, day, hrs, min, sec); + } + + } while (key != ESCAPE); + + return 0; + } + + return -1; +} + +bool Rtc8563::setTimer (uint8_t seconds, Rtc8563Reg_t ®) { + + reg.timerControl.field.fd = FDTIMER_1HZ; + reg.timerControl.field.enable = seconds > 0; + reg.timer = seconds; + reg.reg1.field.tie = seconds > 0; + // clear and alarm flag behavior on I2C write different to datasheet + // datasheet: tf cleared to 0, af remains unchanged + // realchip: tf remains 1 and af is set to 1 (no negative result because tie=0 and aie=0) + reg.reg1.field.tf = 0; // clear timer flag + reg.reg1.field.af = 1; // alarm flag remains unchanged + if (seconds > 0) { + printf_P(PSTR("\n Timer set to %ds (1:%02X) ... "), seconds, reg.reg1.byte); + } else { + printf_P(PSTR("\n Timer off ... ")); + } + if (rtc8563.writeByteAndBuffer(0x01, ®.reg1.byte, 1) && rtc8563.writeByteAndBuffer(14, ®.timerControl.byte, 2)) { + printf_P(PSTR("OK")); + return true; + } else { + printf_P(PSTR("fails")); + return false; + } +} + +bool Rtc8563::powerOnOff (uint8_t delayOffSeconds, Rtc8563Reg_t ®) { + int key = EOF; + if (PORTC & (1 << PC7)) { + printf_P(PSTR("\n power on ...")); + DDRC |= ( 1<< PC7); + PORTC &= ~(1 << PC7); + setTimer(0, reg); + } else { + printf_P(PSTR("\n")); + key = EOF; + for (int8_t i = 9; i > 0 && key == EOF; i--) { + printf_P(PSTR("\r press ESC to abort, power off in %ds (press key to skip timer) "), i); + key = waitAndReadKey(1000); + } + if (key == ESCAPE) { + return true; + } + setTimer(10, reg); + reg.reg1.field.af = 1; // alarm flag remains unchanged + reg.reg1.field.tf = 0; // timer flag clear + reg.reg1.field.tie = 1; // enable timer interrupt + rtc8563.writeByteAndBuffer(0x01, ®.reg1.byte, 1); + printf_P(PSTR("\n power off now ...")); + DDRC |= ( 1<< PC7); + PORTC |= (1 << PC7); + _delay_ms(5); + DDRC &= ~( 1<< PC7); + PORTC &= ~(1 << PC7); + waitAndReadKey(5000); + printf_P(PSTR("power off fails, I am still alive :-) ... proceed")); + } + return true; +} + + +bool Rtc8563::setClock (int8_t weekday, uint16_t year, int8_t month, int8_t day, int8_t hour, int8_t min, int8_t sec) { + Clock_t clock; + clock.month.field.century = (year < 2000 || year > 2100) ? 1: 0; + uint8_t y = year % 100; clock.year.field.bcdL = y % 10; clock.year.field.bcdH = y / 10; + + while (weekday < 0) { weekday += 7; } + while (weekday > 6) { weekday -= 7; } + clock.weekday.field.bcdL = weekday; + + while (month < 1) { month += 12; } + while (month > 12) { month -= 12; } + clock.month.field.bcdL = month % 10; clock.month.field.bcdH = month / 10; + + while (day < 1) { day += 31; } + while (day > 31) { day -= 31; } + clock.day.field.bcdL = day % 10; clock.day.field.bcdH = day / 10; + + while (hour < 0) { hour += 24; } + while (hour > 23) { hour -= 24; } + clock.hour.field.bcdL = hour % 10; clock.hour.field.bcdH = hour / 10; + + while (min < 0) { min += 60; } + while (min > 59) { min -= 60; } + clock.min.field.bcdL = min % 10; clock.min.field.bcdH = min / 10; + + while (sec < 0) { sec += 60; } + while (sec > 59) { sec -= 60; } + clock.sec.field.bcdL = sec % 10; clock.sec.field.bcdH = sec / 10; + + printf_P(PSTR("\n %p %p %p %p %p %p %p -> write: "), &clock.sec.byte, &clock.min.byte, &clock.hour.byte, &clock.day.byte, &clock.weekday.byte, &clock.month.byte, &clock.year.byte ); + for (uint8_t i = 0; i < sizeof(clock); i++) { + printf_P(PSTR(" %02x"), ((uint8_t *)(void *)&clock)[i]); + } + return rtc8563.writeByteAndBuffer(0x02, (uint8_t *)(void *)&clock, sizeof(clock)); +} + +#endif + diff --git a/software/nano-644/test_2024-07-23/src/units/rtc8563.hpp b/software/nano-644/test_2024-07-23/src/units/rtc8563.hpp new file mode 100644 index 0000000..ca79713 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/rtc8563.hpp @@ -0,0 +1,70 @@ +#ifndef RTC8563_HPP +#define RTC8563_HPP + +#include +#include "../main.hpp" +#include "../adafruit/bme280.h" +#include "../adafruit/ens160.h" +#include "../i2cmaster.hpp" +#include "../i2cslave.hpp" + + +class Rtc8563 : public TestUnit { + public: + typedef enum { NORMAL } Rtc8563Mode_t; + + private: + I2cMaster rtc8563; + typedef enum { FDCLOCKOUT_32768HZ = 0, FDCLOCKOUT_1024HZ = 1, FDCLOCKOUT_32HZ = 2, FDCLOCKOUT_1HZ = 3 } FDCLOCKOUT_t; + typedef enum { FDTIMER_4096HZ = 0, FDTIMER_64HZ = 1, FDTIMER_1HZ = 2, FDTIMER_1D60HZ = 3 } FDTIMER_t; + typedef struct { + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:3; uint8_t voltageLow:1; } field; } sec; + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:3; uint8_t notUsed:1; } field; } min; + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:2; uint8_t notUsed:2; } field; } hour; + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:2; uint8_t notUsed:2; } field; } day; + union { uint8_t byte; struct { uint8_t bcdL:3; } field; uint8_t notUsed:5; } weekday; + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:1; uint8_t notUsed:2; uint8_t century:1; } field; } month; + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:4; } field; } year; + } Clock_t; // identical to 8563 register 2..8 + + typedef struct { + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:3; uint8_t enable:1; } field; } min; + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:2; uint8_t notUsed:1; uint8_t enable:1; } field; } hour; + union { uint8_t byte; struct { uint8_t bcdL:4; uint8_t bcdH:2; uint8_t notUsed:1; uint8_t enable:1; } field; } day; + union { uint8_t byte; struct { uint8_t bcdL:3; } field; uint8_t notUsed:4; uint8_t enable_W:1; } weekday; + } Alarm_t; + + typedef struct { + union { uint8_t byte; struct { uint8_t notUsed210:3; uint8_t testC:1; uint8_t notUsed4:1; uint8_t stop:1; uint8_t notUsed6:1; uint8_t test1:1; } field; } reg0; + union { uint8_t byte; struct { uint8_t tie:1; uint8_t aie:1; uint8_t tf:1; uint8_t af:1; uint8_t ti_tp:1; uint8_t notUsed:3; } field; } reg1; + Clock_t clock; + Alarm_t alarm; + union { uint8_t byte; struct { FDCLOCKOUT_t fd:2; uint8_t notUsed65432:5; uint8_t enable:1; } field; } clockoutControl; + union { uint8_t byte; struct { FDTIMER_t fd:2; uint8_t notUsed65432:5; uint8_t enable:1; } field; } timerControl; + uint8_t timer; + } Rtc8563Reg_t; + + + public: + bool enabled; + + public: + Rtc8563 (Rtc8563Mode_t mode) { enabled = false; this->mode = mode; } + void tick1ms () { rtc8563.tick1ms(); } + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName (); + void handleTwiIrq (); + + private: + Rtc8563Mode_t mode; + uint8_t bcd2bin (uint8_t value); + int8_t runModeNormal (uint8_t subtest); + int8_t runModeBattery (uint8_t subtest); + bool setTimer (uint8_t seconds, Rtc8563Reg_t ®); + bool powerOnOff (uint8_t delayOffSeconds, Rtc8563Reg_t ®); + bool setClock (int8_t weekday, uint16_t year, int8_t month, int8_t day, int8_t hour, int8_t min, int8_t sec); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/seg7.cpp b/software/nano-644/test_2024-07-23/src/units/seg7.cpp new file mode 100644 index 0000000..208107b --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/seg7.cpp @@ -0,0 +1,193 @@ +#include +#include + +#include "seg7.hpp" +#include "../main.hpp" + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // --------------------------------------------------------------- + + // PA0 ... Cathode Char 1 + // PA1 ... Cathode Char 2 + // PA2 ... Cathode Char 3 + // PA3 ... Cathode Char 4 + + // PB0 ... Anode Segment A + // PB1 ... Anode Segment B + // PB2 ... Anode Segment C + // PB3 ... Anode Segment D + // PB4 ... Anode Segment E + // PB5 ... Anode Segment F + // PB6 ... Anode Segment G + // PB7 ... Anode DP + + // PD5 ... nOE (Output Enable) for all LEDs + // PD6 ... Anode L1:2 + // PD7 ... Anode L3 + +void Seg7::init () { + setAnodes(0); + setCathodes(0); + DDRA |= (1 << PA3) | (1 << PA2) | (1 << PA1) | (1 << PA0); + DDRB = 0xff; + DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD5); + } + + void Seg7::cleanup () { + setAnodes(0); + setCathodes(0); + DDRA &= ~((1 << PA3) | (1 << PA2) | (1 << PA1) | (1 << PA0)); + DDRB = 0x00; + DDRD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5)); + } + + void Seg7::setAnodes (uint16_t a) { + if (a & 0x0001) PORTB |= (1 << PB0); else PORTB &= ~(1 << PB0); // Anode Char A + if (a & 0x0002) PORTB |= (1 << PB1); else PORTB &= ~(1 << PB1); // Anode Char B + if (a & 0x0004) PORTB |= (1 << PB2); else PORTB &= ~(1 << PB2); // Anode Char C + if (a & 0x0008) PORTB |= (1 << PB3); else PORTB &= ~(1 << PB3); // Anode Char D + if (a & 0x0010) PORTB |= (1 << PB4); else PORTB &= ~(1 << PB4); // Anode Char E + if (a & 0x0020) PORTB |= (1 << PB5); else PORTB &= ~(1 << PB5); // Anode Char F + if (a & 0x0040) PORTB |= (1 << PB6); else PORTB &= ~(1 << PB6); // Anode Char G + if (a & 0x0080) PORTB |= (1 << PB7); else PORTB &= ~(1 << PB7); // Anode Char DP + if (a & 0x0100) PORTD |= (1 << PD6); else PORTD &= ~(1 << PD6); // Anode L1/L2 + if (a & 0x0200) PORTD |= (1 << PD7); else PORTD &= ~(1 << PD7); // Anode L3 + } + + void Seg7::setCathodes (uint8_t c) { + if (c & 0x01) PORTA |= (1 << PA0); else PORTA &= ~(1 << PA0); // Chathode Char 1 (most left) + if (c & 0x02) PORTA |= (1 << PA1); else PORTA &= ~(1 << PA1); // Chathode Char 2 + if (c & 0x04) PORTA |= (1 << PA2); else PORTA &= ~(1 << PA2); // Chathode Char 3 + if (c & 0x08) PORTA |= (1 << PA3); else PORTA &= ~(1 << PA3); // Chathode Char 4 (most right) + } + + void Seg7::setOE (bool enabled) { + if (enabled) { + PORTD &= ~(1 << PD5); + } else { + PORTD |= (1 << PD5); + } + } + +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // --------------------------------------------------------------- + + // PC0 ... Cathode Char 1 + // PC1 ... Cathode Char 2 + // PC2 ... Cathode Char 3 + // PC3 ... Cathode Char 4 + + // PD4 ... Anode Segment A + // PB0 ... Anode Segment B + // PD7 ... Anode Segment C + // PD6 ... Anode Segment D + // PB2 ... Anode Segment E + // PB3 ... Anode Segment F + // PB4 ... Anode Segment G + // PB5 ... Anode DP + + // PB1 ... nOE (Output Enable) for all LEDs + // PD3 ... Anode L1:2 + // PD2 ,,, Anode L3 + + void Seg7::init () { + enabled = 1; + setAnodes(0); + setCathodes(0); + DDRB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB2) | (1 << PB1) | (1 << PB0) ; + DDRC |= (1 << PC3) | (1 << PC2) | (1 << PC1) | (1 << PC0); + DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD4) | (1 << PD3) | (1 << PD2); + + } + + void Seg7::cleanup () { + enabled = 0; + setAnodes(0); + setCathodes(0); + DDRB &= ~((1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB2) | (1 << PB1) | (1 << PB0)); + DDRC &= ~((1 << PC3) | (1 << PC2) | (1 << PC1) | (1 << PC0)); + DDRD &= ~((1 << PD7) | (1 << PD6) | (1 << PD4) | (1 << PD3) | (1 << PD2)); + } + + void Seg7::setAnodes (uint16_t a) { + if (a & 0x0001) PORTD |= (1 << PD4); else PORTD &= ~(1 << PD4); // Anode Char A + if (a & 0x0002) PORTB |= (1 << PB0); else PORTB &= ~(1 << PB0); // Anode Char B + if (a & 0x0004) PORTD |= (1 << PD7); else PORTD &= ~(1 << PD7); // Anode Char C + if (a & 0x0008) PORTD |= (1 << PD6); else PORTD &= ~(1 << PD6); // Anode Char D + if (a & 0x0010) PORTB |= (1 << PB2); else PORTB &= ~(1 << PB2); // Anode Char E + if (a & 0x0020) PORTB |= (1 << PB3); else PORTB &= ~(1 << PB3); // Anode Char F + if (a & 0x0040) PORTB |= (1 << PB4); else PORTB &= ~(1 << PB4); // Anode Char G + if (a & 0x0080) PORTB |= (1 << PB5); else PORTB &= ~(1 << PB5); // Anode Char DP + if (a & 0x0100) PORTD |= (1 << PD3); else PORTD &= ~(1 << PD3); // Anode L1/L2 + if (a & 0x0200) PORTD |= (1 << PD2); else PORTD &= ~(1 << PD2); // Anode L3 + } + + void Seg7::setCathodes (uint8_t c) { + if (c & 0x01) PORTC |= (1 << PC0); else PORTC &= ~(1 << PC0); // Chathode Char 1 (most left) + if (c & 0x02) PORTC |= (1 << PC1); else PORTC &= ~(1 << PC1); // Chathode Char 2 + if (c & 0x04) PORTC |= (1 << PC2); else PORTC &= ~(1 << PC2); // Chathode Char 3 + if (c & 0x08) PORTC |= (1 << PC3); else PORTC &= ~(1 << PC3); // Chathode Char 4 (most right) + } + + void Seg7::setOE (bool enabled) { + if (enabled) { + PORTB &= ~(1 << PB1); + } else { + PORTB |= (1 << PB1); + } + } + +#endif + +const char *segName[] = { "A", "B", "C", "D", "E", "F", "G", "DP" }; + + +int8_t Seg7::run (uint8_t subtest) { + if (subtest == 0) { + setCathodes(0x0f); // all segment cathodes conected to GND + setAnodes(0x3ff); // all segments ON + setOE(true); + printf_P(PSTR("ON")); + wait(2000); + setAnodes(0); + return 0; + + } else if (subtest == 1) { + printf_P(PSTR("OFF")); + wait(1000); + return 0; + + } else if (subtest == 2) { + setAnodes(0x100); // L1/L2 ON + printf_P(PSTR("L1/L2 ON")); + wait(1000); + setAnodes(0); + return 0; + + } else if (subtest == 3) { + setAnodes(0x200); // L3 ON + printf_P(PSTR("L1/L2 ON")); + wait(1000); + setAnodes(0); + return 0; + + } else if (subtest < (4 + 4 * 8)) { + uint8_t chIndex = (subtest - 4) / 8; + uint8_t segIndex = (subtest - 4) % 8; + setCathodes(1 << chIndex); + setAnodes(1 << segIndex); + printf_P(PSTR("Char %d - %s -> %02x"), chIndex, segName[segIndex], (1 << segIndex)); + wait(400); + return 0; + } + + return -1; +} + + diff --git a/software/nano-644/test_2024-07-23/src/units/seg7.hpp b/software/nano-644/test_2024-07-23/src/units/seg7.hpp new file mode 100644 index 0000000..0e71fde --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/seg7.hpp @@ -0,0 +1,25 @@ +#ifndef SEG7_HPP +#define SEG7_HPP + +#include +#include "../main.hpp" +#include + +class Seg7 : public TestUnit { + public: + bool enabled; + + public: + Seg7 () { enabled = false; } + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Seg7"); } + + private: + void setAnodes (uint16_t); + void setCathodes (uint8_t mask); + void setOE (bool enabled); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/switch.cpp b/software/nano-644/test_2024-07-23/src/units/switch.cpp new file mode 100644 index 0000000..4ce9456 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/switch.cpp @@ -0,0 +1,100 @@ +#include +#include +#include + +#include "switch.hpp" +#include "../main.hpp" + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + + // Nano-644 + // --------------------------------------------------------------- + // PA0 ..... SW1 + // PA1 ..... SW2 + // PA2 ..... SW3 + // PA3 ..... SW4 + + void Switch::init () { + DDRA &= ~((1 << PORTA3) | (1 << PORTA2) | (1 << PORTA1) | (1 << PORTA0)); + PORTA |= (1 << PORTA3) | (1 << PORTA2) | (1 << PORTA1) | (1 << PORTA0); + } + + void Switch::cleanup () { + PORTA &= ~((1 << PORTA3) | (1 << PORTA2) | (1 << PORTA1) | (1 << PORTA0)); + DDRA &= ~((1 << PORTA3) | (1 << PORTA2) | (1 << PORTA1) | (1 << PORTA0)); + } + + bool Switch::isPressed (SWITCH sw) { + switch (sw) { + case SW1: return (PINA & ( 1 << PA0)) == 0; + case SW2: return (PINA & ( 1 << PA1)) == 0; + case SW3: return (PINA & ( 1 << PA2)) == 0; + case SW4: return (PINA & ( 1 << PA3)) == 0; + default: return false; + } + } + +#endif + +#ifdef __AVR_ATmega328P__ + + // Arduino-Nano-5V + // --------------------------------------------------------------- + // PC0 ..... SW1 + // PC1 ..... SW2 + // PC2 ..... SW3 + // PC3 ..... SW4 + + void Switch::init () { + DDRC &= ~((1 << PORTC3) | (1 << PORTC2) | (1 << PORTC1) | (1 << PORTC0)); + PORTC |= (1 << PORTC3) | (1 << PORTC2) | (1 << PORTC1) | (1 << PORTC0); + } + + void Switch::cleanup () { + PORTC &= ~((1 << PORTC3) | (1 << PORTC2) | (1 << PORTC1) | (1 << PORTC0)); + DDRC &= ~((1 << PORTC3) | (1 << PORTC2) | (1 << PORTC1) | (1 << PORTC0)); + } + + bool Switch::isPressed (SWITCH sw) { + switch (sw) { + case SW1: return (PINC & ( 1 << PC0)) == 0; + case SW2: return (PINC & ( 1 << PC1)) == 0; + case SW3: return (PINC & ( 1 << PC2)) == 0; + case SW4: return (PINC & ( 1 << PC3)) == 0; + default: return false; + } + } + +#endif + +int8_t Switch::run (uint8_t subtest) { + if (subtest < 16) { + SWITCH sw = (SWITCH)(subtest / 4); + switch (subtest % 4) { + case 1: { + if (!isPressed(sw)) { + printf_P(PSTR("Press SW%d"), sw + 1); + while (!isPressed(sw) && wait(0) == EOF) {} + wait(10); + } + return 0; + } + + case 0: case 2: { + if (isPressed(sw)) { + printf_P(PSTR("Release SW%d "), sw + 1); + while (isPressed(sw) && wait(0) == EOF) {} + wait(10); + } + return 0; + } + + case 3: { + return 0; + } + } + + } + + return -1; +} diff --git a/software/nano-644/test_2024-07-23/src/units/switch.hpp b/software/nano-644/test_2024-07-23/src/units/switch.hpp new file mode 100644 index 0000000..03bf0b2 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/switch.hpp @@ -0,0 +1,20 @@ +#ifndef SWITCH_HPP +#define SWITCH_HPP + +#include +#include "../main.hpp" +#include + +class Switch : public TestUnit { + typedef enum { SW1 = 0, SW2 = 1, SW3 = 2, SW4 = 3 } SWITCH; + + public: + Switch () {}; + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Switch"); } + bool isPressed (SWITCH sw); +}; + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/uart1.cpp b/software/nano-644/test_2024-07-23/src/units/uart1.cpp new file mode 100644 index 0000000..57e0bfb --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/uart1.cpp @@ -0,0 +1,65 @@ +#include +#include +#include + +#include "uart1.hpp" +#include "../main.hpp" + +#ifdef __AVR_ATmega328P__ + void Uart1::init () {} + void Uart1::cleanup () {} + int8_t Uart1::run (uint8_t subtest) { return -1; } + void Uart1::handleRxByte (uint8_t b) {} +#endif + +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + +int uart1_putchar(char c, FILE *stream) { + if (c == '\n') { + uart1_putchar('\r', stream); + } + loop_until_bit_is_set(UCSR1A, UDRE1); + UDR1 = c; + return 0; +} + +static FILE mystderr = { 0, 0, _FDEV_SETUP_WRITE , 0, 0, uart1_putchar, NULL, 0 }; + +void Uart1::init () { + PORTD |= (1 << PD2); // enable RxD1 pullup + UCSR1A = (1 << U2X1); + UCSR1B = (1 << RXCIE1) | (1 << RXEN1) | (1 < send text via UART1 now...")); + fprintf_P(stderr, PSTR("Hello UART1, ECHO-Modus active\n")); + } while (wait(5000) == EOF); + return 0; + } + + return -1; +} + +void Uart1::handleRxByte (uint8_t b) { + uart1_putchar(b, stderr); +} + +#endif \ No newline at end of file diff --git a/software/nano-644/test_2024-07-23/src/units/uart1.hpp b/software/nano-644/test_2024-07-23/src/units/uart1.hpp new file mode 100644 index 0000000..40437e1 --- /dev/null +++ b/software/nano-644/test_2024-07-23/src/units/uart1.hpp @@ -0,0 +1,21 @@ +#ifndef UART1_HPP +#define UART1_HPP + +#include +#include "../main.hpp" +#include + +class Uart1 : public TestUnit { + public: + uint8_t enabled; + + public: + Uart1 () { enabled = 0; } + virtual void init (); + virtual void cleanup (); + virtual int8_t run (uint8_t subtest); + virtual PGM_P getName () { return PSTR("Uart1"); } + void handleRxByte (uint8_t); +}; + +#endif \ No newline at end of file diff --git a/software/pico/nano-x-blink/nano-x-blink.bin b/software/pico/nano-x-blink/nano-x-blink.bin new file mode 100755 index 0000000..301424b Binary files /dev/null and b/software/pico/nano-x-blink/nano-x-blink.bin differ diff --git a/software/pico/nano-x-blink/nano-x-blink.c b/software/pico/nano-x-blink/nano-x-blink.c new file mode 100644 index 0000000..3b93650 --- /dev/null +++ b/software/pico/nano-x-blink/nano-x-blink.c @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "pico/stdlib.h" + +int main () { + const uint LED_X_RED = 20; // PD4 + const uint LED_X_ORANGE = 3; // PD5 + const uint LED_X_GREEN = 15; // PD6 + const uint LED_X_BLUE = 14; // PD7 + + gpio_init(LED_X_RED); + gpio_init(LED_X_ORANGE); + gpio_init(LED_X_GREEN); + gpio_init(LED_X_BLUE); + gpio_set_dir(LED_X_RED, GPIO_OUT); + gpio_set_dir(LED_X_ORANGE, GPIO_OUT); + gpio_set_dir(LED_X_GREEN, GPIO_OUT); + gpio_set_dir(LED_X_BLUE, GPIO_OUT); + + // Pico LED + const uint LED_PIN = PICO_DEFAULT_LED_PIN; + gpio_init(LED_PIN); + gpio_set_dir(LED_PIN, GPIO_OUT); + + while (true) { + gpio_put(LED_PIN, 1); + sleep_ms(100); + gpio_put(LED_PIN, 0); + + gpio_put(LED_X_RED, 1); + sleep_ms(100); + gpio_put(LED_X_RED, 0); + + gpio_put(LED_X_ORANGE, 1); + sleep_ms(100); + gpio_put(LED_X_ORANGE, 0); + + gpio_put(LED_X_GREEN, 1); + sleep_ms(100); + gpio_put(LED_X_GREEN, 0); + + gpio_put(LED_X_BLUE, 1); + sleep_ms(100); + gpio_put(LED_X_BLUE, 0); + + // sleep_ms(450); + } + +} diff --git a/software/pico/nano-x-blink/nano-x-blink.dis b/software/pico/nano-x-blink/nano-x-blink.dis new file mode 100644 index 0000000..ada5603 --- /dev/null +++ b/software/pico/nano-x-blink/nano-x-blink.dis @@ -0,0 +1,3956 @@ + +/home/steiner/pico/pico-examples/nano-x-blink/nano-x-blink.elf: file format elf32-littlearm + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .boot2 00000100 10000000 10000000 00001000 2**0 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .text 00001ec0 10000100 10000100 00001100 2**3 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .rodata 00000100 10001fc0 10001fc0 00002fc0 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .binary_info 00000020 100020c0 100020c0 000030c0 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 4 .ram_vector_table 000000c0 20000000 20000000 00005000 2**2 + ALLOC + 5 .data 0000018c 200000c0 100020e0 000040c0 2**4 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 6 .uninitialized_data 00000000 2000024c 2000024c 0000424c 2**0 + CONTENTS + 7 .scratch_x 00000000 20040000 20040000 0000424c 2**0 + CONTENTS + 8 .scratch_y 00000000 20041000 20041000 0000424c 2**0 + CONTENTS + 9 .bss 000003cc 20000250 20000250 00005000 2**3 + ALLOC + 10 .heap 00000800 2000061c 2000061c 0000424c 2**2 + CONTENTS, READONLY + 11 .stack_dummy 00000800 20041000 20041000 00004a60 2**5 + CONTENTS, READONLY + 12 .ARM.attributes 00000028 00000000 00000000 00005260 2**0 + CONTENTS, READONLY + 13 .comment 00000033 00000000 00000000 00005288 2**0 + CONTENTS, READONLY + 14 .debug_line 000001d2 00000000 00000000 000052bb 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 15 .debug_info 00000114 00000000 00000000 0000548d 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 16 .debug_abbrev 000000a3 00000000 00000000 000055a1 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 17 .debug_aranges 00000040 00000000 00000000 00005648 2**3 + CONTENTS, READONLY, DEBUGGING, OCTETS + 18 .debug_str 00000232 00000000 00000000 00005688 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 19 .debug_loc 00000090 00000000 00000000 000058ba 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 20 .debug_frame 00000028 00000000 00000000 0000594c 2**2 + CONTENTS, READONLY, DEBUGGING, OCTETS + +/home/steiner/pico/pico-examples/nano-x-blink/nano-x-blink.elf: file format elf32-littlearm + + +Disassembly of section .boot2: + +10000000 <__boot2_start__>: +10000000: 4b32b500 .word 0x4b32b500 +10000004: 60582021 .word 0x60582021 +10000008: 21026898 .word 0x21026898 +1000000c: 60984388 .word 0x60984388 +10000010: 611860d8 .word 0x611860d8 +10000014: 4b2e6158 .word 0x4b2e6158 +10000018: 60992100 .word 0x60992100 +1000001c: 61592102 .word 0x61592102 +10000020: 22f02101 .word 0x22f02101 +10000024: 492b5099 .word 0x492b5099 +10000028: 21016019 .word 0x21016019 +1000002c: 20356099 .word 0x20356099 +10000030: f844f000 .word 0xf844f000 +10000034: 42902202 .word 0x42902202 +10000038: 2106d014 .word 0x2106d014 +1000003c: f0006619 .word 0xf0006619 +10000040: 6e19f834 .word 0x6e19f834 +10000044: 66192101 .word 0x66192101 +10000048: 66182000 .word 0x66182000 +1000004c: f000661a .word 0xf000661a +10000050: 6e19f82c .word 0x6e19f82c +10000054: 6e196e19 .word 0x6e196e19 +10000058: f0002005 .word 0xf0002005 +1000005c: 2101f82f .word 0x2101f82f +10000060: d1f94208 .word 0xd1f94208 +10000064: 60992100 .word 0x60992100 +10000068: 6019491b .word 0x6019491b +1000006c: 60592100 .word 0x60592100 +10000070: 481b491a .word 0x481b491a +10000074: 21016001 .word 0x21016001 +10000078: 21eb6099 .word 0x21eb6099 +1000007c: 21a06619 .word 0x21a06619 +10000080: f0006619 .word 0xf0006619 +10000084: 2100f812 .word 0x2100f812 +10000088: 49166099 .word 0x49166099 +1000008c: 60014814 .word 0x60014814 +10000090: 60992101 .word 0x60992101 +10000094: 2800bc01 .word 0x2800bc01 +10000098: 4700d000 .word 0x4700d000 +1000009c: 49134812 .word 0x49134812 +100000a0: c8036008 .word 0xc8036008 +100000a4: 8808f380 .word 0x8808f380 +100000a8: b5034708 .word 0xb5034708 +100000ac: 20046a99 .word 0x20046a99 +100000b0: d0fb4201 .word 0xd0fb4201 +100000b4: 42012001 .word 0x42012001 +100000b8: bd03d1f8 .word 0xbd03d1f8 +100000bc: 6618b502 .word 0x6618b502 +100000c0: f7ff6618 .word 0xf7ff6618 +100000c4: 6e18fff2 .word 0x6e18fff2 +100000c8: bd026e18 .word 0xbd026e18 +100000cc: 40020000 .word 0x40020000 +100000d0: 18000000 .word 0x18000000 +100000d4: 00070000 .word 0x00070000 +100000d8: 005f0300 .word 0x005f0300 +100000dc: 00002221 .word 0x00002221 +100000e0: 180000f4 .word 0x180000f4 +100000e4: a0002022 .word 0xa0002022 +100000e8: 10000100 .word 0x10000100 +100000ec: e000ed08 .word 0xe000ed08 + ... +100000fc: 7a4eb274 .word 0x7a4eb274 + +Disassembly of section .text: + +10000100 <__VECTOR_TABLE>: +10000100: 20042000 .word 0x20042000 +10000104: 100001f7 .word 0x100001f7 +10000108: 100001c3 .word 0x100001c3 +1000010c: 100001c5 .word 0x100001c5 +10000110: 100001c1 .word 0x100001c1 +10000114: 100001c1 .word 0x100001c1 +10000118: 100001c1 .word 0x100001c1 +1000011c: 100001c1 .word 0x100001c1 +10000120: 100001c1 .word 0x100001c1 +10000124: 100001c1 .word 0x100001c1 +10000128: 100001c1 .word 0x100001c1 +1000012c: 100001c7 .word 0x100001c7 +10000130: 100001c1 .word 0x100001c1 +10000134: 100001c1 .word 0x100001c1 +10000138: 100001c9 .word 0x100001c9 +1000013c: 100001cb .word 0x100001cb +10000140: 100001cd .word 0x100001cd +10000144: 100001cd .word 0x100001cd +10000148: 100001cd .word 0x100001cd +1000014c: 100001cd .word 0x100001cd +10000150: 100001cd .word 0x100001cd +10000154: 100001cd .word 0x100001cd +10000158: 100001cd .word 0x100001cd +1000015c: 100001cd .word 0x100001cd +10000160: 100001cd .word 0x100001cd +10000164: 100001cd .word 0x100001cd +10000168: 100001cd .word 0x100001cd +1000016c: 100001cd .word 0x100001cd +10000170: 100001cd .word 0x100001cd +10000174: 100001cd .word 0x100001cd +10000178: 100001cd .word 0x100001cd +1000017c: 100001cd .word 0x100001cd +10000180: 100001cd .word 0x100001cd +10000184: 100001cd .word 0x100001cd +10000188: 100001cd .word 0x100001cd +1000018c: 100001cd .word 0x100001cd +10000190: 100001cd .word 0x100001cd +10000194: 100001cd .word 0x100001cd +10000198: 100001cd .word 0x100001cd +1000019c: 100001cd .word 0x100001cd +100001a0: 100001cd .word 0x100001cd +100001a4: 100001cd .word 0x100001cd +100001a8: 100001cd .word 0x100001cd +100001ac: 100001cd .word 0x100001cd +100001b0: 100001cd .word 0x100001cd +100001b4: 100001cd .word 0x100001cd +100001b8: 100001cd .word 0x100001cd +100001bc: 100001cd .word 0x100001cd + +100001c0 : +100001c0: be00 bkpt 0x0000 + +100001c2 : +100001c2: be00 bkpt 0x0000 + +100001c4 : +100001c4: be00 bkpt 0x0000 + +100001c6 : +100001c6: be00 bkpt 0x0000 + +100001c8 : +100001c8: be00 bkpt 0x0000 + +100001ca : +100001ca: be00 bkpt 0x0000 + +100001cc <__unhandled_user_irq>: +100001cc: f3ef 8005 mrs r0, IPSR +100001d0: 3810 subs r0, #16 + +100001d2 : +100001d2: be00 bkpt 0x0000 + +100001d4 : +100001d4: 7188ebf2 .word 0x7188ebf2 +100001d8: 100020c0 .word 0x100020c0 +100001dc: 100020e0 .word 0x100020e0 +100001e0: 10000234 .word 0x10000234 +100001e4: e71aa390 .word 0xe71aa390 + +100001e8 <_entry_point>: +100001e8: 2000 movs r0, #0 +100001ea: 491f ldr r1, [pc, #124] ; (10000268 ) +100001ec: 6008 str r0, [r1, #0] +100001ee: c806 ldmia r0!, {r1, r2} +100001f0: f381 8808 msr MSP, r1 +100001f4: 4710 bx r2 + +100001f6 <_reset_handler>: +100001f6: 481d ldr r0, [pc, #116] ; (1000026c ) +100001f8: 6800 ldr r0, [r0, #0] +100001fa: 2800 cmp r0, #0 +100001fc: d12f bne.n 1000025e +100001fe: a40d add r4, pc, #52 ; (adr r4, 10000234 ) +10000200: cc0e ldmia r4!, {r1, r2, r3} +10000202: 2900 cmp r1, #0 +10000204: d002 beq.n 1000020c <_reset_handler+0x16> +10000206: f000 f812 bl 1000022e +1000020a: e7f9 b.n 10000200 <_reset_handler+0xa> +1000020c: 4918 ldr r1, [pc, #96] ; (10000270 ) +1000020e: 4a19 ldr r2, [pc, #100] ; (10000274 ) +10000210: 2000 movs r0, #0 +10000212: e000 b.n 10000216 + +10000214 : +10000214: c101 stmia r1!, {r0} + +10000216 : +10000216: 4291 cmp r1, r2 +10000218: d1fc bne.n 10000214 + +1000021a : +1000021a: 4917 ldr r1, [pc, #92] ; (10000278 ) +1000021c: 4788 blx r1 +1000021e: 4917 ldr r1, [pc, #92] ; (1000027c ) +10000220: 4788 blx r1 +10000222: 4917 ldr r1, [pc, #92] ; (10000280 ) +10000224: 4788 blx r1 +10000226: be00 bkpt 0x0000 +10000228: e7fd b.n 10000226 + +1000022a : +1000022a: c901 ldmia r1!, {r0} +1000022c: c201 stmia r2!, {r0} + +1000022e : +1000022e: 429a cmp r2, r3 +10000230: d3fb bcc.n 1000022a +10000232: 4770 bx lr + +10000234 : +10000234: 100020e0 .word 0x100020e0 +10000238: 200000c0 .word 0x200000c0 +1000023c: 2000024c .word 0x2000024c +10000240: 1000226c .word 0x1000226c +10000244: 20040000 .word 0x20040000 +10000248: 20040000 .word 0x20040000 +1000024c: 1000226c .word 0x1000226c +10000250: 20041000 .word 0x20041000 +10000254: 20041000 .word 0x20041000 +10000258: 00000000 .word 0x00000000 +1000025c: 4770 bx lr + +1000025e : +1000025e: 4809 ldr r0, [pc, #36] ; (10000284 ) +10000260: f001 fbf4 bl 10001a4c +10000264: 4700 bx r0 +10000266: 0000 .short 0x0000 +10000268: e000ed08 .word 0xe000ed08 +1000026c: d0000000 .word 0xd0000000 +10000270: 20000250 .word 0x20000250 +10000274: 2000061c .word 0x2000061c +10000278: 100018c5 .word 0x100018c5 +1000027c: 10000355 .word 0x10000355 +10000280: 100019b9 .word 0x100019b9 +10000284: 00005657 .word 0x00005657 + +10000288 <__bi_50>: +10000288: 50520006 5360b3ab 10002060 ..RP..`S` .. + +10000294 <__bi_38>: +10000294: 50520006 02031c86 10002070 ..RP....p .. + +100002a0 <__bi_30>: +100002a0: 50520006 9da22254 10002080 ..RPT"... .. + +100002ac <__bi_22>: +100002ac: 50520005 68f465de 1000226c ..RP.e.hl".. + +100002b8 <_init>: +100002b8: b5f8 push {r3, r4, r5, r6, r7, lr} +100002ba: 46c0 nop ; (mov r8, r8) + +100002bc : +100002bc: 4804 ldr r0, [pc, #16] ; (100002d0 ) +100002be: 4b05 ldr r3, [pc, #20] ; (100002d4 ) +100002c0: b510 push {r4, lr} +100002c2: 4283 cmp r3, r0 +100002c4: d003 beq.n 100002ce +100002c6: 4b04 ldr r3, [pc, #16] ; (100002d8 ) +100002c8: 2b00 cmp r3, #0 +100002ca: d000 beq.n 100002ce +100002cc: 4798 blx r3 +100002ce: bd10 pop {r4, pc} +100002d0: 2000024c .word 0x2000024c +100002d4: 2000024c .word 0x2000024c +100002d8: 00000000 .word 0x00000000 + +100002dc : +100002dc: 4806 ldr r0, [pc, #24] ; (100002f8 ) +100002de: 4907 ldr r1, [pc, #28] ; (100002fc ) +100002e0: 1a09 subs r1, r1, r0 +100002e2: 108b asrs r3, r1, #2 +100002e4: 0fc9 lsrs r1, r1, #31 +100002e6: 18c9 adds r1, r1, r3 +100002e8: b510 push {r4, lr} +100002ea: 1049 asrs r1, r1, #1 +100002ec: d003 beq.n 100002f6 +100002ee: 4b04 ldr r3, [pc, #16] ; (10000300 ) +100002f0: 2b00 cmp r3, #0 +100002f2: d000 beq.n 100002f6 +100002f4: 4798 blx r3 +100002f6: bd10 pop {r4, pc} +100002f8: 2000024c .word 0x2000024c +100002fc: 2000024c .word 0x2000024c +10000300: 00000000 .word 0x00000000 + +10000304 <__do_global_dtors_aux>: +10000304: b510 push {r4, lr} +10000306: 4c07 ldr r4, [pc, #28] ; (10000324 <__do_global_dtors_aux+0x20>) +10000308: 7823 ldrb r3, [r4, #0] +1000030a: 2b00 cmp r3, #0 +1000030c: d109 bne.n 10000322 <__do_global_dtors_aux+0x1e> +1000030e: f7ff ffd5 bl 100002bc +10000312: 4b05 ldr r3, [pc, #20] ; (10000328 <__do_global_dtors_aux+0x24>) +10000314: 2b00 cmp r3, #0 +10000316: d002 beq.n 1000031e <__do_global_dtors_aux+0x1a> +10000318: 4804 ldr r0, [pc, #16] ; (1000032c <__do_global_dtors_aux+0x28>) +1000031a: e000 b.n 1000031e <__do_global_dtors_aux+0x1a> +1000031c: bf00 nop +1000031e: 2301 movs r3, #1 +10000320: 7023 strb r3, [r4, #0] +10000322: bd10 pop {r4, pc} +10000324: 20000550 .word 0x20000550 +10000328: 00000000 .word 0x00000000 +1000032c: 10001fc0 .word 0x10001fc0 + +10000330 : +10000330: 4b05 ldr r3, [pc, #20] ; (10000348 ) +10000332: b510 push {r4, lr} +10000334: 2b00 cmp r3, #0 +10000336: d003 beq.n 10000340 +10000338: 4904 ldr r1, [pc, #16] ; (1000034c ) +1000033a: 4805 ldr r0, [pc, #20] ; (10000350 ) +1000033c: e000 b.n 10000340 +1000033e: bf00 nop +10000340: f7ff ffcc bl 100002dc +10000344: bd10 pop {r4, pc} +10000346: 46c0 nop ; (mov r8, r8) +10000348: 00000000 .word 0x00000000 +1000034c: 20000554 .word 0x20000554 +10000350: 10001fc0 .word 0x10001fc0 + +10000354
: +10000354: b570 push {r4, r5, r6, lr} +10000356: 2014 movs r0, #20 +10000358: f000 f83e bl 100003d8 +1000035c: 2003 movs r0, #3 +1000035e: f000 f83b bl 100003d8 +10000362: 200f movs r0, #15 +10000364: f000 f838 bl 100003d8 +10000368: 200e movs r0, #14 +1000036a: f000 f835 bl 100003d8 +1000036e: 24d0 movs r4, #208 ; 0xd0 +10000370: 2380 movs r3, #128 ; 0x80 +10000372: 0624 lsls r4, r4, #24 +10000374: 035b lsls r3, r3, #13 +10000376: 6263 str r3, [r4, #36] ; 0x24 +10000378: 2308 movs r3, #8 +1000037a: 6263 str r3, [r4, #36] ; 0x24 +1000037c: 2380 movs r3, #128 ; 0x80 +1000037e: 021b lsls r3, r3, #8 +10000380: 6263 str r3, [r4, #36] ; 0x24 +10000382: 2380 movs r3, #128 ; 0x80 +10000384: 2680 movs r6, #128 ; 0x80 +10000386: 01db lsls r3, r3, #7 +10000388: 2019 movs r0, #25 +1000038a: 6263 str r3, [r4, #36] ; 0x24 +1000038c: 04b6 lsls r6, r6, #18 +1000038e: f000 f823 bl 100003d8 +10000392: 6266 str r6, [r4, #36] ; 0x24 +10000394: 2580 movs r5, #128 ; 0x80 +10000396: 2064 movs r0, #100 ; 0x64 +10000398: 036d lsls r5, r5, #13 +1000039a: 6166 str r6, [r4, #20] +1000039c: f000 fd0e bl 10000dbc +100003a0: 2064 movs r0, #100 ; 0x64 +100003a2: 61a6 str r6, [r4, #24] +100003a4: 6165 str r5, [r4, #20] +100003a6: f000 fd09 bl 10000dbc +100003aa: 61a5 str r5, [r4, #24] +100003ac: 2508 movs r5, #8 +100003ae: 2064 movs r0, #100 ; 0x64 +100003b0: 6165 str r5, [r4, #20] +100003b2: f000 fd03 bl 10000dbc +100003b6: 61a5 str r5, [r4, #24] +100003b8: 2580 movs r5, #128 ; 0x80 +100003ba: 022d lsls r5, r5, #8 +100003bc: 2064 movs r0, #100 ; 0x64 +100003be: 6165 str r5, [r4, #20] +100003c0: f000 fcfc bl 10000dbc +100003c4: 61a5 str r5, [r4, #24] +100003c6: 2580 movs r5, #128 ; 0x80 +100003c8: 01ed lsls r5, r5, #7 +100003ca: 2064 movs r0, #100 ; 0x64 +100003cc: 6165 str r5, [r4, #20] +100003ce: f000 fcf5 bl 10000dbc +100003d2: 61a5 str r5, [r4, #24] +100003d4: e7de b.n 10000394 +100003d6: 46c0 nop ; (mov r8, r8) + +100003d8 : +100003d8: 2301 movs r3, #1 +100003da: 22d0 movs r2, #208 ; 0xd0 +100003dc: 4083 lsls r3, r0 +100003de: 0612 lsls r2, r2, #24 +100003e0: 6293 str r3, [r2, #40] ; 0x28 +100003e2: 6193 str r3, [r2, #24] +100003e4: 4a09 ldr r2, [pc, #36] ; (1000040c ) +100003e6: 0083 lsls r3, r0, #2 +100003e8: 4694 mov ip, r2 +100003ea: 2240 movs r2, #64 ; 0x40 +100003ec: 4463 add r3, ip +100003ee: 6819 ldr r1, [r3, #0] +100003f0: 00c0 lsls r0, r0, #3 +100003f2: 404a eors r2, r1 +100003f4: 21c0 movs r1, #192 ; 0xc0 +100003f6: 4011 ands r1, r2 +100003f8: 2280 movs r2, #128 ; 0x80 +100003fa: 0152 lsls r2, r2, #5 +100003fc: 4313 orrs r3, r2 +100003fe: 6019 str r1, [r3, #0] +10000400: 4b03 ldr r3, [pc, #12] ; (10000410 ) +10000402: 469c mov ip, r3 +10000404: 2305 movs r3, #5 +10000406: 4460 add r0, ip +10000408: 6043 str r3, [r0, #4] +1000040a: 4770 bx lr +1000040c: 4001c004 .word 0x4001c004 +10000410: 40014000 .word 0x40014000 + +10000414 : +10000414: 4b02 ldr r3, [pc, #8] ; (10000420 ) +10000416: 6818 ldr r0, [r3, #0] +10000418: 0780 lsls r0, r0, #30 +1000041a: 0fc0 lsrs r0, r0, #31 +1000041c: 4770 bx lr +1000041e: 46c0 nop ; (mov r8, r8) +10000420: 4006c000 .word 0x4006c000 + +10000424 : +10000424: b570 push {r4, r5, r6, lr} +10000426: f3ef 8c10 mrs ip, PRIMASK +1000042a: b672 cpsid i +1000042c: 4d0d ldr r5, [pc, #52] ; (10000464 ) +1000042e: 682b ldr r3, [r5, #0] +10000430: 2b00 cmp r3, #0 +10000432: d0fc beq.n 1000042e +10000434: f3bf 8f5f dmb sy +10000438: 2407 movs r4, #7 +1000043a: 08cb lsrs r3, r1, #3 +1000043c: 18c6 adds r6, r0, r3 +1000043e: 5cc0 ldrb r0, [r0, r3] +10000440: 2301 movs r3, #1 +10000442: 400c ands r4, r1 +10000444: 40a3 lsls r3, r4 +10000446: 001c movs r4, r3 +10000448: 4004 ands r4, r0 +1000044a: 4203 tst r3, r0 +1000044c: d107 bne.n 1000045e +1000044e: 4303 orrs r3, r0 +10000450: 7033 strb r3, [r6, #0] +10000452: f3bf 8f5f dmb sy +10000456: 602c str r4, [r5, #0] +10000458: f38c 8810 msr PRIMASK, ip +1000045c: bd70 pop {r4, r5, r6, pc} +1000045e: 0010 movs r0, r2 +10000460: f001 faae bl 100019c0 +10000464: d000012c .word 0xd000012c + +10000468 : +10000468: 2100 movs r1, #0 +1000046a: 4b04 ldr r3, [pc, #16] ; (1000047c ) +1000046c: 4a04 ldr r2, [pc, #16] ; (10000480 ) +1000046e: f3bf 8f5f dmb sy +10000472: c302 stmia r3!, {r1} +10000474: 4293 cmp r3, r2 +10000476: d1fa bne.n 1000046e +10000478: 4770 bx lr +1000047a: 46c0 nop ; (mov r8, r8) +1000047c: d0000100 .word 0xd0000100 +10000480: d0000180 .word 0xd0000180 + +10000484 : +10000484: 4a04 ldr r2, [pc, #16] ; (10000498 ) +10000486: 7810 ldrb r0, [r2, #0] +10000488: 1c43 adds r3, r0, #1 +1000048a: b2db uxtb r3, r3 +1000048c: 2b17 cmp r3, #23 +1000048e: d900 bls.n 10000492 +10000490: 2310 movs r3, #16 +10000492: 7013 strb r3, [r2, #0] +10000494: 4770 bx lr +10000496: 46c0 nop ; (mov r8, r8) +10000498: 20000198 .word 0x20000198 + +1000049c : +1000049c: 2301 movs r3, #1 +1000049e: 4083 lsls r3, r0 +100004a0: 2900 cmp r1, #0 +100004a2: d004 beq.n 100004ae +100004a4: 4a03 ldr r2, [pc, #12] ; (100004b4 ) +100004a6: 6013 str r3, [r2, #0] +100004a8: 4a03 ldr r2, [pc, #12] ; (100004b8 ) +100004aa: 6013 str r3, [r2, #0] +100004ac: 4770 bx lr +100004ae: 4a03 ldr r2, [pc, #12] ; (100004bc ) +100004b0: 6013 str r3, [r2, #0] +100004b2: e7fb b.n 100004ac +100004b4: e000e280 .word 0xe000e280 +100004b8: e000e100 .word 0xe000e100 +100004bc: e000e180 .word 0xe000e180 + +100004c0 : +100004c0: 4b02 ldr r3, [pc, #8] ; (100004cc ) +100004c2: 3010 adds r0, #16 +100004c4: 689b ldr r3, [r3, #8] +100004c6: 0080 lsls r0, r0, #2 +100004c8: 58c0 ldr r0, [r0, r3] +100004ca: 4770 bx lr +100004cc: e000ed00 .word 0xe000ed00 + +100004d0 : +100004d0: b570 push {r4, r5, r6, lr} +100004d2: 000d movs r5, r1 +100004d4: f3ef 8610 mrs r6, PRIMASK +100004d8: b672 cpsid i +100004da: 4a0f ldr r2, [pc, #60] ; (10000518 ) +100004dc: 6813 ldr r3, [r2, #0] +100004de: 2b00 cmp r3, #0 +100004e0: d0fc beq.n 100004dc +100004e2: f3bf 8f5f dmb sy +100004e6: 4b0d ldr r3, [pc, #52] ; (1000051c ) +100004e8: 3010 adds r0, #16 +100004ea: 689b ldr r3, [r3, #8] +100004ec: 0084 lsls r4, r0, #2 +100004ee: 591b ldr r3, [r3, r4] +100004f0: 4a0b ldr r2, [pc, #44] ; (10000520 ) +100004f2: 4293 cmp r3, r2 +100004f4: d003 beq.n 100004fe +100004f6: 429d cmp r5, r3 +100004f8: d001 beq.n 100004fe +100004fa: f001 fa79 bl 100019f0 +100004fe: 4b07 ldr r3, [pc, #28] ; (1000051c ) +10000500: 689b ldr r3, [r3, #8] +10000502: 511d str r5, [r3, r4] +10000504: f3bf 8f5f dmb sy +10000508: f3bf 8f5f dmb sy +1000050c: 2200 movs r2, #0 +1000050e: 4b02 ldr r3, [pc, #8] ; (10000518 ) +10000510: 601a str r2, [r3, #0] +10000512: f386 8810 msr PRIMASK, r6 +10000516: bd70 pop {r4, r5, r6, pc} +10000518: d0000124 .word 0xd0000124 +1000051c: e000ed00 .word 0xe000ed00 +10000520: 100001cd .word 0x100001cd + +10000524 : +10000524: b5f0 push {r4, r5, r6, r7, lr} +10000526: 46de mov lr, fp +10000528: 4657 mov r7, sl +1000052a: 464e mov r6, r9 +1000052c: 4645 mov r5, r8 +1000052e: b5e0 push {r5, r6, r7, lr} +10000530: 000c movs r4, r1 +10000532: b083 sub sp, #12 +10000534: f3ef 8910 mrs r9, PRIMASK +10000538: b672 cpsid i +1000053a: 4a58 ldr r2, [pc, #352] ; (1000069c ) +1000053c: 6813 ldr r3, [r2, #0] +1000053e: 2b00 cmp r3, #0 +10000540: d0fc beq.n 1000053c +10000542: f3bf 8f5f dmb sy +10000546: 4b56 ldr r3, [pc, #344] ; (100006a0 ) +10000548: 689a ldr r2, [r3, #8] +1000054a: 0003 movs r3, r0 +1000054c: 3310 adds r3, #16 +1000054e: 009f lsls r7, r3, #2 +10000550: 59d5 ldr r5, [r2, r7] +10000552: 4a54 ldr r2, [pc, #336] ; (100006a4 ) +10000554: 4690 mov r8, r2 +10000556: 4295 cmp r5, r2 +10000558: d032 beq.n 100005c0 +1000055a: 42a5 cmp r5, r4 +1000055c: d043 beq.n 100005e6 +1000055e: 4e52 ldr r6, [pc, #328] ; (100006a8 ) +10000560: 1baa subs r2, r5, r6 +10000562: 2a2f cmp r2, #47 ; 0x2f +10000564: d82c bhi.n 100005c0 +10000566: 2201 movs r2, #1 +10000568: 4082 lsls r2, r0 +1000056a: 4692 mov sl, r2 +1000056c: 4651 mov r1, sl +1000056e: 4a4f ldr r2, [pc, #316] ; (100006ac ) +10000570: 6812 ldr r2, [r2, #0] +10000572: 4011 ands r1, r2 +10000574: 9101 str r1, [sp, #4] +10000576: 4651 mov r1, sl +10000578: 4a4d ldr r2, [pc, #308] ; (100006b0 ) +1000057a: 6011 str r1, [r2, #0] +1000057c: f3bf 8f5f dmb sy +10000580: f3ef 8205 mrs r2, IPSR +10000584: 4693 mov fp, r2 +10000586: 2a00 cmp r2, #0 +10000588: d133 bne.n 100005f2 +1000058a: 2301 movs r3, #1 +1000058c: 002a movs r2, r5 +1000058e: 439a bics r2, r3 +10000590: 6893 ldr r3, [r2, #8] +10000592: 429c cmp r4, r3 +10000594: d108 bne.n 100005a8 +10000596: e077 b.n 10000688 +10000598: 004b lsls r3, r1, #1 +1000059a: 185b adds r3, r3, r1 +1000059c: 009b lsls r3, r3, #2 +1000059e: 18f3 adds r3, r6, r3 +100005a0: 6899 ldr r1, [r3, #8] +100005a2: 42a1 cmp r1, r4 +100005a4: d02a beq.n 100005fc +100005a6: 001a movs r2, r3 +100005a8: 2106 movs r1, #6 +100005aa: 5651 ldrsb r1, [r2, r1] +100005ac: 2900 cmp r1, #0 +100005ae: daf3 bge.n 10000598 +100005b0: 9b01 ldr r3, [sp, #4] +100005b2: 2b00 cmp r3, #0 +100005b4: d019 beq.n 100005ea +100005b6: 4652 mov r2, sl +100005b8: 4b3e ldr r3, [pc, #248] ; (100006b4 ) +100005ba: 601a str r2, [r3, #0] +100005bc: 4b3b ldr r3, [pc, #236] ; (100006ac ) +100005be: 601a str r2, [r3, #0] +100005c0: 4b37 ldr r3, [pc, #220] ; (100006a0 ) +100005c2: 689b ldr r3, [r3, #8] +100005c4: 51dd str r5, [r3, r7] +100005c6: f3bf 8f5f dmb sy +100005ca: f3bf 8f5f dmb sy +100005ce: 2200 movs r2, #0 +100005d0: 4b32 ldr r3, [pc, #200] ; (1000069c ) +100005d2: 601a str r2, [r3, #0] +100005d4: f389 8810 msr PRIMASK, r9 +100005d8: b003 add sp, #12 +100005da: bcf0 pop {r4, r5, r6, r7} +100005dc: 46bb mov fp, r7 +100005de: 46b2 mov sl, r6 +100005e0: 46a9 mov r9, r5 +100005e2: 46a0 mov r8, r4 +100005e4: bdf0 pop {r4, r5, r6, r7, pc} +100005e6: 0015 movs r5, r2 +100005e8: e7ea b.n 100005c0 +100005ea: 4652 mov r2, sl +100005ec: 4b30 ldr r3, [pc, #192] ; (100006b0 ) +100005ee: 601a str r2, [r3, #0] +100005f0: e7e6 b.n 100005c0 +100005f2: 4293 cmp r3, r2 +100005f4: d0c9 beq.n 1000058a +100005f6: f001 f9fb bl 100019f0 +100005fa: e7c6 b.n 1000058a +100005fc: 2106 movs r1, #6 +100005fe: 5659 ldrsb r1, [r3, r1] +10000600: 2900 cmp r1, #0 +10000602: db21 blt.n 10000648 +10000604: 004a lsls r2, r1, #1 +10000606: 1850 adds r0, r2, r1 +10000608: 0080 lsls r0, r0, #2 +1000060a: 1834 adds r4, r6, r0 +1000060c: 4680 mov r8, r0 +1000060e: 68a0 ldr r0, [r4, #8] +10000610: 6098 str r0, [r3, #8] +10000612: 79e0 ldrb r0, [r4, #7] +10000614: 71d8 strb r0, [r3, #7] +10000616: 2006 movs r0, #6 +10000618: 5620 ldrsb r0, [r4, r0] +1000061a: 7198 strb r0, [r3, #6] +1000061c: 2800 cmp r0, #0 +1000061e: db24 blt.n 1000066a +10000620: 88a4 ldrh r4, [r4, #4] +10000622: 1af0 subs r0, r6, r3 +10000624: 0564 lsls r4, r4, #21 +10000626: 1524 asrs r4, r4, #20 +10000628: 4444 add r4, r8 +1000062a: 1900 adds r0, r0, r4 +1000062c: 24e0 movs r4, #224 ; 0xe0 +1000062e: 0500 lsls r0, r0, #20 +10000630: 0d40 lsrs r0, r0, #21 +10000632: 0224 lsls r4, r4, #8 +10000634: 4320 orrs r0, r4 +10000636: 8098 strh r0, [r3, #4] +10000638: 1852 adds r2, r2, r1 +1000063a: 4b1f ldr r3, [pc, #124] ; (100006b8 ) +1000063c: 0092 lsls r2, r2, #2 +1000063e: 18b6 adds r6, r6, r2 +10000640: 781a ldrb r2, [r3, #0] +10000642: 7019 strb r1, [r3, #0] +10000644: 71b2 strb r2, [r6, #6] +10000646: e7b3 b.n 100005b0 +10000648: 4659 mov r1, fp +1000064a: 2900 cmp r1, #0 +1000064c: d10f bne.n 1000066e +1000064e: 31ff adds r1, #255 ; 0xff +10000650: 7191 strb r1, [r2, #6] +10000652: 491a ldr r1, [pc, #104] ; (100006bc ) +10000654: 8091 strh r1, [r2, #4] +10000656: 4918 ldr r1, [pc, #96] ; (100006b8 ) +10000658: 780a ldrb r2, [r1, #0] +1000065a: 719a strb r2, [r3, #6] +1000065c: 4a18 ldr r2, [pc, #96] ; (100006c0 ) +1000065e: 1b9b subs r3, r3, r6 +10000660: 415b adcs r3, r3 +10000662: 435a muls r2, r3 +10000664: 0d12 lsrs r2, r2, #20 +10000666: 700a strb r2, [r1, #0] +10000668: e7a2 b.n 100005b0 +1000066a: 4816 ldr r0, [pc, #88] ; (100006c4 ) +1000066c: e7e3 b.n 10000636 +1000066e: 4a16 ldr r2, [pc, #88] ; (100006c8 ) +10000670: 4916 ldr r1, [pc, #88] ; (100006cc ) +10000672: 1ad2 subs r2, r2, r3 +10000674: 3a08 subs r2, #8 +10000676: 0250 lsls r0, r2, #9 +10000678: 0d40 lsrs r0, r0, #21 +1000067a: 4301 orrs r1, r0 +1000067c: 8099 strh r1, [r3, #4] +1000067e: 4914 ldr r1, [pc, #80] ; (100006d0 ) +10000680: 0852 lsrs r2, r2, #1 +10000682: 430a orrs r2, r1 +10000684: 80da strh r2, [r3, #6] +10000686: e793 b.n 100005b0 +10000688: 2106 movs r1, #6 +1000068a: 5651 ldrsb r1, [r2, r1] +1000068c: 0013 movs r3, r2 +1000068e: 2900 cmp r1, #0 +10000690: dab8 bge.n 10000604 +10000692: 465a mov r2, fp +10000694: 2a00 cmp r2, #0 +10000696: d1ea bne.n 1000066e +10000698: 4645 mov r5, r8 +1000069a: e7dc b.n 10000656 +1000069c: d0000124 .word 0xd0000124 +100006a0: e000ed00 .word 0xe000ed00 +100006a4: 100001cd .word 0x100001cd +100006a8: 2000019c .word 0x2000019c +100006ac: e000e100 .word 0xe000e100 +100006b0: e000e180 .word 0xe000e180 +100006b4: e000e280 .word 0xe000e280 +100006b8: 20000619 .word 0x20000619 +100006bc: ffffbd01 .word 0xffffbd01 +100006c0: 0000aaaa .word 0x0000aaaa +100006c4: 0000bd01 .word 0x0000bd01 +100006c8: 200001d6 .word 0x200001d6 +100006cc: fffff000 .word 0xfffff000 +100006d0: fffff800 .word 0xfffff800 + +100006d4 : +100006d4: b570 push {r4, r5, r6, lr} +100006d6: f3ef 8105 mrs r1, IPSR +100006da: 2401 movs r4, #1 +100006dc: 4304 orrs r4, r0 +100006de: f3ef 8c10 mrs ip, PRIMASK +100006e2: b672 cpsid i +100006e4: 4a21 ldr r2, [pc, #132] ; (1000076c ) +100006e6: 6813 ldr r3, [r2, #0] +100006e8: 2b00 cmp r3, #0 +100006ea: d0fc beq.n 100006e6 +100006ec: f3bf 8f5f dmb sy +100006f0: 4b1f ldr r3, [pc, #124] ; (10000770 ) +100006f2: 0005 movs r5, r0 +100006f4: 4a1f ldr r2, [pc, #124] ; (10000774 ) +100006f6: 1aed subs r5, r5, r3 +100006f8: 416d adcs r5, r5 +100006fa: 436a muls r2, r5 +100006fc: 0d12 lsrs r2, r2, #20 +100006fe: 4d1e ldr r5, [pc, #120] ; (10000778 ) +10000700: 0089 lsls r1, r1, #2 +10000702: 68ae ldr r6, [r5, #8] +10000704: b252 sxtb r2, r2 +10000706: 5876 ldr r6, [r6, r1] +10000708: 42a6 cmp r6, r4 +1000070a: d01c beq.n 10000746 +1000070c: 2106 movs r1, #6 +1000070e: 5659 ldrsb r1, [r3, r1] +10000710: 4291 cmp r1, r2 +10000712: d01c beq.n 1000074e +10000714: 2112 movs r1, #18 +10000716: 5659 ldrsb r1, [r3, r1] +10000718: 4291 cmp r1, r2 +1000071a: d022 beq.n 10000762 +1000071c: 211e movs r1, #30 +1000071e: 5659 ldrsb r1, [r3, r1] +10000720: 4291 cmp r1, r2 +10000722: d020 beq.n 10000766 +10000724: 212a movs r1, #42 ; 0x2a +10000726: 5659 ldrsb r1, [r3, r1] +10000728: 2403 movs r4, #3 +1000072a: 4291 cmp r1, r2 +1000072c: d010 beq.n 10000750 +1000072e: 4b13 ldr r3, [pc, #76] ; (1000077c ) +10000730: 7819 ldrb r1, [r3, #0] +10000732: 701a strb r2, [r3, #0] +10000734: 7181 strb r1, [r0, #6] +10000736: f3bf 8f5f dmb sy +1000073a: 2200 movs r2, #0 +1000073c: 4b0b ldr r3, [pc, #44] ; (1000076c ) +1000073e: 601a str r2, [r3, #0] +10000740: f38c 8810 msr PRIMASK, ip +10000744: bd70 pop {r4, r5, r6, pc} +10000746: 68ab ldr r3, [r5, #8] +10000748: 4c0d ldr r4, [pc, #52] ; (10000780 ) +1000074a: 505c str r4, [r3, r1] +1000074c: e7ef b.n 1000072e +1000074e: 2400 movs r4, #0 +10000750: 0061 lsls r1, r4, #1 +10000752: 1909 adds r1, r1, r4 +10000754: 0089 lsls r1, r1, #2 +10000756: 185b adds r3, r3, r1 +10000758: 21ff movs r1, #255 ; 0xff +1000075a: 7199 strb r1, [r3, #6] +1000075c: 4909 ldr r1, [pc, #36] ; (10000784 ) +1000075e: 8099 strh r1, [r3, #4] +10000760: e7e5 b.n 1000072e +10000762: 2401 movs r4, #1 +10000764: e7f4 b.n 10000750 +10000766: 2402 movs r4, #2 +10000768: e7f2 b.n 10000750 +1000076a: 46c0 nop ; (mov r8, r8) +1000076c: d0000124 .word 0xd0000124 +10000770: 2000019c .word 0x2000019c +10000774: 0000aaaa .word 0x0000aaaa +10000778: e000ed00 .word 0xe000ed00 +1000077c: 20000619 .word 0x20000619 +10000780: 100001cd .word 0x100001cd +10000784: ffffbd01 .word 0xffffbd01 + +10000788 : +10000788: 4b05 ldr r3, [pc, #20] ; (100007a0 ) +1000078a: 4a06 ldr r2, [pc, #24] ; (100007a4 ) +1000078c: 6013 str r3, [r2, #0] +1000078e: 4a06 ldr r2, [pc, #24] ; (100007a8 ) +10000790: 6013 str r3, [r2, #0] +10000792: 6053 str r3, [r2, #4] +10000794: 6093 str r3, [r2, #8] +10000796: 60d3 str r3, [r2, #12] +10000798: 6113 str r3, [r2, #16] +1000079a: 6153 str r3, [r2, #20] +1000079c: 6193 str r3, [r2, #24] +1000079e: 4770 bx lr +100007a0: 80808080 .word 0x80808080 +100007a4: e000e400 .word 0xe000e400 +100007a8: e000e404 .word 0xe000e404 + +100007ac : +100007ac: 4b02 ldr r3, [pc, #8] ; (100007b8 ) +100007ae: 469c mov ip, r3 +100007b0: 4461 add r1, ip +100007b2: 0089 lsls r1, r1, #2 +100007b4: 6001 str r1, [r0, #0] +100007b6: 4770 bx lr +100007b8: 34000040 .word 0x34000040 + +100007bc : +100007bc: b510 push {r4, lr} +100007be: 0004 movs r4, r0 +100007c0: f7ff fe60 bl 10000484 +100007c4: 0001 movs r1, r0 +100007c6: 0020 movs r0, r4 +100007c8: f7ff fff0 bl 100007ac +100007cc: 23ff movs r3, #255 ; 0xff +100007ce: 7123 strb r3, [r4, #4] +100007d0: f3bf 8f5f dmb sy +100007d4: bd10 pop {r4, pc} +100007d6: 46c0 nop ; (mov r8, r8) + +100007d8 : +100007d8: b510 push {r4, lr} +100007da: 0004 movs r4, r0 +100007dc: f7ff fe52 bl 10000484 +100007e0: 0001 movs r1, r0 +100007e2: 0020 movs r0, r4 +100007e4: f7ff ffe2 bl 100007ac +100007e8: 23ff movs r3, #255 ; 0xff +100007ea: 80a3 strh r3, [r4, #4] +100007ec: f3bf 8f5f dmb sy +100007f0: bd10 pop {r4, pc} +100007f2: 46c0 nop ; (mov r8, r8) + +100007f4 : +100007f4: 6883 ldr r3, [r0, #8] +100007f6: 480b ldr r0, [pc, #44] ; (10000824 ) +100007f8: b510 push {r4, lr} +100007fa: 4684 mov ip, r0 +100007fc: 4461 add r1, ip +100007fe: 4462 add r2, ip +10000800: 0109 lsls r1, r1, #4 +10000802: 0112 lsls r2, r2, #4 +10000804: 189a adds r2, r3, r2 +10000806: 1859 adds r1, r3, r1 +10000808: 6854 ldr r4, [r2, #4] +1000080a: 684b ldr r3, [r1, #4] +1000080c: 2001 movs r0, #1 +1000080e: 429c cmp r4, r3 +10000810: d801 bhi.n 10000816 +10000812: d002 beq.n 1000081a +10000814: 2000 movs r0, #0 +10000816: b2c0 uxtb r0, r0 +10000818: bd10 pop {r4, pc} +1000081a: 6812 ldr r2, [r2, #0] +1000081c: 680b ldr r3, [r1, #0] +1000081e: 429a cmp r2, r3 +10000820: d8f9 bhi.n 10000816 +10000822: e7f7 b.n 10000814 +10000824: 0fffffff .word 0x0fffffff + +10000828 : +10000828: 4b0a ldr r3, [pc, #40] ; (10000854 ) +1000082a: 6819 ldr r1, [r3, #0] +1000082c: f3ef 8010 mrs r0, PRIMASK +10000830: b672 cpsid i +10000832: 680a ldr r2, [r1, #0] +10000834: 2a00 cmp r2, #0 +10000836: d0fc beq.n 10000832 +10000838: f3bf 8f5f dmb sy +1000083c: 681b ldr r3, [r3, #0] +1000083e: f3bf 8f5f dmb sy +10000842: 2200 movs r2, #0 +10000844: 601a str r2, [r3, #0] +10000846: f380 8810 msr PRIMASK, r0 +1000084a: bf40 sev +1000084c: 2000 movs r0, #0 +1000084e: 2100 movs r1, #0 +10000850: 4770 bx lr +10000852: 46c0 nop ; (mov r8, r8) +10000854: 20000604 .word 0x20000604 + +10000858 : +10000858: b5f8 push {r3, r4, r5, r6, r7, lr} +1000085a: 4657 mov r7, sl +1000085c: 464e mov r6, r9 +1000085e: 4645 mov r5, r8 +10000860: 46de mov lr, fp +10000862: b5e0 push {r5, r6, r7, lr} +10000864: 4699 mov r9, r3 +10000866: ab0c add r3, sp, #48 ; 0x30 +10000868: 781c ldrb r4, [r3, #0] +1000086a: ab0d add r3, sp, #52 ; 0x34 +1000086c: 781b ldrb r3, [r3, #0] +1000086e: 0006 movs r6, r0 +10000870: 4690 mov r8, r2 +10000872: 469a mov sl, r3 +10000874: 6807 ldr r7, [r0, #0] +10000876: 2c00 cmp r4, #0 +10000878: d111 bne.n 1000089e +1000087a: 7bbc ldrb r4, [r7, #14] +1000087c: 2c00 cmp r4, #0 +1000087e: d042 beq.n 10000906 +10000880: 0065 lsls r5, r4, #1 +10000882: 683b ldr r3, [r7, #0] +10000884: 192d adds r5, r5, r4 +10000886: 3d03 subs r5, #3 +10000888: 1959 adds r1, r3, r5 +1000088a: 784b ldrb r3, [r1, #1] +1000088c: 73bb strb r3, [r7, #14] +1000088e: 2b00 cmp r3, #0 +10000890: d100 bne.n 10000894 +10000892: 73fb strb r3, [r7, #15] +10000894: 2300 movs r3, #0 +10000896: 708b strb r3, [r1, #2] +10000898: 704b strb r3, [r1, #1] +1000089a: 700b strb r3, [r1, #0] +1000089c: e004 b.n 100008a8 +1000089e: 0065 lsls r5, r4, #1 +100008a0: 683b ldr r3, [r7, #0] +100008a2: 192d adds r5, r5, r4 +100008a4: 3d03 subs r5, #3 +100008a6: 1959 adds r1, r3, r5 +100008a8: 68b2 ldr r2, [r6, #8] +100008aa: 4b2a ldr r3, [pc, #168] ; (10000954 ) +100008ac: 4694 mov ip, r2 +100008ae: 4642 mov r2, r8 +100008b0: 18e3 adds r3, r4, r3 +100008b2: 011b lsls r3, r3, #4 +100008b4: 4463 add r3, ip +100008b6: 601a str r2, [r3, #0] +100008b8: 464a mov r2, r9 +100008ba: 605a str r2, [r3, #4] +100008bc: 9a0a ldr r2, [sp, #40] ; 0x28 +100008be: 609a str r2, [r3, #8] +100008c0: 9a0b ldr r2, [sp, #44] ; 0x2c +100008c2: 60da str r2, [r3, #12] +100008c4: 2300 movs r3, #0 +100008c6: 708b strb r3, [r1, #2] +100008c8: 704b strb r3, [r1, #1] +100008ca: 700b strb r3, [r1, #0] +100008cc: 7b7b ldrb r3, [r7, #13] +100008ce: 469b mov fp, r3 +100008d0: 2b00 cmp r3, #0 +100008d2: d02b beq.n 1000092c +100008d4: 0022 movs r2, r4 +100008d6: 4659 mov r1, fp +100008d8: 68b8 ldr r0, [r7, #8] +100008da: 687b ldr r3, [r7, #4] +100008dc: 4798 blx r3 +100008de: 683a ldr r2, [r7, #0] +100008e0: 2800 cmp r0, #0 +100008e2: d016 beq.n 10000912 +100008e4: 465b mov r3, fp +100008e6: 4658 mov r0, fp +100008e8: 005b lsls r3, r3, #1 +100008ea: 445b add r3, fp +100008ec: 1955 adds r5, r2, r5 +100008ee: 3b03 subs r3, #3 +100008f0: 70a8 strb r0, [r5, #2] +100008f2: 18d1 adds r1, r2, r3 +100008f4: 5cd3 ldrb r3, [r2, r3] +100008f6: 2b00 cmp r3, #0 +100008f8: d000 beq.n 100008fc +100008fa: 706b strb r3, [r5, #1] +100008fc: 465b mov r3, fp +100008fe: 700c strb r4, [r1, #0] +10000900: 737b strb r3, [r7, #13] +10000902: 45a3 cmp fp, r4 +10000904: d013 beq.n 1000092e +10000906: bcf0 pop {r4, r5, r6, r7} +10000908: 46bb mov fp, r7 +1000090a: 46b2 mov sl, r6 +1000090c: 46a9 mov r9, r5 +1000090e: 46a0 mov r8, r4 +10000910: bdf8 pop {r3, r4, r5, r6, r7, pc} +10000912: 465b mov r3, fp +10000914: 005b lsls r3, r3, #1 +10000916: 445b add r3, fp +10000918: 3b03 subs r3, #3 +1000091a: 18d3 adds r3, r2, r3 +1000091c: 709c strb r4, [r3, #2] +1000091e: 1951 adds r1, r2, r5 +10000920: 5d52 ldrb r2, [r2, r5] +10000922: 2a00 cmp r2, #0 +10000924: d000 beq.n 10000928 +10000926: 705a strb r2, [r3, #1] +10000928: 465b mov r3, fp +1000092a: 700b strb r3, [r1, #0] +1000092c: 737c strb r4, [r7, #13] +1000092e: 4642 mov r2, r8 +10000930: 464b mov r3, r9 +10000932: 7d30 ldrb r0, [r6, #20] +10000934: f000 fb90 bl 10001058 +10000938: 1e05 subs r5, r0, #0 +1000093a: d006 beq.n 1000094a +1000093c: 4653 mov r3, sl +1000093e: 2b00 cmp r3, #0 +10000940: d103 bne.n 1000094a +10000942: 0021 movs r1, r4 +10000944: 6830 ldr r0, [r6, #0] +10000946: f000 fdab bl 100014a0 +1000094a: 9b0e ldr r3, [sp, #56] ; 0x38 +1000094c: 2b00 cmp r3, #0 +1000094e: d0da beq.n 10000906 +10000950: 701d strb r5, [r3, #0] +10000952: e7d8 b.n 10000906 +10000954: 0fffffff .word 0x0fffffff + +10000958 : +10000958: b5f0 push {r4, r5, r6, r7, lr} +1000095a: 46de mov lr, fp +1000095c: 4657 mov r7, sl +1000095e: 464e mov r6, r9 +10000960: 4645 mov r5, r8 +10000962: 2300 movs r3, #0 +10000964: b5e0 push {r5, r6, r7, lr} +10000966: b08b sub sp, #44 ; 0x2c +10000968: 9308 str r3, [sp, #32] +1000096a: 4b67 ldr r3, [pc, #412] ; (10000b08 ) +1000096c: 0082 lsls r2, r0, #2 +1000096e: 58d4 ldr r4, [r2, r3] +10000970: 2300 movs r3, #0 +10000972: 469b mov fp, r3 +10000974: 9009 str r0, [sp, #36] ; 0x24 +10000976: f000 fb0f bl 10000f98 +1000097a: 6862 ldr r2, [r4, #4] +1000097c: 0006 movs r6, r0 +1000097e: 000f movs r7, r1 +10000980: f3ef 8510 mrs r5, PRIMASK +10000984: b672 cpsid i +10000986: 6813 ldr r3, [r2, #0] +10000988: 2b00 cmp r3, #0 +1000098a: d0fc beq.n 10000986 +1000098c: f3bf 8f5f dmb sy +10000990: 6823 ldr r3, [r4, #0] +10000992: 469c mov ip, r3 +10000994: 7b5b ldrb r3, [r3, #13] +10000996: 4699 mov r9, r3 +10000998: 2b00 cmp r3, #0 +1000099a: d100 bne.n 1000099e +1000099c: e069 b.n 10000a72 +1000099e: 68a2 ldr r2, [r4, #8] +100009a0: 4b5a ldr r3, [pc, #360] ; (10000b0c ) +100009a2: 4690 mov r8, r2 +100009a4: 444b add r3, r9 +100009a6: 011b lsls r3, r3, #4 +100009a8: 4498 add r8, r3 +100009aa: 4643 mov r3, r8 +100009ac: 681a ldr r2, [r3, #0] +100009ae: 685b ldr r3, [r3, #4] +100009b0: 0010 movs r0, r2 +100009b2: 0019 movs r1, r3 +100009b4: 1b80 subs r0, r0, r6 +100009b6: 41b9 sbcs r1, r7 +100009b8: 2900 cmp r1, #0 +100009ba: dc00 bgt.n 100009be +100009bc: e063 b.n 10000a86 +100009be: 9809 ldr r0, [sp, #36] ; 0x24 +100009c0: f000 fb4a bl 10001058 +100009c4: 2300 movs r3, #0 +100009c6: 2200 movs r2, #0 +100009c8: 4698 mov r8, r3 +100009ca: 2300 movs r3, #0 +100009cc: 9206 str r2, [sp, #24] +100009ce: 9307 str r3, [sp, #28] +100009d0: 2300 movs r3, #0 +100009d2: 469a mov sl, r3 +100009d4: 6863 ldr r3, [r4, #4] +100009d6: f3bf 8f5f dmb sy +100009da: 465a mov r2, fp +100009dc: 601a str r2, [r3, #0] +100009de: f385 8810 msr PRIMASK, r5 +100009e2: 4653 mov r3, sl +100009e4: 2b00 cmp r3, #0 +100009e6: d108 bne.n 100009fa +100009e8: 2800 cmp r0, #0 +100009ea: d1c4 bne.n 10000976 +100009ec: b00b add sp, #44 ; 0x2c +100009ee: bcf0 pop {r4, r5, r6, r7} +100009f0: 46bb mov fp, r7 +100009f2: 46b2 mov sl, r6 +100009f4: 46a9 mov r9, r5 +100009f6: 46a0 mov r8, r4 +100009f8: bdf0 pop {r4, r5, r6, r7, pc} +100009fa: 9b08 ldr r3, [sp, #32] +100009fc: 4641 mov r1, r8 +100009fe: 0218 lsls r0, r3, #8 +10000a00: 464b mov r3, r9 +10000a02: 4318 orrs r0, r3 +10000a04: 47d0 blx sl +10000a06: 6862 ldr r2, [r4, #4] +10000a08: 0006 movs r6, r0 +10000a0a: 000f movs r7, r1 +10000a0c: f3ef 8510 mrs r5, PRIMASK +10000a10: b672 cpsid i +10000a12: 6813 ldr r3, [r2, #0] +10000a14: 2b00 cmp r3, #0 +10000a16: d0fc beq.n 10000a12 +10000a18: f3bf 8f5f dmb sy +10000a1c: 2f00 cmp r7, #0 +10000a1e: db50 blt.n 10000ac2 +10000a20: 0033 movs r3, r6 +10000a22: 433b orrs r3, r7 +10000a24: d002 beq.n 10000a2c +10000a26: 6923 ldr r3, [r4, #16] +10000a28: 2b00 cmp r3, #0 +10000a2a: d161 bne.n 10000af0 +10000a2c: 6823 ldr r3, [r4, #0] +10000a2e: 7bd9 ldrb r1, [r3, #15] +10000a30: 2900 cmp r1, #0 +10000a32: d007 beq.n 10000a44 +10000a34: 004a lsls r2, r1, #1 +10000a36: 1852 adds r2, r2, r1 +10000a38: 6819 ldr r1, [r3, #0] +10000a3a: 468c mov ip, r1 +10000a3c: 4649 mov r1, r9 +10000a3e: 4462 add r2, ip +10000a40: 3a03 subs r2, #3 +10000a42: 7051 strb r1, [r2, #1] +10000a44: 7b9a ldrb r2, [r3, #14] +10000a46: 2a00 cmp r2, #0 +10000a48: d101 bne.n 10000a4e +10000a4a: 464a mov r2, r9 +10000a4c: 739a strb r2, [r3, #14] +10000a4e: 464a mov r2, r9 +10000a50: 73da strb r2, [r3, #15] +10000a52: 464b mov r3, r9 +10000a54: 68e1 ldr r1, [r4, #12] +10000a56: 3b01 subs r3, #1 +10000a58: 5cca ldrb r2, [r1, r3] +10000a5a: 3201 adds r2, #1 +10000a5c: 54ca strb r2, [r1, r3] +10000a5e: 465b mov r3, fp +10000a60: 6123 str r3, [r4, #16] +10000a62: 6863 ldr r3, [r4, #4] +10000a64: f3bf 8f5f dmb sy +10000a68: 465a mov r2, fp +10000a6a: 601a str r2, [r3, #0] +10000a6c: f385 8810 msr PRIMASK, r5 +10000a70: e781 b.n 10000976 +10000a72: 2300 movs r3, #0 +10000a74: 2200 movs r2, #0 +10000a76: 4698 mov r8, r3 +10000a78: 2300 movs r3, #0 +10000a7a: 9206 str r2, [sp, #24] +10000a7c: 9307 str r3, [sp, #28] +10000a7e: 2300 movs r3, #0 +10000a80: 2000 movs r0, #0 +10000a82: 469a mov sl, r3 +10000a84: e7a6 b.n 100009d4 +10000a86: 2900 cmp r1, #0 +10000a88: d102 bne.n 10000a90 +10000a8a: 2800 cmp r0, #0 +10000a8c: d000 beq.n 10000a90 +10000a8e: e796 b.n 100009be +10000a90: 2100 movs r1, #0 +10000a92: 4660 mov r0, ip +10000a94: f000 fc82 bl 1000139c +10000a98: 4643 mov r3, r8 +10000a9a: 681a ldr r2, [r3, #0] +10000a9c: 685b ldr r3, [r3, #4] +10000a9e: 9206 str r2, [sp, #24] +10000aa0: 9307 str r3, [sp, #28] +10000aa2: 4643 mov r3, r8 +10000aa4: 689b ldr r3, [r3, #8] +10000aa6: 469a mov sl, r3 +10000aa8: 4643 mov r3, r8 +10000aaa: 68db ldr r3, [r3, #12] +10000aac: 4698 mov r8, r3 +10000aae: 68e3 ldr r3, [r4, #12] +10000ab0: 444b add r3, r9 +10000ab2: 3b01 subs r3, #1 +10000ab4: 781b ldrb r3, [r3, #0] +10000ab6: 9308 str r3, [sp, #32] +10000ab8: 021b lsls r3, r3, #8 +10000aba: 4303 orrs r3, r0 +10000abc: 6123 str r3, [r4, #16] +10000abe: 2000 movs r0, #0 +10000ac0: e788 b.n 100009d4 +10000ac2: 6923 ldr r3, [r4, #16] +10000ac4: 2b00 cmp r3, #0 +10000ac6: d0b1 beq.n 10000a2c +10000ac8: 9a06 ldr r2, [sp, #24] +10000aca: 9b07 ldr r3, [sp, #28] +10000acc: 1b92 subs r2, r2, r6 +10000ace: 41bb sbcs r3, r7 +10000ad0: 2b00 cmp r3, #0 +10000ad2: db15 blt.n 10000b00 +10000ad4: 4659 mov r1, fp +10000ad6: 9104 str r1, [sp, #16] +10000ad8: 2101 movs r1, #1 +10000ada: 9103 str r1, [sp, #12] +10000adc: 4649 mov r1, r9 +10000ade: 9102 str r1, [sp, #8] +10000ae0: 4641 mov r1, r8 +10000ae2: 9101 str r1, [sp, #4] +10000ae4: 4651 mov r1, sl +10000ae6: 0020 movs r0, r4 +10000ae8: 9100 str r1, [sp, #0] +10000aea: f7ff feb5 bl 10000858 +10000aee: e7b6 b.n 10000a5e +10000af0: f000 fa52 bl 10000f98 +10000af4: 0032 movs r2, r6 +10000af6: 003b movs r3, r7 +10000af8: 1812 adds r2, r2, r0 +10000afa: 414b adcs r3, r1 +10000afc: 2b00 cmp r3, #0 +10000afe: dae9 bge.n 10000ad4 +10000b00: 2201 movs r2, #1 +10000b02: 4b03 ldr r3, [pc, #12] ; (10000b10 ) +10000b04: 4252 negs r2, r2 +10000b06: e7e5 b.n 10000ad4 +10000b08: 200005f0 .word 0x200005f0 +10000b0c: 0fffffff .word 0x0fffffff +10000b10: 7fffffff .word 0x7fffffff + +10000b14 : +10000b14: b510 push {r4, lr} +10000b16: 4c14 ldr r4, [pc, #80] ; (10000b68 ) +10000b18: 6863 ldr r3, [r4, #4] +10000b1a: 2b00 cmp r3, #0 +10000b1c: d004 beq.n 10000b28 +10000b1e: 210a movs r1, #10 +10000b20: 4812 ldr r0, [pc, #72] ; (10000b6c ) +10000b22: f7ff fe43 bl 100007ac +10000b26: bd10 pop {r4, pc} +10000b28: 0023 movs r3, r4 +10000b2a: 4a11 ldr r2, [pc, #68] ; (10000b70 ) +10000b2c: 2110 movs r1, #16 +10000b2e: 6820 ldr r0, [r4, #0] +10000b30: f000 fb4e bl 100011d0 +10000b34: 2003 movs r0, #3 +10000b36: f000 fa23 bl 10000f80 +10000b3a: 2003 movs r0, #3 +10000b3c: f000 faf6 bl 1000112c +10000b40: 2003 movs r0, #3 +10000b42: 490c ldr r1, [pc, #48] ; (10000b74 ) +10000b44: f000 fa42 bl 10000fcc +10000b48: f7ff fc9c bl 10000484 +10000b4c: 4b0a ldr r3, [pc, #40] ; (10000b78 ) +10000b4e: 469c mov ip, r3 +10000b50: 2303 movs r3, #3 +10000b52: 7523 strb r3, [r4, #20] +10000b54: 23d0 movs r3, #208 ; 0xd0 +10000b56: 061b lsls r3, r3, #24 +10000b58: 681b ldr r3, [r3, #0] +10000b5a: 4460 add r0, ip +10000b5c: 7563 strb r3, [r4, #21] +10000b5e: 4b07 ldr r3, [pc, #28] ; (10000b7c ) +10000b60: 0080 lsls r0, r0, #2 +10000b62: 6060 str r0, [r4, #4] +10000b64: 60dc str r4, [r3, #12] +10000b66: e7da b.n 10000b1e +10000b68: 200001e4 .word 0x200001e4 +10000b6c: 20000604 .word 0x20000604 +10000b70: 100007f5 .word 0x100007f5 +10000b74: 10000959 .word 0x10000959 +10000b78: 34000040 .word 0x34000040 +10000b7c: 200005f0 .word 0x200005f0 + +10000b80 : +10000b80: b5f0 push {r4, r5, r6, r7, lr} +10000b82: 464e mov r6, r9 +10000b84: 4645 mov r5, r8 +10000b86: 46de mov lr, fp +10000b88: 4657 mov r7, sl +10000b8a: b5e0 push {r5, r6, r7, lr} +10000b8c: b085 sub sp, #20 +10000b8e: 9301 str r3, [sp, #4] +10000b90: ab10 add r3, sp, #64 ; 0x40 +10000b92: 781b ldrb r3, [r3, #0] +10000b94: 0006 movs r6, r0 +10000b96: 9303 str r3, [sp, #12] +10000b98: 2300 movs r3, #0 +10000b9a: 4699 mov r9, r3 +10000b9c: 4698 mov r8, r3 +10000b9e: 9200 str r2, [sp, #0] +10000ba0: 6872 ldr r2, [r6, #4] +10000ba2: f3ef 8b10 mrs fp, PRIMASK +10000ba6: b672 cpsid i +10000ba8: 6813 ldr r3, [r2, #0] +10000baa: 2b00 cmp r3, #0 +10000bac: d0fc beq.n 10000ba8 +10000bae: f3bf 8f5f dmb sy +10000bb2: 6835 ldr r5, [r6, #0] +10000bb4: 7bac ldrb r4, [r5, #14] +10000bb6: 2c00 cmp r4, #0 +10000bb8: d03d beq.n 10000c36 +10000bba: 0067 lsls r7, r4, #1 +10000bbc: 682b ldr r3, [r5, #0] +10000bbe: 193f adds r7, r7, r4 +10000bc0: 3f03 subs r7, #3 +10000bc2: 19db adds r3, r3, r7 +10000bc4: 785a ldrb r2, [r3, #1] +10000bc6: 73aa strb r2, [r5, #14] +10000bc8: 2a00 cmp r2, #0 +10000bca: d100 bne.n 10000bce +10000bcc: 73ea strb r2, [r5, #15] +10000bce: 68b1 ldr r1, [r6, #8] +10000bd0: 4a47 ldr r2, [pc, #284] ; (10000cf0 ) +10000bd2: 468c mov ip, r1 +10000bd4: 9800 ldr r0, [sp, #0] +10000bd6: 9901 ldr r1, [sp, #4] +10000bd8: 18a2 adds r2, r4, r2 +10000bda: 0112 lsls r2, r2, #4 +10000bdc: 4462 add r2, ip +10000bde: 6010 str r0, [r2, #0] +10000be0: 6051 str r1, [r2, #4] +10000be2: 990e ldr r1, [sp, #56] ; 0x38 +10000be4: 6091 str r1, [r2, #8] +10000be6: 990f ldr r1, [sp, #60] ; 0x3c +10000be8: 60d1 str r1, [r2, #12] +10000bea: 4642 mov r2, r8 +10000bec: 709a strb r2, [r3, #2] +10000bee: 705a strb r2, [r3, #1] +10000bf0: 701a strb r2, [r3, #0] +10000bf2: 7b6b ldrb r3, [r5, #13] +10000bf4: 469a mov sl, r3 +10000bf6: 2b00 cmp r3, #0 +10000bf8: d067 beq.n 10000cca +10000bfa: 0022 movs r2, r4 +10000bfc: 0019 movs r1, r3 +10000bfe: 68a8 ldr r0, [r5, #8] +10000c00: 686b ldr r3, [r5, #4] +10000c02: 4798 blx r3 +10000c04: 682a ldr r2, [r5, #0] +10000c06: 2800 cmp r0, #0 +10000c08: d052 beq.n 10000cb0 +10000c0a: 4653 mov r3, sl +10000c0c: 4650 mov r0, sl +10000c0e: 005b lsls r3, r3, #1 +10000c10: 4453 add r3, sl +10000c12: 19d7 adds r7, r2, r7 +10000c14: 3b03 subs r3, #3 +10000c16: 70b8 strb r0, [r7, #2] +10000c18: 18d1 adds r1, r2, r3 +10000c1a: 5cd3 ldrb r3, [r2, r3] +10000c1c: 2b00 cmp r3, #0 +10000c1e: d000 beq.n 10000c22 +10000c20: 707b strb r3, [r7, #1] +10000c22: 4653 mov r3, sl +10000c24: 700c strb r4, [r1, #0] +10000c26: 736b strb r3, [r5, #13] +10000c28: 4554 cmp r4, sl +10000c2a: d04f beq.n 10000ccc +10000c2c: 68f3 ldr r3, [r6, #12] +10000c2e: 191b adds r3, r3, r4 +10000c30: 3b01 subs r3, #1 +10000c32: 7818 ldrb r0, [r3, #0] +10000c34: e000 b.n 10000c38 +10000c36: 2000 movs r0, #0 +10000c38: 6873 ldr r3, [r6, #4] +10000c3a: f3bf 8f5f dmb sy +10000c3e: 4642 mov r2, r8 +10000c40: 601a str r2, [r3, #0] +10000c42: f38b 8810 msr PRIMASK, fp +10000c46: 2c00 cmp r4, #0 +10000c48: d04f beq.n 10000cea +10000c4a: 464b mov r3, r9 +10000c4c: 2b00 cmp r3, #0 +10000c4e: d108 bne.n 10000c62 +10000c50: 0200 lsls r0, r0, #8 +10000c52: 4320 orrs r0, r4 +10000c54: b005 add sp, #20 +10000c56: bcf0 pop {r4, r5, r6, r7} +10000c58: 46bb mov fp, r7 +10000c5a: 46b2 mov sl, r6 +10000c5c: 46a9 mov r9, r5 +10000c5e: 46a0 mov r8, r4 +10000c60: bdf0 pop {r4, r5, r6, r7, pc} +10000c62: 9b03 ldr r3, [sp, #12] +10000c64: 2b00 cmp r3, #0 +10000c66: d03e beq.n 10000ce6 +10000c68: 9b0e ldr r3, [sp, #56] ; 0x38 +10000c6a: 2000 movs r0, #0 +10000c6c: 990f ldr r1, [sp, #60] ; 0x3c +10000c6e: 4798 blx r3 +10000c70: 0003 movs r3, r0 +10000c72: 0004 movs r4, r0 +10000c74: 000d movs r5, r1 +10000c76: 430b orrs r3, r1 +10000c78: d035 beq.n 10000ce6 +10000c7a: 2900 cmp r1, #0 +10000c7c: da0a bge.n 10000c94 +10000c7e: 9a00 ldr r2, [sp, #0] +10000c80: 9b01 ldr r3, [sp, #4] +10000c82: 1b12 subs r2, r2, r4 +10000c84: 41ab sbcs r3, r5 +10000c86: 9200 str r2, [sp, #0] +10000c88: 9301 str r3, [sp, #4] +10000c8a: 2b00 cmp r3, #0 +10000c8c: db0a blt.n 10000ca4 +10000c8e: 9b03 ldr r3, [sp, #12] +10000c90: 4699 mov r9, r3 +10000c92: e785 b.n 10000ba0 +10000c94: f000 f980 bl 10000f98 +10000c98: 1824 adds r4, r4, r0 +10000c9a: 414d adcs r5, r1 +10000c9c: 9400 str r4, [sp, #0] +10000c9e: 9501 str r5, [sp, #4] +10000ca0: 2d00 cmp r5, #0 +10000ca2: daf4 bge.n 10000c8e +10000ca4: 2301 movs r3, #1 +10000ca6: 4c13 ldr r4, [pc, #76] ; (10000cf4 ) +10000ca8: 425b negs r3, r3 +10000caa: 9300 str r3, [sp, #0] +10000cac: 9401 str r4, [sp, #4] +10000cae: e7ee b.n 10000c8e +10000cb0: 4653 mov r3, sl +10000cb2: 005b lsls r3, r3, #1 +10000cb4: 4453 add r3, sl +10000cb6: 3b03 subs r3, #3 +10000cb8: 18d3 adds r3, r2, r3 +10000cba: 709c strb r4, [r3, #2] +10000cbc: 19d1 adds r1, r2, r7 +10000cbe: 5dd2 ldrb r2, [r2, r7] +10000cc0: 2a00 cmp r2, #0 +10000cc2: d000 beq.n 10000cc6 +10000cc4: 705a strb r2, [r3, #1] +10000cc6: 4653 mov r3, sl +10000cc8: 700b strb r3, [r1, #0] +10000cca: 736c strb r4, [r5, #13] +10000ccc: 7d30 ldrb r0, [r6, #20] +10000cce: 9a00 ldr r2, [sp, #0] +10000cd0: 9b01 ldr r3, [sp, #4] +10000cd2: f000 f9c1 bl 10001058 +10000cd6: 4681 mov r9, r0 +10000cd8: 2800 cmp r0, #0 +10000cda: d0a7 beq.n 10000c2c +10000cdc: 0021 movs r1, r4 +10000cde: 6830 ldr r0, [r6, #0] +10000ce0: f000 fbde bl 100014a0 +10000ce4: e7a2 b.n 10000c2c +10000ce6: 2000 movs r0, #0 +10000ce8: e7b4 b.n 10000c54 +10000cea: 2001 movs r0, #1 +10000cec: 4240 negs r0, r0 +10000cee: e7b1 b.n 10000c54 +10000cf0: 0fffffff .word 0x0fffffff +10000cf4: 7fffffff .word 0x7fffffff + +10000cf8 : +10000cf8: b5f0 push {r4, r5, r6, r7, lr} +10000cfa: 0004 movs r4, r0 +10000cfc: 000d movs r5, r1 +10000cfe: 2606 movs r6, #6 +10000d00: 4276 negs r6, r6 +10000d02: 17f7 asrs r7, r6, #31 +10000d04: 46c6 mov lr, r8 +10000d06: 1936 adds r6, r6, r4 +10000d08: 416f adcs r7, r5 +10000d0a: b500 push {lr} +10000d0c: b084 sub sp, #16 +10000d0e: 428f cmp r7, r1 +10000d10: d814 bhi.n 10000d3c +10000d12: d011 beq.n 10000d38 +10000d14: f000 f940 bl 10000f98 +10000d18: 0032 movs r2, r6 +10000d1a: 003b movs r3, r7 +10000d1c: 1a12 subs r2, r2, r0 +10000d1e: 418b sbcs r3, r1 +10000d20: 2b00 cmp r3, #0 +10000d22: dc15 bgt.n 10000d50 +10000d24: 2b00 cmp r3, #0 +10000d26: d03e beq.n 10000da6 +10000d28: 0020 movs r0, r4 +10000d2a: 0029 movs r1, r5 +10000d2c: f000 f93e bl 10000fac +10000d30: b004 add sp, #16 +10000d32: bc80 pop {r7} +10000d34: 46b8 mov r8, r7 +10000d36: bdf0 pop {r4, r5, r6, r7, pc} +10000d38: 4286 cmp r6, r0 +10000d3a: d9eb bls.n 10000d14 +10000d3c: 2600 movs r6, #0 +10000d3e: 2700 movs r7, #0 +10000d40: f000 f92a bl 10000f98 +10000d44: 0032 movs r2, r6 +10000d46: 003b movs r3, r7 +10000d48: 1a12 subs r2, r2, r0 +10000d4a: 418b sbcs r3, r1 +10000d4c: 2b00 cmp r3, #0 +10000d4e: dde9 ble.n 10000d24 +10000d50: 2300 movs r3, #0 +10000d52: 9302 str r3, [sp, #8] +10000d54: 9301 str r3, [sp, #4] +10000d56: 4b15 ldr r3, [pc, #84] ; (10000dac ) +10000d58: 0032 movs r2, r6 +10000d5a: 9300 str r3, [sp, #0] +10000d5c: 4814 ldr r0, [pc, #80] ; (10000db0 ) +10000d5e: 003b movs r3, r7 +10000d60: f7ff ff0e bl 10000b80 +10000d64: 2800 cmp r0, #0 +10000d66: dbdf blt.n 10000d28 +10000d68: 2300 movs r3, #0 +10000d6a: 4698 mov r8, r3 +10000d6c: 46bc mov ip, r7 +10000d6e: 4a11 ldr r2, [pc, #68] ; (10000db4 ) +10000d70: 4f11 ldr r7, [pc, #68] ; (10000db8 ) +10000d72: 6a7b ldr r3, [r7, #36] ; 0x24 +10000d74: 459c cmp ip, r3 +10000d76: d804 bhi.n 10000d82 +10000d78: 6ab9 ldr r1, [r7, #40] ; 0x28 +10000d7a: 428e cmp r6, r1 +10000d7c: d9d4 bls.n 10000d28 +10000d7e: 459c cmp ip, r3 +10000d80: d1d2 bne.n 10000d28 +10000d82: 6811 ldr r1, [r2, #0] +10000d84: f3ef 8010 mrs r0, PRIMASK +10000d88: b672 cpsid i +10000d8a: 680b ldr r3, [r1, #0] +10000d8c: 2b00 cmp r3, #0 +10000d8e: d0fc beq.n 10000d8a +10000d90: f3bf 8f5f dmb sy +10000d94: 6813 ldr r3, [r2, #0] +10000d96: f3bf 8f5f dmb sy +10000d9a: 4641 mov r1, r8 +10000d9c: 6019 str r1, [r3, #0] +10000d9e: f380 8810 msr PRIMASK, r0 +10000da2: bf20 wfe +10000da4: e7e5 b.n 10000d72 +10000da6: 2a00 cmp r2, #0 +10000da8: d0be beq.n 10000d28 +10000daa: e7d1 b.n 10000d50 +10000dac: 10000829 .word 0x10000829 +10000db0: 200001e4 .word 0x200001e4 +10000db4: 20000604 .word 0x20000604 +10000db8: 40054000 .word 0x40054000 + +10000dbc : +10000dbc: b570 push {r4, r5, r6, lr} +10000dbe: 0006 movs r6, r0 +10000dc0: f000 f8ea bl 10000f98 +10000dc4: 22fa movs r2, #250 ; 0xfa +10000dc6: 0004 movs r4, r0 +10000dc8: 000d movs r5, r1 +10000dca: 2300 movs r3, #0 +10000dcc: 0030 movs r0, r6 +10000dce: 2100 movs r1, #0 +10000dd0: 0092 lsls r2, r2, #2 +10000dd2: f000 fef3 bl 10001bbc <__wrap___aeabi_lmul> +10000dd6: 1900 adds r0, r0, r4 +10000dd8: 4169 adcs r1, r5 +10000dda: 2900 cmp r1, #0 +10000ddc: db02 blt.n 10000de4 +10000dde: f7ff ff8b bl 10000cf8 +10000de2: bd70 pop {r4, r5, r6, pc} +10000de4: 2001 movs r0, #1 +10000de6: 4901 ldr r1, [pc, #4] ; (10000dec ) +10000de8: 4240 negs r0, r0 +10000dea: e7f8 b.n 10000dde +10000dec: 7fffffff .word 0x7fffffff + +10000df0 : +10000df0: b5f0 push {r4, r5, r6, r7, lr} +10000df2: f3ef 8305 mrs r3, IPSR +10000df6: 46ce mov lr, r9 +10000df8: 4647 mov r7, r8 +10000dfa: b580 push {r7, lr} +10000dfc: 0005 movs r5, r0 +10000dfe: 000c movs r4, r1 +10000e00: b085 sub sp, #20 +10000e02: 2b00 cmp r3, #0 +10000e04: d012 beq.n 10000e2c +10000e06: 4a2c ldr r2, [pc, #176] ; (10000eb8 ) +10000e08: 2000 movs r0, #0 +10000e0a: 6a53 ldr r3, [r2, #36] ; 0x24 +10000e0c: 429c cmp r4, r3 +10000e0e: d803 bhi.n 10000e18 +10000e10: 6a92 ldr r2, [r2, #40] ; 0x28 +10000e12: 3001 adds r0, #1 +10000e14: 42aa cmp r2, r5 +10000e16: d304 bcc.n 10000e22 +10000e18: b005 add sp, #20 +10000e1a: bcc0 pop {r6, r7} +10000e1c: 46b9 mov r9, r7 +10000e1e: 46b0 mov r8, r6 +10000e20: bdf0 pop {r4, r5, r6, r7, pc} +10000e22: 1ae0 subs r0, r4, r3 +10000e24: 1e42 subs r2, r0, #1 +10000e26: 4190 sbcs r0, r2 +10000e28: b2c0 uxtb r0, r0 +10000e2a: e7f5 b.n 10000e18 +10000e2c: 4e23 ldr r6, [pc, #140] ; (10000ebc ) +10000e2e: 9302 str r3, [sp, #8] +10000e30: 9301 str r3, [sp, #4] +10000e32: 4b23 ldr r3, [pc, #140] ; (10000ec0 ) +10000e34: 0002 movs r2, r0 +10000e36: 9300 str r3, [sp, #0] +10000e38: 0030 movs r0, r6 +10000e3a: 000b movs r3, r1 +10000e3c: f7ff fea0 bl 10000b80 +10000e40: 1e03 subs r3, r0, #0 +10000e42: dde0 ble.n 10000e06 +10000e44: bf20 wfe +10000e46: 6871 ldr r1, [r6, #4] +10000e48: f3ef 8710 mrs r7, PRIMASK +10000e4c: b672 cpsid i +10000e4e: 680a ldr r2, [r1, #0] +10000e50: 2a00 cmp r2, #0 +10000e52: d0fc beq.n 10000e4e +10000e54: f3bf 8f5f dmb sy +10000e58: b2da uxtb r2, r3 +10000e5a: 4694 mov ip, r2 +10000e5c: 6830 ldr r0, [r6, #0] +10000e5e: 7b42 ldrb r2, [r0, #13] +10000e60: 4562 cmp r2, ip +10000e62: d01d beq.n 10000ea0 +10000e64: 22ff movs r2, #255 ; 0xff +10000e66: 401a ands r2, r3 +10000e68: 0051 lsls r1, r2, #1 +10000e6a: 4689 mov r9, r1 +10000e6c: 6801 ldr r1, [r0, #0] +10000e6e: 4491 add r9, r2 +10000e70: 4688 mov r8, r1 +10000e72: 4649 mov r1, r9 +10000e74: 4441 add r1, r8 +10000e76: 3903 subs r1, #3 +10000e78: 7889 ldrb r1, [r1, #2] +10000e7a: 2900 cmp r1, #0 +10000e7c: d013 beq.n 10000ea6 +10000e7e: 68f1 ldr r1, [r6, #12] +10000e80: 0a1b lsrs r3, r3, #8 +10000e82: 4688 mov r8, r1 +10000e84: 4442 add r2, r8 +10000e86: 3a01 subs r2, #1 +10000e88: 7812 ldrb r2, [r2, #0] +10000e8a: b2db uxtb r3, r3 +10000e8c: 429a cmp r2, r3 +10000e8e: d00f beq.n 10000eb0 +10000e90: 6873 ldr r3, [r6, #4] +10000e92: f3bf 8f5f dmb sy +10000e96: 2200 movs r2, #0 +10000e98: 601a str r2, [r3, #0] +10000e9a: f387 8810 msr PRIMASK, r7 +10000e9e: e7b2 b.n 10000e06 +10000ea0: 22ff movs r2, #255 ; 0xff +10000ea2: 401a ands r2, r3 +10000ea4: e7eb b.n 10000e7e +10000ea6: 6932 ldr r2, [r6, #16] +10000ea8: 4293 cmp r3, r2 +10000eaa: d1f1 bne.n 10000e90 +10000eac: 6131 str r1, [r6, #16] +10000eae: e7ef b.n 10000e90 +10000eb0: 4661 mov r1, ip +10000eb2: f000 faf5 bl 100014a0 +10000eb6: e7eb b.n 10000e90 +10000eb8: 40054000 .word 0x40054000 +10000ebc: 200001e4 .word 0x200001e4 +10000ec0: 10000829 .word 0x10000829 + +10000ec4 : +10000ec4: b5f0 push {r4, r5, r6, r7, lr} +10000ec6: f3ef 8205 mrs r2, IPSR +10000eca: 46d6 mov lr, sl +10000ecc: 464f mov r7, r9 +10000ece: 4646 mov r6, r8 +10000ed0: 0010 movs r0, r2 +10000ed2: b5c0 push {r6, r7, lr} +10000ed4: 3810 subs r0, #16 +10000ed6: f3ef 8810 mrs r8, PRIMASK +10000eda: b672 cpsid i +10000edc: 4c21 ldr r4, [pc, #132] ; (10000f64 ) +10000ede: 6823 ldr r3, [r4, #0] +10000ee0: 2b00 cmp r3, #0 +10000ee2: d0fc beq.n 10000ede +10000ee4: f3bf 8f5f dmb sy +10000ee8: 2301 movs r3, #1 +10000eea: 0019 movs r1, r3 +10000eec: 4081 lsls r1, r0 +10000eee: 4d1e ldr r5, [pc, #120] ; (10000f68 ) +10000ef0: 001f movs r7, r3 +10000ef2: 6369 str r1, [r5, #52] ; 0x34 +10000ef4: 46aa mov sl, r5 +10000ef6: 4d1d ldr r5, [pc, #116] ; (10000f6c ) +10000ef8: 6029 str r1, [r5, #0] +10000efa: 4d1d ldr r5, [pc, #116] ; (10000f70 ) +10000efc: 782e ldrb r6, [r5, #0] +10000efe: 46ac mov ip, r5 +10000f00: 0035 movs r5, r6 +10000f02: 40c5 lsrs r5, r0 +10000f04: 402f ands r7, r5 +10000f06: 422b tst r3, r5 +10000f08: d109 bne.n 10000f1e +10000f0a: f3bf 8f5f dmb sy +10000f0e: 6027 str r7, [r4, #0] +10000f10: f388 8810 msr PRIMASK, r8 +10000f14: bce0 pop {r5, r6, r7} +10000f16: 46ba mov sl, r7 +10000f18: 46b1 mov r9, r6 +10000f1a: 46a8 mov r8, r5 +10000f1c: bdf0 pop {r4, r5, r6, r7, pc} +10000f1e: 4653 mov r3, sl +10000f20: 4d14 ldr r5, [pc, #80] ; (10000f74 ) +10000f22: 6a5f ldr r7, [r3, #36] ; 0x24 +10000f24: 0083 lsls r3, r0, #2 +10000f26: 595d ldr r5, [r3, r5] +10000f28: 42af cmp r7, r5 +10000f2a: d30e bcc.n 10000f4a +10000f2c: 4a12 ldr r2, [pc, #72] ; (10000f78 ) +10000f2e: 438e bics r6, r1 +10000f30: 589b ldr r3, [r3, r2] +10000f32: 4662 mov r2, ip +10000f34: 7016 strb r6, [r2, #0] +10000f36: f3bf 8f5f dmb sy +10000f3a: 2200 movs r2, #0 +10000f3c: 6022 str r2, [r4, #0] +10000f3e: f388 8810 msr PRIMASK, r8 +10000f42: 2b00 cmp r3, #0 +10000f44: d0e6 beq.n 10000f14 +10000f46: 4798 blx r3 +10000f48: e7e4 b.n 10000f14 +10000f4a: 4b0c ldr r3, [pc, #48] ; (10000f7c ) +10000f4c: 0092 lsls r2, r2, #2 +10000f4e: 469c mov ip, r3 +10000f50: 4462 add r2, ip +10000f52: 6813 ldr r3, [r2, #0] +10000f54: 6013 str r3, [r2, #0] +10000f56: f3bf 8f5f dmb sy +10000f5a: 2300 movs r3, #0 +10000f5c: 6023 str r3, [r4, #0] +10000f5e: f388 8810 msr PRIMASK, r8 +10000f62: e7d7 b.n 10000f14 +10000f64: d0000128 .word 0xd0000128 +10000f68: 40054000 .word 0x40054000 +10000f6c: 4005703c .word 0x4005703c +10000f70: 2000061a .word 0x2000061a +10000f74: 20000608 .word 0x20000608 +10000f78: 2000056c .word 0x2000056c +10000f7c: 40053fd0 .word 0x40053fd0 + +10000f80 : +10000f80: b510 push {r4, lr} +10000f82: 0001 movs r1, r0 +10000f84: 4a02 ldr r2, [pc, #8] ; (10000f90 ) +10000f86: 4803 ldr r0, [pc, #12] ; (10000f94 ) +10000f88: f7ff fa4c bl 10000424 +10000f8c: bd10 pop {r4, pc} +10000f8e: 46c0 nop ; (mov r8, r8) +10000f90: 10001fc0 .word 0x10001fc0 +10000f94: 20000618 .word 0x20000618 + +10000f98 : +10000f98: 4b03 ldr r3, [pc, #12] ; (10000fa8 ) +10000f9a: 6a59 ldr r1, [r3, #36] ; 0x24 +10000f9c: 000a movs r2, r1 +10000f9e: 6a98 ldr r0, [r3, #40] ; 0x28 +10000fa0: 6a59 ldr r1, [r3, #36] ; 0x24 +10000fa2: 428a cmp r2, r1 +10000fa4: d1fa bne.n 10000f9c +10000fa6: 4770 bx lr +10000fa8: 40054000 .word 0x40054000 + +10000fac : +10000fac: 4a06 ldr r2, [pc, #24] ; (10000fc8 ) +10000fae: 6a53 ldr r3, [r2, #36] ; 0x24 +10000fb0: 4299 cmp r1, r3 +10000fb2: d8fc bhi.n 10000fae +10000fb4: d107 bne.n 10000fc6 +10000fb6: 4b04 ldr r3, [pc, #16] ; (10000fc8 ) +10000fb8: e002 b.n 10000fc0 +10000fba: 6a5a ldr r2, [r3, #36] ; 0x24 +10000fbc: 4291 cmp r1, r2 +10000fbe: d102 bne.n 10000fc6 +10000fc0: 6a9a ldr r2, [r3, #40] ; 0x28 +10000fc2: 4282 cmp r2, r0 +10000fc4: d3f9 bcc.n 10000fba +10000fc6: 4770 bx lr +10000fc8: 40054000 .word 0x40054000 + +10000fcc : +10000fcc: b570 push {r4, r5, r6, lr} +10000fce: 0004 movs r4, r0 +10000fd0: 000d movs r5, r1 +10000fd2: f3ef 8610 mrs r6, PRIMASK +10000fd6: b672 cpsid i +10000fd8: 4a1a ldr r2, [pc, #104] ; (10001044 ) +10000fda: 6813 ldr r3, [r2, #0] +10000fdc: 2b00 cmp r3, #0 +10000fde: d0fc beq.n 10000fda +10000fe0: f3bf 8f5f dmb sy +10000fe4: 2d00 cmp r5, #0 +10000fe6: d01b beq.n 10001020 +10000fe8: 0020 movs r0, r4 +10000fea: f7ff fa69 bl 100004c0 +10000fee: 4916 ldr r1, [pc, #88] ; (10001048 ) +10000ff0: 4281 cmp r1, r0 +10000ff2: d00a beq.n 1000100a +10000ff4: 0020 movs r0, r4 +10000ff6: f7ff fa6b bl 100004d0 +10000ffa: 2101 movs r1, #1 +10000ffc: 0020 movs r0, r4 +10000ffe: f7ff fa4d bl 1000049c +10001002: 2301 movs r3, #1 +10001004: 40a3 lsls r3, r4 +10001006: 4a11 ldr r2, [pc, #68] ; (1000104c ) +10001008: 6013 str r3, [r2, #0] +1000100a: 4b11 ldr r3, [pc, #68] ; (10001050 ) +1000100c: 00a4 lsls r4, r4, #2 +1000100e: 50e5 str r5, [r4, r3] +10001010: f3bf 8f5f dmb sy +10001014: 2200 movs r2, #0 +10001016: 4b0b ldr r3, [pc, #44] ; (10001044 ) +10001018: 601a str r2, [r3, #0] +1000101a: f386 8810 msr PRIMASK, r6 +1000101e: bd70 pop {r4, r5, r6, pc} +10001020: 4b0b ldr r3, [pc, #44] ; (10001050 ) +10001022: 00a2 lsls r2, r4, #2 +10001024: 50d5 str r5, [r2, r3] +10001026: 2201 movs r2, #1 +10001028: 40a2 lsls r2, r4 +1000102a: 490a ldr r1, [pc, #40] ; (10001054 ) +1000102c: 0020 movs r0, r4 +1000102e: 780b ldrb r3, [r1, #0] +10001030: 4393 bics r3, r2 +10001032: 700b strb r3, [r1, #0] +10001034: 4904 ldr r1, [pc, #16] ; (10001048 ) +10001036: f7ff fa75 bl 10000524 +1000103a: 2100 movs r1, #0 +1000103c: 0020 movs r0, r4 +1000103e: f7ff fa2d bl 1000049c +10001042: e7e5 b.n 10001010 +10001044: d0000128 .word 0xd0000128 +10001048: 10000ec5 .word 0x10000ec5 +1000104c: 40056038 .word 0x40056038 +10001050: 2000056c .word 0x2000056c +10001054: 2000061a .word 0x2000061a + +10001058 : +10001058: b5f0 push {r4, r5, r6, r7, lr} +1000105a: 464f mov r7, r9 +1000105c: 46d6 mov lr, sl +1000105e: 4646 mov r6, r8 +10001060: b5c0 push {r6, r7, lr} +10001062: 0007 movs r7, r0 +10001064: 4c2c ldr r4, [pc, #176] ; (10001118 ) +10001066: 6a61 ldr r1, [r4, #36] ; 0x24 +10001068: 000d movs r5, r1 +1000106a: 6aa6 ldr r6, [r4, #40] ; 0x28 +1000106c: 6a61 ldr r1, [r4, #36] ; 0x24 +1000106e: 42a9 cmp r1, r5 +10001070: d1fa bne.n 10001068 +10001072: 428b cmp r3, r1 +10001074: d808 bhi.n 10001088 +10001076: d005 beq.n 10001084 +10001078: 2001 movs r0, #1 +1000107a: bce0 pop {r5, r6, r7} +1000107c: 46ba mov sl, r7 +1000107e: 46b1 mov r9, r6 +10001080: 46a8 mov r8, r5 +10001082: bdf0 pop {r4, r5, r6, r7, pc} +10001084: 42b2 cmp r2, r6 +10001086: d9f7 bls.n 10001078 +10001088: f3ef 8a10 mrs sl, PRIMASK +1000108c: b672 cpsid i +1000108e: 4823 ldr r0, [pc, #140] ; (1000111c ) +10001090: 6801 ldr r1, [r0, #0] +10001092: 2900 cmp r1, #0 +10001094: d0fc beq.n 10001090 +10001096: f3bf 8f5f dmb sy +1000109a: 2501 movs r5, #1 +1000109c: 40bd lsls r5, r7 +1000109e: 4920 ldr r1, [pc, #128] ; (10001120 ) +100010a0: 4c1d ldr r4, [pc, #116] ; (10001118 ) +100010a2: 4688 mov r8, r1 +100010a4: 7809 ldrb r1, [r1, #0] +100010a6: 4689 mov r9, r1 +100010a8: 4329 orrs r1, r5 +100010aa: b2c9 uxtb r1, r1 +100010ac: 468c mov ip, r1 +100010ae: 4641 mov r1, r8 +100010b0: 4660 mov r0, ip +100010b2: 7008 strb r0, [r1, #0] +100010b4: 1d39 adds r1, r7, #4 +100010b6: 481b ldr r0, [pc, #108] ; (10001124 ) +100010b8: 0089 lsls r1, r1, #2 +100010ba: 6365 str r5, [r4, #52] ; 0x34 +100010bc: 510a str r2, [r1, r4] +100010be: 00b9 lsls r1, r7, #2 +100010c0: 500b str r3, [r1, r0] +100010c2: 6a21 ldr r1, [r4, #32] +100010c4: 2000 movs r0, #0 +100010c6: 4229 tst r1, r5 +100010c8: d019 beq.n 100010fe +100010ca: 6a61 ldr r1, [r4, #36] ; 0x24 +100010cc: 0008 movs r0, r1 +100010ce: 6aa6 ldr r6, [r4, #40] ; 0x28 +100010d0: 6a61 ldr r1, [r4, #36] ; 0x24 +100010d2: 4281 cmp r1, r0 +100010d4: d1fa bne.n 100010cc +100010d6: 428b cmp r3, r1 +100010d8: d819 bhi.n 1000110e +100010da: d101 bne.n 100010e0 +100010dc: 42b2 cmp r2, r6 +100010de: d816 bhi.n 1000110e +100010e0: 45cc cmp ip, r9 +100010e2: d016 beq.n 10001112 +100010e4: 4b0c ldr r3, [pc, #48] ; (10001118 ) +100010e6: 201f movs r0, #31 +100010e8: 621d str r5, [r3, #32] +100010ea: 635d str r5, [r3, #52] ; 0x34 +100010ec: 2301 movs r3, #1 +100010ee: 4007 ands r7, r0 +100010f0: 40bb lsls r3, r7 +100010f2: 4a0d ldr r2, [pc, #52] ; (10001128 ) +100010f4: 381e subs r0, #30 +100010f6: 6013 str r3, [r2, #0] +100010f8: 4643 mov r3, r8 +100010fa: 464a mov r2, r9 +100010fc: 701a strb r2, [r3, #0] +100010fe: f3bf 8f5f dmb sy +10001102: 2200 movs r2, #0 +10001104: 4b05 ldr r3, [pc, #20] ; (1000111c ) +10001106: 601a str r2, [r3, #0] +10001108: f38a 8810 msr PRIMASK, sl +1000110c: e7b5 b.n 1000107a +1000110e: 2000 movs r0, #0 +10001110: e7f5 b.n 100010fe +10001112: 2001 movs r0, #1 +10001114: e7f3 b.n 100010fe +10001116: 46c0 nop ; (mov r8, r8) +10001118: 40054000 .word 0x40054000 +1000111c: d0000128 .word 0xd0000128 +10001120: 2000061a .word 0x2000061a +10001124: 20000608 .word 0x20000608 +10001128: e000e280 .word 0xe000e280 + +1000112c : +1000112c: f3ef 8c10 mrs ip, PRIMASK +10001130: b672 cpsid i +10001132: 490a ldr r1, [pc, #40] ; (1000115c ) +10001134: 680b ldr r3, [r1, #0] +10001136: 2b00 cmp r3, #0 +10001138: d0fc beq.n 10001134 +1000113a: f3bf 8f5f dmb sy +1000113e: 2301 movs r3, #1 +10001140: 4083 lsls r3, r0 +10001142: 4a07 ldr r2, [pc, #28] ; (10001160 ) +10001144: 4807 ldr r0, [pc, #28] ; (10001164 ) +10001146: 6213 str r3, [r2, #32] +10001148: 7802 ldrb r2, [r0, #0] +1000114a: 439a bics r2, r3 +1000114c: 7002 strb r2, [r0, #0] +1000114e: f3bf 8f5f dmb sy +10001152: 2300 movs r3, #0 +10001154: 600b str r3, [r1, #0] +10001156: f38c 8810 msr PRIMASK, ip +1000115a: 4770 bx lr +1000115c: d0000128 .word 0xd0000128 +10001160: 40054000 .word 0x40054000 +10001164: 2000061a .word 0x2000061a + +10001168 : +10001168: b570 push {r4, r5, r6, lr} +1000116a: 0005 movs r5, r0 +1000116c: 0014 movs r4, r2 +1000116e: 0016 movs r6, r2 +10001170: 2900 cmp r1, #0 +10001172: d015 beq.n 100011a0 +10001174: 000c movs r4, r1 +10001176: 2a00 cmp r2, #0 +10001178: d012 beq.n 100011a0 +1000117a: 6880 ldr r0, [r0, #8] +1000117c: 686b ldr r3, [r5, #4] +1000117e: 4798 blx r3 +10001180: 6829 ldr r1, [r5, #0] +10001182: 2800 cmp r0, #0 +10001184: d00e beq.n 100011a4 +10001186: 0073 lsls r3, r6, #1 +10001188: 199b adds r3, r3, r6 +1000118a: 0062 lsls r2, r4, #1 +1000118c: 3b03 subs r3, #3 +1000118e: 1912 adds r2, r2, r4 +10001190: 18cb adds r3, r1, r3 +10001192: 3a03 subs r2, #3 +10001194: 709c strb r4, [r3, #2] +10001196: 1888 adds r0, r1, r2 +10001198: 5c8a ldrb r2, [r1, r2] +1000119a: 2a00 cmp r2, #0 +1000119c: d115 bne.n 100011ca +1000119e: 7006 strb r6, [r0, #0] +100011a0: 0020 movs r0, r4 +100011a2: bd70 pop {r4, r5, r6, pc} +100011a4: 0063 lsls r3, r4, #1 +100011a6: 191b adds r3, r3, r4 +100011a8: 0072 lsls r2, r6, #1 +100011aa: 3b03 subs r3, #3 +100011ac: 1992 adds r2, r2, r6 +100011ae: 18cb adds r3, r1, r3 +100011b0: 3a03 subs r2, #3 +100011b2: 709e strb r6, [r3, #2] +100011b4: 1888 adds r0, r1, r2 +100011b6: 5c8a ldrb r2, [r1, r2] +100011b8: 2a00 cmp r2, #0 +100011ba: d102 bne.n 100011c2 +100011bc: 7004 strb r4, [r0, #0] +100011be: 0034 movs r4, r6 +100011c0: e7ee b.n 100011a0 +100011c2: 705a strb r2, [r3, #1] +100011c4: 7004 strb r4, [r0, #0] +100011c6: 0034 movs r4, r6 +100011c8: e7ea b.n 100011a0 +100011ca: 705a strb r2, [r3, #1] +100011cc: 7006 strb r6, [r0, #0] +100011ce: e7e7 b.n 100011a0 + +100011d0 : +100011d0: b530 push {r4, r5, lr} +100011d2: 6083 str r3, [r0, #8] +100011d4: 2300 movs r3, #0 +100011d6: b2cc uxtb r4, r1 +100011d8: 7343 strb r3, [r0, #13] +100011da: 3301 adds r3, #1 +100011dc: 7304 strb r4, [r0, #12] +100011de: 6042 str r2, [r0, #4] +100011e0: 7383 strb r3, [r0, #14] +100011e2: 73c4 strb r4, [r0, #15] +100011e4: 000d movs r5, r1 +100011e6: 6800 ldr r0, [r0, #0] +100011e8: 2c01 cmp r4, #1 +100011ea: d906 bls.n 100011fa +100011ec: 1c42 adds r2, r0, #1 +100011ee: 3301 adds r3, #1 +100011f0: b2db uxtb r3, r3 +100011f2: 7013 strb r3, [r2, #0] +100011f4: 3203 adds r2, #3 +100011f6: 429c cmp r4, r3 +100011f8: d1f9 bne.n 100011ee +100011fa: 21ff movs r1, #255 ; 0xff +100011fc: 4029 ands r1, r5 +100011fe: 004b lsls r3, r1, #1 +10001200: 1859 adds r1, r3, r1 +10001202: 2300 movs r3, #0 +10001204: 1840 adds r0, r0, r1 +10001206: 3803 subs r0, #3 +10001208: 7043 strb r3, [r0, #1] +1000120a: bd30 pop {r4, r5, pc} + +1000120c : +1000120c: b5f8 push {r3, r4, r5, r6, r7, lr} +1000120e: 46ce mov lr, r9 +10001210: 4647 mov r7, r8 +10001212: 0006 movs r6, r0 +10001214: 000c movs r4, r1 +10001216: b580 push {r7, lr} +10001218: 2900 cmp r1, #0 +1000121a: d007 beq.n 1000122c +1000121c: 004d lsls r5, r1, #1 +1000121e: 6803 ldr r3, [r0, #0] +10001220: 186d adds r5, r5, r1 +10001222: 3d03 subs r5, #3 +10001224: 195a adds r2, r3, r5 +10001226: 7857 ldrb r7, [r2, #1] +10001228: 2f00 cmp r7, #0 +1000122a: d104 bne.n 10001236 +1000122c: 0020 movs r0, r4 +1000122e: bcc0 pop {r6, r7} +10001230: 46b9 mov r9, r7 +10001232: 46b0 mov r8, r6 +10001234: bdf8 pop {r3, r4, r5, r6, r7, pc} +10001236: 0079 lsls r1, r7, #1 +10001238: 19c9 adds r1, r1, r7 +1000123a: 3903 subs r1, #3 +1000123c: 4688 mov r8, r1 +1000123e: 4443 add r3, r8 +10001240: 7859 ldrb r1, [r3, #1] +10001242: 4689 mov r9, r1 +10001244: 2100 movs r1, #0 +10001246: 7059 strb r1, [r3, #1] +10001248: 7051 strb r1, [r2, #1] +1000124a: 6873 ldr r3, [r6, #4] +1000124c: 003a movs r2, r7 +1000124e: 0021 movs r1, r4 +10001250: 6880 ldr r0, [r0, #8] +10001252: 4798 blx r3 +10001254: 6833 ldr r3, [r6, #0] +10001256: 2800 cmp r0, #0 +10001258: d014 beq.n 10001284 +1000125a: 4642 mov r2, r8 +1000125c: 189a adds r2, r3, r2 +1000125e: 7094 strb r4, [r2, #2] +10001260: 1959 adds r1, r3, r5 +10001262: 5d5b ldrb r3, [r3, r5] +10001264: 2b00 cmp r3, #0 +10001266: d000 beq.n 1000126a +10001268: 7053 strb r3, [r2, #1] +1000126a: 700f strb r7, [r1, #0] +1000126c: 0027 movs r7, r4 +1000126e: 4649 mov r1, r9 +10001270: 0030 movs r0, r6 +10001272: f7ff ffcb bl 1000120c +10001276: 0039 movs r1, r7 +10001278: 0002 movs r2, r0 +1000127a: 0030 movs r0, r6 +1000127c: f7ff ff74 bl 10001168 +10001280: 0004 movs r4, r0 +10001282: e7d3 b.n 1000122c +10001284: 4642 mov r2, r8 +10001286: 4641 mov r1, r8 +10001288: 195d adds r5, r3, r5 +1000128a: 70af strb r7, [r5, #2] +1000128c: 189a adds r2, r3, r2 +1000128e: 5c5b ldrb r3, [r3, r1] +10001290: 2b00 cmp r3, #0 +10001292: d000 beq.n 10001296 +10001294: 706b strb r3, [r5, #1] +10001296: 7014 strb r4, [r2, #0] +10001298: e7e9 b.n 1000126e +1000129a: 46c0 nop ; (mov r8, r8) + +1000129c : +1000129c: b5f0 push {r4, r5, r6, r7, lr} +1000129e: 4657 mov r7, sl +100012a0: 4645 mov r5, r8 +100012a2: 46de mov lr, fp +100012a4: 464e mov r6, r9 +100012a6: b5e0 push {r5, r6, r7, lr} +100012a8: 000d movs r5, r1 +100012aa: 006b lsls r3, r5, #1 +100012ac: 6801 ldr r1, [r0, #0] +100012ae: 195b adds r3, r3, r5 +100012b0: 1edf subs r7, r3, #3 +100012b2: 0004 movs r4, r0 +100012b4: 5dc8 ldrb r0, [r1, r7] +100012b6: b083 sub sp, #12 +100012b8: 9201 str r2, [sp, #4] +100012ba: 19ca adds r2, r1, r7 +100012bc: 2800 cmp r0, #0 +100012be: d050 beq.n 10001362 +100012c0: 0043 lsls r3, r0, #1 +100012c2: 181b adds r3, r3, r0 +100012c4: 3b03 subs r3, #3 +100012c6: 18cb adds r3, r1, r3 +100012c8: 785e ldrb r6, [r3, #1] +100012ca: 46b4 mov ip, r6 +100012cc: 2e00 cmp r6, #0 +100012ce: d11a bne.n 10001306 +100012d0: 9e01 ldr r6, [sp, #4] +100012d2: 2e00 cmp r6, #0 +100012d4: d042 beq.n 1000135c +100012d6: 7be6 ldrb r6, [r4, #15] +100012d8: 2e00 cmp r6, #0 +100012da: d004 beq.n 100012e6 +100012dc: 0073 lsls r3, r6, #1 +100012de: 199b adds r3, r3, r6 +100012e0: 18cb adds r3, r1, r3 +100012e2: 3b03 subs r3, #3 +100012e4: 705d strb r5, [r3, #1] +100012e6: 7ba3 ldrb r3, [r4, #14] +100012e8: 2b00 cmp r3, #0 +100012ea: d100 bne.n 100012ee +100012ec: 73a5 strb r5, [r4, #14] +100012ee: 73e5 strb r5, [r4, #15] +100012f0: 2800 cmp r0, #0 +100012f2: d12f bne.n 10001354 +100012f4: 2300 movs r3, #0 +100012f6: 7053 strb r3, [r2, #1] +100012f8: b003 add sp, #12 +100012fa: bcf0 pop {r4, r5, r6, r7} +100012fc: 46bb mov fp, r7 +100012fe: 46b2 mov sl, r6 +10001300: 46a9 mov r9, r5 +10001302: 46a0 mov r8, r4 +10001304: bdf0 pop {r4, r5, r6, r7, pc} +10001306: 0072 lsls r2, r6, #1 +10001308: 4462 add r2, ip +1000130a: 3a03 subs r2, #3 +1000130c: 1889 adds r1, r1, r2 +1000130e: 784a ldrb r2, [r1, #1] +10001310: 4690 mov r8, r2 +10001312: 2200 movs r2, #0 +10001314: 704a strb r2, [r1, #1] +10001316: 4691 mov r9, r2 +10001318: 705a strb r2, [r3, #1] +1000131a: 0001 movs r1, r0 +1000131c: 0032 movs r2, r6 +1000131e: 0020 movs r0, r4 +10001320: f7ff ff22 bl 10001168 +10001324: 4643 mov r3, r8 +10001326: 4682 mov sl, r0 +10001328: 2b00 cmp r3, #0 +1000132a: d007 beq.n 1000133c +1000132c: 005b lsls r3, r3, #1 +1000132e: 6821 ldr r1, [r4, #0] +10001330: 4443 add r3, r8 +10001332: 3b03 subs r3, #3 +10001334: 18cb adds r3, r1, r3 +10001336: 785a ldrb r2, [r3, #1] +10001338: 2a00 cmp r2, #0 +1000133a: d116 bne.n 1000136a +1000133c: 4642 mov r2, r8 +1000133e: 4651 mov r1, sl +10001340: 0020 movs r0, r4 +10001342: f7ff ff11 bl 10001168 +10001346: 6821 ldr r1, [r4, #0] +10001348: 9b01 ldr r3, [sp, #4] +1000134a: 19ca adds r2, r1, r7 +1000134c: 2b00 cmp r3, #0 +1000134e: d1c2 bne.n 100012d6 +10001350: 2800 cmp r0, #0 +10001352: d0cf beq.n 100012f4 +10001354: 0043 lsls r3, r0, #1 +10001356: 181b adds r3, r3, r0 +10001358: 3b03 subs r3, #3 +1000135a: 18cb adds r3, r1, r3 +1000135c: 2100 movs r1, #0 +1000135e: 7099 strb r1, [r3, #2] +10001360: e7c8 b.n 100012f4 +10001362: 9b01 ldr r3, [sp, #4] +10001364: 2b00 cmp r3, #0 +10001366: d1b6 bne.n 100012d6 +10001368: e7c4 b.n 100012f4 +1000136a: 0050 lsls r0, r2, #1 +1000136c: 1880 adds r0, r0, r2 +1000136e: 3803 subs r0, #3 +10001370: 1809 adds r1, r1, r0 +10001372: 7848 ldrb r0, [r1, #1] +10001374: 4683 mov fp, r0 +10001376: 4648 mov r0, r9 +10001378: 7048 strb r0, [r1, #1] +1000137a: 7058 strb r0, [r3, #1] +1000137c: 4641 mov r1, r8 +1000137e: 0020 movs r0, r4 +10001380: f7ff fef2 bl 10001168 +10001384: 4659 mov r1, fp +10001386: 4680 mov r8, r0 +10001388: 0020 movs r0, r4 +1000138a: f7ff ff3f bl 1000120c +1000138e: 4641 mov r1, r8 +10001390: 0002 movs r2, r0 +10001392: 0020 movs r0, r4 +10001394: f7ff fee8 bl 10001168 +10001398: 4680 mov r8, r0 +1000139a: e7cf b.n 1000133c + +1000139c : +1000139c: b5f0 push {r4, r5, r6, r7, lr} +1000139e: 4657 mov r7, sl +100013a0: 4645 mov r5, r8 +100013a2: 46de mov lr, fp +100013a4: 464e mov r6, r9 +100013a6: b5e0 push {r5, r6, r7, lr} +100013a8: b083 sub sp, #12 +100013aa: 9101 str r1, [sp, #4] +100013ac: 7b45 ldrb r5, [r0, #13] +100013ae: 0004 movs r4, r0 +100013b0: 006b lsls r3, r5, #1 +100013b2: 6800 ldr r0, [r0, #0] +100013b4: 195b adds r3, r3, r5 +100013b6: 1edf subs r7, r3, #3 +100013b8: 5dc1 ldrb r1, [r0, r7] +100013ba: 19c2 adds r2, r0, r7 +100013bc: 2900 cmp r1, #0 +100013be: d052 beq.n 10001466 +100013c0: 004b lsls r3, r1, #1 +100013c2: 185b adds r3, r3, r1 +100013c4: 3b03 subs r3, #3 +100013c6: 18c3 adds r3, r0, r3 +100013c8: 785e ldrb r6, [r3, #1] +100013ca: 46b4 mov ip, r6 +100013cc: 2e00 cmp r6, #0 +100013ce: d11c bne.n 1000140a +100013d0: 9e01 ldr r6, [sp, #4] +100013d2: 2e00 cmp r6, #0 +100013d4: d044 beq.n 10001460 +100013d6: 7be6 ldrb r6, [r4, #15] +100013d8: 2e00 cmp r6, #0 +100013da: d004 beq.n 100013e6 +100013dc: 0073 lsls r3, r6, #1 +100013de: 199b adds r3, r3, r6 +100013e0: 18c3 adds r3, r0, r3 +100013e2: 3b03 subs r3, #3 +100013e4: 705d strb r5, [r3, #1] +100013e6: 7ba3 ldrb r3, [r4, #14] +100013e8: 2b00 cmp r3, #0 +100013ea: d100 bne.n 100013ee +100013ec: 73a5 strb r5, [r4, #14] +100013ee: 73e5 strb r5, [r4, #15] +100013f0: 2900 cmp r1, #0 +100013f2: d131 bne.n 10001458 +100013f4: 2300 movs r3, #0 +100013f6: 0028 movs r0, r5 +100013f8: 7053 strb r3, [r2, #1] +100013fa: 7361 strb r1, [r4, #13] +100013fc: b003 add sp, #12 +100013fe: bcf0 pop {r4, r5, r6, r7} +10001400: 46bb mov fp, r7 +10001402: 46b2 mov sl, r6 +10001404: 46a9 mov r9, r5 +10001406: 46a0 mov r8, r4 +10001408: bdf0 pop {r4, r5, r6, r7, pc} +1000140a: 0072 lsls r2, r6, #1 +1000140c: 4462 add r2, ip +1000140e: 3a03 subs r2, #3 +10001410: 1880 adds r0, r0, r2 +10001412: 7842 ldrb r2, [r0, #1] +10001414: 4690 mov r8, r2 +10001416: 2200 movs r2, #0 +10001418: 7042 strb r2, [r0, #1] +1000141a: 4691 mov r9, r2 +1000141c: 705a strb r2, [r3, #1] +1000141e: 0020 movs r0, r4 +10001420: 0032 movs r2, r6 +10001422: f7ff fea1 bl 10001168 +10001426: 4643 mov r3, r8 +10001428: 4682 mov sl, r0 +1000142a: 2b00 cmp r3, #0 +1000142c: d007 beq.n 1000143e +1000142e: 005b lsls r3, r3, #1 +10001430: 6821 ldr r1, [r4, #0] +10001432: 4443 add r3, r8 +10001434: 3b03 subs r3, #3 +10001436: 18cb adds r3, r1, r3 +10001438: 785a ldrb r2, [r3, #1] +1000143a: 2a00 cmp r2, #0 +1000143c: d117 bne.n 1000146e +1000143e: 4642 mov r2, r8 +10001440: 4651 mov r1, sl +10001442: 0020 movs r0, r4 +10001444: f7ff fe90 bl 10001168 +10001448: 9b01 ldr r3, [sp, #4] +1000144a: 0001 movs r1, r0 +1000144c: 6820 ldr r0, [r4, #0] +1000144e: 19c2 adds r2, r0, r7 +10001450: 2b00 cmp r3, #0 +10001452: d1c0 bne.n 100013d6 +10001454: 2900 cmp r1, #0 +10001456: d0cd beq.n 100013f4 +10001458: 004b lsls r3, r1, #1 +1000145a: 185b adds r3, r3, r1 +1000145c: 3b03 subs r3, #3 +1000145e: 18c3 adds r3, r0, r3 +10001460: 2000 movs r0, #0 +10001462: 7098 strb r0, [r3, #2] +10001464: e7c6 b.n 100013f4 +10001466: 9b01 ldr r3, [sp, #4] +10001468: 2b00 cmp r3, #0 +1000146a: d1b4 bne.n 100013d6 +1000146c: e7c2 b.n 100013f4 +1000146e: 0050 lsls r0, r2, #1 +10001470: 1880 adds r0, r0, r2 +10001472: 3803 subs r0, #3 +10001474: 1809 adds r1, r1, r0 +10001476: 7848 ldrb r0, [r1, #1] +10001478: 4683 mov fp, r0 +1000147a: 4648 mov r0, r9 +1000147c: 7048 strb r0, [r1, #1] +1000147e: 7058 strb r0, [r3, #1] +10001480: 4641 mov r1, r8 +10001482: 0020 movs r0, r4 +10001484: f7ff fe70 bl 10001168 +10001488: 4659 mov r1, fp +1000148a: 4680 mov r8, r0 +1000148c: 0020 movs r0, r4 +1000148e: f7ff febd bl 1000120c +10001492: 4641 mov r1, r8 +10001494: 0002 movs r2, r0 +10001496: 0020 movs r0, r4 +10001498: f7ff fe66 bl 10001168 +1000149c: 4680 mov r8, r0 +1000149e: e7ce b.n 1000143e + +100014a0 : +100014a0: b570 push {r4, r5, r6, lr} +100014a2: 0004 movs r4, r0 +100014a4: 2900 cmp r1, #0 +100014a6: d02c beq.n 10001502 +100014a8: 7b43 ldrb r3, [r0, #13] +100014aa: 428b cmp r3, r1 +100014ac: d02e beq.n 1000150c +100014ae: 6805 ldr r5, [r0, #0] +100014b0: 0048 lsls r0, r1, #1 +100014b2: 1840 adds r0, r0, r1 +100014b4: 3803 subs r0, #3 +100014b6: 1828 adds r0, r5, r0 +100014b8: 7882 ldrb r2, [r0, #2] +100014ba: 2a00 cmp r2, #0 +100014bc: d021 beq.n 10001502 +100014be: 0053 lsls r3, r2, #1 +100014c0: 189b adds r3, r3, r2 +100014c2: 3b03 subs r3, #3 +100014c4: 5cea ldrb r2, [r5, r3] +100014c6: 18ee adds r6, r5, r3 +100014c8: 428a cmp r2, r1 +100014ca: d102 bne.n 100014d2 +100014cc: e01b b.n 10001506 +100014ce: 2a00 cmp r2, #0 +100014d0: d008 beq.n 100014e4 +100014d2: 0053 lsls r3, r2, #1 +100014d4: 189b adds r3, r3, r2 +100014d6: 3b03 subs r3, #3 +100014d8: 18eb adds r3, r5, r3 +100014da: 785a ldrb r2, [r3, #1] +100014dc: 428a cmp r2, r1 +100014de: d1f6 bne.n 100014ce +100014e0: 7842 ldrb r2, [r0, #1] +100014e2: 705a strb r2, [r3, #1] +100014e4: 2300 movs r3, #0 +100014e6: 2201 movs r2, #1 +100014e8: 7083 strb r3, [r0, #2] +100014ea: 7043 strb r3, [r0, #1] +100014ec: 0020 movs r0, r4 +100014ee: f7ff fed5 bl 1000129c +100014f2: 7b61 ldrb r1, [r4, #13] +100014f4: 0002 movs r2, r0 +100014f6: 0020 movs r0, r4 +100014f8: f7ff fe36 bl 10001168 +100014fc: 7360 strb r0, [r4, #13] +100014fe: 2001 movs r0, #1 +10001500: e000 b.n 10001504 +10001502: 2000 movs r0, #0 +10001504: bd70 pop {r4, r5, r6, pc} +10001506: 7843 ldrb r3, [r0, #1] +10001508: 7033 strb r3, [r6, #0] +1000150a: e7eb b.n 100014e4 +1000150c: 2201 movs r2, #1 +1000150e: 0019 movs r1, r3 +10001510: f7ff fec4 bl 1000129c +10001514: 7360 strb r0, [r4, #13] +10001516: 2001 movs r0, #1 +10001518: e7f4 b.n 10001504 +1000151a: 46c0 nop ; (mov r8, r8) + +1000151c : +1000151c: b530 push {r4, r5, lr} +1000151e: 200c movs r0, #12 +10001520: b083 sub sp, #12 +10001522: f000 f9b3 bl 1000188c +10001526: f7fe ff75 bl 10000414 +1000152a: 2800 cmp r0, #0 +1000152c: d00e beq.n 1000154c +1000152e: 4b99 ldr r3, [pc, #612] ; (10001794 ) +10001530: 4a99 ldr r2, [pc, #612] ; (10001798 ) +10001532: 601a str r2, [r3, #0] +10001534: 605a str r2, [r3, #4] +10001536: 609a str r2, [r3, #8] +10001538: 60da str r2, [r3, #12] +1000153a: 611a str r2, [r3, #16] +1000153c: 615a str r2, [r3, #20] +1000153e: 619a str r2, [r3, #24] +10001540: 61da str r2, [r3, #28] +10001542: 621a str r2, [r3, #32] +10001544: 4a95 ldr r2, [pc, #596] ; (1000179c ) +10001546: 625a str r2, [r3, #36] ; 0x24 +10001548: b003 add sp, #12 +1000154a: bd30 pop {r4, r5, pc} +1000154c: 4c94 ldr r4, [pc, #592] ; (100017a0 ) +1000154e: 67a0 str r0, [r4, #120] ; 0x78 +10001550: f000 f9a4 bl 1000189c +10001554: 2201 movs r2, #1 +10001556: 4b93 ldr r3, [pc, #588] ; (100017a4 ) +10001558: 601a str r2, [r3, #0] +1000155a: 6c63 ldr r3, [r4, #68] ; 0x44 +1000155c: 2b01 cmp r3, #1 +1000155e: d1fc bne.n 1000155a +10001560: 2203 movs r2, #3 +10001562: 4b91 ldr r3, [pc, #580] ; (100017a8 ) +10001564: 601a str r2, [r3, #0] +10001566: 4a8e ldr r2, [pc, #568] ; (100017a0 ) +10001568: 6b93 ldr r3, [r2, #56] ; 0x38 +1000156a: 2b01 cmp r3, #1 +1000156c: d1fc bne.n 10001568 +1000156e: 3301 adds r3, #1 +10001570: 2101 movs r1, #1 +10001572: 4a8e ldr r2, [pc, #568] ; (100017ac ) +10001574: 488e ldr r0, [pc, #568] ; (100017b0 ) +10001576: 9300 str r3, [sp, #0] +10001578: 3304 adds r3, #4 +1000157a: f000 f937 bl 100017ec +1000157e: 2305 movs r3, #5 +10001580: 4a8c ldr r2, [pc, #560] ; (100017b4 ) +10001582: 9300 str r3, [sp, #0] +10001584: 2101 movs r1, #1 +10001586: 488c ldr r0, [pc, #560] ; (100017b8 ) +10001588: f000 f930 bl 100017ec +1000158c: 4b8b ldr r3, [pc, #556] ; (100017bc ) +1000158e: 685a ldr r2, [r3, #4] +10001590: 2aff cmp r2, #255 ; 0xff +10001592: d802 bhi.n 1000159a +10001594: 2280 movs r2, #128 ; 0x80 +10001596: 0052 lsls r2, r2, #1 +10001598: 605a str r2, [r3, #4] +1000159a: 2280 movs r2, #128 ; 0x80 +1000159c: 4c7d ldr r4, [pc, #500] ; (10001794 ) +1000159e: 4b82 ldr r3, [pc, #520] ; (100017a8 ) +100015a0: 6921 ldr r1, [r4, #16] +100015a2: 0112 lsls r2, r2, #4 +100015a4: 4d85 ldr r5, [pc, #532] ; (100017bc ) +100015a6: 601a str r2, [r3, #0] +100015a8: 2900 cmp r1, #0 +100015aa: d007 beq.n 100015bc +100015ac: 6960 ldr r0, [r4, #20] +100015ae: f000 fa7f bl 10001ab0 <__wrap___aeabi_uidiv> +100015b2: 1c43 adds r3, r0, #1 +100015b4: 0058 lsls r0, r3, #1 +100015b6: 18c0 adds r0, r0, r3 +100015b8: 3803 subs r0, #3 +100015ba: d2fd bcs.n 100015b8 +100015bc: 21e0 movs r1, #224 ; 0xe0 +100015be: 4b7f ldr r3, [pc, #508] ; (100017bc ) +100015c0: 2002 movs r0, #2 +100015c2: 681a ldr r2, [r3, #0] +100015c4: 4011 ands r1, r2 +100015c6: 2280 movs r2, #128 ; 0x80 +100015c8: 0152 lsls r2, r2, #5 +100015ca: 432a orrs r2, r5 +100015cc: 6011 str r1, [r2, #0] +100015ce: 6819 ldr r1, [r3, #0] +100015d0: 4048 eors r0, r1 +100015d2: 2103 movs r1, #3 +100015d4: 4001 ands r1, r0 +100015d6: 6011 str r1, [r2, #0] +100015d8: 2104 movs r1, #4 +100015da: 689a ldr r2, [r3, #8] +100015dc: 4211 tst r1, r2 +100015de: d0fc beq.n 100015da +100015e0: 2280 movs r2, #128 ; 0x80 +100015e2: 2180 movs r1, #128 ; 0x80 +100015e4: 0192 lsls r2, r2, #6 +100015e6: 432a orrs r2, r5 +100015e8: 0109 lsls r1, r1, #4 +100015ea: 6011 str r1, [r2, #0] +100015ec: 2280 movs r2, #128 ; 0x80 +100015ee: 0052 lsls r2, r2, #1 +100015f0: 605a str r2, [r3, #4] +100015f2: 4b73 ldr r3, [pc, #460] ; (100017c0 ) +100015f4: 6123 str r3, [r4, #16] +100015f6: 4b73 ldr r3, [pc, #460] ; (100017c4 ) +100015f8: 6859 ldr r1, [r3, #4] +100015fa: 29ff cmp r1, #255 ; 0xff +100015fc: d800 bhi.n 10001600 +100015fe: 605a str r2, [r3, #4] +10001600: 2103 movs r1, #3 +10001602: 4a68 ldr r2, [pc, #416] ; (100017a4 ) +10001604: 4b6f ldr r3, [pc, #444] ; (100017c4 ) +10001606: 6011 str r1, [r2, #0] +10001608: 3902 subs r1, #2 +1000160a: 689a ldr r2, [r3, #8] +1000160c: 4211 tst r1, r2 +1000160e: d0fc beq.n 1000160a +10001610: 20e0 movs r0, #224 ; 0xe0 +10001612: 681a ldr r2, [r3, #0] +10001614: 4010 ands r0, r2 +10001616: 2280 movs r2, #128 ; 0x80 +10001618: 0152 lsls r2, r2, #5 +1000161a: 431a orrs r2, r3 +1000161c: 6010 str r0, [r2, #0] +1000161e: 6818 ldr r0, [r3, #0] +10001620: 4048 eors r0, r1 +10001622: 2103 movs r1, #3 +10001624: 4001 ands r1, r0 +10001626: 2002 movs r0, #2 +10001628: 6011 str r1, [r2, #0] +1000162a: 4966 ldr r1, [pc, #408] ; (100017c4 ) +1000162c: 688a ldr r2, [r1, #8] +1000162e: 4210 tst r0, r2 +10001630: d0fc beq.n 1000162c +10001632: 2280 movs r2, #128 ; 0x80 +10001634: 0192 lsls r2, r2, #6 +10001636: 4313 orrs r3, r2 +10001638: 2280 movs r2, #128 ; 0x80 +1000163a: 0112 lsls r2, r2, #4 +1000163c: 601a str r2, [r3, #0] +1000163e: 2280 movs r2, #128 ; 0x80 +10001640: 4b61 ldr r3, [pc, #388] ; (100017c8 ) +10001642: 0052 lsls r2, r2, #1 +10001644: 604a str r2, [r1, #4] +10001646: 6163 str r3, [r4, #20] +10001648: 4b60 ldr r3, [pc, #384] ; (100017cc ) +1000164a: 6859 ldr r1, [r3, #4] +1000164c: 29ff cmp r1, #255 ; 0xff +1000164e: d800 bhi.n 10001652 +10001650: 605a str r2, [r3, #4] +10001652: 2280 movs r2, #128 ; 0x80 +10001654: 4b5e ldr r3, [pc, #376] ; (100017d0 ) +10001656: 69e1 ldr r1, [r4, #28] +10001658: 0112 lsls r2, r2, #4 +1000165a: 4d5c ldr r5, [pc, #368] ; (100017cc ) +1000165c: 601a str r2, [r3, #0] +1000165e: 2900 cmp r1, #0 +10001660: d007 beq.n 10001672 +10001662: 6960 ldr r0, [r4, #20] +10001664: f000 fa24 bl 10001ab0 <__wrap___aeabi_uidiv> +10001668: 1c43 adds r3, r0, #1 +1000166a: 0058 lsls r0, r3, #1 +1000166c: 18c0 adds r0, r0, r3 +1000166e: 3803 subs r0, #3 +10001670: d2fd bcs.n 1000166e +10001672: 22e0 movs r2, #224 ; 0xe0 +10001674: 4955 ldr r1, [pc, #340] ; (100017cc ) +10001676: 680b ldr r3, [r1, #0] +10001678: 401a ands r2, r3 +1000167a: 2380 movs r3, #128 ; 0x80 +1000167c: 015b lsls r3, r3, #5 +1000167e: 432b orrs r3, r5 +10001680: 601a str r2, [r3, #0] +10001682: 2380 movs r3, #128 ; 0x80 +10001684: 2280 movs r2, #128 ; 0x80 +10001686: 019b lsls r3, r3, #6 +10001688: 432b orrs r3, r5 +1000168a: 0112 lsls r2, r2, #4 +1000168c: 601a str r2, [r3, #0] +1000168e: 2280 movs r2, #128 ; 0x80 +10001690: 4b41 ldr r3, [pc, #260] ; (10001798 ) +10001692: 0052 lsls r2, r2, #1 +10001694: 604a str r2, [r1, #4] +10001696: 61e3 str r3, [r4, #28] +10001698: 4b4e ldr r3, [pc, #312] ; (100017d4 ) +1000169a: 6859 ldr r1, [r3, #4] +1000169c: 29ff cmp r1, #255 ; 0xff +1000169e: d800 bhi.n 100016a2 +100016a0: 605a str r2, [r3, #4] +100016a2: 2280 movs r2, #128 ; 0x80 +100016a4: 4b4c ldr r3, [pc, #304] ; (100017d8 ) +100016a6: 6a21 ldr r1, [r4, #32] +100016a8: 0112 lsls r2, r2, #4 +100016aa: 4d4a ldr r5, [pc, #296] ; (100017d4 ) +100016ac: 601a str r2, [r3, #0] +100016ae: 2900 cmp r1, #0 +100016b0: d007 beq.n 100016c2 +100016b2: 6960 ldr r0, [r4, #20] +100016b4: f000 f9fc bl 10001ab0 <__wrap___aeabi_uidiv> +100016b8: 1c43 adds r3, r0, #1 +100016ba: 0058 lsls r0, r3, #1 +100016bc: 18c0 adds r0, r0, r3 +100016be: 3803 subs r0, #3 +100016c0: d2fd bcs.n 100016be +100016c2: 22e0 movs r2, #224 ; 0xe0 +100016c4: 4943 ldr r1, [pc, #268] ; (100017d4 ) +100016c6: 680b ldr r3, [r1, #0] +100016c8: 401a ands r2, r3 +100016ca: 2380 movs r3, #128 ; 0x80 +100016cc: 015b lsls r3, r3, #5 +100016ce: 432b orrs r3, r5 +100016d0: 601a str r2, [r3, #0] +100016d2: 2380 movs r3, #128 ; 0x80 +100016d4: 2280 movs r2, #128 ; 0x80 +100016d6: 019b lsls r3, r3, #6 +100016d8: 432b orrs r3, r5 +100016da: 0112 lsls r2, r2, #4 +100016dc: 601a str r2, [r3, #0] +100016de: 2380 movs r3, #128 ; 0x80 +100016e0: 2280 movs r2, #128 ; 0x80 +100016e2: 005b lsls r3, r3, #1 +100016e4: 604b str r3, [r1, #4] +100016e6: 4b2c ldr r3, [pc, #176] ; (10001798 ) +100016e8: 02d2 lsls r2, r2, #11 +100016ea: 6223 str r3, [r4, #32] +100016ec: 4b3b ldr r3, [pc, #236] ; (100017dc ) +100016ee: 6859 ldr r1, [r3, #4] +100016f0: 4291 cmp r1, r2 +100016f2: d200 bcs.n 100016f6 +100016f4: 605a str r2, [r3, #4] +100016f6: 2280 movs r2, #128 ; 0x80 +100016f8: 4b39 ldr r3, [pc, #228] ; (100017e0 ) +100016fa: 6a61 ldr r1, [r4, #36] ; 0x24 +100016fc: 0112 lsls r2, r2, #4 +100016fe: 4d37 ldr r5, [pc, #220] ; (100017dc ) +10001700: 601a str r2, [r3, #0] +10001702: 2900 cmp r1, #0 +10001704: d007 beq.n 10001716 +10001706: 6960 ldr r0, [r4, #20] +10001708: f000 f9d2 bl 10001ab0 <__wrap___aeabi_uidiv> +1000170c: 1c43 adds r3, r0, #1 +1000170e: 0058 lsls r0, r3, #1 +10001710: 18c0 adds r0, r0, r3 +10001712: 3803 subs r0, #3 +10001714: d2fd bcs.n 10001712 +10001716: 22e0 movs r2, #224 ; 0xe0 +10001718: 4930 ldr r1, [pc, #192] ; (100017dc ) +1000171a: 680b ldr r3, [r1, #0] +1000171c: 401a ands r2, r3 +1000171e: 2380 movs r3, #128 ; 0x80 +10001720: 015b lsls r3, r3, #5 +10001722: 432b orrs r3, r5 +10001724: 601a str r2, [r3, #0] +10001726: 2380 movs r3, #128 ; 0x80 +10001728: 2280 movs r2, #128 ; 0x80 +1000172a: 019b lsls r3, r3, #6 +1000172c: 432b orrs r3, r5 +1000172e: 0112 lsls r2, r2, #4 +10001730: 601a str r2, [r3, #0] +10001732: 2380 movs r3, #128 ; 0x80 +10001734: 02db lsls r3, r3, #11 +10001736: 604b str r3, [r1, #4] +10001738: 4b18 ldr r3, [pc, #96] ; (1000179c ) +1000173a: 6263 str r3, [r4, #36] ; 0x24 +1000173c: 4b29 ldr r3, [pc, #164] ; (100017e4 ) +1000173e: 685a ldr r2, [r3, #4] +10001740: 2aff cmp r2, #255 ; 0xff +10001742: d802 bhi.n 1000174a +10001744: 2280 movs r2, #128 ; 0x80 +10001746: 0052 lsls r2, r2, #1 +10001748: 605a str r2, [r3, #4] +1000174a: 2280 movs r2, #128 ; 0x80 +1000174c: 4b26 ldr r3, [pc, #152] ; (100017e8 ) +1000174e: 69a1 ldr r1, [r4, #24] +10001750: 0112 lsls r2, r2, #4 +10001752: 4d24 ldr r5, [pc, #144] ; (100017e4 ) +10001754: 601a str r2, [r3, #0] +10001756: 2900 cmp r1, #0 +10001758: d007 beq.n 1000176a +1000175a: 6960 ldr r0, [r4, #20] +1000175c: f000 f9a8 bl 10001ab0 <__wrap___aeabi_uidiv> +10001760: 1c43 adds r3, r0, #1 +10001762: 0058 lsls r0, r3, #1 +10001764: 18c0 adds r0, r0, r3 +10001766: 3803 subs r0, #3 +10001768: d2fd bcs.n 10001766 +1000176a: 22e0 movs r2, #224 ; 0xe0 +1000176c: 491d ldr r1, [pc, #116] ; (100017e4 ) +1000176e: 680b ldr r3, [r1, #0] +10001770: 401a ands r2, r3 +10001772: 2380 movs r3, #128 ; 0x80 +10001774: 015b lsls r3, r3, #5 +10001776: 432b orrs r3, r5 +10001778: 601a str r2, [r3, #0] +1000177a: 2380 movs r3, #128 ; 0x80 +1000177c: 2280 movs r2, #128 ; 0x80 +1000177e: 019b lsls r3, r3, #6 +10001780: 432b orrs r3, r5 +10001782: 0112 lsls r2, r2, #4 +10001784: 601a str r2, [r3, #0] +10001786: 2380 movs r3, #128 ; 0x80 +10001788: 005b lsls r3, r3, #1 +1000178a: 604b str r3, [r1, #4] +1000178c: 4b0e ldr r3, [pc, #56] ; (100017c8 ) +1000178e: 61a3 str r3, [r4, #24] +10001790: e6da b.n 10001548 +10001792: 46c0 nop ; (mov r8, r8) +10001794: 2000057c .word 0x2000057c +10001798: 02dc6c00 .word 0x02dc6c00 +1000179c: 0000b71b .word 0x0000b71b +100017a0: 40008000 .word 0x40008000 +100017a4: 4000b03c .word 0x4000b03c +100017a8: 4000b030 .word 0x4000b030 +100017ac: 59682f00 .word 0x59682f00 +100017b0: 40028000 .word 0x40028000 +100017b4: 47868c00 .word 0x47868c00 +100017b8: 4002c000 .word 0x4002c000 +100017bc: 40008030 .word 0x40008030 +100017c0: 00b71b00 .word 0x00b71b00 +100017c4: 4000803c .word 0x4000803c +100017c8: 07735940 .word 0x07735940 +100017cc: 40008054 .word 0x40008054 +100017d0: 4000b054 .word 0x4000b054 +100017d4: 40008060 .word 0x40008060 +100017d8: 4000b060 .word 0x4000b060 +100017dc: 4000806c .word 0x4000806c +100017e0: 4000b06c .word 0x4000b06c +100017e4: 40008048 .word 0x40008048 +100017e8: 4000b048 .word 0x4000b048 + +100017ec : +100017ec: b5f8 push {r3, r4, r5, r6, r7, lr} +100017ee: 0004 movs r4, r0 +100017f0: 4821 ldr r0, [pc, #132] ; (10001878 ) +100017f2: 001d movs r5, r3 +100017f4: 0017 movs r7, r2 +100017f6: 000e movs r6, r1 +100017f8: f000 f95a bl 10001ab0 <__wrap___aeabi_uidiv> +100017fc: 0001 movs r1, r0 +100017fe: 0038 movs r0, r7 +10001800: f000 f956 bl 10001ab0 <__wrap___aeabi_uidiv> +10001804: 9b06 ldr r3, [sp, #24] +10001806: 0429 lsls r1, r5, #16 +10001808: 031b lsls r3, r3, #12 +1000180a: 4319 orrs r1, r3 +1000180c: 6823 ldr r3, [r4, #0] +1000180e: 2b00 cmp r3, #0 +10001810: db20 blt.n 10001854 +10001812: 4b1a ldr r3, [pc, #104] ; (1000187c ) +10001814: 4d1a ldr r5, [pc, #104] ; (10001880 ) +10001816: 18e2 adds r2, r4, r3 +10001818: 4253 negs r3, r2 +1000181a: 415a adcs r2, r3 +1000181c: 2380 movs r3, #128 ; 0x80 +1000181e: 015b lsls r3, r3, #5 +10001820: 469c mov ip, r3 +10001822: 0312 lsls r2, r2, #12 +10001824: 4b17 ldr r3, [pc, #92] ; (10001884 ) +10001826: 4462 add r2, ip +10001828: 601a str r2, [r3, #0] +1000182a: 4b17 ldr r3, [pc, #92] ; (10001888 ) +1000182c: 601a str r2, [r3, #0] +1000182e: 0017 movs r7, r2 +10001830: 68ab ldr r3, [r5, #8] +10001832: 439f bics r7, r3 +10001834: d1fb bne.n 1000182e +10001836: 22c0 movs r2, #192 ; 0xc0 +10001838: 1d23 adds r3, r4, #4 +1000183a: 0192 lsls r2, r2, #6 +1000183c: 431a orrs r2, r3 +1000183e: 2321 movs r3, #33 ; 0x21 +10001840: 6026 str r6, [r4, #0] +10001842: 60a0 str r0, [r4, #8] +10001844: 6013 str r3, [r2, #0] +10001846: 6823 ldr r3, [r4, #0] +10001848: 2b00 cmp r3, #0 +1000184a: dafc bge.n 10001846 +1000184c: 2308 movs r3, #8 +1000184e: 60e1 str r1, [r4, #12] +10001850: 6013 str r3, [r2, #0] +10001852: bdf8 pop {r3, r4, r5, r6, r7, pc} +10001854: 233f movs r3, #63 ; 0x3f +10001856: 6822 ldr r2, [r4, #0] +10001858: 4013 ands r3, r2 +1000185a: 42b3 cmp r3, r6 +1000185c: d1d9 bne.n 10001812 +1000185e: 68a3 ldr r3, [r4, #8] +10001860: 051b lsls r3, r3, #20 +10001862: 0d1b lsrs r3, r3, #20 +10001864: 4283 cmp r3, r0 +10001866: d1d4 bne.n 10001812 +10001868: 22ee movs r2, #238 ; 0xee +1000186a: 68e3 ldr r3, [r4, #12] +1000186c: 02d2 lsls r2, r2, #11 +1000186e: 4013 ands r3, r2 +10001870: 428b cmp r3, r1 +10001872: d1ce bne.n 10001812 +10001874: e7ed b.n 10001852 +10001876: 46c0 nop ; (mov r8, r8) +10001878: 00b71b00 .word 0x00b71b00 +1000187c: bffd4000 .word 0xbffd4000 +10001880: 4000c000 .word 0x4000c000 +10001884: 4000e000 .word 0x4000e000 +10001888: 4000f000 .word 0x4000f000 + +1000188c : +1000188c: 2380 movs r3, #128 ; 0x80 +1000188e: 4a02 ldr r2, [pc, #8] ; (10001898 ) +10001890: 009b lsls r3, r3, #2 +10001892: 4303 orrs r3, r0 +10001894: 62d3 str r3, [r2, #44] ; 0x2c +10001896: 4770 bx lr +10001898: 40058000 .word 0x40058000 + +1000189c : +1000189c: 23aa movs r3, #170 ; 0xaa +1000189e: 4a06 ldr r2, [pc, #24] ; (100018b8 ) +100018a0: 011b lsls r3, r3, #4 +100018a2: 6013 str r3, [r2, #0] +100018a4: 232f movs r3, #47 ; 0x2f +100018a6: 4905 ldr r1, [pc, #20] ; (100018bc ) +100018a8: 60d3 str r3, [r2, #12] +100018aa: 4b05 ldr r3, [pc, #20] ; (100018c0 ) +100018ac: 6019 str r1, [r3, #0] +100018ae: 6853 ldr r3, [r2, #4] +100018b0: 2b00 cmp r3, #0 +100018b2: dafc bge.n 100018ae +100018b4: 4770 bx lr +100018b6: 46c0 nop ; (mov r8, r8) +100018b8: 40024000 .word 0x40024000 +100018bc: 00fab000 .word 0x00fab000 +100018c0: 40026000 .word 0x40026000 + +100018c4 : +100018c4: 4b2c ldr r3, [pc, #176] ; (10001978 ) +100018c6: 4a2d ldr r2, [pc, #180] ; (1000197c ) +100018c8: b570 push {r4, r5, r6, lr} +100018ca: 601a str r2, [r3, #0] +100018cc: 4a2c ldr r2, [pc, #176] ; (10001980 ) +100018ce: 4b2d ldr r3, [pc, #180] ; (10001984 ) +100018d0: 492d ldr r1, [pc, #180] ; (10001988 ) +100018d2: 601a str r2, [r3, #0] +100018d4: 0014 movs r4, r2 +100018d6: 688b ldr r3, [r1, #8] +100018d8: 439c bics r4, r3 +100018da: d1fb bne.n 100018d4 +100018dc: 4d2b ldr r5, [pc, #172] ; (1000198c ) +100018de: 4e2c ldr r6, [pc, #176] ; (10001990 ) +100018e0: 42b5 cmp r5, r6 +100018e2: d208 bcs.n 100018f6 +100018e4: 3e01 subs r6, #1 +100018e6: 1b76 subs r6, r6, r5 +100018e8: 08b6 lsrs r6, r6, #2 +100018ea: cd08 ldmia r5!, {r3} +100018ec: 4798 blx r3 +100018ee: 0023 movs r3, r4 +100018f0: 3401 adds r4, #1 +100018f2: 42b3 cmp r3, r6 +100018f4: d1f9 bne.n 100018ea +100018f6: f7ff fe11 bl 1000151c +100018fa: 4a26 ldr r2, [pc, #152] ; (10001994 ) +100018fc: 4b21 ldr r3, [pc, #132] ; (10001984 ) +100018fe: 601a str r2, [r3, #0] +10001900: 4a21 ldr r2, [pc, #132] ; (10001988 ) +10001902: 6893 ldr r3, [r2, #8] +10001904: 43db mvns r3, r3 +10001906: 01db lsls r3, r3, #7 +10001908: 09dd lsrs r5, r3, #7 +1000190a: 2b00 cmp r3, #0 +1000190c: d1f9 bne.n 10001902 +1000190e: 2240 movs r2, #64 ; 0x40 +10001910: 4b21 ldr r3, [pc, #132] ; (10001998 ) +10001912: 4c22 ldr r4, [pc, #136] ; (1000199c ) +10001914: 4e22 ldr r6, [pc, #136] ; (100019a0 ) +10001916: 679a str r2, [r3, #120] ; 0x78 +10001918: 675a str r2, [r3, #116] ; 0x74 +1000191a: 671a str r2, [r3, #112] ; 0x70 +1000191c: 66da str r2, [r3, #108] ; 0x6c +1000191e: 42b4 cmp r4, r6 +10001920: d208 bcs.n 10001934 +10001922: 6823 ldr r3, [r4, #0] +10001924: 0020 movs r0, r4 +10001926: 2b00 cmp r3, #0 +10001928: d020 beq.n 1000196c +1000192a: 3408 adds r4, #8 +1000192c: f7fe ff54 bl 100007d8 +10001930: 42b4 cmp r4, r6 +10001932: d3f6 bcc.n 10001922 +10001934: 4e1b ldr r6, [pc, #108] ; (100019a4 ) +10001936: 4c1c ldr r4, [pc, #112] ; (100019a8 ) +10001938: 22c0 movs r2, #192 ; 0xc0 +1000193a: 68a1 ldr r1, [r4, #8] +1000193c: 0030 movs r0, r6 +1000193e: f000 f9a7 bl 10001c90 <__wrap___aeabi_memcpy> +10001942: 60a6 str r6, [r4, #8] +10001944: f7fe fd90 bl 10000468 +10001948: f7fe ff1e bl 10000788 +1000194c: f7ff f8e2 bl 10000b14 +10001950: 4c16 ldr r4, [pc, #88] ; (100019ac ) +10001952: 4e17 ldr r6, [pc, #92] ; (100019b0 ) +10001954: 42b4 cmp r4, r6 +10001956: d208 bcs.n 1000196a +10001958: 3e01 subs r6, #1 +1000195a: 1b36 subs r6, r6, r4 +1000195c: 08b6 lsrs r6, r6, #2 +1000195e: cc08 ldmia r4!, {r3} +10001960: 4798 blx r3 +10001962: 002b movs r3, r5 +10001964: 3501 adds r5, #1 +10001966: 429e cmp r6, r3 +10001968: d1f9 bne.n 1000195e +1000196a: bd70 pop {r4, r5, r6, pc} +1000196c: 3408 adds r4, #8 +1000196e: f7fe ff25 bl 100007bc +10001972: 42b4 cmp r4, r6 +10001974: d3d5 bcc.n 10001922 +10001976: e7dd b.n 10001934 +10001978: 4000e000 .word 0x4000e000 +1000197c: fefbcdbf .word 0xfefbcdbf +10001980: 003c7ffe .word 0x003c7ffe +10001984: 4000f000 .word 0x4000f000 +10001988: 4000c000 .word 0x4000c000 +1000198c: 20000238 .word 0x20000238 +10001990: 20000248 .word 0x20000248 +10001994: 01ffffff .word 0x01ffffff +10001998: 4001f000 .word 0x4001f000 +1000199c: 20000230 .word 0x20000230 +100019a0: 20000238 .word 0x20000238 +100019a4: 20000000 .word 0x20000000 +100019a8: e000ed00 .word 0xe000ed00 +100019ac: 20000248 .word 0x20000248 +100019b0: 2000024c .word 0x2000024c + +100019b4 <_exit>: +100019b4: be00 bkpt 0x0000 +100019b6: e7fd b.n 100019b4 <_exit> + +100019b8 : +100019b8: b510 push {r4, lr} +100019ba: f7ff fffb bl 100019b4 <_exit> +100019be: 46c0 nop ; (mov r8, r8) + +100019c0 : +100019c0: b40f push {r0, r1, r2, r3} +100019c2: b500 push {lr} +100019c4: 4808 ldr r0, [pc, #32] ; (100019e8 ) +100019c6: b083 sub sp, #12 +100019c8: f000 fa94 bl 10001ef4 <__wrap_puts> +100019cc: 9b04 ldr r3, [sp, #16] +100019ce: 2b00 cmp r3, #0 +100019d0: d007 beq.n 100019e2 +100019d2: a905 add r1, sp, #20 +100019d4: 0018 movs r0, r3 +100019d6: 9101 str r1, [sp, #4] +100019d8: f000 f818 bl 10001a0c +100019dc: 4803 ldr r0, [pc, #12] ; (100019ec ) +100019de: f000 fa89 bl 10001ef4 <__wrap_puts> +100019e2: 2001 movs r0, #1 +100019e4: f7ff ffe6 bl 100019b4 <_exit> +100019e8: 10001fe4 .word 0x10001fe4 +100019ec: 10001ff4 .word 0x10001ff4 + +100019f0 : +100019f0: b510 push {r4, lr} +100019f2: 4801 ldr r0, [pc, #4] ; (100019f8 ) +100019f4: f7ff ffe4 bl 100019c0 +100019f8: 10001ff8 .word 0x10001ff8 + +100019fc <_out_char>: +100019fc: b510 push {r4, lr} +100019fe: 2800 cmp r0, #0 +10001a00: d100 bne.n 10001a04 <_out_char+0x8> +10001a02: bd10 pop {r4, pc} +10001a04: f000 fa2a bl 10001e5c <__wrap_putchar> +10001a08: e7fb b.n 10001a02 <_out_char+0x6> +10001a0a: 46c0 nop ; (mov r8, r8) + +10001a0c : +10001a0c: b510 push {r4, lr} +10001a0e: 4a09 ldr r2, [pc, #36] ; (10001a34 ) +10001a10: 0003 movs r3, r0 +10001a12: 6814 ldr r4, [r2, #0] +10001a14: b084 sub sp, #16 +10001a16: 2c00 cmp r4, #0 +10001a18: d008 beq.n 10001a2c +10001a1a: 2201 movs r2, #1 +10001a1c: 9100 str r1, [sp, #0] +10001a1e: 4806 ldr r0, [pc, #24] ; (10001a38 ) +10001a20: 4252 negs r2, r2 +10001a22: a903 add r1, sp, #12 +10001a24: 47a0 blx r4 +10001a26: 2001 movs r0, #1 +10001a28: b004 add sp, #16 +10001a2a: bd10 pop {r4, pc} +10001a2c: f000 fa62 bl 10001ef4 <__wrap_puts> +10001a30: 2000 movs r0, #0 +10001a32: e7f9 b.n 10001a28 +10001a34: 200005ec .word 0x200005ec +10001a38: 100019fd .word 0x100019fd + +10001a3c <__aeabi_bits_init>: +10001a3c: 4801 ldr r0, [pc, #4] ; (10001a44 <__aeabi_bits_init+0x8>) +10001a3e: 2104 movs r1, #4 +10001a40: 4b01 ldr r3, [pc, #4] ; (10001a48 <__aeabi_bits_init+0xc>) +10001a42: 4718 bx r3 +10001a44: 20000210 .word 0x20000210 +10001a48: 10001a6d .word 0x10001a6d + +10001a4c : +10001a4c: 2314 movs r3, #20 +10001a4e: b510 push {r4, lr} +10001a50: 0001 movs r1, r0 +10001a52: 8818 ldrh r0, [r3, #0] +10001a54: 3304 adds r3, #4 +10001a56: 881b ldrh r3, [r3, #0] +10001a58: 4798 blx r3 +10001a5a: bd10 pop {r4, pc} + +10001a5c : +10001a5c: 2316 movs r3, #22 +10001a5e: b510 push {r4, lr} +10001a60: 0001 movs r1, r0 +10001a62: 8818 ldrh r0, [r3, #0] +10001a64: 3302 adds r3, #2 +10001a66: 881b ldrh r3, [r3, #0] +10001a68: 4798 blx r3 +10001a6a: bd10 pop {r4, pc} + +10001a6c : +10001a6c: b5f8 push {r3, r4, r5, r6, r7, lr} +10001a6e: 4647 mov r7, r8 +10001a70: 46ce mov lr, r9 +10001a72: b580 push {r7, lr} +10001a74: 1e0f subs r7, r1, #0 +10001a76: d019 beq.n 10001aac +10001a78: 2314 movs r3, #20 +10001a7a: 4699 mov r9, r3 +10001a7c: 3304 adds r3, #4 +10001a7e: 0004 movs r4, r0 +10001a80: 2500 movs r5, #0 +10001a82: 2601 movs r6, #1 +10001a84: 4698 mov r8, r3 +10001a86: 464b mov r3, r9 +10001a88: 8818 ldrh r0, [r3, #0] +10001a8a: 4643 mov r3, r8 +10001a8c: 6821 ldr r1, [r4, #0] +10001a8e: 881b ldrh r3, [r3, #0] +10001a90: 4798 blx r3 +10001a92: c401 stmia r4!, {r0} +10001a94: 1e43 subs r3, r0, #1 +10001a96: 4198 sbcs r0, r3 +10001a98: 3501 adds r5, #1 +10001a9a: 4240 negs r0, r0 +10001a9c: 4006 ands r6, r0 +10001a9e: 42af cmp r7, r5 +10001aa0: d1f1 bne.n 10001a86 +10001aa2: 0030 movs r0, r6 +10001aa4: bcc0 pop {r6, r7} +10001aa6: 46b9 mov r9, r7 +10001aa8: 46b0 mov r8, r6 +10001aaa: bdf8 pop {r3, r4, r5, r6, r7, pc} +10001aac: 2601 movs r6, #1 +10001aae: e7f8 b.n 10001aa2 + +10001ab0 <__wrap___aeabi_uidiv>: +10001ab0: 4a11 ldr r2, [pc, #68] ; (10001af8 ) +10001ab2: 6f93 ldr r3, [r2, #120] ; 0x78 +10001ab4: 089b lsrs r3, r3, #2 +10001ab6: d213 bcs.n 10001ae0 + +10001ab8 : +10001ab8: 6610 str r0, [r2, #96] ; 0x60 +10001aba: 6651 str r1, [r2, #100] ; 0x64 +10001abc: 2900 cmp r1, #0 +10001abe: d005 beq.n 10001acc +10001ac0: e7ff b.n 10001ac2 +10001ac2: e7ff b.n 10001ac4 +10001ac4: e7ff b.n 10001ac6 +10001ac6: 6f51 ldr r1, [r2, #116] ; 0x74 +10001ac8: 6f10 ldr r0, [r2, #112] ; 0x70 +10001aca: 4770 bx lr +10001acc: b504 push {r2, lr} +10001ace: 2800 cmp r0, #0 +10001ad0: d001 beq.n 10001ad6 +10001ad2: 2000 movs r0, #0 +10001ad4: 43c0 mvns r0, r0 +10001ad6: f000 fa63 bl 10001fa0 <____aeabi_idiv0_veneer> +10001ada: 2100 movs r1, #0 +10001adc: bd04 pop {r2, pc} +10001ade: 46c0 nop ; (mov r8, r8) + +10001ae0 : +10001ae0: b5f0 push {r4, r5, r6, r7, lr} +10001ae2: 6e14 ldr r4, [r2, #96] ; 0x60 +10001ae4: 6e55 ldr r5, [r2, #100] ; 0x64 +10001ae6: 6f57 ldr r7, [r2, #116] ; 0x74 +10001ae8: 6f16 ldr r6, [r2, #112] ; 0x70 +10001aea: f7ff ffe5 bl 10001ab8 +10001aee: 6614 str r4, [r2, #96] ; 0x60 +10001af0: 6655 str r5, [r2, #100] ; 0x64 +10001af2: 6757 str r7, [r2, #116] ; 0x74 +10001af4: 6716 str r6, [r2, #112] ; 0x70 +10001af6: bdf0 pop {r4, r5, r6, r7, pc} +10001af8: d0000000 .word 0xd0000000 + +10001afc <__aeabi_double_init>: +10001afc: 2313 movs r3, #19 +10001afe: b570 push {r4, r5, r6, lr} +10001b00: 781d ldrb r5, [r3, #0] +10001b02: 2d01 cmp r5, #1 +10001b04: d015 beq.n 10001b32 <__aeabi_double_init+0x36> +10001b06: dd10 ble.n 10001b2a <__aeabi_double_init+0x2e> +10001b08: 481c ldr r0, [pc, #112] ; (10001b7c <__aeabi_double_init+0x80>) +10001b0a: f7ff ffa7 bl 10001a5c +10001b0e: 4c1c ldr r4, [pc, #112] ; (10001b80 <__aeabi_double_init+0x84>) +10001b10: 0001 movs r1, r0 +10001b12: 2280 movs r2, #128 ; 0x80 +10001b14: 0020 movs r0, r4 +10001b16: f000 f8bb bl 10001c90 <__wrap___aeabi_memcpy> +10001b1a: 2d02 cmp r5, #2 +10001b1c: d006 beq.n 10001b2c <__aeabi_double_init+0x30> +10001b1e: 4819 ldr r0, [pc, #100] ; (10001b84 <__aeabi_double_init+0x88>) +10001b20: f7ff ff94 bl 10001a4c +10001b24: 4b18 ldr r3, [pc, #96] ; (10001b88 <__aeabi_double_init+0x8c>) +10001b26: 6018 str r0, [r3, #0] +10001b28: bd70 pop {r4, r5, r6, pc} +10001b2a: 4c15 ldr r4, [pc, #84] ; (10001b80 <__aeabi_double_init+0x84>) +10001b2c: 4b17 ldr r3, [pc, #92] ; (10001b8c <__aeabi_double_init+0x90>) +10001b2e: 64a3 str r3, [r4, #72] ; 0x48 +10001b30: e7f5 b.n 10001b1e <__aeabi_double_init+0x22> +10001b32: 4b16 ldr r3, [pc, #88] ; (10001b8c <__aeabi_double_init+0x90>) +10001b34: 4c12 ldr r4, [pc, #72] ; (10001b80 <__aeabi_double_init+0x84>) +10001b36: 6023 str r3, [r4, #0] +10001b38: 6063 str r3, [r4, #4] +10001b3a: 60a3 str r3, [r4, #8] +10001b3c: 60e3 str r3, [r4, #12] +10001b3e: 6123 str r3, [r4, #16] +10001b40: 6163 str r3, [r4, #20] +10001b42: 61a3 str r3, [r4, #24] +10001b44: 61e3 str r3, [r4, #28] +10001b46: 6223 str r3, [r4, #32] +10001b48: 6263 str r3, [r4, #36] ; 0x24 +10001b4a: 62a3 str r3, [r4, #40] ; 0x28 +10001b4c: 62e3 str r3, [r4, #44] ; 0x2c +10001b4e: 6323 str r3, [r4, #48] ; 0x30 +10001b50: 6363 str r3, [r4, #52] ; 0x34 +10001b52: 63a3 str r3, [r4, #56] ; 0x38 +10001b54: 63e3 str r3, [r4, #60] ; 0x3c +10001b56: 6423 str r3, [r4, #64] ; 0x40 +10001b58: 6463 str r3, [r4, #68] ; 0x44 +10001b5a: 64a3 str r3, [r4, #72] ; 0x48 +10001b5c: 64e3 str r3, [r4, #76] ; 0x4c +10001b5e: 6523 str r3, [r4, #80] ; 0x50 +10001b60: 6563 str r3, [r4, #84] ; 0x54 +10001b62: 65a3 str r3, [r4, #88] ; 0x58 +10001b64: 65e3 str r3, [r4, #92] ; 0x5c +10001b66: 6623 str r3, [r4, #96] ; 0x60 +10001b68: 6663 str r3, [r4, #100] ; 0x64 +10001b6a: 66a3 str r3, [r4, #104] ; 0x68 +10001b6c: 66e3 str r3, [r4, #108] ; 0x6c +10001b6e: 6723 str r3, [r4, #112] ; 0x70 +10001b70: 6763 str r3, [r4, #116] ; 0x74 +10001b72: 67a3 str r3, [r4, #120] ; 0x78 +10001b74: 67e3 str r3, [r4, #124] ; 0x7c +10001b76: 64a3 str r3, [r4, #72] ; 0x48 +10001b78: e7d1 b.n 10001b1e <__aeabi_double_init+0x22> +10001b7a: 46c0 nop ; (mov r8, r8) +10001b7c: 00004453 .word 0x00004453 +10001b80: 20000350 .word 0x20000350 +10001b84: 0000334c .word 0x0000334c +10001b88: 20000600 .word 0x20000600 +10001b8c: 10001b91 .word 0x10001b91 + +10001b90 : +10001b90: b507 push {r0, r1, r2, lr} +10001b92: 4660 mov r0, ip +10001b94: 8801 ldrh r1, [r0, #0] +10001b96: 0a0a lsrs r2, r1, #8 +10001b98: 3002 adds r0, #2 +10001b9a: 2adf cmp r2, #223 ; 0xdf +10001b9c: d1fa bne.n 10001b94 +10001b9e: b2c9 uxtb r1, r1 +10001ba0: 0882 lsrs r2, r0, #2 +10001ba2: d304 bcc.n 10001bae +10001ba4: 8802 ldrh r2, [r0, #0] +10001ba6: 8840 ldrh r0, [r0, #2] +10001ba8: 0400 lsls r0, r0, #16 +10001baa: 4310 orrs r0, r2 +10001bac: e000 b.n 10001bb0 +10001bae: 6800 ldr r0, [r0, #0] +10001bb0: 4a01 ldr r2, [pc, #4] ; (10001bb8 ) +10001bb2: 5050 str r0, [r2, r1] +10001bb4: 9003 str r0, [sp, #12] +10001bb6: bd07 pop {r0, r1, r2, pc} +10001bb8: 20000350 .word 0x20000350 + +10001bbc <__wrap___aeabi_lmul>: +10001bbc: 4351 muls r1, r2 +10001bbe: 4343 muls r3, r0 +10001bc0: 18c9 adds r1, r1, r3 +10001bc2: 468c mov ip, r1 +10001bc4: 0c11 lsrs r1, r2, #16 +10001bc6: b283 uxth r3, r0 +10001bc8: 434b muls r3, r1 +10001bca: b410 push {r4} +10001bcc: 0c04 lsrs r4, r0, #16 +10001bce: 4361 muls r1, r4 +10001bd0: b292 uxth r2, r2 +10001bd2: b280 uxth r0, r0 +10001bd4: 4350 muls r0, r2 +10001bd6: 4362 muls r2, r4 +10001bd8: 041c lsls r4, r3, #16 +10001bda: 0c1b lsrs r3, r3, #16 +10001bdc: 1900 adds r0, r0, r4 +10001bde: bc10 pop {r4} +10001be0: 4159 adcs r1, r3 +10001be2: 0413 lsls r3, r2, #16 +10001be4: 0c12 lsrs r2, r2, #16 +10001be6: 18c0 adds r0, r0, r3 +10001be8: 4151 adcs r1, r2 +10001bea: 4461 add r1, ip +10001bec: 4770 bx lr + ... + +10001bf0 <__aeabi_float_init>: +10001bf0: 2313 movs r3, #19 +10001bf2: b510 push {r4, lr} +10001bf4: 4812 ldr r0, [pc, #72] ; (10001c40 <__aeabi_float_init+0x50>) +10001bf6: 781c ldrb r4, [r3, #0] +10001bf8: f7ff ff30 bl 10001a5c +10001bfc: 0001 movs r1, r0 +10001bfe: 2c01 cmp r4, #1 +10001c00: d00a beq.n 10001c18 <__aeabi_float_init+0x28> +10001c02: dd03 ble.n 10001c0c <__aeabi_float_init+0x1c> +10001c04: 2280 movs r2, #128 ; 0x80 +10001c06: 480f ldr r0, [pc, #60] ; (10001c44 <__aeabi_float_init+0x54>) +10001c08: f000 f842 bl 10001c90 <__wrap___aeabi_memcpy> +10001c0c: 480e ldr r0, [pc, #56] ; (10001c48 <__aeabi_float_init+0x58>) +10001c0e: f7ff ff1d bl 10001a4c +10001c12: 4b0e ldr r3, [pc, #56] ; (10001c4c <__aeabi_float_init+0x5c>) +10001c14: 6018 str r0, [r3, #0] +10001c16: bd10 pop {r4, pc} +10001c18: 4c0a ldr r4, [pc, #40] ; (10001c44 <__aeabi_float_init+0x54>) +10001c1a: 2254 movs r2, #84 ; 0x54 +10001c1c: 0020 movs r0, r4 +10001c1e: f000 f837 bl 10001c90 <__wrap___aeabi_memcpy> +10001c22: 4b0b ldr r3, [pc, #44] ; (10001c50 <__aeabi_float_init+0x60>) +10001c24: 6563 str r3, [r4, #84] ; 0x54 +10001c26: 65a3 str r3, [r4, #88] ; 0x58 +10001c28: 65e3 str r3, [r4, #92] ; 0x5c +10001c2a: 6623 str r3, [r4, #96] ; 0x60 +10001c2c: 6663 str r3, [r4, #100] ; 0x64 +10001c2e: 66a3 str r3, [r4, #104] ; 0x68 +10001c30: 66e3 str r3, [r4, #108] ; 0x6c +10001c32: 6723 str r3, [r4, #112] ; 0x70 +10001c34: 6763 str r3, [r4, #116] ; 0x74 +10001c36: 67a3 str r3, [r4, #120] ; 0x78 +10001c38: 67e3 str r3, [r4, #124] ; 0x7c +10001c3a: 6223 str r3, [r4, #32] +10001c3c: 61e3 str r3, [r4, #28] +10001c3e: e7e5 b.n 10001c0c <__aeabi_float_init+0x1c> +10001c40: 00004653 .word 0x00004653 +10001c44: 20000450 .word 0x20000450 +10001c48: 0000334c .word 0x0000334c +10001c4c: 20000600 .word 0x20000600 +10001c50: 10001c55 .word 0x10001c55 + +10001c54 : +10001c54: b507 push {r0, r1, r2, lr} +10001c56: 4660 mov r0, ip +10001c58: 8801 ldrh r1, [r0, #0] +10001c5a: 0a0a lsrs r2, r1, #8 +10001c5c: 3002 adds r0, #2 +10001c5e: 2adf cmp r2, #223 ; 0xdf +10001c60: d1fa bne.n 10001c58 +10001c62: b2c9 uxtb r1, r1 +10001c64: 0882 lsrs r2, r0, #2 +10001c66: d304 bcc.n 10001c72 +10001c68: 8802 ldrh r2, [r0, #0] +10001c6a: 8840 ldrh r0, [r0, #2] +10001c6c: 0400 lsls r0, r0, #16 +10001c6e: 4310 orrs r0, r2 +10001c70: e000 b.n 10001c74 +10001c72: 6800 ldr r0, [r0, #0] +10001c74: 4a01 ldr r2, [pc, #4] ; (10001c7c ) +10001c76: 5050 str r0, [r2, r1] +10001c78: 9003 str r0, [sp, #12] +10001c7a: bd07 pop {r0, r1, r2, pc} +10001c7c: 20000450 .word 0x20000450 + +10001c80 <__aeabi_mem_init>: +10001c80: 4801 ldr r0, [pc, #4] ; (10001c88 <__aeabi_mem_init+0x8>) +10001c82: 2104 movs r1, #4 +10001c84: 4b01 ldr r3, [pc, #4] ; (10001c8c <__aeabi_mem_init+0xc>) +10001c86: 4718 bx r3 +10001c88: 20000220 .word 0x20000220 +10001c8c: 10001a6d .word 0x10001a6d + +10001c90 <__wrap___aeabi_memcpy>: +10001c90: 4b01 ldr r3, [pc, #4] ; (10001c98 <__wrap___aeabi_memcpy+0x8>) +10001c92: 685b ldr r3, [r3, #4] +10001c94: 4718 bx r3 +10001c96: 0000 .short 0x0000 +10001c98: 20000220 .word 0x20000220 + +10001c9c : +10001c9c: 0003 movs r3, r0 +10001c9e: b510 push {r4, lr} +10001ca0: 0008 movs r0, r1 +10001ca2: 0011 movs r1, r2 +10001ca4: 681b ldr r3, [r3, #0] +10001ca6: 4798 blx r3 +10001ca8: bd10 pop {r4, pc} +10001caa: 46c0 nop ; (mov r8, r8) + +10001cac : +10001cac: b5f0 push {r4, r5, r6, r7, lr} +10001cae: 4646 mov r6, r8 +10001cb0: 464f mov r7, r9 +10001cb2: 46d6 mov lr, sl +10001cb4: b5c0 push {r6, r7, lr} +10001cb6: 7d43 ldrb r3, [r0, #21] +10001cb8: 4680 mov r8, r0 +10001cba: 000e movs r6, r1 +10001cbc: 0017 movs r7, r2 +10001cbe: 2b00 cmp r3, #0 +10001cc0: d046 beq.n 10001d50 +10001cc2: 2a00 cmp r2, #0 +10001cc4: dd3f ble.n 10001d46 +10001cc6: 1e4b subs r3, r1, #1 +10001cc8: 4699 mov r9, r3 +10001cca: 4b24 ldr r3, [pc, #144] ; (10001d5c ) +10001ccc: 2501 movs r5, #1 +10001cce: 2400 movs r4, #0 +10001cd0: 2000 movs r0, #0 +10001cd2: 469a mov sl, r3 +10001cd4: e00d b.n 10001cf2 +10001cd6: 464b mov r3, r9 +10001cd8: 5d1b ldrb r3, [r3, r4] +10001cda: 3b0d subs r3, #13 +10001cdc: 425a negs r2, r3 +10001cde: 4153 adcs r3, r2 +10001ce0: 5d32 ldrb r2, [r6, r4] +10001ce2: b2db uxtb r3, r3 +10001ce4: 2a0a cmp r2, #10 +10001ce6: d00b beq.n 10001d00 +10001ce8: 002b movs r3, r5 +10001cea: 3401 adds r4, #1 +10001cec: 3501 adds r5, #1 +10001cee: 429f cmp r7, r3 +10001cf0: dd1a ble.n 10001d28 +10001cf2: 2c00 cmp r4, #0 +10001cf4: d1ef bne.n 10001cd6 +10001cf6: 4643 mov r3, r8 +10001cf8: 5d32 ldrb r2, [r6, r4] +10001cfa: 7d1b ldrb r3, [r3, #20] +10001cfc: 2a0a cmp r2, #10 +10001cfe: d1f3 bne.n 10001ce8 +10001d00: 2b00 cmp r3, #0 +10001d02: d1f1 bne.n 10001ce8 +10001d04: 42a0 cmp r0, r4 +10001d06: da04 bge.n 10001d12 +10001d08: 4643 mov r3, r8 +10001d0a: 1a21 subs r1, r4, r0 +10001d0c: 681b ldr r3, [r3, #0] +10001d0e: 1830 adds r0, r6, r0 +10001d10: 4798 blx r3 +10001d12: 4643 mov r3, r8 +10001d14: 4650 mov r0, sl +10001d16: 681b ldr r3, [r3, #0] +10001d18: 2102 movs r1, #2 +10001d1a: 4798 blx r3 +10001d1c: 3401 adds r4, #1 +10001d1e: 0028 movs r0, r5 +10001d20: 002b movs r3, r5 +10001d22: 3501 adds r5, #1 +10001d24: 429f cmp r7, r3 +10001d26: dce4 bgt.n 10001cf2 +10001d28: 4287 cmp r7, r0 +10001d2a: dd04 ble.n 10001d36 +10001d2c: 4643 mov r3, r8 +10001d2e: 1a39 subs r1, r7, r0 +10001d30: 681b ldr r3, [r3, #0] +10001d32: 1830 adds r0, r6, r0 +10001d34: 4798 blx r3 +10001d36: 19f6 adds r6, r6, r7 +10001d38: 3e01 subs r6, #1 +10001d3a: 7833 ldrb r3, [r6, #0] +10001d3c: 3b0d subs r3, #13 +10001d3e: 425a negs r2, r3 +10001d40: 4153 adcs r3, r2 +10001d42: 4642 mov r2, r8 +10001d44: 7513 strb r3, [r2, #20] +10001d46: bce0 pop {r5, r6, r7} +10001d48: 46ba mov sl, r7 +10001d4a: 46b1 mov r9, r6 +10001d4c: 46a8 mov r8, r5 +10001d4e: bdf0 pop {r4, r5, r6, r7, pc} +10001d50: 6803 ldr r3, [r0, #0] +10001d52: 0011 movs r1, r2 +10001d54: 0030 movs r0, r6 +10001d56: 4798 blx r3 +10001d58: e7f5 b.n 10001d46 +10001d5a: 46c0 nop ; (mov r8, r8) +10001d5c: 100020bc .word 0x100020bc + +10001d60 : +10001d60: b5f0 push {r4, r5, r6, r7, lr} +10001d62: 46de mov lr, fp +10001d64: 4657 mov r7, sl +10001d66: 464e mov r6, r9 +10001d68: 4645 mov r5, r8 +10001d6a: b5e0 push {r5, r6, r7, lr} +10001d6c: b085 sub sp, #20 +10001d6e: 0017 movs r7, r2 +10001d70: 001c movs r4, r3 +10001d72: 0006 movs r6, r0 +10001d74: 000d movs r5, r1 +10001d76: f7ff f90f bl 10000f98 +10001d7a: 2300 movs r3, #0 +10001d7c: 4a30 ldr r2, [pc, #192] ; (10001e40 ) +10001d7e: 1812 adds r2, r2, r0 +10001d80: 414b adcs r3, r1 +10001d82: 2b00 cmp r3, #0 +10001d84: db58 blt.n 10001e38 +10001d86: 492f ldr r1, [pc, #188] ; (10001e44 ) +10001d88: 0008 movs r0, r1 +10001d8a: 468a mov sl, r1 +10001d8c: f000 f910 bl 10001fb0 <__mutex_try_enter_block_until_veneer> +10001d90: 9001 str r0, [sp, #4] +10001d92: 1c6b adds r3, r5, #1 +10001d94: d103 bne.n 10001d9e +10001d96: 0030 movs r0, r6 +10001d98: f000 f8ca bl 10001f30 +10001d9c: 0005 movs r5, r0 +10001d9e: 2c00 cmp r4, #0 +10001da0: d125 bne.n 10001dee +10001da2: 4b29 ldr r3, [pc, #164] ; (10001e48 ) +10001da4: 4698 mov r8, r3 +10001da6: 4b29 ldr r3, [pc, #164] ; (10001e4c ) +10001da8: 681c ldr r4, [r3, #0] +10001daa: 2c00 cmp r4, #0 +10001dac: d015 beq.n 10001dda +10001dae: 2f00 cmp r7, #0 +10001db0: d120 bne.n 10001df4 +10001db2: 4f27 ldr r7, [pc, #156] ; (10001e50 ) +10001db4: e002 b.n 10001dbc +10001db6: 6924 ldr r4, [r4, #16] +10001db8: 2c00 cmp r4, #0 +10001dba: d00e beq.n 10001dda +10001dbc: 6823 ldr r3, [r4, #0] +10001dbe: 2b00 cmp r3, #0 +10001dc0: d0f9 beq.n 10001db6 +10001dc2: 683b ldr r3, [r7, #0] +10001dc4: 2b00 cmp r3, #0 +10001dc6: d001 beq.n 10001dcc +10001dc8: 42a3 cmp r3, r4 +10001dca: d1f4 bne.n 10001db6 +10001dcc: 0020 movs r0, r4 +10001dce: 002a movs r2, r5 +10001dd0: 0031 movs r1, r6 +10001dd2: 47c0 blx r8 +10001dd4: 6924 ldr r4, [r4, #16] +10001dd6: 2c00 cmp r4, #0 +10001dd8: d1f0 bne.n 10001dbc +10001dda: 9b01 ldr r3, [sp, #4] +10001ddc: 2b00 cmp r3, #0 +10001dde: d127 bne.n 10001e30 +10001de0: b005 add sp, #20 +10001de2: bcf0 pop {r4, r5, r6, r7} +10001de4: 46bb mov fp, r7 +10001de6: 46b2 mov sl, r6 +10001de8: 46a9 mov r9, r5 +10001dea: 46a0 mov r8, r4 +10001dec: bdf0 pop {r4, r5, r6, r7, pc} +10001dee: 4b19 ldr r3, [pc, #100] ; (10001e54 ) +10001df0: 4698 mov r8, r3 +10001df2: e7d8 b.n 10001da6 +10001df4: 4b16 ldr r3, [pc, #88] ; (10001e50 ) +10001df6: 4699 mov r9, r3 +10001df8: ab02 add r3, sp, #8 +10001dfa: 1ddf adds r7, r3, #7 +10001dfc: 230a movs r3, #10 +10001dfe: 469b mov fp, r3 +10001e00: e002 b.n 10001e08 +10001e02: 6924 ldr r4, [r4, #16] +10001e04: 2c00 cmp r4, #0 +10001e06: d0e8 beq.n 10001dda +10001e08: 6823 ldr r3, [r4, #0] +10001e0a: 2b00 cmp r3, #0 +10001e0c: d0f9 beq.n 10001e02 +10001e0e: 464b mov r3, r9 +10001e10: 681b ldr r3, [r3, #0] +10001e12: 2b00 cmp r3, #0 +10001e14: d001 beq.n 10001e1a +10001e16: 42a3 cmp r3, r4 +10001e18: d1f3 bne.n 10001e02 +10001e1a: 002a movs r2, r5 +10001e1c: 0031 movs r1, r6 +10001e1e: 0020 movs r0, r4 +10001e20: 47c0 blx r8 +10001e22: 465b mov r3, fp +10001e24: 2201 movs r2, #1 +10001e26: 0039 movs r1, r7 +10001e28: 0020 movs r0, r4 +10001e2a: 703b strb r3, [r7, #0] +10001e2c: 47c0 blx r8 +10001e2e: e7e8 b.n 10001e02 +10001e30: 4650 mov r0, sl +10001e32: f000 f8ad bl 10001f90 <__mutex_exit_veneer> +10001e36: e7d3 b.n 10001de0 +10001e38: 2201 movs r2, #1 +10001e3a: 4b07 ldr r3, [pc, #28] ; (10001e58 ) +10001e3c: 4252 negs r2, r2 +10001e3e: e7a2 b.n 10001d86 +10001e40: 000f4240 .word 0x000f4240 +10001e44: 20000230 .word 0x20000230 +10001e48: 10001cad .word 0x10001cad +10001e4c: 200005e4 .word 0x200005e4 +10001e50: 200005e8 .word 0x200005e8 +10001e54: 10001c9d .word 0x10001c9d +10001e58: 7fffffff .word 0x7fffffff + +10001e5c <__wrap_putchar>: +10001e5c: b5f0 push {r4, r5, r6, r7, lr} +10001e5e: 46ce mov lr, r9 +10001e60: 4647 mov r7, r8 +10001e62: b580 push {r7, lr} +10001e64: b083 sub sp, #12 +10001e66: 466b mov r3, sp +10001e68: 0006 movs r6, r0 +10001e6a: 1ddd adds r5, r3, #7 +10001e6c: 7028 strb r0, [r5, #0] +10001e6e: f7ff f893 bl 10000f98 +10001e72: 2300 movs r3, #0 +10001e74: 4a1a ldr r2, [pc, #104] ; (10001ee0 <__wrap_putchar+0x84>) +10001e76: 1812 adds r2, r2, r0 +10001e78: 414b adcs r3, r1 +10001e7a: 2b00 cmp r3, #0 +10001e7c: db2b blt.n 10001ed6 <__wrap_putchar+0x7a> +10001e7e: 4919 ldr r1, [pc, #100] ; (10001ee4 <__wrap_putchar+0x88>) +10001e80: 0008 movs r0, r1 +10001e82: 4688 mov r8, r1 +10001e84: f000 f894 bl 10001fb0 <__mutex_try_enter_block_until_veneer> +10001e88: 4b17 ldr r3, [pc, #92] ; (10001ee8 <__wrap_putchar+0x8c>) +10001e8a: 4681 mov r9, r0 +10001e8c: 681c ldr r4, [r3, #0] +10001e8e: 2c00 cmp r4, #0 +10001e90: d014 beq.n 10001ebc <__wrap_putchar+0x60> +10001e92: 4f16 ldr r7, [pc, #88] ; (10001eec <__wrap_putchar+0x90>) +10001e94: e002 b.n 10001e9c <__wrap_putchar+0x40> +10001e96: 6924 ldr r4, [r4, #16] +10001e98: 2c00 cmp r4, #0 +10001e9a: d00f beq.n 10001ebc <__wrap_putchar+0x60> +10001e9c: 6823 ldr r3, [r4, #0] +10001e9e: 2b00 cmp r3, #0 +10001ea0: d0f9 beq.n 10001e96 <__wrap_putchar+0x3a> +10001ea2: 683b ldr r3, [r7, #0] +10001ea4: 2b00 cmp r3, #0 +10001ea6: d001 beq.n 10001eac <__wrap_putchar+0x50> +10001ea8: 42a3 cmp r3, r4 +10001eaa: d1f4 bne.n 10001e96 <__wrap_putchar+0x3a> +10001eac: 0020 movs r0, r4 +10001eae: 2201 movs r2, #1 +10001eb0: 0029 movs r1, r5 +10001eb2: f7ff fefb bl 10001cac +10001eb6: 6924 ldr r4, [r4, #16] +10001eb8: 2c00 cmp r4, #0 +10001eba: d1ef bne.n 10001e9c <__wrap_putchar+0x40> +10001ebc: 464b mov r3, r9 +10001ebe: 2b00 cmp r3, #0 +10001ec0: d105 bne.n 10001ece <__wrap_putchar+0x72> +10001ec2: 0030 movs r0, r6 +10001ec4: b003 add sp, #12 +10001ec6: bcc0 pop {r6, r7} +10001ec8: 46b9 mov r9, r7 +10001eca: 46b0 mov r8, r6 +10001ecc: bdf0 pop {r4, r5, r6, r7, pc} +10001ece: 4640 mov r0, r8 +10001ed0: f000 f85e bl 10001f90 <__mutex_exit_veneer> +10001ed4: e7f5 b.n 10001ec2 <__wrap_putchar+0x66> +10001ed6: 2201 movs r2, #1 +10001ed8: 4b05 ldr r3, [pc, #20] ; (10001ef0 <__wrap_putchar+0x94>) +10001eda: 4252 negs r2, r2 +10001edc: e7cf b.n 10001e7e <__wrap_putchar+0x22> +10001ede: 46c0 nop ; (mov r8, r8) +10001ee0: 000f4240 .word 0x000f4240 +10001ee4: 20000230 .word 0x20000230 +10001ee8: 200005e4 .word 0x200005e4 +10001eec: 200005e8 .word 0x200005e8 +10001ef0: 7fffffff .word 0x7fffffff + +10001ef4 <__wrap_puts>: +10001ef4: b570 push {r4, r5, r6, lr} +10001ef6: 0004 movs r4, r0 +10001ef8: f000 f81a bl 10001f30 +10001efc: 2300 movs r3, #0 +10001efe: 0001 movs r1, r0 +10001f00: 0005 movs r5, r0 +10001f02: 2201 movs r2, #1 +10001f04: 0020 movs r0, r4 +10001f06: f7ff ff2b bl 10001d60 +10001f0a: 4b08 ldr r3, [pc, #32] ; (10001f2c <__wrap_puts+0x38>) +10001f0c: 681c ldr r4, [r3, #0] +10001f0e: 2c00 cmp r4, #0 +10001f10: d006 beq.n 10001f20 <__wrap_puts+0x2c> +10001f12: 6863 ldr r3, [r4, #4] +10001f14: 2b00 cmp r3, #0 +10001f16: d005 beq.n 10001f24 <__wrap_puts+0x30> +10001f18: 4798 blx r3 +10001f1a: 6924 ldr r4, [r4, #16] +10001f1c: 2c00 cmp r4, #0 +10001f1e: d1f8 bne.n 10001f12 <__wrap_puts+0x1e> +10001f20: 0028 movs r0, r5 +10001f22: bd70 pop {r4, r5, r6, pc} +10001f24: 6924 ldr r4, [r4, #16] +10001f26: 2c00 cmp r4, #0 +10001f28: d1f3 bne.n 10001f12 <__wrap_puts+0x1e> +10001f2a: e7f9 b.n 10001f20 <__wrap_puts+0x2c> +10001f2c: 200005e4 .word 0x200005e4 + +10001f30 : +10001f30: b510 push {r4, lr} +10001f32: 0783 lsls r3, r0, #30 +10001f34: d00a beq.n 10001f4c +10001f36: 0003 movs r3, r0 +10001f38: 2103 movs r1, #3 +10001f3a: e002 b.n 10001f42 +10001f3c: 3301 adds r3, #1 +10001f3e: 420b tst r3, r1 +10001f40: d005 beq.n 10001f4e +10001f42: 781a ldrb r2, [r3, #0] +10001f44: 2a00 cmp r2, #0 +10001f46: d1f9 bne.n 10001f3c +10001f48: 1a18 subs r0, r3, r0 +10001f4a: bd10 pop {r4, pc} +10001f4c: 0003 movs r3, r0 +10001f4e: 6819 ldr r1, [r3, #0] +10001f50: 4a0c ldr r2, [pc, #48] ; (10001f84 ) +10001f52: 4c0d ldr r4, [pc, #52] ; (10001f88 ) +10001f54: 188a adds r2, r1, r2 +10001f56: 438a bics r2, r1 +10001f58: 4222 tst r2, r4 +10001f5a: d10f bne.n 10001f7c +10001f5c: 6859 ldr r1, [r3, #4] +10001f5e: 4a09 ldr r2, [pc, #36] ; (10001f84 ) +10001f60: 3304 adds r3, #4 +10001f62: 188a adds r2, r1, r2 +10001f64: 438a bics r2, r1 +10001f66: 4222 tst r2, r4 +10001f68: d108 bne.n 10001f7c +10001f6a: 6859 ldr r1, [r3, #4] +10001f6c: 4a05 ldr r2, [pc, #20] ; (10001f84 ) +10001f6e: 3304 adds r3, #4 +10001f70: 188a adds r2, r1, r2 +10001f72: 438a bics r2, r1 +10001f74: 4222 tst r2, r4 +10001f76: d0f1 beq.n 10001f5c +10001f78: e000 b.n 10001f7c +10001f7a: 3301 adds r3, #1 +10001f7c: 781a ldrb r2, [r3, #0] +10001f7e: 2a00 cmp r2, #0 +10001f80: d1fb bne.n 10001f7a +10001f82: e7e1 b.n 10001f48 +10001f84: fefefeff .word 0xfefefeff +10001f88: 80808080 .word 0x80808080 + +10001f8c <_fini>: +10001f8c: b5f8 push {r3, r4, r5, r6, r7, lr} +10001f8e: 46c0 nop ; (mov r8, r8) + +10001f90 <__mutex_exit_veneer>: +10001f90: b401 push {r0} +10001f92: 4802 ldr r0, [pc, #8] ; (10001f9c <__mutex_exit_veneer+0xc>) +10001f94: 4684 mov ip, r0 +10001f96: bc01 pop {r0} +10001f98: 4760 bx ip +10001f9a: bf00 nop +10001f9c: 2000015d .word 0x2000015d + +10001fa0 <____aeabi_idiv0_veneer>: +10001fa0: b401 push {r0} +10001fa2: 4802 ldr r0, [pc, #8] ; (10001fac <____aeabi_idiv0_veneer+0xc>) +10001fa4: 4684 mov ip, r0 +10001fa6: bc01 pop {r0} +10001fa8: 4760 bx ip +10001faa: bf00 nop +10001fac: 20000185 .word 0x20000185 + +10001fb0 <__mutex_try_enter_block_until_veneer>: +10001fb0: b401 push {r0} +10001fb2: 4802 ldr r0, [pc, #8] ; (10001fbc <__mutex_try_enter_block_until_veneer+0xc>) +10001fb4: 4684 mov ip, r0 +10001fb6: bc01 pop {r0} +10001fb8: 4760 bx ip +10001fba: bf00 nop +10001fbc: 200000c1 .word 0x200000c1 + +Disassembly of section .data: + +200000c0 : +200000c0: b5f0 push {r4, r5, r6, r7, lr} +200000c2: 46c6 mov lr, r8 +200000c4: 0015 movs r5, r2 +200000c6: b500 push {lr} +200000c8: 0004 movs r4, r0 +200000ca: 001e movs r6, r3 +200000cc: 6802 ldr r2, [r0, #0] +200000ce: f3ef 8110 mrs r1, PRIMASK +200000d2: b672 cpsid i +200000d4: 6813 ldr r3, [r2, #0] +200000d6: 2b00 cmp r3, #0 +200000d8: d0fc beq.n 200000d4 +200000da: f3bf 8f5f dmb sy +200000de: 2304 movs r3, #4 +200000e0: 56e3 ldrsb r3, [r4, r3] +200000e2: 2b00 cmp r3, #0 +200000e4: db2d blt.n 20000142 +200000e6: 6822 ldr r2, [r4, #0] +200000e8: f3bf 8f5f dmb sy +200000ec: 2000 movs r0, #0 +200000ee: 6010 str r0, [r2, #0] +200000f0: f381 8810 msr PRIMASK, r1 +200000f4: 22d0 movs r2, #208 ; 0xd0 +200000f6: 0612 lsls r2, r2, #24 +200000f8: 7812 ldrb r2, [r2, #0] +200000fa: b252 sxtb r2, r2 +200000fc: 4690 mov r8, r2 +200000fe: 429a cmp r2, r3 +20000100: d103 bne.n 2000010a +20000102: 2000 movs r0, #0 +20000104: bc80 pop {r7} +20000106: 46b8 mov r8, r7 +20000108: bdf0 pop {r4, r5, r6, r7, pc} +2000010a: 2700 movs r7, #0 +2000010c: e00b b.n 20000126 +2000010e: 6823 ldr r3, [r4, #0] +20000110: f3bf 8f5f dmb sy +20000114: 601f str r7, [r3, #0] +20000116: f381 8810 msr PRIMASK, r1 +2000011a: 0028 movs r0, r5 +2000011c: 0031 movs r1, r6 +2000011e: f000 f833 bl 20000188 <__best_effort_wfe_or_timeout_veneer> +20000122: 2800 cmp r0, #0 +20000124: d1ed bne.n 20000102 +20000126: 6822 ldr r2, [r4, #0] +20000128: f3ef 8110 mrs r1, PRIMASK +2000012c: b672 cpsid i +2000012e: 6813 ldr r3, [r2, #0] +20000130: 2b00 cmp r3, #0 +20000132: d0fc beq.n 2000012e +20000134: f3bf 8f5f dmb sy +20000138: 7923 ldrb r3, [r4, #4] +2000013a: 2b7f cmp r3, #127 ; 0x7f +2000013c: d9e7 bls.n 2000010e +2000013e: 4643 mov r3, r8 +20000140: e002 b.n 20000148 +20000142: 23d0 movs r3, #208 ; 0xd0 +20000144: 061b lsls r3, r3, #24 +20000146: 681b ldr r3, [r3, #0] +20000148: 7123 strb r3, [r4, #4] +2000014a: 6823 ldr r3, [r4, #0] +2000014c: f3bf 8f5f dmb sy +20000150: 2200 movs r2, #0 +20000152: 601a str r2, [r3, #0] +20000154: f381 8810 msr PRIMASK, r1 +20000158: 2001 movs r0, #1 +2000015a: e7d3 b.n 20000104 + +2000015c : +2000015c: 6802 ldr r2, [r0, #0] +2000015e: f3ef 8110 mrs r1, PRIMASK +20000162: b672 cpsid i +20000164: 6813 ldr r3, [r2, #0] +20000166: 2b00 cmp r3, #0 +20000168: d0fc beq.n 20000164 +2000016a: f3bf 8f5f dmb sy +2000016e: 23ff movs r3, #255 ; 0xff +20000170: 7103 strb r3, [r0, #4] +20000172: 6803 ldr r3, [r0, #0] +20000174: f3bf 8f5f dmb sy +20000178: 2200 movs r2, #0 +2000017a: 601a str r2, [r3, #0] +2000017c: f381 8810 msr PRIMASK, r1 +20000180: bf40 sev +20000182: 4770 bx lr + +20000184 <__aeabi_idiv0>: +20000184: 4770 bx lr +20000186: 46c0 nop ; (mov r8, r8) + +20000188 <__best_effort_wfe_or_timeout_veneer>: +20000188: b401 push {r0} +2000018a: 4802 ldr r0, [pc, #8] ; (20000194 <__best_effort_wfe_or_timeout_veneer+0xc>) +2000018c: 4684 mov ip, r0 +2000018e: bc01 pop {r0} +20000190: 4760 bx ip +20000192: bf00 nop +20000194: 10000df1 .word 0x10000df1 + +20000198 : +20000198: 00000010 .... + +2000019c : +2000019c: 00000000 .word 0x00000000 +200001a0: 00010000 .word 0x00010000 + ... +200001ac: 00020000 .word 0x00020000 + ... +200001b8: 00030000 .word 0x00030000 + ... +200001c4: 00ff0000 .word 0x00ff0000 +200001c8: 00000000 .word 0x00000000 + +200001cc : +200001cc: b501 push {r0, lr} +200001ce: 6848 ldr r0, [r1, #4] +200001d0: 3101 adds r1, #1 +200001d2: 468e mov lr, r1 +200001d4: 4700 bx r0 + +200001d6 : +200001d6: 4670 mov r0, lr +200001d8: 3809 subs r0, #9 +200001da: 4901 ldr r1, [pc, #4] ; (200001e0 ) +200001dc: 4788 blx r1 +200001de: bd01 pop {r0, pc} +200001e0: 100006d5 .word 0x100006d5 + +200001e4 : +200001e4: 200001fc 00000000 20000250 200005a4 ... ....P.. ... + ... + +200001fc : +200001fc: 200005b4 00000000 00000000 00000010 ... ............ +2000020c: 00000000 .... + +20000210 : +20000210: 00003350 .word 0x00003350 +20000214: 0000334c .word 0x0000334c +20000218: 00003354 .word 0x00003354 +2000021c: 00003352 .word 0x00003352 + +20000220 : +20000220: 0000534d .word 0x0000534d +20000224: 0000434d .word 0x0000434d +20000228: 00003453 .word 0x00003453 +2000022c: 00003443 .word 0x00003443 + +20000230 : + ... + +20000238 <__mutex_array_end>: +20000238: 10001c81 .word 0x10001c81 +2000023c: 10001a3d .word 0x10001a3d +20000240: 10001afd .word 0x10001afd +20000244: 10001bf1 .word 0x10001bf1 + +20000248 <__frame_dummy_init_array_entry>: +20000248: 10000331 1... diff --git a/software/pico/nano-x-blink/nano-x-blink.elf b/software/pico/nano-x-blink/nano-x-blink.elf new file mode 100755 index 0000000..769ab50 Binary files /dev/null and b/software/pico/nano-x-blink/nano-x-blink.elf differ diff --git a/software/pico/nano-x-blink/nano-x-blink.elf.map b/software/pico/nano-x-blink/nano-x-blink.elf.map new file mode 100644 index 0000000..8c254b2 --- /dev/null +++ b/software/pico/nano-x-blink/nano-x-blink.elf.map @@ -0,0 +1,2074 @@ +Archive member included to satisfy reference by file (symbol) + +/usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj (__aeabi_idiv0) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o (atexit) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj (calloc) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) (_calloc_r) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o (__libc_fini_array) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) (_impure_ptr) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o (__libc_init_array) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj (malloc) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) (_malloc_r) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) (__malloc_lock) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj (realloc) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) (_realloc_r) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) (_sbrk_r) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj (strlen) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) (__register_exitproc) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) (_free_r) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) (memmove) +/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) (errno) + +Discarded input sections + + .text 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crti.o + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crti.o + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crti.o + .data 0x0000000000000000 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + .rodata 0x0000000000000000 0x24 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + .fini_array 0x0000000000000000 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + .text 0x0000000000000000 0x74 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .ARM.extab 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .ARM.exidx 0x0000000000000000 0x10 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .debug_line 0x0000000000000000 0x8c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .debug_info 0x0000000000000000 0x26 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .debug_abbrev 0x0000000000000000 0x14 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .debug_str 0x0000000000000000 0x94 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .ARM.attributes + 0x0000000000000000 0x1b /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/nano-x-blink.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/nano-x-blink.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/nano-x-blink.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .text.set_sys_clock_48mhz + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .text.set_sys_clock_pll + 0x0000000000000000 0x78 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .text.check_sys_clock_khz + 0x0000000000000000 0x17c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .text.setup_default_uart + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_default_irq_handler + 0x0000000000000000 0x248 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_get_pad + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_function + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_get_function + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_pulls + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_irqover + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_inover + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_outover + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_oeover + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_input_hysteresis_enabled + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_is_input_hysteresis_enabled + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_slew_rate + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_get_slew_rate + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_drive_strength + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_get_drive_strength + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_irq_enabled + 0x0000000000000000 0x54 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_irq_enabled_with_callback + 0x0000000000000000 0xb0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_irq_callback + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_add_raw_irq_handler_with_order_priority_masked + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_add_raw_irq_handler_masked + 0x0000000000000000 0x38 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_remove_raw_irq_handler_masked + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_dormant_irq_enabled + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_acknowledge_irq + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_debug_pins_init + 0x0000000000000000 0x7c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_set_input_enabled + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_deinit + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text.gpio_init_mask + 0x0000000000000000 0x68 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .bss.callbacks + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .bss.raw_irq_mask + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + .text.rp2040_chip_version + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .text.hw_claim_lock + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .text.hw_claim_unlock + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .text.hw_is_claimed + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .text.hw_claim_unused_from_range + 0x0000000000000000 0x9c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .text.hw_claim_clear + 0x0000000000000000 0x38 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .text.spin_lock_init + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .rodata.spin_lock_claim.str1.4 + 0x0000000000000000 0x1f CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .text.spin_lock_claim + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .text.spin_lock_claim_mask + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .text.spin_lock_unclaim + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .rodata.spin_lock_claim_unused.str1.4 + 0x0000000000000000 0x1b CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .text.spin_lock_claim_unused + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .text.spin_lock_is_claimed + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .bss.claimed 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_is_enabled + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_set_mask_enabled + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_set_pending + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_has_shared_handler + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_get_exclusive_handler + 0x0000000000000000 0x50 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_add_shared_handler + 0x0000000000000000 0x1e8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_set_priority + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.irq_get_priority + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .rodata.user_irq_claim.str1.4 + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.user_irq_claim + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.user_irq_unclaim + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .rodata.user_irq_claim_unused.str1.4 + 0x0000000000000000 0x1b CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.user_irq_claim_unused + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text.user_irq_is_claimed + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .bss.user_irq_claimed + 0x0000000000000000 0x1 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .text.sem_init + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_available + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_acquire_blocking + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_acquire_timeout_ms + 0x0000000000000000 0x80 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_acquire_timeout_us + 0x0000000000000000 0x74 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_acquire_block_until + 0x0000000000000000 0x68 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_try_acquire + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_release + 0x0000000000000000 0x4c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .time_critical.sem_reset + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/lock_core.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/lock_core.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/lock_core.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.mutex_enter_blocking + 0x0000000000000000 0x48 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.recursive_mutex_enter_blocking + 0x0000000000000000 0x54 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.mutex_try_enter + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.recursive_mutex_try_enter + 0x0000000000000000 0x54 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.mutex_enter_timeout_ms + 0x0000000000000000 0x90 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.recursive_mutex_enter_timeout_ms + 0x0000000000000000 0x9c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.mutex_enter_timeout_us + 0x0000000000000000 0x80 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.recursive_mutex_enter_timeout_us + 0x0000000000000000 0x90 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.mutex_enter_block_until + 0x0000000000000000 0x74 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.recursive_mutex_enter_block_until + 0x0000000000000000 0x80 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .time_critical.recursive_mutex_exit + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .text.critical_section_init + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .text.critical_section_init_with_lock_num + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .text.critical_section_deinit + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.repeating_timer_callback + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .rodata.alarm_pool_dump_key.str1.4 + 0x0000000000000000 0xf CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_dump_key + 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_get_default + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_create + 0x0000000000000000 0x74 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_create_with_unused_hardware_alarm + 0x0000000000000000 0x74 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_destroy + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_add_alarm_at_force_in_context + 0x0000000000000000 0x124 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_cancel_alarm + 0x0000000000000000 0x78 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_hardware_alarm_num + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_core_num + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_add_repeating_timer_us + 0x0000000000000000 0x208 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.cancel_repeating_timer + 0x0000000000000000 0x8c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_dump + 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.sleep_us + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .rodata.at_the_end_of_time + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .rodata.nil_time + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .text.check_single_timeout_us + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .text.check_per_iteration_timeout_us + 0x0000000000000000 0x48 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .text.init_single_timeout_until + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .text.init_per_iteration_timeout_us + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.hardware_alarm_unclaim + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.hardware_alarm_is_claimed + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .rodata.hardware_alarm_claim_unused.str1.4 + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.hardware_alarm_claim_unused + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.busy_wait_us_32 + 0x0000000000000000 0x68 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.busy_wait_us + 0x0000000000000000 0x54 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.busy_wait_ms + 0x0000000000000000 0x88 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.hardware_alarm_force_irq + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .rodata.datetime_to_str.str1.4 + 0x0000000000000000 0x19 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .text.datetime_to_str + 0x0000000000000000 0x50 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .rodata.str1.4 + 0x0000000000000000 0xad CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .rodata.DATETIME_DOWS + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .rodata.DATETIME_MONTHS + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .rodata.ph_dump_node.str1.4 + 0x0000000000000000 0x15 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text.ph_dump_node + 0x0000000000000000 0xb0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text.ph_create + 0x0000000000000000 0x60 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text.ph_clear + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text.ph_destroy + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .rodata.ph_dump.str1.4 + 0x0000000000000000 0xf CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text.ph_dump 0x0000000000000000 0x38c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_init_with_spinlock + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_free + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_try_add + 0x0000000000000000 0x70 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_try_remove + 0x0000000000000000 0x70 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_try_peek + 0x0000000000000000 0x5c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_add_blocking + 0x0000000000000000 0x74 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_remove_blocking + 0x0000000000000000 0x74 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text.queue_peek_blocking + 0x0000000000000000 0x60 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_init + 0x0000000000000000 0x188 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_deinit + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_set_baudrate + 0x0000000000000000 0xb8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_set_format + 0x0000000000000000 0x7c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_set_fifo_enabled + 0x0000000000000000 0x64 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_set_break + 0x0000000000000000 0x60 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_set_translate_crlf + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text.uart_is_readable_within_us + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .bss.uart_char_to_line_feed + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clocks_irq_handler + 0x0000000000000000 0xc4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clock_stop + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clock_configure + 0x0000000000000000 0x118 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clock_get_hz + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clock_set_reported_hz + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.frequency_count_khz + 0x0000000000000000 0x48 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clocks_enable_resus + 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clock_gpio_init_int_frac + 0x0000000000000000 0x54 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text.clock_configure_gpin + 0x0000000000000000 0x110 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .bss._resus_callback + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .rodata.gpin0_src + 0x0000000000000000 0xa CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + .text.pll_deinit + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj + .text.vreg_set_voltage + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text.watchdog_update + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text.watchdog_get_count + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text._watchdog_enable + 0x0000000000000000 0x78 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text.watchdog_enable + 0x0000000000000000 0x84 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text.watchdog_reboot + 0x0000000000000000 0x98 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text.watchdog_caused_reboot + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text.watchdog_enable_caused_reboot + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .bss.load_value + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + .text.xosc_disable + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + .text.xosc_dormant + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .text.hw_divider_divmod_s32 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .text.hw_divider_divmod_u32 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .text.hw_divider_divmod_return + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .text.hw_divider_save_state + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .text.hw_divider_restore_state + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .ARM.attributes + 0x0000000000000000 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text.runtime_install_stack_guard + 0x0000000000000000 0x38 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text._sbrk 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text._gettimeofday + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text.settimeofday + 0x0000000000000000 0x54 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text._times 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text._getpid 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text._kill 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .rodata.__assert_func.str1.4 + 0x0000000000000000 0x43 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text.__assert_func + 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .rodata.panic_unsupported.str1.4 + 0x0000000000000000 0xe CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text.panic_unsupported + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .bss.epoch_time_us_since_boot + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .bss.heap_end.0 + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._out_buffer + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._out_null + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._out_rev + 0x0000000000000000 0x9c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._ntoa_format + 0x0000000000000000 0x1cc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._out_fct + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._etoa 0x0000000000000000 0x44c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .rodata._ftoa.str1.4 + 0x0000000000000000 0x15 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._ftoa 0x0000000000000000 0x398 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._vsnprintf + 0x0000000000000000 0xb04 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .rodata._vsnprintf + 0x0000000000000000 0x1e0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text.__wrap_sprintf + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text.__wrap_snprintf + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text.__wrap_vsnprintf + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text.vfctprintf + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text.weak_raw_printf + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .rodata.pow10.0 + 0x0000000000000000 0x50 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.clzsi 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.ctzsi 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.popcountsi + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.clzdi 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.ctzdi 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.popcountdi + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.reverse32 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.__rev 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.__revll 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .text.__wrap___aeabi_idiv + 0x0000000000000000 0x50 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .text.__wrap___aeabi_ldiv + 0x0000000000000000 0x424 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .text.divmod_s64s64_rem + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .text.divmod_u64u64_rem + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.push_r8_r11 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.pop_r8_r11 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_darithmetic + 0x0000000000000000 0x80 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_cdcmple + 0x0000000000000000 0x6c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_dcmpeq + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_dcmplt + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_dcmple + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_dcmpge + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_dcmpgt + 0x0000000000000000 0xa CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_dcmpun + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_ui2d + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_i2d + 0x0000000000000000 0x38 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_d2iz + 0x0000000000000000 0x48 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.double2int + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_d2uiz + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.fix2double + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.ufix2double + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.fix642double + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_l2d + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_ul2d + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_d2lz + 0x0000000000000000 0x26 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.double2int64 + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_d2ulz + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.double2fix64 + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.double2ufix64 + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.double2fix + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.double2ufix + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap___aeabi_d2f + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_srqt + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_sincostan_remainder + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_cos + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_sin + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_sincos + 0x0000000000000000 0xa0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_tan + 0x0000000000000000 0x5c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_atan2 + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_exp + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text.__wrap_log + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.dpow_1 0x0000000000000000 0x274 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.dpow_int2 + 0x0000000000000000 0xf8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.dpowint_0 + 0x0000000000000000 0x1dc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.dpow_0 0x0000000000000000 0x1cc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_ldexp + 0x0000000000000000 0x4c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_copysign + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_trunc + 0x0000000000000000 0x60 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_round + 0x0000000000000000 0xa0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_floor + 0x0000000000000000 0x94 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_ceil + 0x0000000000000000 0x98 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_asin + 0x0000000000000000 0x60 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_acos + 0x0000000000000000 0x5c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_atan + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_sinh + 0x0000000000000000 0x5c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_cosh + 0x0000000000000000 0x5c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_tanh + 0x0000000000000000 0x68 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_asinh + 0x0000000000000000 0xb0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_acosh + 0x0000000000000000 0x7c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_atanh + 0x0000000000000000 0x60 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_exp2 + 0x0000000000000000 0xbc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_log2 + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_exp10 + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_log10 + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_expm1 + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_log1p + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_fma + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_powint + 0x0000000000000000 0xb0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_pow + 0x0000000000000000 0x314 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_hypot + 0x0000000000000000 0x1ac CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_cbrt + 0x0000000000000000 0xcc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_fmod + 0x0000000000000000 0x170 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_remquo + 0x0000000000000000 0x2a0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_drem + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text.__wrap_remainder + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.__wrap___aeabi_dsub + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dadd_shim + 0x0000000000000000 0x15c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dmul_shim + 0x0000000000000000 0x15c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.ddiv_shim + 0x0000000000000000 0x1b0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dsqrt_shim + 0x0000000000000000 0x1a8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dcordic_vec_step + 0x0000000000000000 0xe CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dcordic_rot_step + 0x0000000000000000 0x76 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.double2int_shim + 0x0000000000000000 0xe CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.double2uint_shim + 0x0000000000000000 0xe CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.double2int64_shim + 0x0000000000000000 0x1a CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.double2uint64_shim + 0x0000000000000000 0x70 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.double2float_shim + 0x0000000000000000 0x5c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.x2double_shims + 0x0000000000000000 0x90 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dunpacks + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dreduce 0x0000000000000000 0x82 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dtan_shim + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dcos_shim + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dsin_shim + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dsincos_shim + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dtrig_guts + 0x0000000000000000 0x2ec CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text.dexp_guts + 0x0000000000000000 0x268 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_farithmetic + 0x0000000000000000 0x48 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_cfcmple + 0x0000000000000000 0x50 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_fcmpeq + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_fcmplt + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_fcmple + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_fcmpge + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_fcmpgt + 0x0000000000000000 0xa CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_fcmpun + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_ui2f + 0x0000000000000000 0xa CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_i2f + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_f2iz + 0x0000000000000000 0x4e CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.float2int + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.float2fix + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.float2ufix + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_f2uiz + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.fix2float + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.ufix2float + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.fix642float + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.ufix642float + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_l2f + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_ul2f + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_f2lz + 0x0000000000000000 0x26 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.float2int64 + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.float2fix64 + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_f2ulz + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.float2ufix64 + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap___aeabi_f2d + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_sqrtf + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_cosf + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_sinf + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_sincosf + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_tanf + 0x0000000000000000 0x4c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_atan2f + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_expf + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text.__wrap_logf + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + .bss.sf_clz_func + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.fpow_int2 + 0x0000000000000000 0xd4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.fpowint_0 + 0x0000000000000000 0xe8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.fpow_0 0x0000000000000000 0xf8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_ldexpf + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_copysignf + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_truncf + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_roundf + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_floorf + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_ceilf + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_asinf + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_acosf + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_atanf + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_sinhf + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_coshf + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_tanhf + 0x0000000000000000 0x4c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_asinhf + 0x0000000000000000 0xb4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_acoshf + 0x0000000000000000 0x70 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_atanhf + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_exp2f + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_log2f + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_exp10f + 0x0000000000000000 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_log10f + 0x0000000000000000 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_expm1f + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_log1pf + 0x0000000000000000 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_fmaf + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_powintf + 0x0000000000000000 0x88 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_powf + 0x0000000000000000 0x1ac CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_hypotf + 0x0000000000000000 0x100 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_cbrtf + 0x0000000000000000 0x9c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_fmodf + 0x0000000000000000 0xbc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_remquof + 0x0000000000000000 0x14c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_dremf + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text.__wrap_remainderf + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .text.642float_shims + 0x0000000000000000 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .text.fatan2_shim + 0x0000000000000000 0x88 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .text.float232_shims + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .text.float264_shims + 0x0000000000000000 0x4c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .text.d2fix_a_float + 0x0000000000000000 0x5c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .text.float2double_shim + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .rodata.__wrap_malloc.str1.4 + 0x0000000000000000 0xe CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .text.__wrap_malloc + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .text.__wrap_calloc + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .text.__wrap_realloc + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .text.__wrap_free + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + .text.aeabi_memset_memcpy + 0x0000000000000000 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + .text.memset 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .text._Znwj 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .text._Znaj 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .text._ZdlPv 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .text._ZdaPv 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .text._ZdlPvj 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .text._ZdaPvj 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_buffered_printer + 0x0000000000000000 0x64 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdout_serialize_begin + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdout_serialize_end + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.putchar_raw + 0x0000000000000000 0x98 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.puts_raw + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text._read 0x0000000000000000 0x94 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text._write 0x0000000000000000 0xac CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text._open 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text._close 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text._lseek 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text._fstat 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text._isatty 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_set_driver_enabled + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_flush + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.__wrap_vprintf + 0x0000000000000000 0xd8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.__wrap_printf + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_init_all + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.__wrap_getchar + 0x0000000000000000 0x74 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.getchar_timeout_us + 0x0000000000000000 0x98 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_filter_driver + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_set_translate_crlf + 0x0000000000000000 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_set_chars_available_callback + 0x0000000000000000 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.stdio_uart_out_chars + 0x0000000000000000 0x4c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.stdio_uart_in_chars + 0x0000000000000000 0x84 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.on_uart_rx + 0x0000000000000000 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.stdio_uart_set_chars_available_callback + 0x0000000000000000 0x8c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.stdio_uart_init + 0x0000000000000000 0x48 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.stdout_uart_init + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.stdin_uart_init + 0x0000000000000000 0x40 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text.stdio_uart_init_full + 0x0000000000000000 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .rodata.str1.4 + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .binary_info.__bi_ptr33 + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .binary_info.__bi_ptr34 + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .binary_info.__bi_ptr54 + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .binary_info.__bi_ptr58 + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .binary_info.__bi_ptr66 + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .binary_info.__bi_ptr70 + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .bss.chars_available_callback + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .bss.chars_available_param + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .bss.uart_instance + 0x0000000000000000 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .data.stdio_uart + 0x0000000000000000 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .rodata.__bi_33.4 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .rodata.__bi_34.5 + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .rodata.__bi_54.2 + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .rodata.__bi_58.3 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .rodata.__bi_66.0 + 0x0000000000000000 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .rodata.__bi_70.1 + 0x0000000000000000 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .comment 0x0000000000000000 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .ARM.attributes + 0x0000000000000000 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + .text 0x0000000000000000 0x0 /tmp/ccKUGYR8.o + .data 0x0000000000000000 0x0 /tmp/ccKUGYR8.o + .bss 0x0000000000000000 0x0 /tmp/ccKUGYR8.o + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .text 0x0000000000000000 0x10 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .debug_info 0x0000000000000000 0x100 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .debug_abbrev 0x0000000000000000 0xb4 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .debug_loc 0x0000000000000000 0x32 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .debug_line 0x0000000000000000 0xc3 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .debug_str 0x0000000000000000 0x1dd /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .debug_frame 0x0000000000000000 0x28 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-atexit.o) + .text 0x0000000000000000 0x18 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .debug_info 0x0000000000000000 0x96a /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .debug_abbrev 0x0000000000000000 0x212 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .debug_loc 0x0000000000000000 0x64 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .debug_line 0x0000000000000000 0x149 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .debug_str 0x0000000000000000 0x57b /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .debug_frame 0x0000000000000000 0x28 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-calloc.o) + .text 0x0000000000000000 0x5c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_info 0x0000000000000000 0xa81 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_abbrev 0x0000000000000000 0x241 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_loc 0x0000000000000000 0x299 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_ranges 0x0000000000000000 0x40 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_line 0x0000000000000000 0x1d1 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_str 0x0000000000000000 0x5b4 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .debug_frame 0x0000000000000000 0x28 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-callocr.o) + .text 0x0000000000000000 0x28 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .debug_info 0x0000000000000000 0x102 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .debug_abbrev 0x0000000000000000 0xcc /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .debug_loc 0x0000000000000000 0x46 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .debug_line 0x0000000000000000 0xef /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .debug_str 0x0000000000000000 0x1d5 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .debug_frame 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-fini.o) + .text 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .data 0x0000000000000000 0x430 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .rodata 0x0000000000000000 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .debug_info 0x0000000000000000 0x92a /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .debug_abbrev 0x0000000000000000 0x1b8 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .debug_aranges + 0x0000000000000000 0x18 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .debug_line 0x0000000000000000 0xe4 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .debug_str 0x0000000000000000 0x57b /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-impure.o) + .text 0x0000000000000000 0x44 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .debug_info 0x0000000000000000 0x11a /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .debug_abbrev 0x0000000000000000 0xcc /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .debug_loc 0x0000000000000000 0x98 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .debug_line 0x0000000000000000 0x127 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .debug_str 0x0000000000000000 0x1ff /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .debug_frame 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-init.o) + .text 0x0000000000000000 0x28 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .debug_info 0x0000000000000000 0x998 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .debug_abbrev 0x0000000000000000 0x21a /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .debug_loc 0x0000000000000000 0x64 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .debug_line 0x0000000000000000 0x165 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .debug_str 0x0000000000000000 0x58f /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .debug_frame 0x0000000000000000 0x40 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-malloc.o) + .text 0x0000000000000000 0x574 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .data 0x0000000000000000 0x410 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .bss 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_info 0x0000000000000000 0xe80 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_abbrev 0x0000000000000000 0x2f6 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_loc 0x0000000000000000 0xef0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_ranges 0x0000000000000000 0x50 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_line 0x0000000000000000 0x8e2 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_str 0x0000000000000000 0x780 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .debug_frame 0x0000000000000000 0x3c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mallocr.o) + .text 0x0000000000000000 0x8 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .debug_info 0x0000000000000000 0x942 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .debug_abbrev 0x0000000000000000 0x1f0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .debug_line 0x0000000000000000 0x13e /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .debug_str 0x0000000000000000 0x588 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .debug_frame 0x0000000000000000 0x30 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-mlock.o) + .text 0x0000000000000000 0x18 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .debug_info 0x0000000000000000 0x96a /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .debug_abbrev 0x0000000000000000 0x212 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .debug_loc 0x0000000000000000 0x64 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .debug_line 0x0000000000000000 0x14a /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .debug_str 0x0000000000000000 0x580 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .debug_frame 0x0000000000000000 0x28 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-realloc.o) + .text 0x0000000000000000 0x354 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_info 0x0000000000000000 0xd6f /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_abbrev 0x0000000000000000 0x280 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_loc 0x0000000000000000 0x13c2 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_ranges 0x0000000000000000 0x100 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_line 0x0000000000000000 0x6ed /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_str 0x0000000000000000 0x65c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .debug_frame 0x0000000000000000 0x3c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reallocr.o) + .text 0x0000000000000000 0x24 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .debug_info 0x0000000000000000 0x98e /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .debug_abbrev 0x0000000000000000 0x23d /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .debug_loc 0x0000000000000000 0x79 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .debug_line 0x0000000000000000 0x183 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .debug_str 0x0000000000000000 0x572 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .debug_frame 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-sbrkr.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + .text 0x0000000000000000 0x88 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .debug_info 0x0000000000000000 0x9b0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .debug_abbrev 0x0000000000000000 0x23f /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .debug_loc 0x0000000000000000 0x164 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .debug_line 0x0000000000000000 0x1b8 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .debug_str 0x0000000000000000 0x5b5 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .debug_frame 0x0000000000000000 0x38 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-__atexit.o) + .text 0x0000000000000000 0x260 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .debug_info 0x0000000000000000 0xce5 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .debug_abbrev 0x0000000000000000 0x2a1 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .debug_loc 0x0000000000000000 0x4e3 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .debug_line 0x0000000000000000 0x47d /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .debug_str 0x0000000000000000 0x6ca /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .debug_frame 0x0000000000000000 0x54 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-freer.o) + .text 0x0000000000000000 0xac /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .debug_info 0x0000000000000000 0x152 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .debug_abbrev 0x0000000000000000 0xc0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .debug_loc 0x0000000000000000 0x508 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .debug_line 0x0000000000000000 0x1e1 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .debug_str 0x0000000000000000 0x1d3 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .debug_frame 0x0000000000000000 0x30 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-memmove.o) + .text 0x0000000000000000 0xf0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .bss 0x0000000000000000 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .debug_info 0x0000000000000000 0xbe1 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .debug_abbrev 0x0000000000000000 0x2d0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .debug_loc 0x0000000000000000 0x1e0 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .debug_line 0x0000000000000000 0x27e /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .debug_str 0x0000000000000000 0x59a /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .comment 0x0000000000000000 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .debug_frame 0x0000000000000000 0x50 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .ARM.attributes + 0x0000000000000000 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-reent.o) + .text 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + .rodata 0x0000000000000000 0x24 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + .eh_frame 0x0000000000000000 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + .text 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtn.o + .data 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtn.o + .bss 0x0000000000000000 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtn.o + .init 0x0000000000000000 0x8 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtn.o + .fini 0x0000000000000000 0x8 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtn.o + .ARM.attributes + 0x0000000000000000 0x1e /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtn.o + +Memory Configuration + +Name Origin Length Attributes +FLASH 0x0000000010000000 0x0000000000200000 xr +RAM 0x0000000020000000 0x0000000000040000 xrw +SCRATCH_X 0x0000000020040000 0x0000000000001000 xrw +SCRATCH_Y 0x0000000020041000 0x0000000000001000 xrw +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crti.o +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/crt0.o + +.flash_begin 0x0000000010000000 0x0 + 0x0000000010000000 __flash_binary_start = . + +.boot2 0x0000000010000000 0x100 + 0x0000000010000000 __boot2_start__ = . + *(.boot2) + .boot2 0x0000000010000000 0x100 /tmp/ccKUGYR8.o + 0x0000000010000100 __boot2_end__ = . + 0x0000000000000001 ASSERT (((__boot2_end__ - __boot2_start__) == 0x100), ERROR: Pico second stage bootloader must be 256 bytes in size) + +.text 0x0000000010000100 0x1ec0 + 0x0000000010000100 __logical_binary_start = . + *(.vectors) + .vectors 0x0000000010000100 0xd4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + 0x0000000010000100 __vectors + 0x0000000010000100 __VECTOR_TABLE + 0x00000000100001c0 isr_invalid + 0x00000000100001c0 __default_isrs_start + 0x00000000100001c2 isr_nmi + 0x00000000100001c4 isr_hardfault + 0x00000000100001c6 isr_svcall + 0x00000000100001c8 isr_pendsv + 0x00000000100001ca isr_systick + 0x00000000100001cc isr_irq30 + 0x00000000100001cc __unhandled_user_irq + 0x00000000100001cc isr_irq13 + 0x00000000100001cc isr_irq27 + 0x00000000100001cc isr_irq31 + 0x00000000100001cc isr_irq5 + 0x00000000100001cc isr_irq11 + 0x00000000100001cc isr_irq23 + 0x00000000100001cc isr_irq18 + 0x00000000100001cc isr_irq28 + 0x00000000100001cc isr_irq19 + 0x00000000100001cc isr_irq0 + 0x00000000100001cc isr_irq6 + 0x00000000100001cc isr_irq22 + 0x00000000100001cc isr_irq17 + 0x00000000100001cc isr_irq14 + 0x00000000100001cc isr_irq2 + 0x00000000100001cc isr_irq10 + 0x00000000100001cc isr_irq8 + 0x00000000100001cc isr_irq24 + 0x00000000100001cc isr_irq1 + 0x00000000100001cc isr_irq7 + 0x00000000100001cc isr_irq21 + 0x00000000100001cc isr_irq20 + 0x00000000100001cc isr_irq15 + 0x00000000100001cc isr_irq25 + 0x00000000100001cc isr_irq4 + 0x00000000100001cc isr_irq16 + 0x00000000100001cc isr_irq29 + 0x00000000100001cc isr_irq26 + 0x00000000100001cc __default_isrs_end + 0x00000000100001cc isr_irq3 + 0x00000000100001cc isr_irq12 + 0x00000000100001cc isr_irq9 + 0x00000000100001d2 unhandled_user_irq_num_in_r0 + *(.binary_info_header) + .binary_info_header + 0x00000000100001d4 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + 0x00000000100001e8 __binary_info_header_end = . + *(.reset) + .reset 0x00000000100001e8 0xa0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + 0x00000000100001e8 _entry_point + .reset 0x0000000010000288 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + *(.init) + .init 0x00000000100002b8 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crti.o + 0x00000000100002b8 _init + *(EXCLUDE_FILE(*libm.a: *libc.a:*lib_a-mem*.o *libgcc.a:) .text*) + .text 0x00000000100002bc 0x98 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + .text.startup.main + 0x0000000010000354 0x84 CMakeFiles/nano-x-blink.dir/nano-x-blink.c.obj + 0x0000000010000354 main + .text.gpio_init + 0x00000000100003d8 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + 0x00000000100003d8 gpio_init + .text.running_on_fpga + 0x0000000010000414 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + 0x0000000010000414 running_on_fpga + .text.hw_claim_or_assert + 0x0000000010000424 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + 0x0000000010000424 hw_claim_or_assert + .text.spin_locks_reset + 0x0000000010000468 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x0000000010000468 spin_locks_reset + .text.next_striped_spin_lock_num + 0x0000000010000484 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x0000000010000484 next_striped_spin_lock_num + .text.irq_set_enabled + 0x000000001000049c 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x000000001000049c irq_set_enabled + .text.irq_get_vtable_handler + 0x00000000100004c0 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x00000000100004c0 irq_get_vtable_handler + .text.irq_set_exclusive_handler + 0x00000000100004d0 0x54 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x00000000100004d0 irq_set_exclusive_handler + .text.irq_remove_handler + 0x0000000010000524 0x1b0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x0000000010000524 irq_remove_handler + .text.irq_add_tail_to_free_list + 0x00000000100006d4 0xb4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x00000000100006d4 irq_add_tail_to_free_list + .text.irq_init_priorities + 0x0000000010000788 0x24 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x0000000010000788 irq_init_priorities + .text.lock_init + 0x00000000100007ac 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/lock_core.c.obj + 0x00000000100007ac lock_init + .text.mutex_init + 0x00000000100007bc 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x00000000100007bc mutex_init + .text.recursive_mutex_init + 0x00000000100007d8 0x1c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x00000000100007d8 recursive_mutex_init + .text.timer_pool_entry_comparator + 0x00000000100007f4 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + 0x00000000100007f4 timer_pool_entry_comparator + .text.sleep_until_callback + 0x0000000010000828 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.add_alarm_under_lock.isra.0 + 0x0000000010000858 0x100 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_alarm_callback + 0x0000000010000958 0x1bc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .text.alarm_pool_init_default + 0x0000000010000b14 0x6c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + 0x0000000010000b14 alarm_pool_init_default + .text.alarm_pool_add_alarm_at + 0x0000000010000b80 0x178 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + 0x0000000010000b80 alarm_pool_add_alarm_at + .text.sleep_until + 0x0000000010000cf8 0xc4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + 0x0000000010000cf8 sleep_until + .text.sleep_ms + 0x0000000010000dbc 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + 0x0000000010000dbc sleep_ms + .text.best_effort_wfe_or_timeout + 0x0000000010000df0 0xd4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + 0x0000000010000df0 best_effort_wfe_or_timeout + .text.hardware_alarm_irq_handler + 0x0000000010000ec4 0xbc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .text.hardware_alarm_claim + 0x0000000010000f80 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x0000000010000f80 hardware_alarm_claim + .text.time_us_64 + 0x0000000010000f98 0x14 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x0000000010000f98 time_us_64 + .text.busy_wait_until + 0x0000000010000fac 0x20 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x0000000010000fac busy_wait_until + .text.hardware_alarm_set_callback + 0x0000000010000fcc 0x8c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x0000000010000fcc hardware_alarm_set_callback + .text.hardware_alarm_set_target + 0x0000000010001058 0xd4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x0000000010001058 hardware_alarm_set_target + .text.hardware_alarm_cancel + 0x000000001000112c 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x000000001000112c hardware_alarm_cancel + .text.ph_merge_nodes + 0x0000000010001168 0x68 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text.ph_post_alloc_init + 0x00000000100011d0 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + 0x00000000100011d0 ph_post_alloc_init + .text.ph_merge_two_pass + 0x000000001000120c 0x90 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + 0x000000001000120c ph_merge_two_pass + .text.ph_remove_any_head + 0x000000001000129c 0x100 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .text.ph_remove_head + 0x000000001000139c 0x104 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + 0x000000001000139c ph_remove_head + .text.ph_remove_and_free_node + 0x00000000100014a0 0x7c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + 0x00000000100014a0 ph_remove_and_free_node + .text.clocks_init + 0x000000001000151c 0x2d0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + 0x000000001000151c clocks_init + .text.pll_init + 0x00000000100017ec 0xa0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + 0x00000000100017ec pll_init + .text.watchdog_start_tick + 0x000000001000188c 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + 0x000000001000188c watchdog_start_tick + .text.xosc_init + 0x000000001000189c 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + 0x000000001000189c xosc_init + .text.runtime_init + 0x00000000100018c4 0xf0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x00000000100018c4 runtime_init + .text._exit 0x00000000100019b4 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x00000000100019b4 _exit + .text.exit 0x00000000100019b8 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x00000000100019b8 exit + .text.panic 0x00000000100019c0 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x00000000100019c0 panic + .text.hard_assertion_failure + 0x00000000100019f0 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x00000000100019f0 hard_assertion_failure + .text._out_char + 0x00000000100019fc 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text.weak_raw_vprintf + 0x0000000010001a0c 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + 0x0000000010001a0c weak_raw_vprintf + .text 0x0000000010001a3c 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .text.rom_func_lookup + 0x0000000010001a4c 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x0000000010001a4c rom_func_lookup + .text.rom_data_lookup + 0x0000000010001a5c 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x0000000010001a5c rom_data_lookup + .text.rom_funcs_lookup + 0x0000000010001a6c 0x44 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x0000000010001a6c rom_funcs_lookup + .text.__wrap___aeabi_uidiv + 0x0000000010001ab0 0x4c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + 0x0000000010001ab0 __wrap___aeabi_uidiv + 0x0000000010001ab0 __wrap___aeabi_uidivmod + 0x0000000010001ab0 div_u32u32 + 0x0000000010001ab0 divmod_u32u32 + 0x0000000010001ab8 divmod_u32u32_unsafe + 0x0000000010001ae0 divmod_u32u32_savestate + .text.__aeabi_double_init + 0x0000000010001afc 0x94 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x0000000010001afc __aeabi_double_init + .text.double_table_shim_on_use_helper + 0x0000000010001b90 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x0000000010001b90 double_table_shim_on_use_helper + .text.__aeabi_lmul + 0x0000000010001bbc 0x32 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + 0x0000000010001bbc __wrap___aeabi_lmul + *fill* 0x0000000010001bee 0x2 + .text.__aeabi_float_init + 0x0000000010001bf0 0x64 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + 0x0000000010001bf0 __aeabi_float_init + .text.float_table_shim_on_use_helper + 0x0000000010001c54 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + 0x0000000010001c54 float_table_shim_on_use_helper + .text 0x0000000010001c80 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x0000000010001c80 __aeabi_mem_init + .text.memcpy 0x0000000010001c90 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x0000000010001c90 __wrap___aeabi_memcpy + 0x0000000010001c90 __wrap_memcpy + .text.stdio_out_chars_no_crlf + 0x0000000010001c9c 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_out_chars_crlf + 0x0000000010001cac 0xb4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_put_string.isra.0 + 0x0000000010001d60 0xfc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.__wrap_putchar + 0x0000000010001e5c 0x98 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x0000000010001e5c __wrap_putchar + .text.__wrap_puts + 0x0000000010001ef4 0x3c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x0000000010001ef4 __wrap_puts + .text 0x0000000010001f30 0x5c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + 0x0000000010001f30 strlen + *(.fini) + .fini 0x0000000010001f8c 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crti.o + 0x0000000010001f8c _fini + .fini.__stub 0x0000000010001f90 0x30 linker stubs + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend.o *crtend?.o) .ctors) + *(SORT_BY_NAME(.ctors.*)) + *(.ctors) + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend.o *crtend?.o) .dtors) + *(SORT_BY_NAME(.dtors.*)) + *(.dtors) + *(.eh_frame*) + .eh_frame 0x0000000010001fc0 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + 0x0000000010001fc0 . = ALIGN (0x4) + +.glue_7 0x0000000010001fc0 0x0 + .glue_7 0x0000000010001fc0 0x0 linker stubs + +.glue_7t 0x0000000010001fc0 0x0 + .glue_7t 0x0000000010001fc0 0x0 linker stubs + +.vfp11_veneer 0x0000000010001fc0 0x0 + .vfp11_veneer 0x0000000010001fc0 0x0 linker stubs + +.v4_bx 0x0000000010001fc0 0x0 + .v4_bx 0x0000000010001fc0 0x0 linker stubs + +.iplt 0x0000000010001fc0 0x0 + .iplt 0x0000000010001fc0 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + +.rodata 0x0000000010001fc0 0x100 + *(EXCLUDE_FILE(*libm.a: *libc.a:*lib_a-mem*.o *libgcc.a:) .rodata*) + .rodata.hardware_alarm_claim.str1.4 + 0x0000000010001fc0 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + *fill* 0x0000000010001fe2 0x2 + .rodata.panic.str1.4 + 0x0000000010001fe4 0x12 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + *fill* 0x0000000010001ff6 0x2 + .rodata.hard_assertion_failure.str1.4 + 0x0000000010001ff8 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .rodata.str1.4 + 0x0000000010002004 0x88 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .rodata.__bi_44 + 0x000000001000208c 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .rodata.__bi_69 + 0x0000000010002098 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .rodata.__bi_75 + 0x00000000100020a4 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .rodata.__bi_81 + 0x00000000100020b0 0xc CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .rodata.crlf_str.0 + 0x00000000100020bc 0x2 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x00000000100020c0 . = ALIGN (0x4) + *fill* 0x00000000100020be 0x2 + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*))) + 0x00000000100020c0 . = ALIGN (0x4) + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x00000000100020c0 __exidx_start = . + +.ARM.exidx + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + 0x00000000100020c0 __exidx_end = . + 0x00000000100020c0 . = ALIGN (0x4) + 0x00000000100020c0 __binary_info_start = . + +.binary_info 0x00000000100020c0 0x20 + *(.binary_info.keep.*) + .binary_info.keep.__bi_ptr22 + 0x00000000100020c0 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .binary_info.keep.__bi_ptr30 + 0x00000000100020c4 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .binary_info.keep.__bi_ptr38 + 0x00000000100020c8 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .binary_info.keep.__bi_ptr44 + 0x00000000100020cc 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .binary_info.keep.__bi_ptr50 + 0x00000000100020d0 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .binary_info.keep.__bi_ptr69 + 0x00000000100020d4 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .binary_info.keep.__bi_ptr75 + 0x00000000100020d8 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .binary_info.keep.__bi_ptr81 + 0x00000000100020dc 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + *(.binary_info.*) + 0x00000000100020e0 __binary_info_end = . + +.rel.dyn 0x00000000100020e0 0x0 + .rel.iplt 0x00000000100020e0 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + 0x00000000100020e0 . = ALIGN (0x4) + +.ram_vector_table + 0x0000000020000000 0xc0 + *(.ram_vector_table) + .ram_vector_table + 0x0000000020000000 0xc0 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x0000000020000000 ram_vector_table + +.data 0x00000000200000c0 0x18c load address 0x00000000100020e0 + 0x00000000200000c0 __data_start__ = . + *(vtable) + *(.time_critical*) + .time_critical.mutex_try_enter_block_until + 0x00000000200000c0 0x9c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x00000000200000c0 mutex_try_enter_block_until + .time_critical.mutex_exit + 0x000000002000015c 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x000000002000015c mutex_exit + *(.text*) + .text 0x0000000020000184 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + 0x0000000020000184 __aeabi_ldiv0 + 0x0000000020000184 __aeabi_idiv0 + .text.__stub 0x0000000020000188 0x10 linker stubs + 0x0000000020000198 . = ALIGN (0x4) + *(.rodata*) + 0x0000000020000198 . = ALIGN (0x4) + *(.data*) + .data.striped_spin_lock_num + 0x0000000020000198 0x1 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + *fill* 0x0000000020000199 0x3 + .data 0x000000002000019c 0x48 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj + 0x000000002000019c irq_handler_chain_slots + 0x00000000200001cc irq_handler_chain_first_slot + 0x00000000200001d6 irq_handler_chain_remove_tail + .data.default_alarm_pool + 0x00000000200001e4 0x18 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .data.default_alarm_pool_heap + 0x00000000200001fc 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + *fill* 0x000000002000020c 0x4 + .data.aeabi_bits_funcs + 0x0000000020000210 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + 0x0000000020000210 aeabi_bits_funcs + 0x0000000020000220 aeabi_bits_funcs_end + .data.aeabi_mem_funcs + 0x0000000020000220 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x0000000020000220 aeabi_mem_funcs + 0x0000000020000230 aeabi_mem_funcs_end + 0x0000000020000230 . = ALIGN (0x4) + *(.after_data.*) + 0x0000000020000230 . = ALIGN (0x4) + 0x0000000020000230 PROVIDE (__mutex_array_start = .) + *(SORT_BY_NAME(.mutex_array.*)) + *(.mutex_array) + .mutex_array 0x0000000020000230 0x8 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x0000000020000238 PROVIDE (__mutex_array_end = .) + 0x0000000020000238 . = ALIGN (0x4) + 0x0000000020000238 PROVIDE (__preinit_array_start = .) + *(SORT_BY_NAME(.preinit_array.*)) + .preinit_array.00001 + 0x0000000020000238 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + .preinit_array.00010 + 0x000000002000023c 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .preinit_array.00020 + 0x0000000020000240 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .preinit_array.00020 + 0x0000000020000244 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + *(.preinit_array) + 0x0000000020000248 PROVIDE (__preinit_array_end = .) + 0x0000000020000248 . = ALIGN (0x4) + 0x0000000020000248 PROVIDE (__init_array_start = .) + *(SORT_BY_NAME(.init_array.*)) + *(.init_array) + .init_array 0x0000000020000248 0x4 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + 0x000000002000024c PROVIDE (__init_array_end = .) + 0x000000002000024c . = ALIGN (0x4) + 0x000000002000024c PROVIDE (__fini_array_start = .) + *(SORT_BY_NAME(.fini_array.*)) + *(.fini_array) + 0x000000002000024c PROVIDE (__fini_array_end = .) + *(.jcr) + 0x000000002000024c . = ALIGN (0x4) + 0x000000002000024c __data_end__ = . + 0x00000000100020e0 __etext = LOADADDR (.data) + +.tm_clone_table + 0x000000002000024c 0x0 load address 0x000000001000226c + .tm_clone_table + 0x000000002000024c 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + .tm_clone_table + 0x000000002000024c 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + +.igot.plt 0x000000002000024c 0x0 load address 0x000000001000226c + .igot.plt 0x000000002000024c 0x0 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + +.uninitialized_data + 0x000000002000024c 0x0 load address 0x000000001000226c + 0x000000002000024c . = ALIGN (0x4) + *(.uninitialized_data*) + +.scratch_x 0x0000000020040000 0x0 load address 0x000000001000226c + 0x0000000020040000 __scratch_x_start__ = . + *(.scratch_x.*) + 0x0000000020040000 . = ALIGN (0x4) + 0x0000000020040000 __scratch_x_end__ = . + 0x000000001000226c __scratch_x_source__ = LOADADDR (.scratch_x) + +.scratch_y 0x0000000020041000 0x0 load address 0x000000001000226c + 0x0000000020041000 __scratch_y_start__ = . + *(.scratch_y.*) + 0x0000000020041000 . = ALIGN (0x4) + 0x0000000020041000 __scratch_y_end__ = . + 0x000000001000226c __scratch_y_source__ = LOADADDR (.scratch_y) + +.bss 0x0000000020000250 0x3cc + 0x0000000020000250 . = ALIGN (0x4) + 0x0000000020000250 __bss_start__ = . + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) + .bss.default_alarm_pool_entries + 0x0000000020000250 0x100 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .bss.sd_table 0x0000000020000350 0x100 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x0000000020000350 sd_table + .bss.sf_table 0x0000000020000450 0x100 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + 0x0000000020000450 sf_table + .bss 0x0000000020000550 0x1c /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + .bss.alarm_callbacks + 0x000000002000056c 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .bss.configured_freq + 0x000000002000057c 0x28 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .bss.default_alarm_pool_entry_ids_high + 0x00000000200005a4 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .bss.default_alarm_pool_heap_nodes + 0x00000000200005b4 0x30 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .bss.drivers 0x00000000200005e4 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .bss.filter 0x00000000200005e8 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .bss.lazy_vsnprintf + 0x00000000200005ec 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .bss.pools 0x00000000200005f0 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .bss.sf_clz_func + 0x0000000020000600 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x0000000020000600 sf_clz_func + .bss.sleep_notifier + 0x0000000020000604 0x4 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .bss.target_hi + 0x0000000020000608 0x10 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .bss.claimed 0x0000000020000618 0x1 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .bss.irq_hander_chain_free_slot_head + 0x0000000020000619 0x1 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .bss.timer_callbacks_pending + 0x000000002000061a 0x1 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + *(COMMON) + 0x000000002000061c . = ALIGN (0x4) + *fill* 0x000000002000061b 0x1 + 0x000000002000061c __bss_end__ = . + +.heap 0x000000002000061c 0x800 + 0x000000002000061c __end__ = . + 0x000000002000061c end = __end__ + *(.heap*) + .heap 0x000000002000061c 0x800 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + 0x0000000020000e1c __HeapLimit = . + +.stack1_dummy 0x0000000020040000 0x0 + *(.stack1*) + +.stack_dummy 0x0000000020041000 0x800 + *(.stack*) + .stack 0x0000000020041000 0x800 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + +.flash_end 0x000000001000226c 0x0 + 0x000000001000226c PROVIDE (__flash_binary_end = .) + 0x0000000020040000 __StackLimit = (ORIGIN (RAM) + LENGTH (RAM)) + 0x0000000020041000 __StackOneTop = (ORIGIN (SCRATCH_X) + LENGTH (SCRATCH_X)) + 0x0000000020042000 __StackTop = (ORIGIN (SCRATCH_Y) + LENGTH (SCRATCH_Y)) + 0x0000000020041000 __StackOneBottom = (__StackOneTop - SIZEOF (.stack1_dummy)) + 0x0000000020041800 __StackBottom = (__StackTop - SIZEOF (.stack_dummy)) + 0x0000000020042000 PROVIDE (__stack = __StackTop) + 0x0000000000000001 ASSERT ((__StackLimit >= __HeapLimit), region RAM overflowed) + 0x0000000000000001 ASSERT (((__binary_info_header_end - __logical_binary_start) <= 0x100), Binary info must be in first 256 bytes of the binary) +LOAD CMakeFiles/nano-x-blink.dir/nano-x-blink.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/sem.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/lock_core.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/critical_section.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/timeout_helper.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/datetime.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/queue.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj +LOAD CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj +LOAD /tmp/ccKUGYR8.o +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libstdc++.a +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libm.a +START GROUP +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a +END GROUP +START GROUP +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libnosys.a +END GROUP +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o +LOAD /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtn.o +OUTPUT(nano-x-blink.elf elf32-littlearm) +LOAD linker stubs + +.ARM.attributes + 0x0000000000000000 0x28 + .ARM.attributes + 0x0000000000000000 0x1e /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crti.o + .ARM.attributes + 0x000000000000001e 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + .ARM.attributes + 0x000000000000004a 0x2c CMakeFiles/nano-x-blink.dir/nano-x-blink.c.obj + .ARM.attributes + 0x0000000000000076 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .ARM.attributes + 0x00000000000000a2 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + .ARM.attributes + 0x00000000000000ce 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .ARM.attributes + 0x00000000000000fa 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .ARM.attributes + 0x0000000000000126 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .ARM.attributes + 0x0000000000000152 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj + .ARM.attributes + 0x0000000000000174 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/lock_core.c.obj + .ARM.attributes + 0x00000000000001a0 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .ARM.attributes + 0x00000000000001cc 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .ARM.attributes + 0x00000000000001f8 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .ARM.attributes + 0x0000000000000224 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .ARM.attributes + 0x0000000000000250 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .ARM.attributes + 0x000000000000027c 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + .ARM.attributes + 0x00000000000002a8 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .ARM.attributes + 0x00000000000002d4 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + .ARM.attributes + 0x0000000000000300 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .ARM.attributes + 0x000000000000032c 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .ARM.attributes + 0x0000000000000358 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + .ARM.attributes + 0x000000000000037a 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + .ARM.attributes + 0x00000000000003a6 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + .ARM.attributes + 0x00000000000003c8 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + .ARM.attributes + 0x00000000000003ea 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + .ARM.attributes + 0x0000000000000416 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + .ARM.attributes + 0x0000000000000438 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + .ARM.attributes + 0x000000000000045a 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + .ARM.attributes + 0x000000000000047c 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + .ARM.attributes + 0x00000000000004a8 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + .ARM.attributes + 0x00000000000004ca 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + .ARM.attributes + 0x00000000000004ec 0x22 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + .ARM.attributes + 0x000000000000050e 0x32 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .ARM.attributes + 0x0000000000000540 0x2c CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .ARM.attributes + 0x000000000000056c 0x22 /tmp/ccKUGYR8.o + .ARM.attributes + 0x000000000000058e 0x1e /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .ARM.attributes + 0x00000000000005ac 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + .ARM.attributes + 0x00000000000005d8 0x2c /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + +.comment 0x0000000000000000 0x33 + .comment 0x0000000000000000 0x33 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtbegin.o + 0x34 (size before relaxing) + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/nano-x-blink.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/lock_core.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_sync/mutex.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_time/time.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/common/pico_util/pheap.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + .comment 0x0000000000000033 0x34 CMakeFiles/nano-x-blink.dir/home/steiner/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .comment 0x0000000000000033 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + .comment 0x0000000000000033 0x34 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/crtend.o + +.debug_line 0x0000000000000000 0x1d2 + .debug_line 0x0000000000000000 0x60 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .debug_line 0x0000000000000060 0x172 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + +.debug_info 0x0000000000000000 0x114 + .debug_info 0x0000000000000000 0x26 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .debug_info 0x0000000000000026 0xee /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + +.debug_abbrev 0x0000000000000000 0xa3 + .debug_abbrev 0x0000000000000000 0x14 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .debug_abbrev 0x0000000000000014 0x8f /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + +.debug_aranges 0x0000000000000000 0x40 + .debug_aranges + 0x0000000000000000 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .debug_aranges + 0x0000000000000020 0x20 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + +.debug_str 0x0000000000000000 0x232 + .debug_str 0x0000000000000000 0xa6 /usr/lib/gcc/arm-none-eabi/10.3.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + .debug_str 0x00000000000000a6 0x18c /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + 0x1c5 (size before relaxing) + +.debug_loc 0x0000000000000000 0x90 + .debug_loc 0x0000000000000000 0x90 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) + +.debug_frame 0x0000000000000000 0x28 + .debug_frame 0x0000000000000000 0x28 /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(lib_a-strlen-stub.o) diff --git a/software/pico/nano-x-blink/nano-x-blink.hex b/software/pico/nano-x-blink/nano-x-blink.hex new file mode 100644 index 0000000..8eb9327 --- /dev/null +++ b/software/pico/nano-x-blink/nano-x-blink.hex @@ -0,0 +1,554 @@ +:020000041000EA +:1000000000B5324B212058609868022188439860DF +:10001000D860186158612E4B002199600221596106 +:100020000121F02299502B49196001219960352056 +:1000300000F044F80222904214D00621196600F024 +:1000400034F8196E01211966002018661A6600F04E +:100050002CF8196E196E196E052000F02FF8012189 +:100060000842F9D1002199601B49196000215960AB +:100070001A491B48016001219960EB211966A021F2 +:10008000196600F012F800219960164914480160C1 +:100090000121996001BC002800D000471248134993 +:1000A000086003C880F30888084703B5996A0420EC +:1000B0000142FBD001200142F8D103BD02B5186610 +:1000C0001866FFF7F2FF186E186E02BD00000240BE +:1000D000000000180000070000035F00212200005C +:1000E000F4000018222000A00001001008ED00E03C +:1000F00000000000000000000000000074B24E7A12 +:1001000000200420F7010010C3010010C5010010F9 +:10011000C1010010C1010010C1010010C101001097 +:10012000C1010010C1010010C1010010C701001081 +:10013000C1010010C1010010C9010010CB01001065 +:10014000CD010010CD010010CD010010CD01001037 +:10015000CD010010CD010010CD010010CD01001027 +:10016000CD010010CD010010CD010010CD01001017 +:10017000CD010010CD010010CD010010CD01001007 +:10018000CD010010CD010010CD010010CD010010F7 +:10019000CD010010CD010010CD010010CD010010E7 +:1001A000CD010010CD010010CD010010CD010010D7 +:1001B000CD010010CD010010CD010010CD010010C7 +:1001C00000BE00BE00BE00BE00BE00BEEFF3058054 +:1001D000103800BEF2EB8871C0200010E020001043 +:1001E0003402001090A31AE700201F49086006C8D7 +:1001F00081F3088810471D48006800282FD10DA4FE +:100200000ECC002902D000F012F8F9E71849194A7B +:10021000002000E001C19142FCD1174988471749ED +:1002200088471749884700BEFDE701C901C29A42C5 +:10023000FBD37047E0200010C00000204C020020DB +:100240006C22001000000420000004206C2200102A +:10025000001004200010042000000000704709482E +:1002600001F0F4FB0047000008ED00E0000000D0C2 +:10027000500200201C060020C51800105503001075 +:10028000B91900105756000006005250ABB3605326 +:100290006020001006005250861C030270200010DF +:1002A000060052505422A29D80200010050052509A +:1002B000DE65F4686C220010F8B5C0460448054BB2 +:1002C00010B5834203D0044B002B00D0984710BDDB +:1002D0004C0200204C0200200000000006480749A4 +:1002E000091A8B10C90FC91810B5491003D0044B57 +:1002F000002B00D0984710BD4C0200204C0200207B +:100300000000000010B5074C2378002B09D1FFF73F +:10031000D5FF054B002B02D0044800E000BF0123AD +:10032000237010BD5005002000000000C01F001009 +:10033000054B10B5002B03D00449054800E000BF71 +:10034000FFF7CCFF10BDC0460000000054050020A0 +:10035000C01F001070B5142000F03EF8032000F01C +:100360003BF80F2000F038F80E2000F035F8D024CC +:10037000802324065B0363620823636280231B02DD +:10038000636280238026DB0119206362B60400F0DB +:1003900023F86662802564206D03666100F00EFD1F +:1003A0006420A661656100F009FDA561082564204F +:1003B000656100F003FDA56180252D026420656163 +:1003C00000F0FCFCA5618025ED016420656100F072 +:1003D000F5FCA561DEE7C0460123D022834012066A +:1003E00093629361094A83009446402263441968EA +:1003F000C0004A40C02111408022520113431960BD +:10040000034B9C46052360444360704704C0014091 +:1004100000400140024B18688007C00F7047C0467B +:1004200000C0064070B5EFF3108C72B60D4D2B680E +:10043000002BFCD0BFF35F8F0724CB08C618C05C2D +:1004400001230C40A3401C000440034207D1034396 +:100450003370BFF35F8F2C608CF3108870BD100079 +:1004600001F0AEFA2C0100D00021044B044ABFF386 +:100470005F8F02C39342FAD17047C046000100D09B +:10048000800100D0044A1078431CDBB2172B00D93E +:10049000102313707047C046980100200123834049 +:1004A000002904D0034A1360034A13607047034ACB +:1004B0001360FBE780E200E000E100E080E100E0A3 +:1004C000024B10309B688000C058704700ED00E080 +:1004D00070B50D00EFF3108672B60F4A1368002B4B +:1004E000FCD0BFF35F8F0D4B10309B6884001B590D +:1004F0000B4A934203D09D4201D001F079FA074B99 +:100500009B681D51BFF35F8FBFF35F8F0022024BCB +:100510001A6086F3108870BD240100D000ED00E061 +:10052000CD010010F0B5DE4657464E464546E0B5D3 +:100530000C0083B0EFF3108972B6584A1368002B91 +:10054000FCD0BFF35F8F564B9A68030010339F00B7 +:10055000D559544A9046954232D0A54243D0524E86 +:10056000AA1B2F2A2CD801228240924651464F4A7C +:1005700012681140019151464D4A1160BFF35F8FDF +:10058000EFF305829346002A33D101232A009A43D0 +:1005900093689C4208D177E04B005B189B00F318EE +:1005A0009968A1422AD01A00062151560029F3DA8F +:1005B000019B002B19D052463E4B1A603B4B1A60F0 +:1005C000374B9B68DD51BFF35F8FBFF35F8F002216 +:1005D000324B1A6089F3108803B0F0BCBB46B246B8 +:1005E000A946A046F0BD1500EAE75246304B1A6016 +:1005F000E6E79342C9D001F0FBF9C6E70621595658 +:10060000002921DB4A005018800034188046A06879 +:100610009860E079D871062020569871002824DB74 +:10062000A488F01A6405241544440019E024000548 +:10063000400D24022043988052181F4B9200B61898 +:100640001A781970B271B3E7594600290FD1FF31FA +:1006500091711A49918018490A789A71184A9B1B1E +:100660005B415A43120D0A70A2E71648E3E7164AA7 +:100670001649D21A083A5002400D01439980144994 +:1006800052080A43DA8093E70621515613000029E5 +:10069000B8DA5A46002AEAD14546DCE7240100D000 +:1006A00000ED00E0CD0100109C01002000E100E021 +:1006B00080E100E080E200E01906002001BDFFFFBC +:1006C000AAAA000001BD0000D601002000F0FFFF33 +:1006D00000F8FFFF70B5EFF3058101240443EFF349 +:1006E000108C72B6214A1368002BFCD0BFF35F8FC9 +:1006F0001F4B05001F4AED1A6D416A43120D1E4D36 +:100700008900AE6852B27658A6421CD006215956CE +:1007100091421CD012215956914222D01E21595685 +:10072000914220D02A2159560324914210D0134BD4 +:1007300019781A708171BFF35F8F00220B4B1A601A +:100740008CF3108870BDAB680D4C5C50EFE7002453 +:100750006100091989005B18FF2199710949998085 +:10076000E5E70124F4E70224F2E7C046240100D0C3 +:100770009C010020AAAA000000ED00E0190600205C +:10078000CD01001001BDFFFF054B064A1360064A6C +:10079000136053609360D36013615361936170473A +:1007A0008080808000E400E004E400E0024B9C468E +:1007B00061448900016070474000003410B50400B6 +:1007C000FFF760FE01002000FFF7F0FFFF23237119 +:1007D000BFF35F8F10BDC04610B50400FFF752FE97 +:1007E00001002000FFF7E2FFFF23A380BFF35F8F2C +:1007F00010BDC04683680B4810B58446614462440E +:10080000090112019A18591854684B6801209C423A +:1008100001D802D00020C0B210BD12680B689A4205 +:10082000F9D8F7E7FFFFFF0F0A4B1968EFF31080C5 +:1008300072B60A68002AFCD0BFF35F8F1B68BFF353 +:100840005F8F00221A6080F3108840BF00200021D3 +:100850007047C04604060020F8B557464E46454648 +:10086000DE46E0B599460CAB1C780DAB1B78060054 +:1008700090469A460768002C11D1BC7B002C42D0D0 +:1008800065003B682D19033D59194B78BB73002B4C +:1008900000D1FB7300238B704B700B7004E065007C +:1008A0003B682D19033D5919B2682A4B94464246BC +:1008B000E3181B0163441A604A465A600A9A9A6018 +:1008C0000B9ADA6000238B704B700B707B7B9B461E +:1008D000002B2BD022005946B8687B6898473A68AD +:1008E000002816D05B4658465B005B445519033B15 +:1008F000A870D118D35C002B00D06B705B460C70D5 +:100900007B73A34513D0F0BCBB46B246A946A046B4 +:10091000F8BD5B465B005B44033BD3189C705119E8 +:10092000525D002A00D05A705B460B707C734246C1 +:100930004B46307D00F090FB051E06D05346002B41 +:1009400003D12100306800F0ABFD0E9B002BDAD004 +:100950001D70D8E7FFFFFF0FF0B5DE4657464E4645 +:1009600045460023E0B58BB00893674B8200D4580E +:1009700000239B46099000F00FFB626806000F0001 +:10098000EFF3108572B61368002BFCD0BFF35F8FB6 +:1009900023689C465B7B9946002B00D169E0A268E6 +:1009A0005A4B90464B441B01984443461A685B6877 +:1009B00010001900801BB941002900DC63E0099890 +:1009C00000F04AFB0023002298460023069207937A +:1009D00000239A466368BFF35F8F5A461A6085F317 +:1009E00010885346002B08D10028C4D10BB0F0BCAE +:1009F000BB46B246A946A046F0BD089B4146180238 +:100A00004B461843D047626806000F00EFF310858D +:100A100072B61368002BFCD0BFF35F8F002F50DB42 +:100A200033003B4302D02369002B61D12368D97B7B +:100A3000002907D04A00521819688C46494662447A +:100A4000033A51709A7B002A01D14A469A734A466A +:100A5000DA734B46E168013BCA5C0132CA545B461B +:100A600023616368BFF35F8F5A461A6085F310886D +:100A700081E7002300229846002306920793002373 +:100A800000209A46A6E7002902D1002800D096E768 +:100A90000021604600F082FC43461A685B680692BB +:100AA000079343469B689A464346DB689846E3684B +:100AB0004B44013B1B7808931B0203432361002036 +:100AC00088E72369002BB1D0069A079B921BBB4194 +:100AD000002B15DB594604910121039149460291EF +:100AE00041460191514620000091FFF7B5FEB6E75F +:100AF00000F052FA32003B0012184B41002BE9DAA9 +:100B00000122034B5242E5E7F0050020FFFFFF0FF3 +:100B1000FFFFFF7F10B5144C6368002B04D00A213F +:100B20001248FFF743FE10BD2300114A1021206830 +:100B300000F04EFB032000F023FA032000F0F6FA49 +:100B400003200C4900F042FAFFF79CFC0A4B9C463C +:100B500003232375D0231B061B6860446375074B72 +:100B600080006060DC60DAE7E40100200406002019 +:100B7000F50700105909001040000034F00500206E +:100B8000F0B54E464546DE465746E0B585B0019382 +:100B900010AB1B78060003930023994698460092F9 +:100BA0007268EFF3108B72B61368002BFCD0BFF3A2 +:100BB0005F8F3568AC7B002C3DD067002B683F19F8 +:100BC000033FDB195A78AA73002A00D1EA73B1688F +:100BD000474A8C4600980199A2181201624410609D +:100BE00051600E9991600F99D16042469A705A7087 +:100BF0001A706B7B9A46002B67D022001900A868F8 +:100C00006B6898472A68002852D0534650465B00CC +:100C10005344D719033BB870D118D35C002B00D0D4 +:100C20007B7053460C706B7354454FD0F3681B199F +:100C3000013B187800E000207368BFF35F8F4246E5 +:100C40001A608BF31088002C4FD04B46002B08D134 +:100C50000002204305B0F0BCBB46B246A946A04600 +:100C6000F0BD039B002B3ED00E9B00200F999847B0 +:100C7000030004000D000B4335D000290ADA009A66 +:100C8000019B121BAB4100920193002B0ADB039BDB +:100C9000994685E700F080F924184D4100940195AC +:100CA000002DF4DA0123134C5B4200930194EEE72C +:100CB00053465B005344033BD3189C70D119D25D5B +:100CC000002A00D05A7053460B706C73307D009A26 +:100CD000019B00F0C1F981460028A7D021003068AF +:100CE00000F0DEFBA2E70020B4E701204042B1E7BC +:100CF000FFFFFF0FFFFFFF7FF0B504000D0006268A +:100D00007642F717C64636196F4100B584B08F4258 +:100D100014D811D000F040F932003B00121A8B4178 +:100D2000002B15DC002B3ED02000290000F03EF9FE +:100D300004B080BCB846F0BD8642EBD9002600273F +:100D400000F02AF932003B00121A8B41002BE9DD3A +:100D5000002302930193154B3200009314483B008B +:100D6000FFF70EFF0028DFDB00239846BC46114A40 +:100D7000114F7B6A9C4504D8B96A8E42D4D99C45F0 +:100D8000D2D11168EFF3108072B60B68002BFCD043 +:100D9000BFF35F8F1368BFF35F8F4146196080F325 +:100DA000108820BFE5E7002ABED0D1E7290800104F +:100DB000E4010020040600200040054070B5060054 +:100DC00000F0EAF8FA2204000D00002330000021B0 +:100DD000920000F0F3FE00196941002902DBFFF7E1 +:100DE0008BFF70BD012001494042F8E7FFFFFF7F04 +:100DF000F0B5EFF30583CE46474680B505000C00FD +:100E000085B0002B12D02C4A0020536A9C4203D894 +:100E1000926A0130AA4204D305B0C0BCB946B046BC +:100E2000F0BDE01A421E9041C0B2F5E7234E029396 +:100E30000193234B0200009330000B00FFF7A0FE4C +:100E4000031EE0DD20BF7168EFF3108772B60A68F9 +:100E5000002AFCD0BFF35F8FDAB294463068427B41 +:100E600062451DD0FF221A40510089460168914415 +:100E700088464946414403398978002913D0F168EE +:100E80001B0A88464244013A1278DBB29A420FD0DC +:100E90007368BFF35F8F00221A6087F31088B2E790 +:100EA000FF221A40EBE732699342F1D13161EFE75B +:100EB000614600F0F5FAEBE700400540E401002050 +:100EC00029080010F0B5EFF30582D6464F46464696 +:100ED0001000C0B51038EFF3108872B6214C2368AB +:100EE000002BFCD0BFF35F8F0123190081401E4D02 +:100EF0001F006963AA461D4D29601D4D2E78AC4622 +:100F00003500C5402F402B4209D1BFF35F8F2760CA +:100F100088F31088E0BCBA46B146A846F0BD5346F7 +:100F2000144D5F6A83005D59AF420ED3124A8E435F +:100F30009B5862461670BFF35F8F0022226088F3D1 +:100F40001088002BE6D09847E4E70C4B92009C46B3 +:100F5000624413681360BFF35F8F0023236088F33C +:100F60001088D7E7280100D0004005403C700540BC +:100F70001A060020080600206C050020D03F05401E +:100F800010B50100024A0348FFF74CFA10BDC046F5 +:100F9000C01F001018060020034B596A0A00986A07 +:100FA000596A8A42FAD1704700400540064A536A9E +:100FB0009942FCD807D1044B02E05A6A914202D10F +:100FC0009A6A8242F9D370470040054070B5040028 +:100FD0000D00EFF3108672B61A4A1368002BFCD08E +:100FE000BFF35F8F002D1BD02000FFF769FA164971 +:100FF00081420AD02000FFF76BFA01212000FFF7A1 +:101000004DFA0123A340114A1360114BA400E5508F +:10101000BFF35F8F00220B4B1A6086F3108870BD00 +:101020000B4BA200D5500122A2400A4920000B78A8 +:1010300093430B700449FFF775FA00212000FFF776 +:101040002DFAE5E7280100D0C50E001038600540F4 +:101050006C0500201A060020F0B54F46D6464646DD +:10106000C0B507002C4C616A0D00A66A616AA942EE +:10107000FAD18B4208D805D00120E0BCBA46B1466F +:10108000A846F0BDB242F7D9EFF3108A72B62348F2 +:1010900001680029FCD0BFF35F8F0125BD402049C6 +:1010A0001D4C8846097889462943C9B28C46414679 +:1010B00060460870391D1B48890065630A51B900F4 +:1010C0000B50216A0020294219D0616A0800A66AE3 +:1010D000616A8142FAD18B4219D801D1B24216D845 +:1010E000CC4516D00C4B1F201D625D6301230740C9 +:1010F000BB400D4A1E38136043464A461A70BFF380 +:101100005F8F0022054B1A608AF31088B5E7002034 +:10111000F5E70120F3E7C04600400540280100D074 +:101120001A0600200806002080E200E0EFF3108C91 +:1011300072B60A490B68002BFCD0BFF35F8F012306 +:101140008340074A0748136202789A430270BFF34C +:101150005F8F00230B608CF310887047280100D04C +:10116000004005401A06002070B505001400160066 +:10117000002915D00C00002A12D080686B689847AF +:10118000296800280ED073009B196200033B1219D6 +:10119000CB18033A9C7088188A5C002A15D1067017 +:1011A000200070BD63001B197200033B9219CB181D +:1011B000033A9E7088188A5C002A02D104703400B9 +:1011C000EEE75A7004703400EAE75A700670E7E7F9 +:1011D00030B583600023CCB24373013304734260A3 +:1011E0008373C4730D000068012C06D9421C0133BF +:1011F000DBB2137003329C42F9D1FF2129404B002E +:101200005918002340180338437030BDF8B5CE4656 +:10121000474606000C0080B5002907D04D00036842 +:101220006D18033D5A195778002F04D12000C0BC17 +:10123000B946B046F8BD7900C91903398846434418 +:101240005978894600215970517073683A0021001D +:10125000806898473368002814D042469A189470E2 +:1012600059195B5D002B00D053700F702700494661 +:101270003000FFF7CBFF390002003000FFF774FFAA +:101280000400D3E7424641465D19AF709A185B5C93 +:10129000002B00D06B701470E9E7C046F0B55746DC +:1012A0004546DE464E46E0B50D006B0001685B1911 +:1012B000DF1E0400C85D83B00192CA19002850D017 +:1012C00043001B18033BCB185E78B446002E1AD19E +:1012D000019E002E42D0E67B002E04D073009B19A5 +:1012E000CB18033B5D70A37B002B00D1A573E57386 +:1012F00000282FD10023537003B0F0BCBB46B24688 +:10130000A946A046F0BD72006244033A89184A78A3 +:10131000904600224A7091465A7001003200200027 +:10132000FFF722FF43468246002B07D05B0021686F +:101330004344033BCB185A78002A16D14246514603 +:101340002000FFF711FF2168019BCA19002BC2D1B1 +:101350000028CFD043001B18033BCB180021997005 +:10136000C8E7019B002BB6D1C4E7500080180338B2 +:10137000091848788346484648705870414620000E +:10138000FFF7F2FE594680462000FFF73FFF414637 +:1013900002002000FFF7E8FE8046CFE7F0B5574691 +:1013A0004546DE464E46E0B583B00191457B0400DC +:1013B0006B0000685B19DF1EC15DC219002952D0A5 +:1013C0004B005B18033BC3185E78B446002E1CD15B +:1013D000019E002E44D0E67B002E04D073009B19A2 +:1013E000C318033B5D70A37B002B00D1A573E5738D +:1013F000002931D1002328005370617303B0F0BC81 +:10140000BB46B246A946A046F0BD72006244033A0C +:101410008018427890460022427091465A7020000F +:101420003200FFF7A1FE43468246002B07D05B0047 +:1014300021684344033BCB185A78002A17D142460F +:1014400051462000FFF790FE019B01002068C21961 +:10145000002BC0D10029CDD04B005B18033BC31833 +:1014600000209870C6E7019B002BB4D1C2E7500062 +:1014700080180338091848788346484648705870E1 +:1014800041462000FFF770FE594680462000FFF7D6 +:10149000BDFE414602002000FFF766FE8046CEE713 +:1014A00070B5040000292CD0437B8B422ED00568F8 +:1014B00048004018033828188278002A21D05300A9 +:1014C0009B18033BEA5CEE188A4202D11BE0002A1B +:1014D00008D053009B18033BEB185A788A42F6D188 +:1014E00042785A7000230122837043702000FFF776 +:1014F000D5FE617B02002000FFF736FE60730120FD +:1015000000E0002070BD43783370EBE70122190042 +:10151000FFF7C4FE60730120F4E7C04630B50C202D +:1015200083B000F0B3F9FEF775FF00280ED0994B99 +:10153000994A1A605A609A60DA601A615A619A612F +:10154000DA611A62954A5A6203B030BD944CA067C2 +:1015500000F0A4F90122934B1A60636C012BFCD1BB +:101560000322914B1A608E4A936B012BFCD10133FD +:1015700001218E4A8E480093043300F037F9052389 +:101580008C4A009301218C4800F030F98B4B5A684B +:10159000FF2A02D8802252005A6080227D4C824B62 +:1015A00021691201854D1A60002907D0606900F099 +:1015B0007FFA431C5800C0180338FDD2E0217F4B4E +:1015C00002201A681140802252012A4311601968D2 +:1015D000484003210140116004219A681142FCD067 +:1015E0008022802192012A43090111608022520049 +:1015F0005A60734B2361734B5968FF2900D85A60B6 +:101600000321684A6F4B116002399A681142FCD07D +:10161000E0201A681040802252011A4310601868B6 +:101620004840032101400220116066498A68104247 +:10163000FCD0802292011343802212011A60802282 +:10164000614B52004A606361604B5968FF2900D8C2 +:101650005A6080225E4BE16912015C4D1A600029DC +:1016600007D0606900F024FA431C5800C018033802 +:10167000FDD2E02255490B681A4080235B012B43C1 +:101680001A60802380229B012B4312011A60802262 +:10169000414B52004A60E3614E4B5968FF2900D824 +:1016A0005A6080224C4B216A12014A4D1A6000296F +:1016B00007D0606900F0FCF9431C5800C0180338DB +:1016C000FDD2E02243490B681A4080235B012B4383 +:1016D0001A60802380229B012B4312011A60802311 +:1016E00080225B004B602C4BD20223623B4B59683B +:1016F000914200D25A608022394B616A1201374D03 +:101700001A60002907D0606900F0D2F9431C580024 +:10171000C0180338FDD2E02230490B681A408023FC +:101720005B012B431A60802380229B012B43120113 +:101730001A608023DB024B60184B6362294B5A68A6 +:10174000FF2A02D8802252005A608022264BA169CB +:101750001201244D1A60002907D0606900F0A8F931 +:10176000431C5800C0180338FDD2E0221D490B6805 +:101770001A4080235B012B431A60802380229B0147 +:101780002B4312011A6080235B004B600E4BA36158 +:10179000DAE6C0467C050020006CDC021BB70000C6 +:1017A000008000403CB0004030B00040002F68593D +:1017B00000800240008C864700C00240308000401C +:1017C000001BB7003C800040405973075480004024 +:1017D00054B000406080004060B000406C80004029 +:1017E0006CB000404880004048B00040F8B50400AC +:1017F00021481D0017000E0000F05AF901003800C2 +:1018000000F056F9069B29041B0319432368002B9B +:1018100020DB1A4B1A4DE21853425A4180235B01D8 +:101820009C461203174B62441A60174B1A6017004C +:10183000AB689F43FBD1C022231D92011A43212391 +:101840002660A06013602368002BFCDA0823E160A7 +:101850001360F8BD3F2322681340B342D9D1A36877 +:101860001B051B0D8342D4D1EE22E368D202134044 +:101870008B42CED1EDE7C046001BB7000040FDBF54 +:1018800000C0004000E0004000F000408023024A19 +:101890009B000343D362704700800540AA23064A99 +:1018A0001B0113602F230549D360054B1960536852 +:1018B000002BFCDA7047C0460040024000B0FA003E +:1018C000006002402C4B2D4A70B51A602C4A2D4BFB +:1018D0002D491A6014008B689C43FBD12B4D2C4E74 +:1018E000B54208D2013E761BB60808CD98472300C2 +:1018F0000134B342F9D1FFF711FE264A214B1A6099 +:10190000214A9368DB43DB01DD09002BF9D140223A +:10191000214B224C224E9A675A671A67DA66B44204 +:1019200008D223682000002B20D00834FEF754FF93 +:10193000B442F6D31B4E1C4CC022A168300000F00C +:10194000A7F9A660FEF790FDFEF71EFFFFF7E2F88D +:10195000164C174EB44208D2013E361BB60808CCCE +:1019600098472B0001359E42F9D170BD0834FEF72F +:1019700025FFB442D5D3DDE700E00040BFCDFBFE3C +:10198000FE7F3C0000F0004000C000403802002014 +:1019900048020020FFFFFF0100F00140300200205C +:1019A000380200200000002000ED00E04802002086 +:1019B0004C02002000BEFDE710B5FFF7FBFFC0465C +:1019C0000FB400B5084883B000F094FA049B002BD4 +:1019D00007D005A91800019100F018F8034800F09D +:1019E00089FA0120FFF7E6FFE41F0010F41F001042 +:1019F00010B50148FFF7E4FFF81F001010B50028EC +:101A000000D110BD00F02AFAFBE7C04610B5094A24 +:101A10000300146884B0002C08D00122009106480D +:101A2000524203A9A047012004B010BD00F062FAA1 +:101A30000020F9E7EC050020FD1900100148042101 +:101A4000014B1847100200206D1A0010142310B526 +:101A50000100188804331B88984710BD162310B561 +:101A60000100188802331B88984710BDF8B5474617 +:101A7000CE4680B50F1E19D01423994604330400B6 +:101A80000025012698464B461888434621681B8846 +:101A9000984701C4431E9841013540420640AF4279 +:101AA000F1D13000C0BCB946B046F8BD0126F8E718 +:101AB000114A936F9B0813D210665166002905D016 +:101AC000FFE7FFE7FFE7516F106F704704B500288D +:101AD00001D00020C04300F063FA002104BDC046DD +:101AE000F0B5146E556E576F166FFFF7E5FF14666D +:101AF000556657671667F0BD000000D0132370B518 +:101B00001D78012D15D010DD1C48FFF7A7FF1C4CD8 +:101B100001008022200000F0BBF8022D06D01948F9 +:101B2000FFF794FF184B186070BD154C174BA3645A +:101B3000F5E7164B124C23606360A360E3602361FA +:101B40006361A361E36123626362A362E36223636F +:101B50006363A363E36323646364A364E36423654F +:101B60006365A365E36523666366A366E36623672F +:101B70006367A367E367A364D1E7C04653440000EB +:101B8000500300204C33000000060020911B001081 +:101B900007B5604601880A0A0230DF2AFAD1C9B2C5 +:101BA000820804D3028840880004104300E00068E3 +:101BB000014A5050039007BD500300205143434356 +:101BC000C9188C46110C83B24B4310B4040C61430A +:101BD00092B280B2504362431C041B0C001910BC2B +:101BE00059411304120CC018514161447047000060 +:101BF000132310B512481C78FFF730FF0100012CA9 +:101C00000AD003DD80220F4800F042F80E48FFF7AB +:101C10001DFF0E4B186010BD0A4C5422200000F02E +:101C200037F80B4B6365A365E36523666366A366BC +:101C3000E36623676367A367E3672362E361E5E71E +:101C400053460000500400204C33000000060020E2 +:101C5000551C001007B5604601880A0A0230DF2AC9 +:101C6000FAD1C9B2820804D3028840880004104324 +:101C700000E00068014A5050039007BD5004002066 +:101C800001480421014B1847200200206D1A001062 +:101C9000014B5B681847000020020020030010B5CC +:101CA000080011001B68984710BDC046F0B54646B5 +:101CB0004F46D646C0B5437D80460E001700002B28 +:101CC00046D0002A3FDD4B1E9946244B01250024B7 +:101CD00000209A460DE04B461B5D0D3B5A42534196 +:101CE000325DDBB20A2A0BD02B00013401359F4252 +:101CF0001ADD002CEFD14346325D1B7D0A2AF3D159 +:101D0000002BF1D1A04204DA4346211A1B68301897 +:101D10009847434650461B680221984701342800E3 +:101D20002B0001359F42E4DC874204DD4346391A2B +:101D30001B6830189847F619013E33780D3B5A421C +:101D4000534142461375E0BCBA46B146A846F0BDC1 +:101D50000368110030009847F5E7C046BC2000102A +:101D6000F0B5DE4657464E464546E0B585B017000D +:101D70001C0006000D00FFF70FF90023304A12186F +:101D80004B41002B58DB2F4908008A4600F010F920 +:101D900001906B1C03D1300000F0CAF80500002C44 +:101DA00025D1294B9846294B1C68002C15D0002FB3 +:101DB00020D1274F02E02469002C0ED02368002B8D +:101DC000F9D03B68002B01D0A342F4D120002A00B7 +:101DD0003100C0472469002CF0D1019B002B27D192 +:101DE00005B0F0BCBB46B246A946A046F0BD194BB3 +:101DF0009846D8E7164B994602ABDF1D0A239B464F +:101E000002E02469002CE8D02368002BF9D04B466F +:101E10001B68002B01D0A342F3D12A00310020001F +:101E2000C0475B460122390020003B70C047E8E70D +:101E3000504600F0ADF8D3E70122074B5242A2E72B +:101E400040420F0030020020AD1C0010E4050020CD +:101E5000E80500209D1C0010FFFFFF7FF0B5CE4677 +:101E6000474680B583B06B460600DD1D2870FFF73E +:101E700093F800231A4A12184B41002B2BDB194907 +:101E80000800884600F094F8174B81461C68002C27 +:101E900014D0164F02E02469002C0FD02368002BC9 +:101EA000F9D03B68002B01D0A342F4D120000122DD +:101EB0002900FFF7FBFE2469002CEFD14B46002BD5 +:101EC00005D1300003B0C0BCB946B046F0BD4046B5 +:101ED00000F05EF8F5E70122054B5242CFE7C0461D +:101EE00040420F0030020020E4050020E8050020F9 +:101EF000FFFFFF7F70B5040000F01AF80023010017 +:101F0000050001222000FFF72BFF084B1C68002C66 +:101F100006D06368002B05D098472469002CF8D1BF +:101F2000280070BD2469002CF3D1F9E7E4050020F6 +:101F300010B583070AD00300032102E001330B42EE +:101F400005D01A78002AF9D1181A10BD03001968B3 +:101F50000C4A0D4C8A188A4322420FD15968094A0B +:101F600004338A188A43224208D15968054A043347 +:101F70008A188A432242F1D000E001331A78002AFD +:101F8000FBD1E1E7FFFEFEFE80808080F8B5C04611 +:101F900001B40248844601BC604700BF5D010020D7 +:101FA00001B40248844601BC604700BF850100209F +:101FB00001B40248844601BC604700BFC100002054 +:101FC000486172647761726520616C61726D202571 +:101FD0006420616C726561647920636C61696D6510 +:101FE000640000000A2A2A2A2050414E4943202A30 +:101FF0002A2A0A000A000000486172642061737393 +:102000006572740052656C6561736500626F6F7410 +:10201000325F773235713038300000006874747088 +:10202000733A2F2F6769746875622E636F6D2F7214 +:10203000617370626572727970692F7069636F2D58 +:102040006578616D706C65732F747265652F484596 +:1020500041442F6E616E6F2D782D626C696E6B003E +:10206000312E352E310000007069636F00000000D2 +:102070006E616E6F2D782D626C696E6B00000000D2 +:102080004175672020322032303234000600525031 +:10209000BBFF3CB668200010060052509A23561829 +:1020A0001C20001006005250E182887F0C20001096 +:1020B00006005250D3F07542042000100D0A0000B3 +:1020C000AC020010A0020010940200108C2000103E +:1020D0008802001098200010A4200010B0200010EA +:1020E000F0B5C646150000B504001E000268EFF307 +:1020F000108172B61368002BFCD0BFF35F8F0423EE +:10210000E356002B2DDB2268BFF35F8F00201060A9 +:1021100081F31088D0221206127852B290469A4269 +:1021200003D1002080BCB846F0BD00270BE0236837 +:10213000BFF35F8F1F6081F310882800310000F02B +:1021400033F80028EDD12268EFF3108172B61368DE +:10215000002BFCD0BFF35F8F23797F2BE7D9434659 +:1021600002E0D0231B061B6823712368BFF35F8F37 +:1021700000221A6081F310880120D3E70268EFF390 +:10218000108172B61368002BFCD0BFF35F8FFF2362 +:1021900003710368BFF35F8F00221A6081F3108818 +:1021A00040BF70477047C04601B40248844601BC36 +:1021B000604700BFF10D001010000000000000009B +:1021C000000001000000000000000000000002000C +:1021D00000000000000000000000030000000000FC +:1021E000000000000000FF000000000001B548688A +:1021F00001318E460047704609380149884701BDC4 +:10220000D5060010FC010020000000005002002054 +:10221000A40500200000000000000000B40500201C +:10222000000000000000000010000000000000009E +:10223000503300004C330000543300005233000090 +:102240004D5300004D430000533400004334000060 +:102250000000000000000000811C00103D1A00106A +:0C226000FD1A0010F11B001031030010EB +:04000005100001E9FD +:00000001FF diff --git a/software/pico/nano-x-blink/nano-x-blink.uf2 b/software/pico/nano-x-blink/nano-x-blink.uf2 new file mode 100644 index 0000000..72e3b70 Binary files /dev/null and b/software/pico/nano-x-blink/nano-x-blink.uf2 differ